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", mediaTypeGraphQLNodeIDPreview)
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", mediaTypeGraphQLNodeIDPreview)
55		fmt.Fprint(w, `{"url":"u", "name": "n", "color": "c"}`)
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")}
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", mediaTypeGraphQLNodeIDPreview)
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", mediaTypeGraphQLNodeIDPreview)
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", mediaTypeGraphQLNodeIDPreview)
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", mediaTypeGraphQLNodeIDPreview)
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		testMethod(t, r, "DELETE")
253	})
254
255	_, err := client.Issues.RemoveLabelForIssue(context.Background(), "o", "r", 1, "l")
256	if err != nil {
257		t.Errorf("Issues.RemoveLabelForIssue returned error: %v", err)
258	}
259}
260
261func TestIssuesService_RemoveLabelForIssue_invalidOwner(t *testing.T) {
262	client, _, _, teardown := setup()
263	defer teardown()
264
265	_, err := client.Issues.RemoveLabelForIssue(context.Background(), "%", "%", 1, "%")
266	testURLParseError(t, err)
267}
268
269func TestIssuesService_ReplaceLabelsForIssue(t *testing.T) {
270	client, mux, _, teardown := setup()
271	defer teardown()
272
273	input := []string{"a", "b"}
274
275	mux.HandleFunc("/repos/o/r/issues/1/labels", func(w http.ResponseWriter, r *http.Request) {
276		var v []string
277		json.NewDecoder(r.Body).Decode(&v)
278
279		testMethod(t, r, "PUT")
280		testHeader(t, r, "Accept", mediaTypeGraphQLNodeIDPreview)
281		if !reflect.DeepEqual(v, input) {
282			t.Errorf("Request body = %+v, want %+v", v, input)
283		}
284
285		fmt.Fprint(w, `[{"url":"u"}]`)
286	})
287
288	labels, _, err := client.Issues.ReplaceLabelsForIssue(context.Background(), "o", "r", 1, input)
289	if err != nil {
290		t.Errorf("Issues.ReplaceLabelsForIssue returned error: %v", err)
291	}
292
293	want := []*Label{{URL: String("u")}}
294	if !reflect.DeepEqual(labels, want) {
295		t.Errorf("Issues.ReplaceLabelsForIssue returned %+v, want %+v", labels, want)
296	}
297}
298
299func TestIssuesService_ReplaceLabelsForIssue_invalidOwner(t *testing.T) {
300	client, _, _, teardown := setup()
301	defer teardown()
302
303	_, _, err := client.Issues.ReplaceLabelsForIssue(context.Background(), "%", "%", 1, nil)
304	testURLParseError(t, err)
305}
306
307func TestIssuesService_RemoveLabelsForIssue(t *testing.T) {
308	client, mux, _, teardown := setup()
309	defer teardown()
310
311	mux.HandleFunc("/repos/o/r/issues/1/labels", func(w http.ResponseWriter, r *http.Request) {
312		testMethod(t, r, "DELETE")
313	})
314
315	_, err := client.Issues.RemoveLabelsForIssue(context.Background(), "o", "r", 1)
316	if err != nil {
317		t.Errorf("Issues.RemoveLabelsForIssue returned error: %v", err)
318	}
319}
320
321func TestIssuesService_RemoveLabelsForIssue_invalidOwner(t *testing.T) {
322	client, _, _, teardown := setup()
323	defer teardown()
324
325	_, err := client.Issues.RemoveLabelsForIssue(context.Background(), "%", "%", 1)
326	testURLParseError(t, err)
327}
328
329func TestIssuesService_ListLabelsForMilestone(t *testing.T) {
330	client, mux, _, teardown := setup()
331	defer teardown()
332
333	mux.HandleFunc("/repos/o/r/milestones/1/labels", func(w http.ResponseWriter, r *http.Request) {
334		testMethod(t, r, "GET")
335		testHeader(t, r, "Accept", mediaTypeGraphQLNodeIDPreview)
336		testFormValues(t, r, values{"page": "2"})
337		fmt.Fprint(w, `[{"name": "a"},{"name": "b"}]`)
338	})
339
340	opt := &ListOptions{Page: 2}
341	labels, _, err := client.Issues.ListLabelsForMilestone(context.Background(), "o", "r", 1, opt)
342	if err != nil {
343		t.Errorf("Issues.ListLabelsForMilestone returned error: %v", err)
344	}
345
346	want := []*Label{{Name: String("a")}, {Name: String("b")}}
347	if !reflect.DeepEqual(labels, want) {
348		t.Errorf("Issues.ListLabelsForMilestone returned %+v, want %+v", labels, want)
349	}
350}
351
352func TestIssuesService_ListLabelsForMilestone_invalidOwner(t *testing.T) {
353	client, _, _, teardown := setup()
354	defer teardown()
355
356	_, _, err := client.Issues.ListLabelsForMilestone(context.Background(), "%", "%", 1, nil)
357	testURLParseError(t, err)
358}
359