1// Copyright 2016 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 TestPullRequestsService_ListReviews(t *testing.T) {
18	client, mux, _, teardown := setup()
19	defer teardown()
20
21	mux.HandleFunc("/repos/o/r/pulls/1/reviews", func(w http.ResponseWriter, r *http.Request) {
22		testMethod(t, r, "GET")
23		testFormValues(t, r, values{
24			"page": "2",
25		})
26		fmt.Fprint(w, `[{"id":1},{"id":2}]`)
27	})
28
29	opt := &ListOptions{Page: 2}
30	reviews, _, err := client.PullRequests.ListReviews(context.Background(), "o", "r", 1, opt)
31	if err != nil {
32		t.Errorf("PullRequests.ListReviews returned error: %v", err)
33	}
34
35	want := []*PullRequestReview{
36		{ID: Int64(1)},
37		{ID: Int64(2)},
38	}
39	if !reflect.DeepEqual(reviews, want) {
40		t.Errorf("PullRequests.ListReviews returned %+v, want %+v", reviews, want)
41	}
42}
43
44func TestPullRequestsService_ListReviews_invalidOwner(t *testing.T) {
45	client, _, _, teardown := setup()
46	defer teardown()
47
48	_, _, err := client.PullRequests.ListReviews(context.Background(), "%", "r", 1, nil)
49	testURLParseError(t, err)
50}
51
52func TestPullRequestsService_GetReview(t *testing.T) {
53	client, mux, _, teardown := setup()
54	defer teardown()
55
56	mux.HandleFunc("/repos/o/r/pulls/1/reviews/1", func(w http.ResponseWriter, r *http.Request) {
57		testMethod(t, r, "GET")
58		fmt.Fprint(w, `{"id":1}`)
59	})
60
61	review, _, err := client.PullRequests.GetReview(context.Background(), "o", "r", 1, 1)
62	if err != nil {
63		t.Errorf("PullRequests.GetReview returned error: %v", err)
64	}
65
66	want := &PullRequestReview{ID: Int64(1)}
67	if !reflect.DeepEqual(review, want) {
68		t.Errorf("PullRequests.GetReview returned %+v, want %+v", review, want)
69	}
70}
71
72func TestPullRequestsService_GetReview_invalidOwner(t *testing.T) {
73	client, _, _, teardown := setup()
74	defer teardown()
75
76	_, _, err := client.PullRequests.GetReview(context.Background(), "%", "r", 1, 1)
77	testURLParseError(t, err)
78}
79
80func TestPullRequestsService_DeletePendingReview(t *testing.T) {
81	client, mux, _, teardown := setup()
82	defer teardown()
83
84	mux.HandleFunc("/repos/o/r/pulls/1/reviews/1", func(w http.ResponseWriter, r *http.Request) {
85		testMethod(t, r, "DELETE")
86		fmt.Fprint(w, `{"id":1}`)
87	})
88
89	review, _, err := client.PullRequests.DeletePendingReview(context.Background(), "o", "r", 1, 1)
90	if err != nil {
91		t.Errorf("PullRequests.DeletePendingReview returned error: %v", err)
92	}
93
94	want := &PullRequestReview{ID: Int64(1)}
95	if !reflect.DeepEqual(review, want) {
96		t.Errorf("PullRequests.DeletePendingReview returned %+v, want %+v", review, want)
97	}
98}
99
100func TestPullRequestsService_DeletePendingReview_invalidOwner(t *testing.T) {
101	client, _, _, teardown := setup()
102	defer teardown()
103
104	_, _, err := client.PullRequests.DeletePendingReview(context.Background(), "%", "r", 1, 1)
105	testURLParseError(t, err)
106}
107
108func TestPullRequestsService_ListReviewComments(t *testing.T) {
109	client, mux, _, teardown := setup()
110	defer teardown()
111
112	mux.HandleFunc("/repos/o/r/pulls/1/reviews/1/comments", func(w http.ResponseWriter, r *http.Request) {
113		testMethod(t, r, "GET")
114		fmt.Fprint(w, `[{"id":1},{"id":2}]`)
115	})
116
117	comments, _, err := client.PullRequests.ListReviewComments(context.Background(), "o", "r", 1, 1, nil)
118	if err != nil {
119		t.Errorf("PullRequests.ListReviewComments returned error: %v", err)
120	}
121
122	want := []*PullRequestComment{
123		{ID: Int64(1)},
124		{ID: Int64(2)},
125	}
126	if !reflect.DeepEqual(comments, want) {
127		t.Errorf("PullRequests.ListReviewComments returned %+v, want %+v", comments, want)
128	}
129}
130
131func TestPullRequestsService_ListReviewComments_withOptions(t *testing.T) {
132	client, mux, _, teardown := setup()
133	defer teardown()
134
135	mux.HandleFunc("/repos/o/r/pulls/1/reviews/1/comments", func(w http.ResponseWriter, r *http.Request) {
136		testMethod(t, r, "GET")
137		testFormValues(t, r, values{
138			"page": "2",
139		})
140		fmt.Fprint(w, `[]`)
141	})
142
143	_, _, err := client.PullRequests.ListReviewComments(context.Background(), "o", "r", 1, 1, &ListOptions{Page: 2})
144	if err != nil {
145		t.Errorf("PullRequests.ListReviewComments returned error: %v", err)
146	}
147}
148
149func TestPullRequestsService_ListReviewComments_invalidOwner(t *testing.T) {
150	client, _, _, teardown := setup()
151	defer teardown()
152
153	_, _, err := client.PullRequests.ListReviewComments(context.Background(), "%", "r", 1, 1, nil)
154	testURLParseError(t, err)
155}
156
157func TestPullRequestsService_CreateReview(t *testing.T) {
158	client, mux, _, teardown := setup()
159	defer teardown()
160
161	input := &PullRequestReviewRequest{
162		CommitID: String("commit_id"),
163		Body:     String("b"),
164		Event:    String("APPROVE"),
165	}
166
167	mux.HandleFunc("/repos/o/r/pulls/1/reviews", func(w http.ResponseWriter, r *http.Request) {
168		v := new(PullRequestReviewRequest)
169		json.NewDecoder(r.Body).Decode(v)
170
171		testMethod(t, r, "POST")
172		if !reflect.DeepEqual(v, input) {
173			t.Errorf("Request body = %+v, want %+v", v, input)
174		}
175
176		fmt.Fprint(w, `{"id":1}`)
177	})
178
179	review, _, err := client.PullRequests.CreateReview(context.Background(), "o", "r", 1, input)
180	if err != nil {
181		t.Errorf("PullRequests.CreateReview returned error: %v", err)
182	}
183
184	want := &PullRequestReview{ID: Int64(1)}
185	if !reflect.DeepEqual(review, want) {
186		t.Errorf("PullRequests.CreateReview returned %+v, want %+v", review, want)
187	}
188}
189
190func TestPullRequestsService_CreateReview_invalidOwner(t *testing.T) {
191	client, _, _, teardown := setup()
192	defer teardown()
193
194	_, _, err := client.PullRequests.CreateReview(context.Background(), "%", "r", 1, &PullRequestReviewRequest{})
195	testURLParseError(t, err)
196}
197
198func TestPullRequestsService_UpdateReview(t *testing.T) {
199	client, mux, _, teardown := setup()
200	defer teardown()
201
202	mux.HandleFunc("/repos/o/r/pulls/1/reviews/1", func(w http.ResponseWriter, r *http.Request) {
203		testMethod(t, r, "PUT")
204		fmt.Fprintf(w, `{"id":1}`)
205	})
206
207	got, _, err := client.PullRequests.UpdateReview(context.Background(), "o", "r", 1, 1, "updated_body")
208	if err != nil {
209		t.Errorf("PullRequests.UpdateReview returned error: %v", err)
210	}
211
212	want := &PullRequestReview{ID: Int64(1)}
213	if !reflect.DeepEqual(got, want) {
214		t.Errorf("PullRequests.UpdateReview = %+v, want %+v", got, want)
215	}
216}
217
218func TestPullRequestsService_SubmitReview(t *testing.T) {
219	client, mux, _, teardown := setup()
220	defer teardown()
221
222	input := &PullRequestReviewRequest{
223		Body:  String("b"),
224		Event: String("APPROVE"),
225	}
226
227	mux.HandleFunc("/repos/o/r/pulls/1/reviews/1/events", func(w http.ResponseWriter, r *http.Request) {
228		v := new(PullRequestReviewRequest)
229		json.NewDecoder(r.Body).Decode(v)
230
231		testMethod(t, r, "POST")
232		if !reflect.DeepEqual(v, input) {
233			t.Errorf("Request body = %+v, want %+v", v, input)
234		}
235
236		fmt.Fprint(w, `{"id":1}`)
237	})
238
239	review, _, err := client.PullRequests.SubmitReview(context.Background(), "o", "r", 1, 1, input)
240	if err != nil {
241		t.Errorf("PullRequests.SubmitReview returned error: %v", err)
242	}
243
244	want := &PullRequestReview{ID: Int64(1)}
245	if !reflect.DeepEqual(review, want) {
246		t.Errorf("PullRequests.SubmitReview returned %+v, want %+v", review, want)
247	}
248}
249
250func TestPullRequestsService_SubmitReview_invalidOwner(t *testing.T) {
251	client, _, _, teardown := setup()
252	defer teardown()
253
254	_, _, err := client.PullRequests.SubmitReview(context.Background(), "%", "r", 1, 1, &PullRequestReviewRequest{})
255	testURLParseError(t, err)
256}
257
258func TestPullRequestsService_DismissReview(t *testing.T) {
259	client, mux, _, teardown := setup()
260	defer teardown()
261
262	input := &PullRequestReviewDismissalRequest{Message: String("m")}
263
264	mux.HandleFunc("/repos/o/r/pulls/1/reviews/1/dismissals", func(w http.ResponseWriter, r *http.Request) {
265		v := new(PullRequestReviewDismissalRequest)
266		json.NewDecoder(r.Body).Decode(v)
267
268		testMethod(t, r, "PUT")
269		if !reflect.DeepEqual(v, input) {
270			t.Errorf("Request body = %+v, want %+v", v, input)
271		}
272
273		fmt.Fprint(w, `{"id":1}`)
274	})
275
276	review, _, err := client.PullRequests.DismissReview(context.Background(), "o", "r", 1, 1, input)
277	if err != nil {
278		t.Errorf("PullRequests.DismissReview returned error: %v", err)
279	}
280
281	want := &PullRequestReview{ID: Int64(1)}
282	if !reflect.DeepEqual(review, want) {
283		t.Errorf("PullRequests.DismissReview returned %+v, want %+v", review, want)
284	}
285}
286
287func TestPullRequestsService_DismissReview_invalidOwner(t *testing.T) {
288	client, _, _, teardown := setup()
289	defer teardown()
290
291	_, _, err := client.PullRequests.DismissReview(context.Background(), "%", "r", 1, 1, &PullRequestReviewDismissalRequest{})
292	testURLParseError(t, err)
293}
294