github.com/google/go-github/v70@v70.0.0/github/issues_timeline_test.go (about)

     1  // Copyright 2016 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  	"strings"
    13  	"testing"
    14  
    15  	"github.com/google/go-cmp/cmp"
    16  )
    17  
    18  func TestIssuesService_ListIssueTimeline(t *testing.T) {
    19  	t.Parallel()
    20  	client, mux, _ := setup(t)
    21  
    22  	wantAcceptHeaders := []string{mediaTypeTimelinePreview, mediaTypeProjectCardDetailsPreview}
    23  	mux.HandleFunc("/repos/o/r/issues/1/timeline", func(w http.ResponseWriter, r *http.Request) {
    24  		testMethod(t, r, "GET")
    25  		testHeader(t, r, "Accept", strings.Join(wantAcceptHeaders, ", "))
    26  		testFormValues(t, r, values{
    27  			"page":     "1",
    28  			"per_page": "2",
    29  		})
    30  		fmt.Fprint(w, `[{"id":1}]`)
    31  	})
    32  
    33  	opt := &ListOptions{Page: 1, PerPage: 2}
    34  	ctx := context.Background()
    35  	events, _, err := client.Issues.ListIssueTimeline(ctx, "o", "r", 1, opt)
    36  	if err != nil {
    37  		t.Errorf("Issues.ListIssueTimeline returned error: %v", err)
    38  	}
    39  
    40  	want := []*Timeline{{ID: Ptr(int64(1))}}
    41  	if !cmp.Equal(events, want) {
    42  		t.Errorf("Issues.ListIssueTimeline = %+v, want %+v", events, want)
    43  	}
    44  
    45  	const methodName = "ListIssueTimeline"
    46  	testBadOptions(t, methodName, func() (err error) {
    47  		_, _, err = client.Issues.ListIssueTimeline(ctx, "\n", "\n", -1, opt)
    48  		return err
    49  	})
    50  
    51  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    52  		got, resp, err := client.Issues.ListIssueTimeline(ctx, "o", "r", 1, opt)
    53  		if got != nil {
    54  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
    55  		}
    56  		return resp, err
    57  	})
    58  }
    59  
    60  func TestSource_Marshal(t *testing.T) {
    61  	t.Parallel()
    62  	testJSONMarshal(t, &Source{}, "{}")
    63  
    64  	u := &Source{
    65  		ID:  Ptr(int64(1)),
    66  		URL: Ptr("url"),
    67  		Actor: &User{
    68  			Login:     Ptr("l"),
    69  			ID:        Ptr(int64(1)),
    70  			NodeID:    Ptr("n"),
    71  			URL:       Ptr("u"),
    72  			ReposURL:  Ptr("r"),
    73  			EventsURL: Ptr("e"),
    74  			AvatarURL: Ptr("a"),
    75  		},
    76  		Type:  Ptr("type"),
    77  		Issue: &Issue{ID: Ptr(int64(1))},
    78  	}
    79  
    80  	want := `{
    81  		"id": 1,
    82  		"url": "url",
    83  		"actor": {
    84  			"login": "l",
    85  			"id": 1,
    86  			"node_id": "n",
    87  			"avatar_url": "a",
    88  			"url": "u",
    89  			"events_url": "e",
    90  			"repos_url": "r"
    91  		},
    92  		"type": "type",
    93  		"issue": {
    94  			"id": 1
    95  		}
    96  	}`
    97  
    98  	testJSONMarshal(t, u, want)
    99  }
   100  
   101  func TestTimeline_Marshal(t *testing.T) {
   102  	t.Parallel()
   103  	testJSONMarshal(t, &Timeline{}, "{}")
   104  
   105  	u := &Timeline{
   106  		ID:        Ptr(int64(1)),
   107  		URL:       Ptr("url"),
   108  		CommitURL: Ptr("curl"),
   109  		Actor: &User{
   110  			Login:           Ptr("l"),
   111  			ID:              Ptr(int64(1)),
   112  			URL:             Ptr("u"),
   113  			AvatarURL:       Ptr("a"),
   114  			GravatarID:      Ptr("g"),
   115  			Name:            Ptr("n"),
   116  			Company:         Ptr("c"),
   117  			Blog:            Ptr("b"),
   118  			Location:        Ptr("l"),
   119  			Email:           Ptr("e"),
   120  			Hireable:        Ptr(true),
   121  			Bio:             Ptr("b"),
   122  			TwitterUsername: Ptr("t"),
   123  			PublicRepos:     Ptr(1),
   124  			Followers:       Ptr(1),
   125  			Following:       Ptr(1),
   126  			CreatedAt:       &Timestamp{referenceTime},
   127  			SuspendedAt:     &Timestamp{referenceTime},
   128  		},
   129  		Event:     Ptr("event"),
   130  		CommitID:  Ptr("cid"),
   131  		CreatedAt: &Timestamp{referenceTime},
   132  		Label:     &Label{ID: Ptr(int64(1))},
   133  		Assignee: &User{
   134  			Login:           Ptr("l"),
   135  			ID:              Ptr(int64(1)),
   136  			URL:             Ptr("u"),
   137  			AvatarURL:       Ptr("a"),
   138  			GravatarID:      Ptr("g"),
   139  			Name:            Ptr("n"),
   140  			Company:         Ptr("c"),
   141  			Blog:            Ptr("b"),
   142  			Location:        Ptr("l"),
   143  			Email:           Ptr("e"),
   144  			Hireable:        Ptr(true),
   145  			Bio:             Ptr("b"),
   146  			TwitterUsername: Ptr("t"),
   147  			PublicRepos:     Ptr(1),
   148  			Followers:       Ptr(1),
   149  			Following:       Ptr(1),
   150  			CreatedAt:       &Timestamp{referenceTime},
   151  			SuspendedAt:     &Timestamp{referenceTime},
   152  		},
   153  		Milestone: &Milestone{ID: Ptr(int64(1))},
   154  		Source: &Source{
   155  			ID:  Ptr(int64(1)),
   156  			URL: Ptr("url"),
   157  			Actor: &User{
   158  				Login:     Ptr("l"),
   159  				ID:        Ptr(int64(1)),
   160  				NodeID:    Ptr("n"),
   161  				URL:       Ptr("u"),
   162  				ReposURL:  Ptr("r"),
   163  				EventsURL: Ptr("e"),
   164  				AvatarURL: Ptr("a"),
   165  			},
   166  			Type:  Ptr("type"),
   167  			Issue: &Issue{ID: Ptr(int64(1))},
   168  		},
   169  		Rename: &Rename{
   170  			From: Ptr("from"),
   171  			To:   Ptr("to"),
   172  		},
   173  		State: Ptr("state"),
   174  	}
   175  
   176  	want := `{
   177  		"id": 1,
   178  		"url": "url",
   179  		"commit_url": "curl",
   180  		"actor": {
   181  			"login": "l",
   182  			"id": 1,
   183  			"avatar_url": "a",
   184  			"gravatar_id": "g",
   185  			"name": "n",
   186  			"company": "c",
   187  			"blog": "b",
   188  			"location": "l",
   189  			"email": "e",
   190  			"hireable": true,
   191  			"bio": "b",
   192  			"twitter_username": "t",
   193  			"public_repos": 1,
   194  			"followers": 1,
   195  			"following": 1,
   196  			"created_at": ` + referenceTimeStr + `,
   197  			"suspended_at": ` + referenceTimeStr + `,
   198  			"url": "u"
   199  		},
   200  		"event": "event",
   201  		"commit_id": "cid",
   202  		"created_at": ` + referenceTimeStr + `,
   203  		"label": {
   204  			"id": 1
   205  		},
   206  		"assignee": {
   207  			"login": "l",
   208  			"id": 1,
   209  			"avatar_url": "a",
   210  			"gravatar_id": "g",
   211  			"name": "n",
   212  			"company": "c",
   213  			"blog": "b",
   214  			"location": "l",
   215  			"email": "e",
   216  			"hireable": true,
   217  			"bio": "b",
   218  			"twitter_username": "t",
   219  			"public_repos": 1,
   220  			"followers": 1,
   221  			"following": 1,
   222  			"created_at": ` + referenceTimeStr + `,
   223  			"suspended_at": ` + referenceTimeStr + `,
   224  			"url": "u"
   225  		},
   226  		"milestone": {
   227  			"id": 1
   228  		},
   229  		"source": {
   230  			"id": 1,
   231  			"url": "url",
   232  			"actor": {
   233  				"login": "l",
   234  				"id": 1,
   235  				"node_id": "n",
   236  				"avatar_url": "a",
   237  				"url": "u",
   238  				"events_url": "e",
   239  				"repos_url": "r"
   240  			},
   241  			"type": "type",
   242  			"issue": {
   243  				"id": 1
   244  			}
   245  		},
   246  		"rename": {
   247  			"from": "from",
   248  			"to": "to"
   249  		},
   250  		"project_card": {
   251  			"id": 1
   252  		},
   253  		"state": "state"
   254  	}`
   255  
   256  	testJSONMarshal(t, u, want)
   257  }
   258  
   259  func TestTimeline_ReviewRequests(t *testing.T) {
   260  	t.Parallel()
   261  	client, mux, _ := setup(t)
   262  
   263  	mux.HandleFunc("/repos/example-org/example-repo/issues/3/timeline", func(w http.ResponseWriter, r *http.Request) {
   264  		testMethod(t, r, "GET")
   265  		fmt.Fprint(w, `[{
   266  		    "id": 1234567890,
   267  		    "url": "http://example.com/timeline/1",
   268  		    "actor": {
   269  			"login": "actor-user",
   270  			"id": 1
   271  		    },
   272  		    "event": "review_requested",
   273  		    "created_at": "2006-01-02T15:04:05Z",
   274  		    "requested_reviewer": {
   275  			"login": "reviewer-user",
   276  			"id": 2
   277  		    },
   278  		    "review_requester": {
   279  			"login": "requester-user",
   280  			"id": 1
   281  		    }
   282  		},
   283  		{
   284  		    "id": 1234567891,
   285  		    "url": "http://example.com/timeline/2",
   286  		    "actor": {
   287  			"login": "actor-user",
   288  			"id": 1
   289  		    },
   290  		    "event": "review_request_removed",
   291  		    "created_at": "2006-01-02T15:04:05Z",
   292  		    "requested_reviewer": {
   293  			"login": "reviewer-user",
   294  			"id": 2
   295  		    }
   296  		}]`)
   297  	})
   298  
   299  	ctx := context.Background()
   300  	events, _, err := client.Issues.ListIssueTimeline(ctx, "example-org", "example-repo", 3, nil)
   301  	if err != nil {
   302  		t.Errorf("Issues.ListIssueTimeline returned error: %v", err)
   303  	}
   304  
   305  	want := []*Timeline{
   306  		{
   307  			ID:  Ptr(int64(1234567890)),
   308  			URL: Ptr("http://example.com/timeline/1"),
   309  			Actor: &User{
   310  				Login: Ptr("actor-user"),
   311  				ID:    Ptr(int64(1)),
   312  			},
   313  			Event:     Ptr("review_requested"),
   314  			CreatedAt: &Timestamp{referenceTime},
   315  			Reviewer: &User{
   316  				Login: Ptr("reviewer-user"),
   317  				ID:    Ptr(int64(2)),
   318  			},
   319  			Requester: &User{
   320  				Login: Ptr("requester-user"),
   321  				ID:    Ptr(int64(1)),
   322  			},
   323  		},
   324  		{
   325  			ID:  Ptr(int64(1234567891)),
   326  			URL: Ptr("http://example.com/timeline/2"),
   327  			Actor: &User{
   328  				Login: Ptr("actor-user"),
   329  				ID:    Ptr(int64(1)),
   330  			},
   331  			Event:     Ptr("review_request_removed"),
   332  			CreatedAt: &Timestamp{referenceTime},
   333  			Reviewer: &User{
   334  				Login: Ptr("reviewer-user"),
   335  				ID:    Ptr(int64(2)),
   336  			},
   337  		},
   338  	}
   339  
   340  	if !cmp.Equal(events, want) {
   341  		t.Errorf("Issues.ListIssueTimeline review request events = %+v, want %+v", events, want)
   342  		diff := cmp.Diff(events, want)
   343  		t.Errorf("Difference: %s", diff)
   344  	}
   345  }