github.com/google/go-github/v65@v65.0.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  	client, mux, _, teardown := setup()
    19  	defer teardown()
    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: 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  	client, mux, _, teardown := setup()
    60  	defer teardown()
    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: 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  	client, mux, _, teardown := setup()
   100  	defer teardown()
   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: 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  	testJSONMarshal(t, &Rename{}, "{}")
   135  
   136  	u := &Rename{
   137  		From: String("from"),
   138  		To:   String("to"),
   139  	}
   140  
   141  	want := `{
   142  		"from": "from",
   143  		"to": "to"
   144  	}`
   145  
   146  	testJSONMarshal(t, u, want)
   147  }
   148  
   149  func TestDismissedReview_Marshal(t *testing.T) {
   150  	testJSONMarshal(t, &DismissedReview{}, "{}")
   151  
   152  	u := &DismissedReview{
   153  		State:             String("state"),
   154  		ReviewID:          Int64(1),
   155  		DismissalMessage:  String("dm"),
   156  		DismissalCommitID: String("dcid"),
   157  	}
   158  
   159  	want := `{
   160  		"state": "state",
   161  		"review_id": 1,
   162  		"dismissal_message": "dm",
   163  		"dismissal_commit_id": "dcid"
   164  	}`
   165  
   166  	testJSONMarshal(t, u, want)
   167  }
   168  
   169  func TestIssueEvent_Marshal(t *testing.T) {
   170  	testJSONMarshal(t, &IssueEvent{}, "{}")
   171  
   172  	u := &IssueEvent{
   173  		ID:  Int64(1),
   174  		URL: String("url"),
   175  		Actor: &User{
   176  			Login:           String("l"),
   177  			ID:              Int64(1),
   178  			URL:             String("u"),
   179  			AvatarURL:       String("a"),
   180  			GravatarID:      String("g"),
   181  			Name:            String("n"),
   182  			Company:         String("c"),
   183  			Blog:            String("b"),
   184  			Location:        String("l"),
   185  			Email:           String("e"),
   186  			Hireable:        Bool(true),
   187  			Bio:             String("b"),
   188  			TwitterUsername: String("t"),
   189  			PublicRepos:     Int(1),
   190  			Followers:       Int(1),
   191  			Following:       Int(1),
   192  			CreatedAt:       &Timestamp{referenceTime},
   193  			SuspendedAt:     &Timestamp{referenceTime},
   194  		},
   195  		Event:     String("event"),
   196  		CreatedAt: &Timestamp{referenceTime},
   197  		Issue:     &Issue{ID: Int64(1)},
   198  		Assignee: &User{
   199  			Login:           String("l"),
   200  			ID:              Int64(1),
   201  			URL:             String("u"),
   202  			AvatarURL:       String("a"),
   203  			GravatarID:      String("g"),
   204  			Name:            String("n"),
   205  			Company:         String("c"),
   206  			Blog:            String("b"),
   207  			Location:        String("l"),
   208  			Email:           String("e"),
   209  			Hireable:        Bool(true),
   210  			Bio:             String("b"),
   211  			TwitterUsername: String("t"),
   212  			PublicRepos:     Int(1),
   213  			Followers:       Int(1),
   214  			Following:       Int(1),
   215  			CreatedAt:       &Timestamp{referenceTime},
   216  			SuspendedAt:     &Timestamp{referenceTime},
   217  		},
   218  		Assigner: &User{
   219  			Login:           String("l"),
   220  			ID:              Int64(1),
   221  			URL:             String("u"),
   222  			AvatarURL:       String("a"),
   223  			GravatarID:      String("g"),
   224  			Name:            String("n"),
   225  			Company:         String("c"),
   226  			Blog:            String("b"),
   227  			Location:        String("l"),
   228  			Email:           String("e"),
   229  			Hireable:        Bool(true),
   230  			Bio:             String("b"),
   231  			TwitterUsername: String("t"),
   232  			PublicRepos:     Int(1),
   233  			Followers:       Int(1),
   234  			Following:       Int(1),
   235  			CreatedAt:       &Timestamp{referenceTime},
   236  			SuspendedAt:     &Timestamp{referenceTime},
   237  		},
   238  		CommitID:  String("cid"),
   239  		Milestone: &Milestone{ID: Int64(1)},
   240  		Label:     &Label{ID: Int64(1)},
   241  		Rename: &Rename{
   242  			From: String("from"),
   243  			To:   String("to"),
   244  		},
   245  		LockReason:  String("lr"),
   246  		ProjectCard: &ProjectCard{ID: Int64(1)},
   247  		DismissedReview: &DismissedReview{
   248  			State:             String("state"),
   249  			ReviewID:          Int64(1),
   250  			DismissalMessage:  String("dm"),
   251  			DismissalCommitID: String("dcid"),
   252  		},
   253  		RequestedReviewer: &User{
   254  			Login:           String("l"),
   255  			ID:              Int64(1),
   256  			URL:             String("u"),
   257  			AvatarURL:       String("a"),
   258  			GravatarID:      String("g"),
   259  			Name:            String("n"),
   260  			Company:         String("c"),
   261  			Blog:            String("b"),
   262  			Location:        String("l"),
   263  			Email:           String("e"),
   264  			Hireable:        Bool(true),
   265  			Bio:             String("b"),
   266  			TwitterUsername: String("t"),
   267  			PublicRepos:     Int(1),
   268  			Followers:       Int(1),
   269  			Following:       Int(1),
   270  			CreatedAt:       &Timestamp{referenceTime},
   271  			SuspendedAt:     &Timestamp{referenceTime},
   272  		},
   273  		RequestedTeam: &Team{
   274  			ID:              Int64(1),
   275  			NodeID:          String("n"),
   276  			Name:            String("n"),
   277  			Description:     String("d"),
   278  			URL:             String("u"),
   279  			Slug:            String("s"),
   280  			Permission:      String("p"),
   281  			Privacy:         String("p"),
   282  			MembersCount:    Int(1),
   283  			ReposCount:      Int(1),
   284  			MembersURL:      String("m"),
   285  			RepositoriesURL: String("r"),
   286  			Organization: &Organization{
   287  				Login:     String("l"),
   288  				ID:        Int64(1),
   289  				NodeID:    String("n"),
   290  				AvatarURL: String("a"),
   291  				HTMLURL:   String("h"),
   292  				Name:      String("n"),
   293  				Company:   String("c"),
   294  				Blog:      String("b"),
   295  				Location:  String("l"),
   296  				Email:     String("e"),
   297  			},
   298  			Parent: &Team{
   299  				ID:           Int64(1),
   300  				NodeID:       String("n"),
   301  				Name:         String("n"),
   302  				Description:  String("d"),
   303  				URL:          String("u"),
   304  				Slug:         String("s"),
   305  				Permission:   String("p"),
   306  				Privacy:      String("p"),
   307  				MembersCount: Int(1),
   308  				ReposCount:   Int(1),
   309  			},
   310  			LDAPDN: String("l"),
   311  		},
   312  		PerformedViaGithubApp: &App{
   313  			ID:     Int64(1),
   314  			NodeID: String("n"),
   315  			Owner: &User{
   316  				Login:     String("l"),
   317  				ID:        Int64(1),
   318  				NodeID:    String("n"),
   319  				URL:       String("u"),
   320  				ReposURL:  String("r"),
   321  				EventsURL: String("e"),
   322  				AvatarURL: String("a"),
   323  			},
   324  			Name:        String("n"),
   325  			Description: String("d"),
   326  			HTMLURL:     String("h"),
   327  			ExternalURL: String("u"),
   328  		},
   329  		ReviewRequester: &User{
   330  			Login:           String("l"),
   331  			ID:              Int64(1),
   332  			URL:             String("u"),
   333  			AvatarURL:       String("a"),
   334  			GravatarID:      String("g"),
   335  			Name:            String("n"),
   336  			Company:         String("c"),
   337  			Blog:            String("b"),
   338  			Location:        String("l"),
   339  			Email:           String("e"),
   340  			Hireable:        Bool(true),
   341  			Bio:             String("b"),
   342  			TwitterUsername: String("t"),
   343  			PublicRepos:     Int(1),
   344  			Followers:       Int(1),
   345  			Following:       Int(1),
   346  			CreatedAt:       &Timestamp{referenceTime},
   347  			SuspendedAt:     &Timestamp{referenceTime},
   348  		},
   349  	}
   350  
   351  	want := `{
   352  		"id": 1,
   353  		"url": "url",
   354  		"actor": {
   355  			"login": "l",
   356  			"id": 1,
   357  			"avatar_url": "a",
   358  			"gravatar_id": "g",
   359  			"name": "n",
   360  			"company": "c",
   361  			"blog": "b",
   362  			"location": "l",
   363  			"email": "e",
   364  			"hireable": true,
   365  			"bio": "b",
   366  			"twitter_username": "t",
   367  			"public_repos": 1,
   368  			"followers": 1,
   369  			"following": 1,
   370  			"created_at": ` + referenceTimeStr + `,
   371  			"suspended_at": ` + referenceTimeStr + `,
   372  			"url": "u"
   373  		},
   374  		"event": "event",
   375  		"created_at": ` + referenceTimeStr + `,
   376  		"issue": {
   377  			"id": 1
   378  		},
   379  		"assignee": {
   380  			"login": "l",
   381  			"id": 1,
   382  			"avatar_url": "a",
   383  			"gravatar_id": "g",
   384  			"name": "n",
   385  			"company": "c",
   386  			"blog": "b",
   387  			"location": "l",
   388  			"email": "e",
   389  			"hireable": true,
   390  			"bio": "b",
   391  			"twitter_username": "t",
   392  			"public_repos": 1,
   393  			"followers": 1,
   394  			"following": 1,
   395  			"created_at": ` + referenceTimeStr + `,
   396  			"suspended_at": ` + referenceTimeStr + `,
   397  			"url": "u"
   398  		},
   399  		"assigner": {
   400  			"login": "l",
   401  			"id": 1,
   402  			"avatar_url": "a",
   403  			"gravatar_id": "g",
   404  			"name": "n",
   405  			"company": "c",
   406  			"blog": "b",
   407  			"location": "l",
   408  			"email": "e",
   409  			"hireable": true,
   410  			"bio": "b",
   411  			"twitter_username": "t",
   412  			"public_repos": 1,
   413  			"followers": 1,
   414  			"following": 1,
   415  			"created_at": ` + referenceTimeStr + `,
   416  			"suspended_at": ` + referenceTimeStr + `,
   417  			"url": "u"
   418  		},
   419  		"commit_id": "cid",
   420  		"milestone": {
   421  			"id": 1
   422  		},
   423  		"label": {
   424  			"id": 1
   425  		},
   426  		"rename": {
   427  			"from": "from",
   428  			"to": "to"
   429  		},
   430  		"lock_reason": "lr",
   431  		"project_card": {
   432  			"id": 1
   433  		},
   434  		"dismissed_review": {
   435  			"state": "state",
   436  			"review_id": 1,
   437  			"dismissal_message": "dm",
   438  			"dismissal_commit_id": "dcid"
   439  		},
   440  		"requested_reviewer": {
   441  			"login": "l",
   442  			"id": 1,
   443  			"avatar_url": "a",
   444  			"gravatar_id": "g",
   445  			"name": "n",
   446  			"company": "c",
   447  			"blog": "b",
   448  			"location": "l",
   449  			"email": "e",
   450  			"hireable": true,
   451  			"bio": "b",
   452  			"twitter_username": "t",
   453  			"public_repos": 1,
   454  			"followers": 1,
   455  			"following": 1,
   456  			"created_at": ` + referenceTimeStr + `,
   457  			"suspended_at": ` + referenceTimeStr + `,
   458  			"url": "u"
   459  		},
   460  		"requested_team": {
   461  			"id": 1,
   462  			"node_id": "n",
   463  			"name": "n",
   464  			"description": "d",
   465  			"url": "u",
   466  			"slug": "s",
   467  			"permission": "p",
   468  			"privacy": "p",
   469  			"members_count": 1,
   470  			"repos_count": 1,
   471  			"members_url": "m",
   472  			"repositories_url": "r",
   473  			"organization": {
   474  				"login": "l",
   475  				"id": 1,
   476  				"node_id": "n",
   477  				"avatar_url": "a",
   478  				"html_url": "h",
   479  				"name": "n",
   480  				"company": "c",
   481  				"blog": "b",
   482  				"location": "l",
   483  				"email": "e"
   484  			},
   485  			"parent": {
   486  				"id": 1,
   487  				"node_id": "n",
   488  				"name": "n",
   489  				"description": "d",
   490  				"url": "u",
   491  				"slug": "s",
   492  				"permission": "p",
   493  				"privacy": "p",
   494  				"members_count": 1,
   495  				"repos_count": 1
   496  			},
   497  			"ldap_dn": "l"
   498  		},
   499  		"performed_via_github_app": {
   500  			"id": 1,
   501  			"node_id": "n",
   502  			"owner": {
   503  				"login": "l",
   504  				"id": 1,
   505  				"node_id": "n",
   506  				"url": "u",
   507  				"repos_url": "r",
   508  				"events_url": "e",
   509  				"avatar_url": "a"
   510  			},
   511  			"name": "n",
   512  			"description": "d",
   513  			"html_url": "h",
   514  			"external_url": "u"
   515  		},
   516  		"review_requester": {
   517  			"login": "l",
   518  			"id": 1,
   519  			"avatar_url": "a",
   520  			"gravatar_id": "g",
   521  			"name": "n",
   522  			"company": "c",
   523  			"blog": "b",
   524  			"location": "l",
   525  			"email": "e",
   526  			"hireable": true,
   527  			"bio": "b",
   528  			"twitter_username": "t",
   529  			"public_repos": 1,
   530  			"followers": 1,
   531  			"following": 1,
   532  			"created_at": ` + referenceTimeStr + `,
   533  			"suspended_at": ` + referenceTimeStr + `,
   534  			"url": "u"
   535  		}
   536  	}`
   537  
   538  	testJSONMarshal(t, u, want)
   539  }