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