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  }