github.com/google/go-github/v49@v49.1.0/github/issues_labels_test.go (about) 1 // Copyright 2013 The go-github AUTHORS. All rights reserved. 2 // 3 // Use of this source code is governed by a BSD-style 4 // license that can be found in the LICENSE file. 5 6 package github 7 8 import ( 9 "context" 10 "encoding/json" 11 "fmt" 12 "net/http" 13 "testing" 14 15 "github.com/google/go-cmp/cmp" 16 ) 17 18 func TestIssuesService_ListLabels(t *testing.T) { 19 client, mux, _, teardown := setup() 20 defer teardown() 21 22 mux.HandleFunc("/repos/o/r/labels", func(w http.ResponseWriter, r *http.Request) { 23 testMethod(t, r, "GET") 24 testFormValues(t, r, values{"page": "2"}) 25 fmt.Fprint(w, `[{"name": "a"},{"name": "b"}]`) 26 }) 27 28 opt := &ListOptions{Page: 2} 29 ctx := context.Background() 30 labels, _, err := client.Issues.ListLabels(ctx, "o", "r", opt) 31 if err != nil { 32 t.Errorf("Issues.ListLabels returned error: %v", err) 33 } 34 35 want := []*Label{{Name: String("a")}, {Name: String("b")}} 36 if !cmp.Equal(labels, want) { 37 t.Errorf("Issues.ListLabels returned %+v, want %+v", labels, want) 38 } 39 40 const methodName = "ListLabels" 41 testBadOptions(t, methodName, func() (err error) { 42 _, _, err = client.Issues.ListLabels(ctx, "\n", "\n", opt) 43 return err 44 }) 45 46 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 47 got, resp, err := client.Issues.ListLabels(ctx, "o", "r", opt) 48 if got != nil { 49 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 50 } 51 return resp, err 52 }) 53 } 54 55 func TestIssuesService_ListLabels_invalidOwner(t *testing.T) { 56 client, _, _, teardown := setup() 57 defer teardown() 58 59 ctx := context.Background() 60 _, _, err := client.Issues.ListLabels(ctx, "%", "%", nil) 61 testURLParseError(t, err) 62 } 63 64 func TestIssuesService_GetLabel(t *testing.T) { 65 client, mux, _, teardown := setup() 66 defer teardown() 67 68 mux.HandleFunc("/repos/o/r/labels/n", func(w http.ResponseWriter, r *http.Request) { 69 testMethod(t, r, "GET") 70 fmt.Fprint(w, `{"url":"u", "name": "n", "color": "c", "description": "d"}`) 71 }) 72 73 ctx := context.Background() 74 label, _, err := client.Issues.GetLabel(ctx, "o", "r", "n") 75 if err != nil { 76 t.Errorf("Issues.GetLabel returned error: %v", err) 77 } 78 79 want := &Label{URL: String("u"), Name: String("n"), Color: String("c"), Description: String("d")} 80 if !cmp.Equal(label, want) { 81 t.Errorf("Issues.GetLabel returned %+v, want %+v", label, want) 82 } 83 84 const methodName = "GetLabel" 85 testBadOptions(t, methodName, func() (err error) { 86 _, _, err = client.Issues.GetLabel(ctx, "\n", "\n", "\n") 87 return err 88 }) 89 90 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 91 got, resp, err := client.Issues.GetLabel(ctx, "o", "r", "n") 92 if got != nil { 93 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 94 } 95 return resp, err 96 }) 97 } 98 99 func TestIssuesService_GetLabel_invalidOwner(t *testing.T) { 100 client, _, _, teardown := setup() 101 defer teardown() 102 103 ctx := context.Background() 104 _, _, err := client.Issues.GetLabel(ctx, "%", "%", "%") 105 testURLParseError(t, err) 106 } 107 108 func TestIssuesService_CreateLabel(t *testing.T) { 109 client, mux, _, teardown := setup() 110 defer teardown() 111 112 input := &Label{Name: String("n")} 113 114 mux.HandleFunc("/repos/o/r/labels", func(w http.ResponseWriter, r *http.Request) { 115 v := new(Label) 116 json.NewDecoder(r.Body).Decode(v) 117 118 testMethod(t, r, "POST") 119 if !cmp.Equal(v, input) { 120 t.Errorf("Request body = %+v, want %+v", v, input) 121 } 122 123 fmt.Fprint(w, `{"url":"u"}`) 124 }) 125 126 ctx := context.Background() 127 label, _, err := client.Issues.CreateLabel(ctx, "o", "r", input) 128 if err != nil { 129 t.Errorf("Issues.CreateLabel returned error: %v", err) 130 } 131 132 want := &Label{URL: String("u")} 133 if !cmp.Equal(label, want) { 134 t.Errorf("Issues.CreateLabel returned %+v, want %+v", label, want) 135 } 136 137 const methodName = "CreateLabel" 138 testBadOptions(t, methodName, func() (err error) { 139 _, _, err = client.Issues.CreateLabel(ctx, "\n", "\n", input) 140 return err 141 }) 142 143 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 144 got, resp, err := client.Issues.CreateLabel(ctx, "o", "r", input) 145 if got != nil { 146 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 147 } 148 return resp, err 149 }) 150 } 151 152 func TestIssuesService_CreateLabel_invalidOwner(t *testing.T) { 153 client, _, _, teardown := setup() 154 defer teardown() 155 156 ctx := context.Background() 157 _, _, err := client.Issues.CreateLabel(ctx, "%", "%", nil) 158 testURLParseError(t, err) 159 } 160 161 func TestIssuesService_EditLabel(t *testing.T) { 162 client, mux, _, teardown := setup() 163 defer teardown() 164 165 input := &Label{Name: String("z")} 166 167 mux.HandleFunc("/repos/o/r/labels/n", func(w http.ResponseWriter, r *http.Request) { 168 v := new(Label) 169 json.NewDecoder(r.Body).Decode(v) 170 171 testMethod(t, r, "PATCH") 172 if !cmp.Equal(v, input) { 173 t.Errorf("Request body = %+v, want %+v", v, input) 174 } 175 176 fmt.Fprint(w, `{"url":"u"}`) 177 }) 178 179 ctx := context.Background() 180 label, _, err := client.Issues.EditLabel(ctx, "o", "r", "n", input) 181 if err != nil { 182 t.Errorf("Issues.EditLabel returned error: %v", err) 183 } 184 185 want := &Label{URL: String("u")} 186 if !cmp.Equal(label, want) { 187 t.Errorf("Issues.EditLabel returned %+v, want %+v", label, want) 188 } 189 190 const methodName = "EditLabel" 191 testBadOptions(t, methodName, func() (err error) { 192 _, _, err = client.Issues.EditLabel(ctx, "\n", "\n", "\n", input) 193 return err 194 }) 195 196 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 197 got, resp, err := client.Issues.EditLabel(ctx, "o", "r", "n", input) 198 if got != nil { 199 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 200 } 201 return resp, err 202 }) 203 } 204 205 func TestIssuesService_EditLabel_invalidOwner(t *testing.T) { 206 client, _, _, teardown := setup() 207 defer teardown() 208 209 ctx := context.Background() 210 _, _, err := client.Issues.EditLabel(ctx, "%", "%", "%", nil) 211 testURLParseError(t, err) 212 } 213 214 func TestIssuesService_DeleteLabel(t *testing.T) { 215 client, mux, _, teardown := setup() 216 defer teardown() 217 218 mux.HandleFunc("/repos/o/r/labels/n", func(w http.ResponseWriter, r *http.Request) { 219 testMethod(t, r, "DELETE") 220 }) 221 222 ctx := context.Background() 223 _, err := client.Issues.DeleteLabel(ctx, "o", "r", "n") 224 if err != nil { 225 t.Errorf("Issues.DeleteLabel returned error: %v", err) 226 } 227 228 const methodName = "DeleteLabel" 229 testBadOptions(t, methodName, func() (err error) { 230 _, err = client.Issues.DeleteLabel(ctx, "\n", "\n", "\n") 231 return err 232 }) 233 234 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 235 return client.Issues.DeleteLabel(ctx, "o", "r", "n") 236 }) 237 } 238 239 func TestIssuesService_DeleteLabel_invalidOwner(t *testing.T) { 240 client, _, _, teardown := setup() 241 defer teardown() 242 243 ctx := context.Background() 244 _, err := client.Issues.DeleteLabel(ctx, "%", "%", "%") 245 testURLParseError(t, err) 246 } 247 248 func TestIssuesService_ListLabelsByIssue(t *testing.T) { 249 client, mux, _, teardown := setup() 250 defer teardown() 251 252 mux.HandleFunc("/repos/o/r/issues/1/labels", func(w http.ResponseWriter, r *http.Request) { 253 testMethod(t, r, "GET") 254 testFormValues(t, r, values{"page": "2"}) 255 fmt.Fprint(w, `[{"name":"a","id":1},{"name":"b","id":2}]`) 256 }) 257 258 opt := &ListOptions{Page: 2} 259 ctx := context.Background() 260 labels, _, err := client.Issues.ListLabelsByIssue(ctx, "o", "r", 1, opt) 261 if err != nil { 262 t.Errorf("Issues.ListLabelsByIssue returned error: %v", err) 263 } 264 265 want := []*Label{ 266 {Name: String("a"), ID: Int64(1)}, 267 {Name: String("b"), ID: Int64(2)}, 268 } 269 if !cmp.Equal(labels, want) { 270 t.Errorf("Issues.ListLabelsByIssue returned %+v, want %+v", labels, want) 271 } 272 273 const methodName = "ListLabelsByIssue" 274 testBadOptions(t, methodName, func() (err error) { 275 _, _, err = client.Issues.ListLabelsByIssue(ctx, "\n", "\n", -1, opt) 276 return err 277 }) 278 279 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 280 got, resp, err := client.Issues.ListLabelsByIssue(ctx, "o", "r", 1, opt) 281 if got != nil { 282 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 283 } 284 return resp, err 285 }) 286 } 287 288 func TestIssuesService_ListLabelsByIssue_invalidOwner(t *testing.T) { 289 client, _, _, teardown := setup() 290 defer teardown() 291 292 ctx := context.Background() 293 _, _, err := client.Issues.ListLabelsByIssue(ctx, "%", "%", 1, nil) 294 testURLParseError(t, err) 295 } 296 297 func TestIssuesService_AddLabelsToIssue(t *testing.T) { 298 client, mux, _, teardown := setup() 299 defer teardown() 300 301 input := []string{"a", "b"} 302 303 mux.HandleFunc("/repos/o/r/issues/1/labels", func(w http.ResponseWriter, r *http.Request) { 304 var v []string 305 json.NewDecoder(r.Body).Decode(&v) 306 307 testMethod(t, r, "POST") 308 if !cmp.Equal(v, input) { 309 t.Errorf("Request body = %+v, want %+v", v, input) 310 } 311 312 fmt.Fprint(w, `[{"url":"u"}]`) 313 }) 314 315 ctx := context.Background() 316 labels, _, err := client.Issues.AddLabelsToIssue(ctx, "o", "r", 1, input) 317 if err != nil { 318 t.Errorf("Issues.AddLabelsToIssue returned error: %v", err) 319 } 320 321 want := []*Label{{URL: String("u")}} 322 if !cmp.Equal(labels, want) { 323 t.Errorf("Issues.AddLabelsToIssue returned %+v, want %+v", labels, want) 324 } 325 326 const methodName = "AddLabelsToIssue" 327 testBadOptions(t, methodName, func() (err error) { 328 _, _, err = client.Issues.AddLabelsToIssue(ctx, "\n", "\n", -1, input) 329 return err 330 }) 331 332 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 333 got, resp, err := client.Issues.AddLabelsToIssue(ctx, "o", "r", 1, input) 334 if got != nil { 335 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 336 } 337 return resp, err 338 }) 339 } 340 341 func TestIssuesService_AddLabelsToIssue_invalidOwner(t *testing.T) { 342 client, _, _, teardown := setup() 343 defer teardown() 344 345 ctx := context.Background() 346 _, _, err := client.Issues.AddLabelsToIssue(ctx, "%", "%", 1, nil) 347 testURLParseError(t, err) 348 } 349 350 func TestIssuesService_RemoveLabelForIssue(t *testing.T) { 351 client, mux, _, teardown := setup() 352 defer teardown() 353 354 mux.HandleFunc("/repos/o/r/issues/1/labels/l", func(w http.ResponseWriter, r *http.Request) { 355 testMethod(t, r, "DELETE") 356 }) 357 358 ctx := context.Background() 359 _, err := client.Issues.RemoveLabelForIssue(ctx, "o", "r", 1, "l") 360 if err != nil { 361 t.Errorf("Issues.RemoveLabelForIssue returned error: %v", err) 362 } 363 364 const methodName = "RemoveLabelForIssue" 365 testBadOptions(t, methodName, func() (err error) { 366 _, err = client.Issues.RemoveLabelForIssue(ctx, "\n", "\n", -1, "\n") 367 return err 368 }) 369 370 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 371 return client.Issues.RemoveLabelForIssue(ctx, "o", "r", 1, "l") 372 }) 373 } 374 375 func TestIssuesService_RemoveLabelForIssue_invalidOwner(t *testing.T) { 376 client, _, _, teardown := setup() 377 defer teardown() 378 379 ctx := context.Background() 380 _, err := client.Issues.RemoveLabelForIssue(ctx, "%", "%", 1, "%") 381 testURLParseError(t, err) 382 } 383 384 func TestIssuesService_ReplaceLabelsForIssue(t *testing.T) { 385 client, mux, _, teardown := setup() 386 defer teardown() 387 388 input := []string{"a", "b"} 389 390 mux.HandleFunc("/repos/o/r/issues/1/labels", func(w http.ResponseWriter, r *http.Request) { 391 var v []string 392 json.NewDecoder(r.Body).Decode(&v) 393 394 testMethod(t, r, "PUT") 395 if !cmp.Equal(v, input) { 396 t.Errorf("Request body = %+v, want %+v", v, input) 397 } 398 399 fmt.Fprint(w, `[{"url":"u"}]`) 400 }) 401 402 ctx := context.Background() 403 labels, _, err := client.Issues.ReplaceLabelsForIssue(ctx, "o", "r", 1, input) 404 if err != nil { 405 t.Errorf("Issues.ReplaceLabelsForIssue returned error: %v", err) 406 } 407 408 want := []*Label{{URL: String("u")}} 409 if !cmp.Equal(labels, want) { 410 t.Errorf("Issues.ReplaceLabelsForIssue returned %+v, want %+v", labels, want) 411 } 412 413 const methodName = "ReplaceLabelsForIssue" 414 testBadOptions(t, methodName, func() (err error) { 415 _, _, err = client.Issues.ReplaceLabelsForIssue(ctx, "\n", "\n", -1, input) 416 return err 417 }) 418 419 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 420 got, resp, err := client.Issues.ReplaceLabelsForIssue(ctx, "o", "r", 1, input) 421 if got != nil { 422 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 423 } 424 return resp, err 425 }) 426 } 427 428 func TestIssuesService_ReplaceLabelsForIssue_invalidOwner(t *testing.T) { 429 client, _, _, teardown := setup() 430 defer teardown() 431 432 ctx := context.Background() 433 _, _, err := client.Issues.ReplaceLabelsForIssue(ctx, "%", "%", 1, nil) 434 testURLParseError(t, err) 435 } 436 437 func TestIssuesService_RemoveLabelsForIssue(t *testing.T) { 438 client, mux, _, teardown := setup() 439 defer teardown() 440 441 mux.HandleFunc("/repos/o/r/issues/1/labels", func(w http.ResponseWriter, r *http.Request) { 442 testMethod(t, r, "DELETE") 443 }) 444 445 ctx := context.Background() 446 _, err := client.Issues.RemoveLabelsForIssue(ctx, "o", "r", 1) 447 if err != nil { 448 t.Errorf("Issues.RemoveLabelsForIssue returned error: %v", err) 449 } 450 451 const methodName = "RemoveLabelsForIssue" 452 testBadOptions(t, methodName, func() (err error) { 453 _, err = client.Issues.RemoveLabelsForIssue(ctx, "\n", "\n", -1) 454 return err 455 }) 456 457 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 458 return client.Issues.RemoveLabelsForIssue(ctx, "o", "r", 1) 459 }) 460 } 461 462 func TestIssuesService_RemoveLabelsForIssue_invalidOwner(t *testing.T) { 463 client, _, _, teardown := setup() 464 defer teardown() 465 466 ctx := context.Background() 467 _, err := client.Issues.RemoveLabelsForIssue(ctx, "%", "%", 1) 468 testURLParseError(t, err) 469 } 470 471 func TestIssuesService_ListLabelsForMilestone(t *testing.T) { 472 client, mux, _, teardown := setup() 473 defer teardown() 474 475 mux.HandleFunc("/repos/o/r/milestones/1/labels", func(w http.ResponseWriter, r *http.Request) { 476 testMethod(t, r, "GET") 477 testFormValues(t, r, values{"page": "2"}) 478 fmt.Fprint(w, `[{"name": "a"},{"name": "b"}]`) 479 }) 480 481 opt := &ListOptions{Page: 2} 482 ctx := context.Background() 483 labels, _, err := client.Issues.ListLabelsForMilestone(ctx, "o", "r", 1, opt) 484 if err != nil { 485 t.Errorf("Issues.ListLabelsForMilestone returned error: %v", err) 486 } 487 488 want := []*Label{{Name: String("a")}, {Name: String("b")}} 489 if !cmp.Equal(labels, want) { 490 t.Errorf("Issues.ListLabelsForMilestone returned %+v, want %+v", labels, want) 491 } 492 493 const methodName = "ListLabelsForMilestone" 494 testBadOptions(t, methodName, func() (err error) { 495 _, _, err = client.Issues.ListLabelsForMilestone(ctx, "\n", "\n", -1, opt) 496 return err 497 }) 498 499 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 500 got, resp, err := client.Issues.ListLabelsForMilestone(ctx, "o", "r", 1, opt) 501 if got != nil { 502 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 503 } 504 return resp, err 505 }) 506 } 507 508 func TestIssuesService_ListLabelsForMilestone_invalidOwner(t *testing.T) { 509 client, _, _, teardown := setup() 510 defer teardown() 511 512 ctx := context.Background() 513 _, _, err := client.Issues.ListLabelsForMilestone(ctx, "%", "%", 1, nil) 514 testURLParseError(t, err) 515 } 516 517 func TestLabel_Marshal(t *testing.T) { 518 testJSONMarshal(t, &Label{}, "{}") 519 520 u := &Label{ 521 ID: Int64(1), 522 URL: String("url"), 523 Name: String("name"), 524 Color: String("color"), 525 Description: String("desc"), 526 Default: Bool(false), 527 NodeID: String("nid"), 528 } 529 530 want := `{ 531 "id": 1, 532 "url": "url", 533 "name": "name", 534 "color": "color", 535 "description": "desc", 536 "default": false, 537 "node_id": "nid" 538 }` 539 540 testJSONMarshal(t, u, want) 541 }