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 type args struct {
108 username string
109 }
110 tests := []struct {
111 name string
112 args args
113 want bool
114 }{
115 {
116 name: "existing username",
117 args: args{
118 username: "MichaelMure",
119 },
120 want: true,
121 },
122 {
123 name: "existing organisation name",
124 args: args{
125 username: "ipfs",
126 },
127 want: true,
128 },
129 {
130 name: "non existing username",
131 args: args{
132 username: "cant-find-this",
133 },
134 want: false,
135 },
136 }
137
138 for _, tt := range tests {
139 t.Run(tt.name, func(t *testing.T) {
140 ok, _ := validateUsername(tt.args.username)
141 assert.Equal(t, tt.want, ok)
142 })
143 }
144}
145
146func TestValidateProject(t *testing.T) {
147 envPrivate := os.Getenv("GITHUB_TOKEN_PRIVATE")
148 if envPrivate == "" {
149 t.Skip("Env var GITHUB_TOKEN_PRIVATE missing")
150 }
151
152 envPublic := os.Getenv("GITHUB_TOKEN_PUBLIC")
153 if envPublic == "" {
154 t.Skip("Env var GITHUB_TOKEN_PUBLIC missing")
155 }
156
157 tokenPrivate := auth.NewToken(envPrivate, target)
158 tokenPublic := auth.NewToken(envPublic, target)
159
160 type args struct {
161 owner string
162 project string
163 token *auth.Token
164 }
165 tests := []struct {
166 name string
167 args args
168 want bool
169 }{
170 {
171 name: "public repository and token with scope 'public_repo'",
172 args: args{
173 project: "git-bug",
174 owner: "MichaelMure",
175 token: tokenPublic,
176 },
177 want: true,
178 },
179 {
180 name: "private repository and token with scope 'repo'",
181 args: args{
182 project: "git-bug-test-github-bridge",
183 owner: "MichaelMure",
184 token: tokenPrivate,
185 },
186 want: true,
187 },
188 {
189 name: "private repository and token with scope 'public_repo'",
190 args: args{
191 project: "git-bug-test-github-bridge",
192 owner: "MichaelMure",
193 token: tokenPublic,
194 },
195 want: false,
196 },
197 {
198 name: "project not existing",
199 args: args{
200 project: "cant-find-this",
201 owner: "organisation-not-found",
202 token: tokenPublic,
203 },
204 want: false,
205 },
206 }
207
208 for _, tt := range tests {
209 t.Run(tt.name, func(t *testing.T) {
210 ok, _ := validateProject(tt.args.owner, tt.args.project, tt.args.token)
211 assert.Equal(t, tt.want, ok)
212 })
213 }
214}