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