github.com/google/go-github/v49@v49.1.0/github/issues_comments_test.go (about) 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 6 package github 7 8 import ( 9 "context" 10 "encoding/json" 11 "fmt" 12 "net/http" 13 "testing" 14 "time" 15 16 "github.com/google/go-cmp/cmp" 17 ) 18 19 func TestIssuesService_ListComments_allIssues(t *testing.T) { 20 client, mux, _, teardown := setup() 21 defer teardown() 22 23 mux.HandleFunc("/repos/o/r/issues/comments", func(w http.ResponseWriter, r *http.Request) { 24 testMethod(t, r, "GET") 25 testHeader(t, r, "Accept", mediaTypeReactionsPreview) 26 testFormValues(t, r, values{ 27 "sort": "updated", 28 "direction": "desc", 29 "since": "2002-02-10T15:30:00Z", 30 "page": "2", 31 }) 32 fmt.Fprint(w, `[{"id":1}]`) 33 }) 34 35 since := time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC) 36 opt := &IssueListCommentsOptions{ 37 Sort: String("updated"), 38 Direction: String("desc"), 39 Since: &since, 40 ListOptions: ListOptions{Page: 2}, 41 } 42 ctx := context.Background() 43 comments, _, err := client.Issues.ListComments(ctx, "o", "r", 0, opt) 44 if err != nil { 45 t.Errorf("Issues.ListComments returned error: %v", err) 46 } 47 48 want := []*IssueComment{{ID: Int64(1)}} 49 if !cmp.Equal(comments, want) { 50 t.Errorf("Issues.ListComments returned %+v, want %+v", comments, want) 51 } 52 53 const methodName = "ListComments" 54 testBadOptions(t, methodName, func() (err error) { 55 _, _, err = client.Issues.ListComments(ctx, "\n", "\n", -1, opt) 56 return err 57 }) 58 59 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 60 got, resp, err := client.Issues.ListComments(ctx, "o", "r", 0, opt) 61 if got != nil { 62 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 63 } 64 return resp, err 65 }) 66 } 67 68 func TestIssuesService_ListComments_specificIssue(t *testing.T) { 69 client, mux, _, teardown := setup() 70 defer teardown() 71 72 mux.HandleFunc("/repos/o/r/issues/1/comments", func(w http.ResponseWriter, r *http.Request) { 73 testMethod(t, r, "GET") 74 testHeader(t, r, "Accept", mediaTypeReactionsPreview) 75 fmt.Fprint(w, `[{"id":1}]`) 76 }) 77 78 ctx := context.Background() 79 comments, _, err := client.Issues.ListComments(ctx, "o", "r", 1, nil) 80 if err != nil { 81 t.Errorf("Issues.ListComments returned error: %v", err) 82 } 83 84 want := []*IssueComment{{ID: Int64(1)}} 85 if !cmp.Equal(comments, want) { 86 t.Errorf("Issues.ListComments returned %+v, want %+v", comments, want) 87 } 88 89 const methodName = "ListComments" 90 testBadOptions(t, methodName, func() (err error) { 91 _, _, err = client.Issues.ListComments(ctx, "\n", "\n", -1, nil) 92 return err 93 }) 94 95 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 96 got, resp, err := client.Issues.ListComments(ctx, "o", "r", 1, nil) 97 if got != nil { 98 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 99 } 100 return resp, err 101 }) 102 } 103 104 func TestIssuesService_ListComments_invalidOwner(t *testing.T) { 105 client, _, _, teardown := setup() 106 defer teardown() 107 108 ctx := context.Background() 109 _, _, err := client.Issues.ListComments(ctx, "%", "r", 1, nil) 110 testURLParseError(t, err) 111 } 112 113 func TestIssuesService_GetComment(t *testing.T) { 114 client, mux, _, teardown := setup() 115 defer teardown() 116 117 mux.HandleFunc("/repos/o/r/issues/comments/1", func(w http.ResponseWriter, r *http.Request) { 118 testMethod(t, r, "GET") 119 testHeader(t, r, "Accept", mediaTypeReactionsPreview) 120 fmt.Fprint(w, `{"id":1}`) 121 }) 122 123 ctx := context.Background() 124 comment, _, err := client.Issues.GetComment(ctx, "o", "r", 1) 125 if err != nil { 126 t.Errorf("Issues.GetComment returned error: %v", err) 127 } 128 129 want := &IssueComment{ID: Int64(1)} 130 if !cmp.Equal(comment, want) { 131 t.Errorf("Issues.GetComment returned %+v, want %+v", comment, want) 132 } 133 134 const methodName = "GetComment" 135 testBadOptions(t, methodName, func() (err error) { 136 _, _, err = client.Issues.GetComment(ctx, "\n", "\n", -1) 137 return err 138 }) 139 140 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 141 got, resp, err := client.Issues.GetComment(ctx, "o", "r", 1) 142 if got != nil { 143 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 144 } 145 return resp, err 146 }) 147 } 148 149 func TestIssuesService_GetComment_invalidOrg(t *testing.T) { 150 client, _, _, teardown := setup() 151 defer teardown() 152 153 ctx := context.Background() 154 _, _, err := client.Issues.GetComment(ctx, "%", "r", 1) 155 testURLParseError(t, err) 156 } 157 158 func TestIssuesService_CreateComment(t *testing.T) { 159 client, mux, _, teardown := setup() 160 defer teardown() 161 162 input := &IssueComment{Body: String("b")} 163 164 mux.HandleFunc("/repos/o/r/issues/1/comments", func(w http.ResponseWriter, r *http.Request) { 165 v := new(IssueComment) 166 json.NewDecoder(r.Body).Decode(v) 167 168 testMethod(t, r, "POST") 169 if !cmp.Equal(v, input) { 170 t.Errorf("Request body = %+v, want %+v", v, input) 171 } 172 173 fmt.Fprint(w, `{"id":1}`) 174 }) 175 176 ctx := context.Background() 177 comment, _, err := client.Issues.CreateComment(ctx, "o", "r", 1, input) 178 if err != nil { 179 t.Errorf("Issues.CreateComment returned error: %v", err) 180 } 181 182 want := &IssueComment{ID: Int64(1)} 183 if !cmp.Equal(comment, want) { 184 t.Errorf("Issues.CreateComment returned %+v, want %+v", comment, want) 185 } 186 187 const methodName = "CreateComment" 188 testBadOptions(t, methodName, func() (err error) { 189 _, _, err = client.Issues.CreateComment(ctx, "\n", "\n", -1, input) 190 return err 191 }) 192 193 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 194 got, resp, err := client.Issues.CreateComment(ctx, "o", "r", 1, input) 195 if got != nil { 196 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 197 } 198 return resp, err 199 }) 200 } 201 202 func TestIssuesService_CreateComment_invalidOrg(t *testing.T) { 203 client, _, _, teardown := setup() 204 defer teardown() 205 206 ctx := context.Background() 207 _, _, err := client.Issues.CreateComment(ctx, "%", "r", 1, nil) 208 testURLParseError(t, err) 209 } 210 211 func TestIssuesService_EditComment(t *testing.T) { 212 client, mux, _, teardown := setup() 213 defer teardown() 214 215 input := &IssueComment{Body: String("b")} 216 217 mux.HandleFunc("/repos/o/r/issues/comments/1", func(w http.ResponseWriter, r *http.Request) { 218 v := new(IssueComment) 219 json.NewDecoder(r.Body).Decode(v) 220 221 testMethod(t, r, "PATCH") 222 if !cmp.Equal(v, input) { 223 t.Errorf("Request body = %+v, want %+v", v, input) 224 } 225 226 fmt.Fprint(w, `{"id":1}`) 227 }) 228 229 ctx := context.Background() 230 comment, _, err := client.Issues.EditComment(ctx, "o", "r", 1, input) 231 if err != nil { 232 t.Errorf("Issues.EditComment returned error: %v", err) 233 } 234 235 want := &IssueComment{ID: Int64(1)} 236 if !cmp.Equal(comment, want) { 237 t.Errorf("Issues.EditComment returned %+v, want %+v", comment, want) 238 } 239 240 const methodName = "EditComment" 241 testBadOptions(t, methodName, func() (err error) { 242 _, _, err = client.Issues.EditComment(ctx, "\n", "\n", -1, input) 243 return err 244 }) 245 246 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 247 got, resp, err := client.Issues.EditComment(ctx, "o", "r", 1, input) 248 if got != nil { 249 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 250 } 251 return resp, err 252 }) 253 } 254 255 func TestIssuesService_EditComment_invalidOwner(t *testing.T) { 256 client, _, _, teardown := setup() 257 defer teardown() 258 259 ctx := context.Background() 260 _, _, err := client.Issues.EditComment(ctx, "%", "r", 1, nil) 261 testURLParseError(t, err) 262 } 263 264 func TestIssuesService_DeleteComment(t *testing.T) { 265 client, mux, _, teardown := setup() 266 defer teardown() 267 268 mux.HandleFunc("/repos/o/r/issues/comments/1", func(w http.ResponseWriter, r *http.Request) { 269 testMethod(t, r, "DELETE") 270 }) 271 272 ctx := context.Background() 273 _, err := client.Issues.DeleteComment(ctx, "o", "r", 1) 274 if err != nil { 275 t.Errorf("Issues.DeleteComments returned error: %v", err) 276 } 277 278 const methodName = "DeleteComment" 279 testBadOptions(t, methodName, func() (err error) { 280 _, err = client.Issues.DeleteComment(ctx, "\n", "\n", -1) 281 return err 282 }) 283 284 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 285 return client.Issues.DeleteComment(ctx, "o", "r", 1) 286 }) 287 } 288 289 func TestIssuesService_DeleteComment_invalidOwner(t *testing.T) { 290 client, _, _, teardown := setup() 291 defer teardown() 292 293 ctx := context.Background() 294 _, err := client.Issues.DeleteComment(ctx, "%", "r", 1) 295 testURLParseError(t, err) 296 } 297 298 func TestIssueComment_Marshal(t *testing.T) { 299 testJSONMarshal(t, &IssueComment{}, "{}") 300 301 u := &IssueComment{ 302 ID: Int64(1), 303 NodeID: String("nid"), 304 Body: String("body"), 305 User: &User{ 306 Login: String("l"), 307 ID: Int64(1), 308 URL: String("u"), 309 AvatarURL: String("a"), 310 GravatarID: String("g"), 311 Name: String("n"), 312 Company: String("c"), 313 Blog: String("b"), 314 Location: String("l"), 315 Email: String("e"), 316 Hireable: Bool(true), 317 Bio: String("b"), 318 TwitterUsername: String("t"), 319 PublicRepos: Int(1), 320 Followers: Int(1), 321 Following: Int(1), 322 CreatedAt: &Timestamp{referenceTime}, 323 SuspendedAt: &Timestamp{referenceTime}, 324 }, 325 Reactions: &Reactions{TotalCount: Int(1)}, 326 CreatedAt: &referenceTime, 327 UpdatedAt: &referenceTime, 328 AuthorAssociation: String("aa"), 329 URL: String("url"), 330 HTMLURL: String("hurl"), 331 IssueURL: String("iurl"), 332 } 333 334 want := `{ 335 "id": 1, 336 "node_id": "nid", 337 "body": "body", 338 "user": { 339 "login": "l", 340 "id": 1, 341 "avatar_url": "a", 342 "gravatar_id": "g", 343 "name": "n", 344 "company": "c", 345 "blog": "b", 346 "location": "l", 347 "email": "e", 348 "hireable": true, 349 "bio": "b", 350 "twitter_username": "t", 351 "public_repos": 1, 352 "followers": 1, 353 "following": 1, 354 "created_at": ` + referenceTimeStr + `, 355 "suspended_at": ` + referenceTimeStr + `, 356 "url": "u" 357 }, 358 "reactions": { 359 "total_count": 1 360 }, 361 "created_at": ` + referenceTimeStr + `, 362 "updated_at": ` + referenceTimeStr + `, 363 "author_association": "aa", 364 "url": "url", 365 "html_url": "hurl", 366 "issue_url": "iurl" 367 }` 368 369 testJSONMarshal(t, u, want) 370 }