1// Copyright 2014 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_ListMilestones(t *testing.T) {
18	client, mux, _, teardown := setup()
19	defer teardown()
20
21	mux.HandleFunc("/repos/o/r/milestones", func(w http.ResponseWriter, r *http.Request) {
22		testMethod(t, r, "GET")
23		testFormValues(t, r, values{
24			"state":     "closed",
25			"sort":      "due_date",
26			"direction": "asc",
27			"page":      "2",
28		})
29		fmt.Fprint(w, `[{"number":1}]`)
30	})
31
32	opt := &MilestoneListOptions{"closed", "due_date", "asc", ListOptions{Page: 2}}
33	ctx := context.Background()
34	milestones, _, err := client.Issues.ListMilestones(ctx, "o", "r", opt)
35	if err != nil {
36		t.Errorf("IssuesService.ListMilestones returned error: %v", err)
37	}
38
39	want := []*Milestone{{Number: Int(1)}}
40	if !reflect.DeepEqual(milestones, want) {
41		t.Errorf("IssuesService.ListMilestones returned %+v, want %+v", milestones, want)
42	}
43
44	const methodName = "ListMilestones"
45	testBadOptions(t, methodName, func() (err error) {
46		_, _, err = client.Issues.ListMilestones(ctx, "\n", "\n", opt)
47		return err
48	})
49
50	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
51		got, resp, err := client.Issues.ListMilestones(ctx, "o", "r", opt)
52		if got != nil {
53			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
54		}
55		return resp, err
56	})
57}
58
59func TestIssuesService_ListMilestones_invalidOwner(t *testing.T) {
60	client, _, _, teardown := setup()
61	defer teardown()
62
63	ctx := context.Background()
64	_, _, err := client.Issues.ListMilestones(ctx, "%", "r", nil)
65	testURLParseError(t, err)
66}
67
68func TestIssuesService_GetMilestone(t *testing.T) {
69	client, mux, _, teardown := setup()
70	defer teardown()
71
72	mux.HandleFunc("/repos/o/r/milestones/1", func(w http.ResponseWriter, r *http.Request) {
73		testMethod(t, r, "GET")
74		fmt.Fprint(w, `{"number":1}`)
75	})
76
77	ctx := context.Background()
78	milestone, _, err := client.Issues.GetMilestone(ctx, "o", "r", 1)
79	if err != nil {
80		t.Errorf("IssuesService.GetMilestone returned error: %v", err)
81	}
82
83	want := &Milestone{Number: Int(1)}
84	if !reflect.DeepEqual(milestone, want) {
85		t.Errorf("IssuesService.GetMilestone returned %+v, want %+v", milestone, want)
86	}
87
88	const methodName = "GetMilestone"
89	testBadOptions(t, methodName, func() (err error) {
90		_, _, err = client.Issues.GetMilestone(ctx, "\n", "\n", -1)
91		return err
92	})
93
94	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
95		got, resp, err := client.Issues.GetMilestone(ctx, "o", "r", 1)
96		if got != nil {
97			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
98		}
99		return resp, err
100	})
101}
102
103func TestIssuesService_GetMilestone_invalidOwner(t *testing.T) {
104	client, _, _, teardown := setup()
105	defer teardown()
106
107	ctx := context.Background()
108	_, _, err := client.Issues.GetMilestone(ctx, "%", "r", 1)
109	testURLParseError(t, err)
110}
111
112func TestIssuesService_CreateMilestone(t *testing.T) {
113	client, mux, _, teardown := setup()
114	defer teardown()
115
116	input := &Milestone{Title: String("t")}
117
118	mux.HandleFunc("/repos/o/r/milestones", func(w http.ResponseWriter, r *http.Request) {
119		v := new(Milestone)
120		json.NewDecoder(r.Body).Decode(v)
121
122		testMethod(t, r, "POST")
123		if !reflect.DeepEqual(v, input) {
124			t.Errorf("Request body = %+v, want %+v", v, input)
125		}
126
127		fmt.Fprint(w, `{"number":1}`)
128	})
129
130	ctx := context.Background()
131	milestone, _, err := client.Issues.CreateMilestone(ctx, "o", "r", input)
132	if err != nil {
133		t.Errorf("IssuesService.CreateMilestone returned error: %v", err)
134	}
135
136	want := &Milestone{Number: Int(1)}
137	if !reflect.DeepEqual(milestone, want) {
138		t.Errorf("IssuesService.CreateMilestone returned %+v, want %+v", milestone, want)
139	}
140
141	const methodName = "CreateMilestone"
142	testBadOptions(t, methodName, func() (err error) {
143		_, _, err = client.Issues.CreateMilestone(ctx, "\n", "\n", input)
144		return err
145	})
146
147	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
148		got, resp, err := client.Issues.CreateMilestone(ctx, "o", "r", input)
149		if got != nil {
150			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
151		}
152		return resp, err
153	})
154}
155
156func TestIssuesService_CreateMilestone_invalidOwner(t *testing.T) {
157	client, _, _, teardown := setup()
158	defer teardown()
159
160	ctx := context.Background()
161	_, _, err := client.Issues.CreateMilestone(ctx, "%", "r", nil)
162	testURLParseError(t, err)
163}
164
165func TestIssuesService_EditMilestone(t *testing.T) {
166	client, mux, _, teardown := setup()
167	defer teardown()
168
169	input := &Milestone{Title: String("t")}
170
171	mux.HandleFunc("/repos/o/r/milestones/1", func(w http.ResponseWriter, r *http.Request) {
172		v := new(Milestone)
173		json.NewDecoder(r.Body).Decode(v)
174
175		testMethod(t, r, "PATCH")
176		if !reflect.DeepEqual(v, input) {
177			t.Errorf("Request body = %+v, want %+v", v, input)
178		}
179
180		fmt.Fprint(w, `{"number":1}`)
181	})
182
183	ctx := context.Background()
184	milestone, _, err := client.Issues.EditMilestone(ctx, "o", "r", 1, input)
185	if err != nil {
186		t.Errorf("IssuesService.EditMilestone returned error: %v", err)
187	}
188
189	want := &Milestone{Number: Int(1)}
190	if !reflect.DeepEqual(milestone, want) {
191		t.Errorf("IssuesService.EditMilestone returned %+v, want %+v", milestone, want)
192	}
193
194	const methodName = "EditMilestone"
195	testBadOptions(t, methodName, func() (err error) {
196		_, _, err = client.Issues.EditMilestone(ctx, "\n", "\n", -1, input)
197		return err
198	})
199
200	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
201		got, resp, err := client.Issues.EditMilestone(ctx, "o", "r", 1, input)
202		if got != nil {
203			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
204		}
205		return resp, err
206	})
207}
208
209func TestIssuesService_EditMilestone_invalidOwner(t *testing.T) {
210	client, _, _, teardown := setup()
211	defer teardown()
212
213	ctx := context.Background()
214	_, _, err := client.Issues.EditMilestone(ctx, "%", "r", 1, nil)
215	testURLParseError(t, err)
216}
217
218func TestIssuesService_DeleteMilestone(t *testing.T) {
219	client, mux, _, teardown := setup()
220	defer teardown()
221
222	mux.HandleFunc("/repos/o/r/milestones/1", func(w http.ResponseWriter, r *http.Request) {
223		testMethod(t, r, "DELETE")
224	})
225
226	ctx := context.Background()
227	_, err := client.Issues.DeleteMilestone(ctx, "o", "r", 1)
228	if err != nil {
229		t.Errorf("IssuesService.DeleteMilestone returned error: %v", err)
230	}
231
232	const methodName = "DeleteMilestone"
233	testBadOptions(t, methodName, func() (err error) {
234		_, err = client.Issues.DeleteMilestone(ctx, "\n", "\n", -1)
235		return err
236	})
237
238	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
239		return client.Issues.DeleteMilestone(ctx, "o", "r", 1)
240	})
241}
242
243func TestIssuesService_DeleteMilestone_invalidOwner(t *testing.T) {
244	client, _, _, teardown := setup()
245	defer teardown()
246
247	ctx := context.Background()
248	_, err := client.Issues.DeleteMilestone(ctx, "%", "r", 1)
249	testURLParseError(t, err)
250}
251