github.com/google/go-github/v74@v74.0.0/github/repos_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 15 "github.com/google/go-cmp/cmp" 16 ) 17 18 func TestRepositoriesService_ListComments(t *testing.T) { 19 t.Parallel() 20 client, mux, _ := setup(t) 21 22 mux.HandleFunc("/repos/o/r/comments", func(w http.ResponseWriter, r *http.Request) { 23 testMethod(t, r, "GET") 24 testHeader(t, r, "Accept", mediaTypeReactionsPreview) 25 testFormValues(t, r, values{"page": "2"}) 26 fmt.Fprint(w, `[{"id":1}, {"id":2}]`) 27 }) 28 29 opt := &ListOptions{Page: 2} 30 ctx := context.Background() 31 comments, _, err := client.Repositories.ListComments(ctx, "o", "r", opt) 32 if err != nil { 33 t.Errorf("Repositories.ListComments returned error: %v", err) 34 } 35 36 want := []*RepositoryComment{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}} 37 if !cmp.Equal(comments, want) { 38 t.Errorf("Repositories.ListComments returned %+v, want %+v", comments, want) 39 } 40 41 const methodName = "ListComments" 42 testBadOptions(t, methodName, func() (err error) { 43 _, _, err = client.Repositories.ListComments(ctx, "\n", "\n", opt) 44 return err 45 }) 46 47 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 48 got, resp, err := client.Repositories.ListComments(ctx, "o", "r", opt) 49 if got != nil { 50 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 51 } 52 return resp, err 53 }) 54 } 55 56 func TestRepositoriesService_ListComments_invalidOwner(t *testing.T) { 57 t.Parallel() 58 client, _, _ := setup(t) 59 60 ctx := context.Background() 61 _, _, err := client.Repositories.ListComments(ctx, "%", "%", nil) 62 testURLParseError(t, err) 63 } 64 65 func TestRepositoriesService_ListCommitComments(t *testing.T) { 66 t.Parallel() 67 client, mux, _ := setup(t) 68 69 mux.HandleFunc("/repos/o/r/commits/s/comments", func(w http.ResponseWriter, r *http.Request) { 70 testMethod(t, r, "GET") 71 testHeader(t, r, "Accept", mediaTypeReactionsPreview) 72 testFormValues(t, r, values{"page": "2"}) 73 fmt.Fprint(w, `[{"id":1}, {"id":2}]`) 74 }) 75 76 opt := &ListOptions{Page: 2} 77 ctx := context.Background() 78 comments, _, err := client.Repositories.ListCommitComments(ctx, "o", "r", "s", opt) 79 if err != nil { 80 t.Errorf("Repositories.ListCommitComments returned error: %v", err) 81 } 82 83 want := []*RepositoryComment{{ID: Ptr(int64(1))}, {ID: Ptr(int64(2))}} 84 if !cmp.Equal(comments, want) { 85 t.Errorf("Repositories.ListCommitComments returned %+v, want %+v", comments, want) 86 } 87 88 const methodName = "ListCommitComments" 89 testBadOptions(t, methodName, func() (err error) { 90 _, _, err = client.Repositories.ListCommitComments(ctx, "\n", "\n", "\n", opt) 91 return err 92 }) 93 94 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 95 got, resp, err := client.Repositories.ListCommitComments(ctx, "o", "r", "s", opt) 96 if got != nil { 97 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 98 } 99 return resp, err 100 }) 101 } 102 103 func TestRepositoriesService_ListCommitComments_invalidOwner(t *testing.T) { 104 t.Parallel() 105 client, _, _ := setup(t) 106 107 ctx := context.Background() 108 _, _, err := client.Repositories.ListCommitComments(ctx, "%", "%", "%", nil) 109 testURLParseError(t, err) 110 } 111 112 func TestRepositoriesService_CreateComment(t *testing.T) { 113 t.Parallel() 114 client, mux, _ := setup(t) 115 116 input := &RepositoryComment{Body: Ptr("b")} 117 118 mux.HandleFunc("/repos/o/r/commits/s/comments", func(w http.ResponseWriter, r *http.Request) { 119 v := new(RepositoryComment) 120 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 121 122 testMethod(t, r, "POST") 123 if !cmp.Equal(v, input) { 124 t.Errorf("Request body = %+v, want %+v", v, input) 125 } 126 127 fmt.Fprint(w, `{"id":1}`) 128 }) 129 130 ctx := context.Background() 131 comment, _, err := client.Repositories.CreateComment(ctx, "o", "r", "s", input) 132 if err != nil { 133 t.Errorf("Repositories.CreateComment returned error: %v", err) 134 } 135 136 want := &RepositoryComment{ID: Ptr(int64(1))} 137 if !cmp.Equal(comment, want) { 138 t.Errorf("Repositories.CreateComment returned %+v, want %+v", comment, want) 139 } 140 141 const methodName = "CreateComment" 142 testBadOptions(t, methodName, func() (err error) { 143 _, _, err = client.Repositories.CreateComment(ctx, "\n", "\n", "\n", input) 144 return err 145 }) 146 147 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 148 got, resp, err := client.Repositories.CreateComment(ctx, "o", "r", "s", input) 149 if got != nil { 150 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 151 } 152 return resp, err 153 }) 154 } 155 156 func TestRepositoriesService_CreateComment_invalidOwner(t *testing.T) { 157 t.Parallel() 158 client, _, _ := setup(t) 159 160 ctx := context.Background() 161 _, _, err := client.Repositories.CreateComment(ctx, "%", "%", "%", nil) 162 testURLParseError(t, err) 163 } 164 165 func TestRepositoriesService_GetComment(t *testing.T) { 166 t.Parallel() 167 client, mux, _ := setup(t) 168 169 mux.HandleFunc("/repos/o/r/comments/1", func(w http.ResponseWriter, r *http.Request) { 170 testMethod(t, r, "GET") 171 testHeader(t, r, "Accept", mediaTypeReactionsPreview) 172 fmt.Fprint(w, `{"id":1}`) 173 }) 174 175 ctx := context.Background() 176 comment, _, err := client.Repositories.GetComment(ctx, "o", "r", 1) 177 if err != nil { 178 t.Errorf("Repositories.GetComment returned error: %v", err) 179 } 180 181 want := &RepositoryComment{ID: Ptr(int64(1))} 182 if !cmp.Equal(comment, want) { 183 t.Errorf("Repositories.GetComment returned %+v, want %+v", comment, want) 184 } 185 186 const methodName = "GetComment" 187 testBadOptions(t, methodName, func() (err error) { 188 _, _, err = client.Repositories.GetComment(ctx, "\n", "\n", -1) 189 return err 190 }) 191 192 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 193 got, resp, err := client.Repositories.GetComment(ctx, "o", "r", 1) 194 if got != nil { 195 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 196 } 197 return resp, err 198 }) 199 } 200 201 func TestRepositoriesService_GetComment_invalidOwner(t *testing.T) { 202 t.Parallel() 203 client, _, _ := setup(t) 204 205 ctx := context.Background() 206 _, _, err := client.Repositories.GetComment(ctx, "%", "%", 1) 207 testURLParseError(t, err) 208 } 209 210 func TestRepositoriesService_UpdateComment(t *testing.T) { 211 t.Parallel() 212 client, mux, _ := setup(t) 213 214 input := &RepositoryComment{Body: Ptr("b")} 215 216 mux.HandleFunc("/repos/o/r/comments/1", func(w http.ResponseWriter, r *http.Request) { 217 v := new(RepositoryComment) 218 assertNilError(t, json.NewDecoder(r.Body).Decode(v)) 219 220 testMethod(t, r, "PATCH") 221 if !cmp.Equal(v, input) { 222 t.Errorf("Request body = %+v, want %+v", v, input) 223 } 224 225 fmt.Fprint(w, `{"id":1}`) 226 }) 227 228 ctx := context.Background() 229 comment, _, err := client.Repositories.UpdateComment(ctx, "o", "r", 1, input) 230 if err != nil { 231 t.Errorf("Repositories.UpdateComment returned error: %v", err) 232 } 233 234 want := &RepositoryComment{ID: Ptr(int64(1))} 235 if !cmp.Equal(comment, want) { 236 t.Errorf("Repositories.UpdateComment returned %+v, want %+v", comment, want) 237 } 238 239 const methodName = "UpdateComment" 240 testBadOptions(t, methodName, func() (err error) { 241 _, _, err = client.Repositories.UpdateComment(ctx, "\n", "\n", -1, input) 242 return err 243 }) 244 245 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 246 got, resp, err := client.Repositories.UpdateComment(ctx, "o", "r", 1, input) 247 if got != nil { 248 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 249 } 250 return resp, err 251 }) 252 } 253 254 func TestRepositoriesService_UpdateComment_invalidOwner(t *testing.T) { 255 t.Parallel() 256 client, _, _ := setup(t) 257 258 ctx := context.Background() 259 _, _, err := client.Repositories.UpdateComment(ctx, "%", "%", 1, nil) 260 testURLParseError(t, err) 261 } 262 263 func TestRepositoriesService_DeleteComment(t *testing.T) { 264 t.Parallel() 265 client, mux, _ := setup(t) 266 267 mux.HandleFunc("/repos/o/r/comments/1", func(_ http.ResponseWriter, r *http.Request) { 268 testMethod(t, r, "DELETE") 269 }) 270 271 ctx := context.Background() 272 _, err := client.Repositories.DeleteComment(ctx, "o", "r", 1) 273 if err != nil { 274 t.Errorf("Repositories.DeleteComment returned error: %v", err) 275 } 276 277 const methodName = "DeleteComment" 278 testBadOptions(t, methodName, func() (err error) { 279 _, err = client.Repositories.DeleteComment(ctx, "\n", "\n", 1) 280 return err 281 }) 282 283 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 284 return client.Repositories.DeleteComment(ctx, "o", "r", 1) 285 }) 286 } 287 288 func TestRepositoriesService_DeleteComment_invalidOwner(t *testing.T) { 289 t.Parallel() 290 client, _, _ := setup(t) 291 292 ctx := context.Background() 293 _, err := client.Repositories.DeleteComment(ctx, "%", "%", 1) 294 testURLParseError(t, err) 295 } 296 297 func TestRepositoryComment_Marshal(t *testing.T) { 298 t.Parallel() 299 testJSONMarshal(t, &RepositoryComment{}, "{}") 300 301 r := &RepositoryComment{ 302 HTMLURL: Ptr("hurl"), 303 URL: Ptr("url"), 304 ID: Ptr(int64(1)), 305 NodeID: Ptr("nid"), 306 CommitID: Ptr("cid"), 307 User: &User{ 308 Login: Ptr("l"), 309 ID: Ptr(int64(1)), 310 URL: Ptr("u"), 311 AvatarURL: Ptr("a"), 312 GravatarID: Ptr("g"), 313 Name: Ptr("n"), 314 Company: Ptr("c"), 315 Blog: Ptr("b"), 316 Location: Ptr("l"), 317 Email: Ptr("e"), 318 Hireable: Ptr(true), 319 Bio: Ptr("b"), 320 TwitterUsername: Ptr("t"), 321 PublicRepos: Ptr(1), 322 Followers: Ptr(1), 323 Following: Ptr(1), 324 CreatedAt: &Timestamp{referenceTime}, 325 SuspendedAt: &Timestamp{referenceTime}, 326 }, 327 Reactions: &Reactions{ 328 TotalCount: Ptr(1), 329 PlusOne: Ptr(1), 330 MinusOne: Ptr(1), 331 Laugh: Ptr(1), 332 Confused: Ptr(1), 333 Heart: Ptr(1), 334 Hooray: Ptr(1), 335 Rocket: Ptr(1), 336 Eyes: Ptr(1), 337 URL: Ptr("u"), 338 }, 339 CreatedAt: &Timestamp{referenceTime}, 340 UpdatedAt: &Timestamp{referenceTime}, 341 Body: Ptr("body"), 342 Path: Ptr("path"), 343 Position: Ptr(1), 344 } 345 346 want := `{ 347 "html_url": "hurl", 348 "url": "url", 349 "id": 1, 350 "node_id": "nid", 351 "commit_id": "cid", 352 "user": { 353 "login": "l", 354 "id": 1, 355 "avatar_url": "a", 356 "gravatar_id": "g", 357 "name": "n", 358 "company": "c", 359 "blog": "b", 360 "location": "l", 361 "email": "e", 362 "hireable": true, 363 "bio": "b", 364 "twitter_username": "t", 365 "public_repos": 1, 366 "followers": 1, 367 "following": 1, 368 "created_at": ` + referenceTimeStr + `, 369 "suspended_at": ` + referenceTimeStr + `, 370 "url": "u" 371 }, 372 "reactions": { 373 "total_count": 1, 374 "+1": 1, 375 "-1": 1, 376 "laugh": 1, 377 "confused": 1, 378 "heart": 1, 379 "hooray": 1, 380 "rocket": 1, 381 "eyes": 1, 382 "url": "u" 383 }, 384 "created_at": ` + referenceTimeStr + `, 385 "updated_at": ` + referenceTimeStr + `, 386 "body": "body", 387 "path": "path", 388 "position": 1 389 }` 390 391 testJSONMarshal(t, r, want) 392 }