1package github
2
3import (
4 "os"
5 "testing"
6
7 "github.com/stretchr/testify/assert"
8
9 "github.com/MichaelMure/git-bug/bridge/core/auth"
10)
11
12func TestSplitURL(t *testing.T) {
13 type args struct {
14 url string
15 }
16 type want struct {
17 owner string
18 project string
19 err error
20 }
21 tests := []struct {
22 name string
23 args args
24 want want
25 }{
26 {
27 name: "default url",
28 args: args{
29 url: "https://github.com/MichaelMure/git-bug",
30 },
31 want: want{
32 owner: "MichaelMure",
33 project: "git-bug",
34 err: nil,
35 },
36 },
37 {
38 name: "default issues url",
39 args: args{
40 url: "https://github.com/MichaelMure/git-bug/issues",
41 },
42 want: want{
43 owner: "MichaelMure",
44 project: "git-bug",
45 err: nil,
46 },
47 },
48 {
49 name: "default url with git extension",
50 args: args{
51 url: "https://github.com/MichaelMure/git-bug.git",
52 },
53 want: want{
54 owner: "MichaelMure",
55 project: "git-bug",
56 err: nil,
57 },
58 },
59 {
60 name: "url with git protocol",
61 args: args{
62 url: "git://github.com/MichaelMure/git-bug.git",
63 },
64 want: want{
65 owner: "MichaelMure",
66 project: "git-bug",
67 err: nil,
68 },
69 },
70 {
71 name: "ssh url",
72 args: args{
73 url: "git@github.com:MichaelMure/git-bug.git",
74 },
75 want: want{
76 owner: "MichaelMure",
77 project: "git-bug",
78 err: nil,
79 },
80 },
81 {
82 name: "bad url",
83 args: args{
84 url: "https://githb.com/MichaelMure/git-bug.git",
85 },
86 want: want{
87 err: ErrBadProjectURL,
88 },
89 },
90 }
91
92 for _, tt := range tests {
93 t.Run(tt.name, func(t *testing.T) {
94 owner, project, err := splitURL(tt.args.url)
95 assert.Equal(t, tt.want.err, err)
96 assert.Equal(t, tt.want.owner, owner)
97 assert.Equal(t, tt.want.project, project)
98 })
99 }
100}
101
102func TestValidateUsername(t *testing.T) {
103 if env := os.Getenv("TRAVIS"); env == "true" {
104 t.Skip("Travis environment: avoiding non authenticated requests")
105 }
106
107 if _, has := os.LookupEnv("CI"); has {
108 t.Skip("Github action environment: avoiding non authenticated requests")
109 }
110
111 tests := []struct {
112 name string
113 input string
114 fixed string
115 ok bool
116 }{
117 {
118 name: "existing username",
119 input: "MichaelMure",
120 fixed: "MichaelMure",
121 ok: true,
122 },
123 {
124 name: "existing username with bad case",
125 input: "MicHaelmurE",
126 fixed: "MichaelMure",
127 ok: true,
128 },
129 {
130 name: "existing organisation",
131 input: "ipfs",
132 fixed: "ipfs",
133 ok: true,
134 },
135 {
136 name: "existing organisation with bad case",
137 input: "iPfS",
138 fixed: "ipfs",
139 ok: true,
140 },
141 {
142 name: "non existing username",
143 input: "cant-find-this",
144 fixed: "",
145 ok: false,
146 },
147 }
148
149 for _, tt := range tests {
150 t.Run(tt.name, func(t *testing.T) {
151 ok, fixed, err := validateUsername(tt.input)
152 assert.NoError(t, err)
153 assert.Equal(t, tt.ok, ok)
154 assert.Equal(t, tt.fixed, fixed)
155 })
156 }
157}
158
159func TestValidateProject(t *testing.T) {
160 envPrivate := os.Getenv("GITHUB_TOKEN_PRIVATE")
161 if envPrivate == "" {
162 t.Skip("Env var GITHUB_TOKEN_PRIVATE missing")
163 }
164
165 envPublic := os.Getenv("GITHUB_TOKEN_PUBLIC")
166 if envPublic == "" {
167 t.Skip("Env var GITHUB_TOKEN_PUBLIC missing")
168 }
169
170 tokenPrivate := auth.NewToken(target, envPrivate)
171 tokenPublic := auth.NewToken(target, envPublic)
172
173 type args struct {
174 owner string
175 project string
176 token *auth.Token
177 }
178 tests := []struct {
179 name string
180 args args
181 want bool
182 }{
183 {
184 name: "public repository and token with scope 'public_repo'",
185 args: args{
186 project: "git-bug",
187 owner: "MichaelMure",
188 token: tokenPublic,
189 },
190 want: true,
191 },
192 {
193 name: "private repository and token with scope 'repo'",
194 args: args{
195 project: "git-bug-test-github-bridge",
196 owner: "MichaelMure",
197 token: tokenPrivate,
198 },
199 want: true,
200 },
201 {
202 name: "private repository and token with scope 'public_repo'",
203 args: args{
204 project: "git-bug-test-github-bridge",
205 owner: "MichaelMure",
206 token: tokenPublic,
207 },
208 want: false,
209 },
210 {
211 name: "project not existing",
212 args: args{
213 project: "cant-find-this",
214 owner: "organisation-not-found",
215 token: tokenPublic,
216 },
217 want: false,
218 },
219 }
220
221 for _, tt := range tests {
222 t.Run(tt.name, func(t *testing.T) {
223 ok, _ := validateProject(tt.args.owner, tt.args.project, tt.args.token)
224 assert.Equal(t, tt.want, ok)
225 })
226 }
227}