1//
2// Copyright 2021, Patrick Webster
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8//     http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
16
17package gitlab
18
19import (
20	"net/http"
21	"reflect"
22	"testing"
23	"time"
24)
25
26func TestListProjectAccessTokens(t *testing.T) {
27	mux, server, client := setup(t)
28	defer teardown(server)
29
30	mux.HandleFunc("/api/v4/projects/1/access_tokens", func(w http.ResponseWriter, r *http.Request) {
31		testMethod(t, r, http.MethodGet)
32		mustWriteHTTPResponse(t, w, "testdata/list_project_access_tokens.json")
33	})
34
35	projectAccessTokens, _, err := client.ProjectAccessTokens.ListProjectAccessTokens(1, &ListProjectAccessTokensOptions{Page: 1, PerPage: 20})
36	if err != nil {
37		t.Errorf("ProjectAccessTokens.ListProjectAccessTokens returned error: %v", err)
38	}
39
40	time1, err := time.Parse(time.RFC3339, "2021-03-09T21:11:47.271Z")
41	if err != nil {
42		t.Errorf("ProjectAccessTokens.ListProjectAccessTokens returned error: %v", err)
43	}
44	time2, err := time.Parse(time.RFC3339, "2021-03-09T21:11:47.340Z")
45	if err != nil {
46		t.Errorf("ProjectAccessTokens.ListProjectAccessTokens returned error: %v", err)
47	}
48
49	want := []*ProjectAccessToken{
50		{
51			ID:          1876,
52			UserID:      2453,
53			Name:        "token 10",
54			Scopes:      []string{"api", "read_api", "read_repository", "write_repository"},
55			CreatedAt:   &time1,
56			Active:      true,
57			Revoked:     false,
58			AccessLevel: AccessLevelValue(40),
59		},
60		{
61			ID:          1877,
62			UserID:      2456,
63			Name:        "token 8",
64			Scopes:      []string{"api", "read_api", "read_repository", "write_repository"},
65			CreatedAt:   &time2,
66			Active:      true,
67			Revoked:     false,
68			AccessLevel: AccessLevelValue(30),
69		},
70	}
71
72	if !reflect.DeepEqual(want, projectAccessTokens) {
73		t.Errorf("ProjectAccessTokens.ListProjectAccessTokens returned %+v, want %+v", projectAccessTokens, want)
74	}
75}
76
77func TestCreateProjectAccessToken(t *testing.T) {
78	mux, server, client := setup(t)
79	defer teardown(server)
80
81	mux.HandleFunc("/api/v4/projects/1/access_tokens", func(w http.ResponseWriter, r *http.Request) {
82		testMethod(t, r, http.MethodPost)
83		mustWriteHTTPResponse(t, w, "testdata/create_project_access_token.json")
84	})
85
86	projectAccessToken, _, err := client.ProjectAccessTokens.CreateProjectAccessToken(1, nil)
87	if err != nil {
88		t.Errorf("ProjectAccessTokens.CreateProjectAccessToken returned error: %v", err)
89	}
90
91	time1, err := time.Parse(time.RFC3339, "2021-03-09T21:11:47.271Z")
92	if err != nil {
93		t.Errorf("ProjectAccessTokens.CreateProjectAccessToken returned error: %v", err)
94	}
95	want := &ProjectAccessToken{
96		ID:          1876,
97		UserID:      2453,
98		Name:        "token 10",
99		Scopes:      []string{"api", "read_api", "read_repository", "write_repository"},
100		ExpiresAt:   nil,
101		CreatedAt:   &time1,
102		Active:      true,
103		Revoked:     false,
104		Token:       "2UsevZE1x1ZdFZW4MNzH",
105		AccessLevel: AccessLevelValue(40),
106	}
107
108	if !reflect.DeepEqual(want, projectAccessToken) {
109		t.Errorf("ProjectAccessTokens.CreateProjectAccessToken returned %+v, want %+v", projectAccessToken, want)
110	}
111}
112
113func TestDeleteProjectAccessToken(t *testing.T) {
114	mux, server, client := setup(t)
115	defer teardown(server)
116
117	mux.HandleFunc("/api/v4/projects/1/access_tokens/1234", func(w http.ResponseWriter, r *http.Request) {
118		testMethod(t, r, http.MethodDelete)
119	})
120
121	_, err := client.ProjectAccessTokens.DeleteProjectAccessToken("1", 1234)
122	if err != nil {
123		t.Errorf("Pipelines.DeleteProjectAccessToken returned error: %v", err)
124	}
125}
126