1
2
3
4
5
6 package github
7
8 import (
9 "context"
10 "fmt"
11 "net/http"
12 "testing"
13 "time"
14
15 "github.com/google/go-cmp/cmp"
16 )
17
18 func TestRepositoriesService_ListContributorsStats(t *testing.T) {
19 client, mux, _, teardown := setup()
20 defer teardown()
21
22 mux.HandleFunc("/repos/o/r/stats/contributors", func(w http.ResponseWriter, r *http.Request) {
23 testMethod(t, r, "GET")
24
25 fmt.Fprint(w, `
26 [
27 {
28 "author": {
29 "id": 1,
30 "node_id": "nodeid-1"
31 },
32 "total": 135,
33 "weeks": [
34 {
35 "w": 1367712000,
36 "a": 6898,
37 "d": 77,
38 "c": 10
39 }
40 ]
41 }
42 ]
43 `)
44 })
45
46 ctx := context.Background()
47 stats, _, err := client.Repositories.ListContributorsStats(ctx, "o", "r")
48 if err != nil {
49 t.Errorf("RepositoriesService.ListContributorsStats returned error: %v", err)
50 }
51
52 want := []*ContributorStats{
53 {
54 Author: &Contributor{
55 ID: Int64(1),
56 NodeID: String("nodeid-1"),
57 },
58 Total: Int(135),
59 Weeks: []*WeeklyStats{
60 {
61 Week: &Timestamp{time.Date(2013, time.May, 05, 00, 00, 00, 0, time.UTC).Local()},
62 Additions: Int(6898),
63 Deletions: Int(77),
64 Commits: Int(10),
65 },
66 },
67 },
68 }
69
70 if !cmp.Equal(stats, want) {
71 t.Errorf("RepositoriesService.ListContributorsStats returned %+v, want %+v", stats, want)
72 }
73
74 const methodName = "ListContributorsStats"
75 testBadOptions(t, methodName, func() (err error) {
76 _, _, err = client.Repositories.ListContributorsStats(ctx, "\n", "\n")
77 return err
78 })
79
80 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
81 got, resp, err := client.Repositories.ListContributorsStats(ctx, "o", "r")
82 if got != nil {
83 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
84 }
85 return resp, err
86 })
87 }
88
89 func TestRepositoriesService_ListCommitActivity(t *testing.T) {
90 client, mux, _, teardown := setup()
91 defer teardown()
92
93 mux.HandleFunc("/repos/o/r/stats/commit_activity", func(w http.ResponseWriter, r *http.Request) {
94 testMethod(t, r, "GET")
95
96 fmt.Fprint(w, `
97 [
98 {
99 "days": [0, 3, 26, 20, 39, 1, 0],
100 "total": 89,
101 "week": 1336280400
102 }
103 ]
104 `)
105 })
106
107 ctx := context.Background()
108 activity, _, err := client.Repositories.ListCommitActivity(ctx, "o", "r")
109 if err != nil {
110 t.Errorf("RepositoriesService.ListCommitActivity returned error: %v", err)
111 }
112
113 want := []*WeeklyCommitActivity{
114 {
115 Days: []int{0, 3, 26, 20, 39, 1, 0},
116 Total: Int(89),
117 Week: &Timestamp{time.Date(2012, time.May, 06, 05, 00, 00, 0, time.UTC).Local()},
118 },
119 }
120
121 if !cmp.Equal(activity, want) {
122 t.Errorf("RepositoriesService.ListCommitActivity returned %+v, want %+v", activity, want)
123 }
124
125 const methodName = "ListCommitActivity"
126 testBadOptions(t, methodName, func() (err error) {
127 _, _, err = client.Repositories.ListCommitActivity(ctx, "\n", "\n")
128 return err
129 })
130
131 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
132 got, resp, err := client.Repositories.ListCommitActivity(ctx, "o", "r")
133 if got != nil {
134 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
135 }
136 return resp, err
137 })
138 }
139
140 func TestRepositoriesService_ListCodeFrequency(t *testing.T) {
141 client, mux, _, teardown := setup()
142 defer teardown()
143
144 mux.HandleFunc("/repos/o/r/stats/code_frequency", func(w http.ResponseWriter, r *http.Request) {
145 testMethod(t, r, "GET")
146
147 fmt.Fprint(w, `[[1302998400, 1124, -435]]`)
148 })
149
150 ctx := context.Background()
151 code, _, err := client.Repositories.ListCodeFrequency(ctx, "o", "r")
152 if err != nil {
153 t.Errorf("RepositoriesService.ListCodeFrequency returned error: %v", err)
154 }
155
156 want := []*WeeklyStats{{
157 Week: &Timestamp{time.Date(2011, time.April, 17, 00, 00, 00, 0, time.UTC).Local()},
158 Additions: Int(1124),
159 Deletions: Int(-435),
160 }}
161
162 if !cmp.Equal(code, want) {
163 t.Errorf("RepositoriesService.ListCodeFrequency returned %+v, want %+v", code, want)
164 }
165
166 const methodName = "ListCodeFrequency"
167 testBadOptions(t, methodName, func() (err error) {
168 _, _, err = client.Repositories.ListCodeFrequency(ctx, "\n", "\n")
169 return err
170 })
171
172 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
173 got, resp, err := client.Repositories.ListCodeFrequency(ctx, "o", "r")
174 if got != nil {
175 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
176 }
177 return resp, err
178 })
179 }
180
181 func TestRepositoriesService_Participation(t *testing.T) {
182 client, mux, _, teardown := setup()
183 defer teardown()
184
185 mux.HandleFunc("/repos/o/r/stats/participation", func(w http.ResponseWriter, r *http.Request) {
186 testMethod(t, r, "GET")
187
188 fmt.Fprint(w, `
189 {
190 "all": [
191 11,21,15,2,8,1,8,23,17,21,11,10,33,
192 91,38,34,22,23,32,3,43,87,71,18,13,5,
193 13,16,66,27,12,45,110,117,13,8,18,9,19,
194 26,39,12,20,31,46,91,45,10,24,9,29,7
195 ],
196 "owner": [
197 3,2,3,0,2,0,5,14,7,9,1,5,0,
198 48,19,2,0,1,10,2,23,40,35,8,8,2,
199 10,6,30,0,2,9,53,104,3,3,10,4,7,
200 11,21,4,4,22,26,63,11,2,14,1,10,3
201 ]
202 }
203 `)
204 })
205
206 ctx := context.Background()
207 participation, _, err := client.Repositories.ListParticipation(ctx, "o", "r")
208 if err != nil {
209 t.Errorf("RepositoriesService.ListParticipation returned error: %v", err)
210 }
211
212 want := &RepositoryParticipation{
213 All: []int{
214 11, 21, 15, 2, 8, 1, 8, 23, 17, 21, 11, 10, 33,
215 91, 38, 34, 22, 23, 32, 3, 43, 87, 71, 18, 13, 5,
216 13, 16, 66, 27, 12, 45, 110, 117, 13, 8, 18, 9, 19,
217 26, 39, 12, 20, 31, 46, 91, 45, 10, 24, 9, 29, 7,
218 },
219 Owner: []int{
220 3, 2, 3, 0, 2, 0, 5, 14, 7, 9, 1, 5, 0,
221 48, 19, 2, 0, 1, 10, 2, 23, 40, 35, 8, 8, 2,
222 10, 6, 30, 0, 2, 9, 53, 104, 3, 3, 10, 4, 7,
223 11, 21, 4, 4, 22, 26, 63, 11, 2, 14, 1, 10, 3,
224 },
225 }
226
227 if !cmp.Equal(participation, want) {
228 t.Errorf("RepositoriesService.ListParticipation returned %+v, want %+v", participation, want)
229 }
230
231 const methodName = "ListParticipation"
232 testBadOptions(t, methodName, func() (err error) {
233 _, _, err = client.Repositories.ListParticipation(ctx, "\n", "\n")
234 return err
235 })
236
237 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
238 got, resp, err := client.Repositories.ListParticipation(ctx, "o", "r")
239 if got != nil {
240 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
241 }
242 return resp, err
243 })
244 }
245
246 func TestRepositoriesService_ListPunchCard(t *testing.T) {
247 client, mux, _, teardown := setup()
248 defer teardown()
249
250 mux.HandleFunc("/repos/o/r/stats/punch_card", func(w http.ResponseWriter, r *http.Request) {
251 testMethod(t, r, "GET")
252
253 fmt.Fprint(w, `[
254 [0, 0, 5],
255 [0, 1, 43],
256 [0, 2, 21]
257 ]`)
258 })
259
260 ctx := context.Background()
261 card, _, err := client.Repositories.ListPunchCard(ctx, "o", "r")
262 if err != nil {
263 t.Errorf("RepositoriesService.ListPunchCard returned error: %v", err)
264 }
265
266 want := []*PunchCard{
267 {Day: Int(0), Hour: Int(0), Commits: Int(5)},
268 {Day: Int(0), Hour: Int(1), Commits: Int(43)},
269 {Day: Int(0), Hour: Int(2), Commits: Int(21)},
270 }
271
272 if !cmp.Equal(card, want) {
273 t.Errorf("RepositoriesService.ListPunchCard returned %+v, want %+v", card, want)
274 }
275
276 const methodName = "ListPunchCard"
277 testBadOptions(t, methodName, func() (err error) {
278 _, _, err = client.Repositories.ListPunchCard(ctx, "\n", "\n")
279 return err
280 })
281
282 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
283 got, resp, err := client.Repositories.ListPunchCard(ctx, "o", "r")
284 if got != nil {
285 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
286 }
287 return resp, err
288 })
289 }
290
291 func TestRepositoriesService_AcceptedError(t *testing.T) {
292 client, mux, _, teardown := setup()
293 defer teardown()
294
295 mux.HandleFunc("/repos/o/r/stats/contributors", func(w http.ResponseWriter, r *http.Request) {
296 testMethod(t, r, "GET")
297
298 w.WriteHeader(http.StatusAccepted)
299 fmt.Fprint(w, `{"id":1}`)
300 })
301
302 ctx := context.Background()
303 stats, _, err := client.Repositories.ListContributorsStats(ctx, "o", "r")
304 if err == nil {
305 t.Errorf("RepositoriesService.AcceptedError should have returned an error")
306 }
307
308 if _, ok := err.(*AcceptedError); !ok {
309 t.Errorf("RepositoriesService.AcceptedError returned an AcceptedError: %v", err)
310 }
311
312 if stats != nil {
313 t.Errorf("RepositoriesService.AcceptedError expected stats to be nil: %v", stats)
314 }
315
316 const methodName = "ListContributorsStats"
317 testBadOptions(t, methodName, func() (err error) {
318 _, _, err = client.Repositories.ListContributorsStats(ctx, "o", "r")
319 return err
320 })
321
322 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
323 got, resp, err := client.Repositories.ListContributorsStats(ctx, "o", "r")
324 if got != nil {
325 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
326 }
327 return resp, err
328 })
329 }
330
331 func TestRepositoryParticipation_Marshal(t *testing.T) {
332 testJSONMarshal(t, &RepositoryParticipation{}, "{}")
333
334 u := &RepositoryParticipation{
335 All: []int{1},
336 Owner: []int{1},
337 }
338
339 want := `{
340 "all": [1],
341 "owner": [1]
342 }`
343
344 testJSONMarshal(t, u, want)
345 }
346
347 func TestWeeklyCommitActivity_Marshal(t *testing.T) {
348 testJSONMarshal(t, &WeeklyCommitActivity{}, "{}")
349
350 u := &WeeklyCommitActivity{
351 Days: []int{1},
352 Total: Int(1),
353 Week: &Timestamp{referenceTime},
354 }
355
356 want := `{
357 "days": [
358 1
359 ],
360 "total": 1,
361 "week": ` + referenceTimeStr + `
362 }`
363
364 testJSONMarshal(t, u, want)
365 }
366
367 func TestWeeklyStats_Marshal(t *testing.T) {
368 testJSONMarshal(t, &WeeklyStats{}, "{}")
369
370 u := &WeeklyStats{
371 Week: &Timestamp{referenceTime},
372 Additions: Int(1),
373 Deletions: Int(1),
374 Commits: Int(1),
375 }
376
377 want := `{
378 "w": ` + referenceTimeStr + `,
379 "a": 1,
380 "d": 1,
381 "c": 1
382 }`
383
384 testJSONMarshal(t, u, want)
385 }
386
387 func TestContributorStats_Marshal(t *testing.T) {
388 testJSONMarshal(t, &ContributorStats{}, "{}")
389
390 u := &ContributorStats{
391 Author: &Contributor{ID: Int64(1)},
392 Total: Int(1),
393 Weeks: []*WeeklyStats{
394 {
395 Week: &Timestamp{referenceTime},
396 Additions: Int(1),
397 Deletions: Int(1),
398 Commits: Int(1),
399 },
400 },
401 }
402
403 want := `{
404 "author": {
405 "id": 1
406 },
407 "total": 1,
408 "weeks": [
409 {
410 "w": ` + referenceTimeStr + `,
411 "a": 1,
412 "d": 1,
413 "c": 1
414 }
415 ]
416 }`
417
418 testJSONMarshal(t, u, want)
419 }
420
View as plain text