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 6package github 7 8import ( 9 "context" 10 "encoding/json" 11 "fmt" 12 "net/http" 13 "reflect" 14 "testing" 15) 16 17func TestIssuesService_ListLabels(t *testing.T) { 18 client, mux, _, teardown := setup() 19 defer teardown() 20 21 mux.HandleFunc("/repos/o/r/labels", func(w http.ResponseWriter, r *http.Request) { 22 testMethod(t, r, "GET") 23 testHeader(t, r, "Accept", mediaTypeLabelDescriptionSearchPreview) 24 testFormValues(t, r, values{"page": "2"}) 25 fmt.Fprint(w, `[{"name": "a"},{"name": "b"}]`) 26 }) 27 28 opt := &ListOptions{Page: 2} 29 labels, _, err := client.Issues.ListLabels(context.Background(), "o", "r", opt) 30 if err != nil { 31 t.Errorf("Issues.ListLabels returned error: %v", err) 32 } 33 34 want := []*Label{{Name: String("a")}, {Name: String("b")}} 35 if !reflect.DeepEqual(labels, want) { 36 t.Errorf("Issues.ListLabels returned %+v, want %+v", labels, want) 37 } 38} 39 40func TestIssuesService_ListLabels_invalidOwner(t *testing.T) { 41 client, _, _, teardown := setup() 42 defer teardown() 43 44 _, _, err := client.Issues.ListLabels(context.Background(), "%", "%", nil) 45 testURLParseError(t, err) 46} 47 48func TestIssuesService_GetLabel(t *testing.T) { 49 client, mux, _, teardown := setup() 50 defer teardown() 51 52 mux.HandleFunc("/repos/o/r/labels/n", func(w http.ResponseWriter, r *http.Request) { 53 testMethod(t, r, "GET") 54 testHeader(t, r, "Accept", mediaTypeLabelDescriptionSearchPreview) 55 fmt.Fprint(w, `{"url":"u", "name": "n", "color": "c", "description": "d"}`) 56 }) 57 58 label, _, err := client.Issues.GetLabel(context.Background(), "o", "r", "n") 59 if err != nil { 60 t.Errorf("Issues.GetLabel returned error: %v", err) 61 } 62 63 want := &Label{URL: String("u"), Name: String("n"), Color: String("c"), Description: String("d")} 64 if !reflect.DeepEqual(label, want) { 65 t.Errorf("Issues.GetLabel returned %+v, want %+v", label, want) 66 } 67} 68 69func TestIssuesService_GetLabel_invalidOwner(t *testing.T) { 70 client, _, _, teardown := setup() 71 defer teardown() 72 73 _, _, err := client.Issues.GetLabel(context.Background(), "%", "%", "%") 74 testURLParseError(t, err) 75} 76 77func TestIssuesService_CreateLabel(t *testing.T) { 78 client, mux, _, teardown := setup() 79 defer teardown() 80 81 input := &Label{Name: String("n")} 82 83 mux.HandleFunc("/repos/o/r/labels", func(w http.ResponseWriter, r *http.Request) { 84 v := new(Label) 85 json.NewDecoder(r.Body).Decode(v) 86 87 testMethod(t, r, "POST") 88 testHeader(t, r, "Accept", mediaTypeLabelDescriptionSearchPreview) 89 if !reflect.DeepEqual(v, input) { 90 t.Errorf("Request body = %+v, want %+v", v, input) 91 } 92 93 fmt.Fprint(w, `{"url":"u"}`) 94 }) 95 96 label, _, err := client.Issues.CreateLabel(context.Background(), "o", "r", input) 97 if err != nil { 98 t.Errorf("Issues.CreateLabel returned error: %v", err) 99 } 100 101 want := &Label{URL: String("u")} 102 if !reflect.DeepEqual(label, want) { 103 t.Errorf("Issues.CreateLabel returned %+v, want %+v", label, want) 104 } 105} 106 107func TestIssuesService_CreateLabel_invalidOwner(t *testing.T) { 108 client, _, _, teardown := setup() 109 defer teardown() 110 111 _, _, err := client.Issues.CreateLabel(context.Background(), "%", "%", nil) 112 testURLParseError(t, err) 113} 114 115func TestIssuesService_EditLabel(t *testing.T) { 116 client, mux, _, teardown := setup() 117 defer teardown() 118 119 input := &Label{Name: String("z")} 120 121 mux.HandleFunc("/repos/o/r/labels/n", func(w http.ResponseWriter, r *http.Request) { 122 v := new(Label) 123 json.NewDecoder(r.Body).Decode(v) 124 125 testMethod(t, r, "PATCH") 126 testHeader(t, r, "Accept", mediaTypeLabelDescriptionSearchPreview) 127 if !reflect.DeepEqual(v, input) { 128 t.Errorf("Request body = %+v, want %+v", v, input) 129 } 130 131 fmt.Fprint(w, `{"url":"u"}`) 132 }) 133 134 label, _, err := client.Issues.EditLabel(context.Background(), "o", "r", "n", input) 135 if err != nil { 136 t.Errorf("Issues.EditLabel returned error: %v", err) 137 } 138 139 want := &Label{URL: String("u")} 140 if !reflect.DeepEqual(label, want) { 141 t.Errorf("Issues.EditLabel returned %+v, want %+v", label, want) 142 } 143} 144 145func TestIssuesService_EditLabel_invalidOwner(t *testing.T) { 146 client, _, _, teardown := setup() 147 defer teardown() 148 149 _, _, err := client.Issues.EditLabel(context.Background(), "%", "%", "%", nil) 150 testURLParseError(t, err) 151} 152 153func TestIssuesService_DeleteLabel(t *testing.T) { 154 client, mux, _, teardown := setup() 155 defer teardown() 156 157 mux.HandleFunc("/repos/o/r/labels/n", func(w http.ResponseWriter, r *http.Request) { 158 testMethod(t, r, "DELETE") 159 }) 160 161 _, err := client.Issues.DeleteLabel(context.Background(), "o", "r", "n") 162 if err != nil { 163 t.Errorf("Issues.DeleteLabel returned error: %v", err) 164 } 165} 166 167func TestIssuesService_DeleteLabel_invalidOwner(t *testing.T) { 168 client, _, _, teardown := setup() 169 defer teardown() 170 171 _, err := client.Issues.DeleteLabel(context.Background(), "%", "%", "%") 172 testURLParseError(t, err) 173} 174 175func TestIssuesService_ListLabelsByIssue(t *testing.T) { 176 client, mux, _, teardown := setup() 177 defer teardown() 178 179 mux.HandleFunc("/repos/o/r/issues/1/labels", func(w http.ResponseWriter, r *http.Request) { 180 testMethod(t, r, "GET") 181 testHeader(t, r, "Accept", mediaTypeLabelDescriptionSearchPreview) 182 testFormValues(t, r, values{"page": "2"}) 183 fmt.Fprint(w, `[{"name":"a","id":1},{"name":"b","id":2}]`) 184 }) 185 186 opt := &ListOptions{Page: 2} 187 labels, _, err := client.Issues.ListLabelsByIssue(context.Background(), "o", "r", 1, opt) 188 if err != nil { 189 t.Errorf("Issues.ListLabelsByIssue returned error: %v", err) 190 } 191 192 want := []*Label{ 193 {Name: String("a"), ID: Int64(1)}, 194 {Name: String("b"), ID: Int64(2)}, 195 } 196 if !reflect.DeepEqual(labels, want) { 197 t.Errorf("Issues.ListLabelsByIssue returned %+v, want %+v", labels, want) 198 } 199} 200 201func TestIssuesService_ListLabelsByIssue_invalidOwner(t *testing.T) { 202 client, _, _, teardown := setup() 203 defer teardown() 204 205 _, _, err := client.Issues.ListLabelsByIssue(context.Background(), "%", "%", 1, nil) 206 testURLParseError(t, err) 207} 208 209func TestIssuesService_AddLabelsToIssue(t *testing.T) { 210 client, mux, _, teardown := setup() 211 defer teardown() 212 213 input := []string{"a", "b"} 214 215 mux.HandleFunc("/repos/o/r/issues/1/labels", func(w http.ResponseWriter, r *http.Request) { 216 var v []string 217 json.NewDecoder(r.Body).Decode(&v) 218 219 testMethod(t, r, "POST") 220 testHeader(t, r, "Accept", mediaTypeLabelDescriptionSearchPreview) 221 if !reflect.DeepEqual(v, input) { 222 t.Errorf("Request body = %+v, want %+v", v, input) 223 } 224 225 fmt.Fprint(w, `[{"url":"u"}]`) 226 }) 227 228 labels, _, err := client.Issues.AddLabelsToIssue(context.Background(), "o", "r", 1, input) 229 if err != nil { 230 t.Errorf("Issues.AddLabelsToIssue returned error: %v", err) 231 } 232 233 want := []*Label{{URL: String("u")}} 234 if !reflect.DeepEqual(labels, want) { 235 t.Errorf("Issues.AddLabelsToIssue returned %+v, want %+v", labels, want) 236 } 237} 238 239func TestIssuesService_AddLabelsToIssue_invalidOwner(t *testing.T) { 240 client, _, _, teardown := setup() 241 defer teardown() 242 243 _, _, err := client.Issues.AddLabelsToIssue(context.Background(), "%", "%", 1, nil) 244 testURLParseError(t, err) 245} 246 247func TestIssuesService_RemoveLabelForIssue(t *testing.T) { 248 client, mux, _, teardown := setup() 249 defer teardown() 250 251 mux.HandleFunc("/repos/o/r/issues/1/labels/l", func(w http.ResponseWriter, r *http.Request) { 252 testHeader(t, r, "Accept", mediaTypeLabelDescriptionSearchPreview) 253 testMethod(t, r, "DELETE") 254 }) 255 256 _, err := client.Issues.RemoveLabelForIssue(context.Background(), "o", "r", 1, "l") 257 if err != nil { 258 t.Errorf("Issues.RemoveLabelForIssue returned error: %v", err) 259 } 260} 261 262func TestIssuesService_RemoveLabelForIssue_invalidOwner(t *testing.T) { 263 client, _, _, teardown := setup() 264 defer teardown() 265 266 _, err := client.Issues.RemoveLabelForIssue(context.Background(), "%", "%", 1, "%") 267 testURLParseError(t, err) 268} 269 270func TestIssuesService_ReplaceLabelsForIssue(t *testing.T) { 271 client, mux, _, teardown := setup() 272 defer teardown() 273 274 input := []string{"a", "b"} 275 276 mux.HandleFunc("/repos/o/r/issues/1/labels", func(w http.ResponseWriter, r *http.Request) { 277 var v []string 278 json.NewDecoder(r.Body).Decode(&v) 279 280 testMethod(t, r, "PUT") 281 testHeader(t, r, "Accept", mediaTypeLabelDescriptionSearchPreview) 282 if !reflect.DeepEqual(v, input) { 283 t.Errorf("Request body = %+v, want %+v", v, input) 284 } 285 286 fmt.Fprint(w, `[{"url":"u"}]`) 287 }) 288 289 labels, _, err := client.Issues.ReplaceLabelsForIssue(context.Background(), "o", "r", 1, input) 290 if err != nil { 291 t.Errorf("Issues.ReplaceLabelsForIssue returned error: %v", err) 292 } 293 294 want := []*Label{{URL: String("u")}} 295 if !reflect.DeepEqual(labels, want) { 296 t.Errorf("Issues.ReplaceLabelsForIssue returned %+v, want %+v", labels, want) 297 } 298} 299 300func TestIssuesService_ReplaceLabelsForIssue_invalidOwner(t *testing.T) { 301 client, _, _, teardown := setup() 302 defer teardown() 303 304 _, _, err := client.Issues.ReplaceLabelsForIssue(context.Background(), "%", "%", 1, nil) 305 testURLParseError(t, err) 306} 307 308func TestIssuesService_RemoveLabelsForIssue(t *testing.T) { 309 client, mux, _, teardown := setup() 310 defer teardown() 311 312 mux.HandleFunc("/repos/o/r/issues/1/labels", func(w http.ResponseWriter, r *http.Request) { 313 testMethod(t, r, "DELETE") 314 testHeader(t, r, "Accept", mediaTypeLabelDescriptionSearchPreview) 315 }) 316 317 _, err := client.Issues.RemoveLabelsForIssue(context.Background(), "o", "r", 1) 318 if err != nil { 319 t.Errorf("Issues.RemoveLabelsForIssue returned error: %v", err) 320 } 321} 322 323func TestIssuesService_RemoveLabelsForIssue_invalidOwner(t *testing.T) { 324 client, _, _, teardown := setup() 325 defer teardown() 326 327 _, err := client.Issues.RemoveLabelsForIssue(context.Background(), "%", "%", 1) 328 testURLParseError(t, err) 329} 330 331func TestIssuesService_ListLabelsForMilestone(t *testing.T) { 332 client, mux, _, teardown := setup() 333 defer teardown() 334 335 mux.HandleFunc("/repos/o/r/milestones/1/labels", func(w http.ResponseWriter, r *http.Request) { 336 testMethod(t, r, "GET") 337 testHeader(t, r, "Accept", mediaTypeLabelDescriptionSearchPreview) 338 testFormValues(t, r, values{"page": "2"}) 339 fmt.Fprint(w, `[{"name": "a"},{"name": "b"}]`) 340 }) 341 342 opt := &ListOptions{Page: 2} 343 labels, _, err := client.Issues.ListLabelsForMilestone(context.Background(), "o", "r", 1, opt) 344 if err != nil { 345 t.Errorf("Issues.ListLabelsForMilestone returned error: %v", err) 346 } 347 348 want := []*Label{{Name: String("a")}, {Name: String("b")}} 349 if !reflect.DeepEqual(labels, want) { 350 t.Errorf("Issues.ListLabelsForMilestone returned %+v, want %+v", labels, want) 351 } 352} 353 354func TestIssuesService_ListLabelsForMilestone_invalidOwner(t *testing.T) { 355 client, _, _, teardown := setup() 356 defer teardown() 357 358 _, _, err := client.Issues.ListLabelsForMilestone(context.Background(), "%", "%", 1, nil) 359 testURLParseError(t, err) 360} 361