github.com/google/go-github/v69@v69.2.0/github/issues_events_test.go (about)

     1  // Copyright 2014 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  	"testing"
    13  
    14  	"github.com/google/go-cmp/cmp"
    15  )
    16  
    17  func TestIssuesService_ListIssueEvents(t *testing.T) {
    18  	t.Parallel()
    19  	client, mux, _ := setup(t)
    20  
    21  	mux.HandleFunc("/repos/o/r/issues/1/events", func(w http.ResponseWriter, r *http.Request) {
    22  		testMethod(t, r, "GET")
    23  		testHeader(t, r, "Accept", mediaTypeProjectCardDetailsPreview)
    24  		testFormValues(t, r, values{
    25  			"page":     "1",
    26  			"per_page": "2",
    27  		})
    28  		fmt.Fprint(w, `[{"id":1}]`)
    29  	})
    30  
    31  	opt := &ListOptions{Page: 1, PerPage: 2}
    32  	ctx := context.Background()
    33  	events, _, err := client.Issues.ListIssueEvents(ctx, "o", "r", 1, opt)
    34  	if err != nil {
    35  		t.Errorf("Issues.ListIssueEvents returned error: %v", err)
    36  	}
    37  
    38  	want := []*IssueEvent{{ID: Ptr(int64(1))}}
    39  	if !cmp.Equal(events, want) {
    40  		t.Errorf("Issues.ListIssueEvents returned %+v, want %+v", events, want)
    41  	}
    42  
    43  	const methodName = "ListIssueEvents"
    44  	testBadOptions(t, methodName, func() (err error) {
    45  		_, _, err = client.Issues.ListIssueEvents(ctx, "\n", "\n", -1, &ListOptions{})
    46  		return err
    47  	})
    48  
    49  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    50  		got, resp, err := client.Issues.ListIssueEvents(ctx, "o", "r", 1, nil)
    51  		if got != nil {
    52  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
    53  		}
    54  		return resp, err
    55  	})
    56  }
    57  
    58  func TestIssuesService_ListRepositoryEvents(t *testing.T) {
    59  	t.Parallel()
    60  	client, mux, _ := setup(t)
    61  
    62  	mux.HandleFunc("/repos/o/r/issues/events", func(w http.ResponseWriter, r *http.Request) {
    63  		testMethod(t, r, "GET")
    64  		testFormValues(t, r, values{
    65  			"page":     "1",
    66  			"per_page": "2",
    67  		})
    68  		fmt.Fprint(w, `[{"id":1}]`)
    69  	})
    70  
    71  	opt := &ListOptions{Page: 1, PerPage: 2}
    72  	ctx := context.Background()
    73  	events, _, err := client.Issues.ListRepositoryEvents(ctx, "o", "r", opt)
    74  	if err != nil {
    75  		t.Errorf("Issues.ListRepositoryEvents returned error: %v", err)
    76  	}
    77  
    78  	want := []*IssueEvent{{ID: Ptr(int64(1))}}
    79  	if !cmp.Equal(events, want) {
    80  		t.Errorf("Issues.ListRepositoryEvents returned %+v, want %+v", events, want)
    81  	}
    82  
    83  	const methodName = "ListRepositoryEvents"
    84  	testBadOptions(t, methodName, func() (err error) {
    85  		_, _, err = client.Issues.ListRepositoryEvents(ctx, "\n", "\n", &ListOptions{})
    86  		return err
    87  	})
    88  
    89  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    90  		got, resp, err := client.Issues.ListRepositoryEvents(ctx, "o", "r", nil)
    91  		if got != nil {
    92  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
    93  		}
    94  		return resp, err
    95  	})
    96  }
    97  
    98  func TestIssuesService_GetEvent(t *testing.T) {
    99  	t.Parallel()
   100  	client, mux, _ := setup(t)
   101  
   102  	mux.HandleFunc("/repos/o/r/issues/events/1", func(w http.ResponseWriter, r *http.Request) {
   103  		testMethod(t, r, "GET")
   104  		fmt.Fprint(w, `{"id":1}`)
   105  	})
   106  
   107  	ctx := context.Background()
   108  	event, _, err := client.Issues.GetEvent(ctx, "o", "r", 1)
   109  	if err != nil {
   110  		t.Errorf("Issues.GetEvent returned error: %v", err)
   111  	}
   112  
   113  	want := &IssueEvent{ID: Ptr(int64(1))}
   114  	if !cmp.Equal(event, want) {
   115  		t.Errorf("Issues.GetEvent returned %+v, want %+v", event, want)
   116  	}
   117  
   118  	const methodName = "GetEvent"
   119  	testBadOptions(t, methodName, func() (err error) {
   120  		_, _, err = client.Issues.GetEvent(ctx, "\n", "\n", -1)
   121  		return err
   122  	})
   123  
   124  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   125  		got, resp, err := client.Issues.GetEvent(ctx, "o", "r", 1)
   126  		if got != nil {
   127  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   128  		}
   129  		return resp, err
   130  	})
   131  }
   132  
   133  func TestRename_Marshal(t *testing.T) {
   134  	t.Parallel()
   135  	testJSONMarshal(t, &Rename{}, "{}")
   136  
   137  	u := &Rename{
   138  		From: Ptr("from"),
   139  		To:   Ptr("to"),
   140  	}
   141  
   142  	want := `{
   143  		"from": "from",
   144  		"to": "to"
   145  	}`
   146  
   147  	testJSONMarshal(t, u, want)
   148  }
   149  
   150  func TestDismissedReview_Marshal(t *testing.T) {
   151  	t.Parallel()
   152  	testJSONMarshal(t, &DismissedReview{}, "{}")
   153  
   154  	u := &DismissedReview{
   155  		State:             Ptr("state"),
   156  		ReviewID:          Ptr(int64(1)),
   157  		DismissalMessage:  Ptr("dm"),
   158  		DismissalCommitID: Ptr("dcid"),
   159  	}
   160  
   161  	want := `{
   162  		"state": "state",
   163  		"review_id": 1,
   164  		"dismissal_message": "dm",
   165  		"dismissal_commit_id": "dcid"
   166  	}`
   167  
   168  	testJSONMarshal(t, u, want)
   169  }
   170  
   171  func TestIssueEvent_Marshal(t *testing.T) {
   172  	t.Parallel()
   173  	testJSONMarshal(t, &IssueEvent{}, "{}")
   174  
   175  	u := &IssueEvent{
   176  		ID:  Ptr(int64(1)),
   177  		URL: Ptr("url"),
   178  		Actor: &User{
   179  			Login:           Ptr("l"),
   180  			ID:              Ptr(int64(1)),
   181  			URL:             Ptr("u"),
   182  			AvatarURL:       Ptr("a"),
   183  			GravatarID:      Ptr("g"),
   184  			Name:            Ptr("n"),
   185  			Company:         Ptr("c"),
   186  			Blog:            Ptr("b"),
   187  			Location:        Ptr("l"),
   188  			Email:           Ptr("e"),
   189  			Hireable:        Ptr(true),
   190  			Bio:             Ptr("b"),
   191  			TwitterUsername: Ptr("t"),
   192  			PublicRepos:     Ptr(1),
   193  			Followers:       Ptr(1),
   194  			Following:       Ptr(1),
   195  			CreatedAt:       &Timestamp{referenceTime},
   196  			SuspendedAt:     &Timestamp{referenceTime},
   197  		},
   198  		Event:     Ptr("event"),
   199  		CreatedAt: &Timestamp{referenceTime},
   200  		Issue:     &Issue{ID: Ptr(int64(1))},
   201  		Assignee: &User{
   202  			Login:           Ptr("l"),
   203  			ID:              Ptr(int64(1)),
   204  			URL:             Ptr("u"),
   205  			AvatarURL:       Ptr("a"),
   206  			GravatarID:      Ptr("g"),
   207  			Name:            Ptr("n"),
   208  			Company:         Ptr("c"),
   209  			Blog:            Ptr("b"),
   210  			Location:        Ptr("l"),
   211  			Email:           Ptr("e"),
   212  			Hireable:        Ptr(true),
   213  			Bio:             Ptr("b"),
   214  			TwitterUsername: Ptr("t"),
   215  			PublicRepos:     Ptr(1),
   216  			Followers:       Ptr(1),
   217  			Following:       Ptr(1),
   218  			CreatedAt:       &Timestamp{referenceTime},
   219  			SuspendedAt:     &Timestamp{referenceTime},
   220  		},
   221  		Assigner: &User{
   222  			Login:           Ptr("l"),
   223  			ID:              Ptr(int64(1)),
   224  			URL:             Ptr("u"),
   225  			AvatarURL:       Ptr("a"),
   226  			GravatarID:      Ptr("g"),
   227  			Name:            Ptr("n"),
   228  			Company:         Ptr("c"),
   229  			Blog:            Ptr("b"),
   230  			Location:        Ptr("l"),
   231  			Email:           Ptr("e"),
   232  			Hireable:        Ptr(true),
   233  			Bio:             Ptr("b"),
   234  			TwitterUsername: Ptr("t"),
   235  			PublicRepos:     Ptr(1),
   236  			Followers:       Ptr(1),
   237  			Following:       Ptr(1),
   238  			CreatedAt:       &Timestamp{referenceTime},
   239  			SuspendedAt:     &Timestamp{referenceTime},
   240  		},
   241  		CommitID:  Ptr("cid"),
   242  		Milestone: &Milestone{ID: Ptr(int64(1))},
   243  		Label:     &Label{ID: Ptr(int64(1))},
   244  		Rename: &Rename{
   245  			From: Ptr("from"),
   246  			To:   Ptr("to"),
   247  		},
   248  		LockReason: Ptr("lr"),
   249  		DismissedReview: &DismissedReview{
   250  			State:             Ptr("state"),
   251  			ReviewID:          Ptr(int64(1)),
   252  			DismissalMessage:  Ptr("dm"),
   253  			DismissalCommitID: Ptr("dcid"),
   254  		},
   255  		RequestedReviewer: &User{
   256  			Login:           Ptr("l"),
   257  			ID:              Ptr(int64(1)),
   258  			URL:             Ptr("u"),
   259  			AvatarURL:       Ptr("a"),
   260  			GravatarID:      Ptr("g"),
   261  			Name:            Ptr("n"),
   262  			Company:         Ptr("c"),
   263  			Blog:            Ptr("b"),
   264  			Location:        Ptr("l"),
   265  			Email:           Ptr("e"),
   266  			Hireable:        Ptr(true),
   267  			Bio:             Ptr("b"),
   268  			TwitterUsername: Ptr("t"),
   269  			PublicRepos:     Ptr(1),
   270  			Followers:       Ptr(1),
   271  			Following:       Ptr(1),
   272  			CreatedAt:       &Timestamp{referenceTime},
   273  			SuspendedAt:     &Timestamp{referenceTime},
   274  		},
   275  		RequestedTeam: &Team{
   276  			ID:              Ptr(int64(1)),
   277  			NodeID:          Ptr("n"),
   278  			Name:            Ptr("n"),
   279  			Description:     Ptr("d"),
   280  			URL:             Ptr("u"),
   281  			Slug:            Ptr("s"),
   282  			Permission:      Ptr("p"),
   283  			Privacy:         Ptr("p"),
   284  			MembersCount:    Ptr(1),
   285  			ReposCount:      Ptr(1),
   286  			MembersURL:      Ptr("m"),
   287  			RepositoriesURL: Ptr("r"),
   288  			Organization: &Organization{
   289  				Login:     Ptr("l"),
   290  				ID:        Ptr(int64(1)),
   291  				NodeID:    Ptr("n"),
   292  				AvatarURL: Ptr("a"),
   293  				HTMLURL:   Ptr("h"),
   294  				Name:      Ptr("n"),
   295  				Company:   Ptr("c"),
   296  				Blog:      Ptr("b"),
   297  				Location:  Ptr("l"),
   298  				Email:     Ptr("e"),
   299  			},
   300  			Parent: &Team{
   301  				ID:           Ptr(int64(1)),
   302  				NodeID:       Ptr("n"),
   303  				Name:         Ptr("n"),
   304  				Description:  Ptr("d"),
   305  				URL:          Ptr("u"),
   306  				Slug:         Ptr("s"),
   307  				Permission:   Ptr("p"),
   308  				Privacy:      Ptr("p"),
   309  				MembersCount: Ptr(1),
   310  				ReposCount:   Ptr(1),
   311  			},
   312  			LDAPDN: Ptr("l"),
   313  		},
   314  		PerformedViaGithubApp: &App{
   315  			ID:     Ptr(int64(1)),
   316  			NodeID: Ptr("n"),
   317  			Owner: &User{
   318  				Login:     Ptr("l"),
   319  				ID:        Ptr(int64(1)),
   320  				NodeID:    Ptr("n"),
   321  				URL:       Ptr("u"),
   322  				ReposURL:  Ptr("r"),
   323  				EventsURL: Ptr("e"),
   324  				AvatarURL: Ptr("a"),
   325  			},
   326  			Name:        Ptr("n"),
   327  			Description: Ptr("d"),
   328  			HTMLURL:     Ptr("h"),
   329  			ExternalURL: Ptr("u"),
   330  		},
   331  		ReviewRequester: &User{
   332  			Login:           Ptr("l"),
   333  			ID:              Ptr(int64(1)),
   334  			URL:             Ptr("u"),
   335  			AvatarURL:       Ptr("a"),
   336  			GravatarID:      Ptr("g"),
   337  			Name:            Ptr("n"),
   338  			Company:         Ptr("c"),
   339  			Blog:            Ptr("b"),
   340  			Location:        Ptr("l"),
   341  			Email:           Ptr("e"),
   342  			Hireable:        Ptr(true),
   343  			Bio:             Ptr("b"),
   344  			TwitterUsername: Ptr("t"),
   345  			PublicRepos:     Ptr(1),
   346  			Followers:       Ptr(1),
   347  			Following:       Ptr(1),
   348  			CreatedAt:       &Timestamp{referenceTime},
   349  			SuspendedAt:     &Timestamp{referenceTime},
   350  		},
   351  	}
   352  
   353  	want := `{
   354  		"id": 1,
   355  		"url": "url",
   356  		"actor": {
   357  			"login": "l",
   358  			"id": 1,
   359  			"avatar_url": "a",
   360  			"gravatar_id": "g",
   361  			"name": "n",
   362  			"company": "c",
   363  			"blog": "b",
   364  			"location": "l",
   365  			"email": "e",
   366  			"hireable": true,
   367  			"bio": "b",
   368  			"twitter_username": "t",
   369  			"public_repos": 1,
   370  			"followers": 1,
   371  			"following": 1,
   372  			"created_at": ` + referenceTimeStr + `,
   373  			"suspended_at": ` + referenceTimeStr + `,
   374  			"url": "u"
   375  		},
   376  		"event": "event",
   377  		"created_at": ` + referenceTimeStr + `,
   378  		"issue": {
   379  			"id": 1
   380  		},
   381  		"assignee": {
   382  			"login": "l",
   383  			"id": 1,
   384  			"avatar_url": "a",
   385  			"gravatar_id": "g",
   386  			"name": "n",
   387  			"company": "c",
   388  			"blog": "b",
   389  			"location": "l",
   390  			"email": "e",
   391  			"hireable": true,
   392  			"bio": "b",
   393  			"twitter_username": "t",
   394  			"public_repos": 1,
   395  			"followers": 1,
   396  			"following": 1,
   397  			"created_at": ` + referenceTimeStr + `,
   398  			"suspended_at": ` + referenceTimeStr + `,
   399  			"url": "u"
   400  		},
   401  		"assigner": {
   402  			"login": "l",
   403  			"id": 1,
   404  			"avatar_url": "a",
   405  			"gravatar_id": "g",
   406  			"name": "n",
   407  			"company": "c",
   408  			"blog": "b",
   409  			"location": "l",
   410  			"email": "e",
   411  			"hireable": true,
   412  			"bio": "b",
   413  			"twitter_username": "t",
   414  			"public_repos": 1,
   415  			"followers": 1,
   416  			"following": 1,
   417  			"created_at": ` + referenceTimeStr + `,
   418  			"suspended_at": ` + referenceTimeStr + `,
   419  			"url": "u"
   420  		},
   421  		"commit_id": "cid",
   422  		"milestone": {
   423  			"id": 1
   424  		},
   425  		"label": {
   426  			"id": 1
   427  		},
   428  		"rename": {
   429  			"from": "from",
   430  			"to": "to"
   431  		},
   432  		"lock_reason": "lr",
   433  		"project_card": {
   434  			"id": 1
   435  		},
   436  		"dismissed_review": {
   437  			"state": "state",
   438  			"review_id": 1,
   439  			"dismissal_message": "dm",
   440  			"dismissal_commit_id": "dcid"
   441  		},
   442  		"requested_reviewer": {
   443  			"login": "l",
   444  			"id": 1,
   445  			"avatar_url": "a",
   446  			"gravatar_id": "g",
   447  			"name": "n",
   448  			"company": "c",
   449  			"blog": "b",
   450  			"location": "l",
   451  			"email": "e",
   452  			"hireable": true,
   453  			"bio": "b",
   454  			"twitter_username": "t",
   455  			"public_repos": 1,
   456  			"followers": 1,
   457  			"following": 1,
   458  			"created_at": ` + referenceTimeStr + `,
   459  			"suspended_at": ` + referenceTimeStr + `,
   460  			"url": "u"
   461  		},
   462  		"requested_team": {
   463  			"id": 1,
   464  			"node_id": "n",
   465  			"name": "n",
   466  			"description": "d",
   467  			"url": "u",
   468  			"slug": "s",
   469  			"permission": "p",
   470  			"privacy": "p",
   471  			"members_count": 1,
   472  			"repos_count": 1,
   473  			"members_url": "m",
   474  			"repositories_url": "r",
   475  			"organization": {
   476  				"login": "l",
   477  				"id": 1,
   478  				"node_id": "n",
   479  				"avatar_url": "a",
   480  				"html_url": "h",
   481  				"name": "n",
   482  				"company": "c",
   483  				"blog": "b",
   484  				"location": "l",
   485  				"email": "e"
   486  			},
   487  			"parent": {
   488  				"id": 1,
   489  				"node_id": "n",
   490  				"name": "n",
   491  				"description": "d",
   492  				"url": "u",
   493  				"slug": "s",
   494  				"permission": "p",
   495  				"privacy": "p",
   496  				"members_count": 1,
   497  				"repos_count": 1
   498  			},
   499  			"ldap_dn": "l"
   500  		},
   501  		"performed_via_github_app": {
   502  			"id": 1,
   503  			"node_id": "n",
   504  			"owner": {
   505  				"login": "l",
   506  				"id": 1,
   507  				"node_id": "n",
   508  				"url": "u",
   509  				"repos_url": "r",
   510  				"events_url": "e",
   511  				"avatar_url": "a"
   512  			},
   513  			"name": "n",
   514  			"description": "d",
   515  			"html_url": "h",
   516  			"external_url": "u"
   517  		},
   518  		"review_requester": {
   519  			"login": "l",
   520  			"id": 1,
   521  			"avatar_url": "a",
   522  			"gravatar_id": "g",
   523  			"name": "n",
   524  			"company": "c",
   525  			"blog": "b",
   526  			"location": "l",
   527  			"email": "e",
   528  			"hireable": true,
   529  			"bio": "b",
   530  			"twitter_username": "t",
   531  			"public_repos": 1,
   532  			"followers": 1,
   533  			"following": 1,
   534  			"created_at": ` + referenceTimeStr + `,
   535  			"suspended_at": ` + referenceTimeStr + `,
   536  			"url": "u"
   537  		}
   538  	}`
   539  
   540  	testJSONMarshal(t, u, want)
   541  }