github.com/google/go-github/v70@v70.0.0/github/issues_timeline_test.go (about) 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 6 package github 7 8 import ( 9 "context" 10 "fmt" 11 "net/http" 12 "strings" 13 "testing" 14 15 "github.com/google/go-cmp/cmp" 16 ) 17 18 func TestIssuesService_ListIssueTimeline(t *testing.T) { 19 t.Parallel() 20 client, mux, _ := setup(t) 21 22 wantAcceptHeaders := []string{mediaTypeTimelinePreview, mediaTypeProjectCardDetailsPreview} 23 mux.HandleFunc("/repos/o/r/issues/1/timeline", func(w http.ResponseWriter, r *http.Request) { 24 testMethod(t, r, "GET") 25 testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", ")) 26 testFormValues(t, r, values{ 27 "page": "1", 28 "per_page": "2", 29 }) 30 fmt.Fprint(w, `[{"id":1}]`) 31 }) 32 33 opt := &ListOptions{Page: 1, PerPage: 2} 34 ctx := context.Background() 35 events, _, err := client.Issues.ListIssueTimeline(ctx, "o", "r", 1, opt) 36 if err != nil { 37 t.Errorf("Issues.ListIssueTimeline returned error: %v", err) 38 } 39 40 want := []*Timeline{{ID: Ptr(int64(1))}} 41 if !cmp.Equal(events, want) { 42 t.Errorf("Issues.ListIssueTimeline = %+v, want %+v", events, want) 43 } 44 45 const methodName = "ListIssueTimeline" 46 testBadOptions(t, methodName, func() (err error) { 47 _, _, err = client.Issues.ListIssueTimeline(ctx, "\n", "\n", -1, opt) 48 return err 49 }) 50 51 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 52 got, resp, err := client.Issues.ListIssueTimeline(ctx, "o", "r", 1, opt) 53 if got != nil { 54 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 55 } 56 return resp, err 57 }) 58 } 59 60 func TestSource_Marshal(t *testing.T) { 61 t.Parallel() 62 testJSONMarshal(t, &Source{}, "{}") 63 64 u := &Source{ 65 ID: Ptr(int64(1)), 66 URL: Ptr("url"), 67 Actor: &User{ 68 Login: Ptr("l"), 69 ID: Ptr(int64(1)), 70 NodeID: Ptr("n"), 71 URL: Ptr("u"), 72 ReposURL: Ptr("r"), 73 EventsURL: Ptr("e"), 74 AvatarURL: Ptr("a"), 75 }, 76 Type: Ptr("type"), 77 Issue: &Issue{ID: Ptr(int64(1))}, 78 } 79 80 want := `{ 81 "id": 1, 82 "url": "url", 83 "actor": { 84 "login": "l", 85 "id": 1, 86 "node_id": "n", 87 "avatar_url": "a", 88 "url": "u", 89 "events_url": "e", 90 "repos_url": "r" 91 }, 92 "type": "type", 93 "issue": { 94 "id": 1 95 } 96 }` 97 98 testJSONMarshal(t, u, want) 99 } 100 101 func TestTimeline_Marshal(t *testing.T) { 102 t.Parallel() 103 testJSONMarshal(t, &Timeline{}, "{}") 104 105 u := &Timeline{ 106 ID: Ptr(int64(1)), 107 URL: Ptr("url"), 108 CommitURL: Ptr("curl"), 109 Actor: &User{ 110 Login: Ptr("l"), 111 ID: Ptr(int64(1)), 112 URL: Ptr("u"), 113 AvatarURL: Ptr("a"), 114 GravatarID: Ptr("g"), 115 Name: Ptr("n"), 116 Company: Ptr("c"), 117 Blog: Ptr("b"), 118 Location: Ptr("l"), 119 Email: Ptr("e"), 120 Hireable: Ptr(true), 121 Bio: Ptr("b"), 122 TwitterUsername: Ptr("t"), 123 PublicRepos: Ptr(1), 124 Followers: Ptr(1), 125 Following: Ptr(1), 126 CreatedAt: &Timestamp{referenceTime}, 127 SuspendedAt: &Timestamp{referenceTime}, 128 }, 129 Event: Ptr("event"), 130 CommitID: Ptr("cid"), 131 CreatedAt: &Timestamp{referenceTime}, 132 Label: &Label{ID: Ptr(int64(1))}, 133 Assignee: &User{ 134 Login: Ptr("l"), 135 ID: Ptr(int64(1)), 136 URL: Ptr("u"), 137 AvatarURL: Ptr("a"), 138 GravatarID: Ptr("g"), 139 Name: Ptr("n"), 140 Company: Ptr("c"), 141 Blog: Ptr("b"), 142 Location: Ptr("l"), 143 Email: Ptr("e"), 144 Hireable: Ptr(true), 145 Bio: Ptr("b"), 146 TwitterUsername: Ptr("t"), 147 PublicRepos: Ptr(1), 148 Followers: Ptr(1), 149 Following: Ptr(1), 150 CreatedAt: &Timestamp{referenceTime}, 151 SuspendedAt: &Timestamp{referenceTime}, 152 }, 153 Milestone: &Milestone{ID: Ptr(int64(1))}, 154 Source: &Source{ 155 ID: Ptr(int64(1)), 156 URL: Ptr("url"), 157 Actor: &User{ 158 Login: Ptr("l"), 159 ID: Ptr(int64(1)), 160 NodeID: Ptr("n"), 161 URL: Ptr("u"), 162 ReposURL: Ptr("r"), 163 EventsURL: Ptr("e"), 164 AvatarURL: Ptr("a"), 165 }, 166 Type: Ptr("type"), 167 Issue: &Issue{ID: Ptr(int64(1))}, 168 }, 169 Rename: &Rename{ 170 From: Ptr("from"), 171 To: Ptr("to"), 172 }, 173 State: Ptr("state"), 174 } 175 176 want := `{ 177 "id": 1, 178 "url": "url", 179 "commit_url": "curl", 180 "actor": { 181 "login": "l", 182 "id": 1, 183 "avatar_url": "a", 184 "gravatar_id": "g", 185 "name": "n", 186 "company": "c", 187 "blog": "b", 188 "location": "l", 189 "email": "e", 190 "hireable": true, 191 "bio": "b", 192 "twitter_username": "t", 193 "public_repos": 1, 194 "followers": 1, 195 "following": 1, 196 "created_at": ` + referenceTimeStr + `, 197 "suspended_at": ` + referenceTimeStr + `, 198 "url": "u" 199 }, 200 "event": "event", 201 "commit_id": "cid", 202 "created_at": ` + referenceTimeStr + `, 203 "label": { 204 "id": 1 205 }, 206 "assignee": { 207 "login": "l", 208 "id": 1, 209 "avatar_url": "a", 210 "gravatar_id": "g", 211 "name": "n", 212 "company": "c", 213 "blog": "b", 214 "location": "l", 215 "email": "e", 216 "hireable": true, 217 "bio": "b", 218 "twitter_username": "t", 219 "public_repos": 1, 220 "followers": 1, 221 "following": 1, 222 "created_at": ` + referenceTimeStr + `, 223 "suspended_at": ` + referenceTimeStr + `, 224 "url": "u" 225 }, 226 "milestone": { 227 "id": 1 228 }, 229 "source": { 230 "id": 1, 231 "url": "url", 232 "actor": { 233 "login": "l", 234 "id": 1, 235 "node_id": "n", 236 "avatar_url": "a", 237 "url": "u", 238 "events_url": "e", 239 "repos_url": "r" 240 }, 241 "type": "type", 242 "issue": { 243 "id": 1 244 } 245 }, 246 "rename": { 247 "from": "from", 248 "to": "to" 249 }, 250 "project_card": { 251 "id": 1 252 }, 253 "state": "state" 254 }` 255 256 testJSONMarshal(t, u, want) 257 } 258 259 func TestTimeline_ReviewRequests(t *testing.T) { 260 t.Parallel() 261 client, mux, _ := setup(t) 262 263 mux.HandleFunc("/repos/example-org/example-repo/issues/3/timeline", func(w http.ResponseWriter, r *http.Request) { 264 testMethod(t, r, "GET") 265 fmt.Fprint(w, `[{ 266 "id": 1234567890, 267 "url": "http://example.com/timeline/1", 268 "actor": { 269 "login": "actor-user", 270 "id": 1 271 }, 272 "event": "review_requested", 273 "created_at": "2006-01-02T15:04:05Z", 274 "requested_reviewer": { 275 "login": "reviewer-user", 276 "id": 2 277 }, 278 "review_requester": { 279 "login": "requester-user", 280 "id": 1 281 } 282 }, 283 { 284 "id": 1234567891, 285 "url": "http://example.com/timeline/2", 286 "actor": { 287 "login": "actor-user", 288 "id": 1 289 }, 290 "event": "review_request_removed", 291 "created_at": "2006-01-02T15:04:05Z", 292 "requested_reviewer": { 293 "login": "reviewer-user", 294 "id": 2 295 } 296 }]`) 297 }) 298 299 ctx := context.Background() 300 events, _, err := client.Issues.ListIssueTimeline(ctx, "example-org", "example-repo", 3, nil) 301 if err != nil { 302 t.Errorf("Issues.ListIssueTimeline returned error: %v", err) 303 } 304 305 want := []*Timeline{ 306 { 307 ID: Ptr(int64(1234567890)), 308 URL: Ptr("http://example.com/timeline/1"), 309 Actor: &User{ 310 Login: Ptr("actor-user"), 311 ID: Ptr(int64(1)), 312 }, 313 Event: Ptr("review_requested"), 314 CreatedAt: &Timestamp{referenceTime}, 315 Reviewer: &User{ 316 Login: Ptr("reviewer-user"), 317 ID: Ptr(int64(2)), 318 }, 319 Requester: &User{ 320 Login: Ptr("requester-user"), 321 ID: Ptr(int64(1)), 322 }, 323 }, 324 { 325 ID: Ptr(int64(1234567891)), 326 URL: Ptr("http://example.com/timeline/2"), 327 Actor: &User{ 328 Login: Ptr("actor-user"), 329 ID: Ptr(int64(1)), 330 }, 331 Event: Ptr("review_request_removed"), 332 CreatedAt: &Timestamp{referenceTime}, 333 Reviewer: &User{ 334 Login: Ptr("reviewer-user"), 335 ID: Ptr(int64(2)), 336 }, 337 }, 338 } 339 340 if !cmp.Equal(events, want) { 341 t.Errorf("Issues.ListIssueTimeline review request events = %+v, want %+v", events, want) 342 diff := cmp.Diff(events, want) 343 t.Errorf("Difference: %s", diff) 344 } 345 }