@@ -13,6 +13,7 @@ import (
13
13
"github.com/google/go-cmp/cmp"
14
14
"github.com/google/go-cmp/cmp/cmpopts"
15
15
"github.com/google/go-github/github"
16
+
16
17
"golang.org/x/build/devapp/owners"
17
18
"golang.org/x/build/maintner"
18
19
)
@@ -178,16 +179,65 @@ func TestLabelMutations(t *testing.T) {
178
179
}
179
180
}
180
181
181
- func TestAddLabels ( t * testing. T ) {
182
- oldFunc := addLabelsToIssue
183
- defer func () { addLabelsToIssue = oldFunc }()
182
+ type fakeIssuesService struct {
183
+ labels map [ int ][] string
184
+ }
184
185
185
- var added []string
186
- addLabelsToIssue = func (_ context.Context , _ * github.IssuesService , _ int , labels []string ) error {
187
- added = labels
188
- return nil
186
+ func (f * fakeIssuesService ) ListLabelsByIssue (ctx context.Context , owner string , repo string , number int , opt * github.ListOptions ) ([]* github.Label , * github.Response , error ) {
187
+ var labels []* github.Label
188
+ if ls , ok := f .labels [number ]; ok {
189
+ for _ , l := range ls {
190
+ name := l
191
+ labels = append (labels , & github.Label {Name : & name })
192
+ }
189
193
}
194
+ return labels , nil , nil
195
+ }
190
196
197
+ func (f * fakeIssuesService ) AddLabelsToIssue (ctx context.Context , owner string , repo string , number int , labels []string ) ([]* github.Label , * github.Response , error ) {
198
+ if f .labels == nil {
199
+ f .labels = map [int ][]string {number : labels }
200
+ return nil , nil , nil
201
+ }
202
+ ls , ok := f .labels [number ]
203
+ if ! ok {
204
+ f .labels [number ] = labels
205
+ return nil , nil , nil
206
+ }
207
+ for _ , label := range labels {
208
+ var found bool
209
+ for _ , l := range ls {
210
+ if l == label {
211
+ found = true
212
+ }
213
+ }
214
+ if found {
215
+ continue
216
+ }
217
+ f .labels [number ] = append (f .labels [number ], label )
218
+ }
219
+ return nil , nil , nil
220
+ }
221
+
222
+ func (f * fakeIssuesService ) RemoveLabelForIssue (ctx context.Context , owner string , repo string , number int , label string ) (* github.Response , error ) {
223
+ if ls , ok := f .labels [number ]; ok {
224
+ for i , l := range ls {
225
+ if l == label {
226
+ f .labels [number ] = append (f .labels [number ][:i ], f .labels [number ][i + 1 :]... )
227
+ return nil , nil
228
+ }
229
+ }
230
+ }
231
+ // The GitHub API returns a NotFound error if the label did not exist.
232
+ return nil , & github.ErrorResponse {
233
+ Response : & http.Response {
234
+ Status : http .StatusText (http .StatusNotFound ),
235
+ StatusCode : http .StatusNotFound ,
236
+ },
237
+ }
238
+ }
239
+
240
+ func TestAddLabels (t * testing.T ) {
191
241
testCases := []struct {
192
242
desc string
193
243
gi * maintner.GitHubIssue
@@ -222,60 +272,49 @@ func TestAddLabels(t *testing.T) {
222
272
},
223
273
}
224
274
225
- b := & gopherbot {ghc : github . NewClient ( http . DefaultClient ) }
275
+ b := & gopherbot {}
226
276
for _ , tc := range testCases {
227
- // Clear any previous state from stubbed addLabelsToIssue function above
228
- // since some test cases may skip calls to it.
229
- added = nil
277
+ // Clear any previous state from fake addLabelsToIssue since some test cases may skip calls to it.
278
+ fis := & fakeIssuesService {}
279
+ b . is = fis
230
280
231
281
if err := b .addLabels (context .Background (), tc .gi , tc .labels ); err != nil {
232
282
t .Errorf ("%s: b.addLabels got unexpected error: %v" , tc .desc , err )
233
283
continue
234
284
}
235
- if diff := cmp .Diff (added , tc .added ); diff != "" {
285
+ if diff := cmp .Diff (fis . labels [ int ( tc . gi . ID )] , tc .added ); diff != "" {
236
286
t .Errorf ("%s: labels added differ: (-got, +want)\n %s" , tc .desc , diff )
237
287
}
238
288
}
239
289
}
240
290
241
291
func TestRemoveLabels (t * testing.T ) {
242
- oldLabelsForIssue := labelsForIssue
243
- defer func () { labelsForIssue = oldLabelsForIssue }()
244
-
245
- labelsForIssue = func (_ context.Context , _ * github.IssuesService , _ int ) ([]string , error ) {
246
- return []string {"help wanted" , "NeedsFix" }, nil
247
- }
248
-
249
- oldRemoveLabelFromIssue := removeLabelFromIssue
250
- defer func () { removeLabelFromIssue = oldRemoveLabelFromIssue }()
251
-
252
- var removed []string
253
- removeLabelFromIssue = func (_ context.Context , _ * github.IssuesService , _ int , label string ) error {
254
- removed = append (removed , label )
255
- return nil
256
- }
257
-
258
292
testCases := []struct {
259
293
desc string
260
294
gi * maintner.GitHubIssue
295
+ ghLabels []string
261
296
toRemove []string
262
- removed []string
297
+ want []string
263
298
}{
264
299
{
265
300
"basic remove" ,
266
301
& maintner.GitHubIssue {
302
+ Number : 123 ,
267
303
Labels : map [int64 ]* maintner.GitHubLabel {
268
304
0 : {Name : "NeedsFix" },
305
+ 1 : {Name : "help wanted" },
269
306
},
270
307
},
308
+ []string {"NeedsFix" , "help wanted" },
271
309
[]string {"NeedsFix" },
272
- []string {"NeedsFix " },
310
+ []string {"help wanted " },
273
311
},
274
312
{
275
313
"label not present in maintner" ,
276
314
& maintner.GitHubIssue {},
277
315
[]string {"NeedsFix" },
278
- nil ,
316
+ []string {"NeedsFix" },
317
+ []string {"NeedsFix" },
279
318
},
280
319
{
281
320
"label not present in GitHub" ,
@@ -284,23 +323,26 @@ func TestRemoveLabels(t *testing.T) {
284
323
0 : {Name : "foo" },
285
324
},
286
325
},
326
+ []string {"NeedsFix" },
287
327
[]string {"foo" },
288
- nil ,
328
+ [] string { "NeedsFix" } ,
289
329
},
290
330
}
291
331
292
- b := & gopherbot {ghc : github . NewClient ( http . DefaultClient ) }
332
+ b := & gopherbot {}
293
333
for _ , tc := range testCases {
294
- // Clear any previous state from stubbed removeLabelFromIssue function above
295
- // since some test cases may skip calls to it.
296
- removed = nil
334
+ // Clear any previous state from fakeIssuesService since some test cases may skip calls to it.
335
+ fis := & fakeIssuesService {map [int ][]string {
336
+ int (tc .gi .Number ): tc .ghLabels ,
337
+ }}
338
+ b .is = fis
297
339
298
340
if err := b .removeLabels (context .Background (), tc .gi , tc .toRemove ); err != nil {
299
341
t .Errorf ("%s: b.addLabels got unexpected error: %v" , tc .desc , err )
300
342
continue
301
343
}
302
- if diff := cmp .Diff (removed , tc .removed ); diff != "" {
303
- t .Errorf ("%s: labels removed differ: (-got, +want)\n %s" , tc .desc , diff )
344
+ if diff := cmp .Diff (fis . labels [ int ( tc . gi . Number )] , tc .want ); diff != "" {
345
+ t .Errorf ("%s: labels differ: (-got, +want)\n %s" , tc .desc , diff )
304
346
}
305
347
}
306
348
}
0 commit comments