github.com/google/go-github/v68@v68.0.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 t.Parallel() 21 client, mux, _ := setup(t) 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: Ptr("updated"), 38 Direction: Ptr("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: Ptr(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 t.Parallel() 70 client, mux, _ := setup(t) 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: Ptr(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 t.Parallel() 106 client, _, _ := setup(t) 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 t.Parallel() 115 client, mux, _ := setup(t) 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: Ptr(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 t.Parallel() 151 client, _, _ := setup(t) 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 t.Parallel() 160 client, mux, _ := setup(t) 161 162 input := &IssueComment{Body: Ptr("b")} 163 164 mux.HandleFunc("/repos/o/r/issues/1/comments", func(w http.ResponseWriter, r *http.Request) { 165 v := new(IssueComment) 166 assertNilError(t, 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: Ptr(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 t.Parallel() 204 client, _, _ := setup(t) 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 t.Parallel() 213 client, mux, _ := setup(t) 214 215 input := &IssueComment{Body: Ptr("b")} 216 217 mux.HandleFunc("/repos/o/r/issues/comments/1", func(w http.ResponseWriter, r *http.Request) { 218 v := new(IssueComment) 219 assertNilError(t, 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: Ptr(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 t.Parallel() 257 client, _, _ := setup(t) 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 t.Parallel() 266 client, mux, _ := setup(t) 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 t.Parallel() 291 client, _, _ := setup(t) 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 t.Parallel() 300 testJSONMarshal(t, &IssueComment{}, "{}") 301 302 u := &IssueComment{ 303 ID: Ptr(int64(1)), 304 NodeID: Ptr("nid"), 305 Body: Ptr("body"), 306 User: &User{ 307 Login: Ptr("l"), 308 ID: Ptr(int64(1)), 309 URL: Ptr("u"), 310 AvatarURL: Ptr("a"), 311 GravatarID: Ptr("g"), 312 Name: Ptr("n"), 313 Company: Ptr("c"), 314 Blog: Ptr("b"), 315 Location: Ptr("l"), 316 Email: Ptr("e"), 317 Hireable: Ptr(true), 318 Bio: Ptr("b"), 319 TwitterUsername: Ptr("t"), 320 PublicRepos: Ptr(1), 321 Followers: Ptr(1), 322 Following: Ptr(1), 323 CreatedAt: &Timestamp{referenceTime}, 324 SuspendedAt: &Timestamp{referenceTime}, 325 }, 326 Reactions: &Reactions{TotalCount: Ptr(1)}, 327 CreatedAt: &Timestamp{referenceTime}, 328 UpdatedAt: &Timestamp{referenceTime}, 329 AuthorAssociation: Ptr("aa"), 330 URL: Ptr("url"), 331 HTMLURL: Ptr("hurl"), 332 IssueURL: Ptr("iurl"), 333 } 334 335 want := `{ 336 "id": 1, 337 "node_id": "nid", 338 "body": "body", 339 "user": { 340 "login": "l", 341 "id": 1, 342 "avatar_url": "a", 343 "gravatar_id": "g", 344 "name": "n", 345 "company": "c", 346 "blog": "b", 347 "location": "l", 348 "email": "e", 349 "hireable": true, 350 "bio": "b", 351 "twitter_username": "t", 352 "public_repos": 1, 353 "followers": 1, 354 "following": 1, 355 "created_at": ` + referenceTimeStr + `, 356 "suspended_at": ` + referenceTimeStr + `, 357 "url": "u" 358 }, 359 "reactions": { 360 "total_count": 1 361 }, 362 "created_at": ` + referenceTimeStr + `, 363 "updated_at": ` + referenceTimeStr + `, 364 "author_association": "aa", 365 "url": "url", 366 "html_url": "hurl", 367 "issue_url": "iurl" 368 }` 369 370 testJSONMarshal(t, u, want) 371 }