github.com/google/go-github/v70@v70.0.0/github/gists_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  	"time"
    15  
    16  	"github.com/google/go-cmp/cmp"
    17  )
    18  
    19  func TestGist_Marshal(t *testing.T) {
    20  	t.Parallel()
    21  	testJSONMarshal(t, &Gist{}, "{}")
    22  
    23  	createdAt := time.Date(2010, time.February, 10, 10, 10, 0, 0, time.UTC)
    24  	updatedAt := time.Date(2010, time.February, 10, 10, 10, 0, 0, time.UTC)
    25  
    26  	u := &Gist{
    27  		ID:          Ptr("i"),
    28  		Description: Ptr("description"),
    29  		Public:      Ptr(true),
    30  		Owner: &User{
    31  			Login:       Ptr("ll"),
    32  			ID:          Ptr(int64(123)),
    33  			AvatarURL:   Ptr("a"),
    34  			GravatarID:  Ptr("g"),
    35  			Name:        Ptr("n"),
    36  			Company:     Ptr("c"),
    37  			Blog:        Ptr("b"),
    38  			Location:    Ptr("l"),
    39  			Email:       Ptr("e"),
    40  			Hireable:    Ptr(true),
    41  			PublicRepos: Ptr(1),
    42  			Followers:   Ptr(1),
    43  			Following:   Ptr(1),
    44  			CreatedAt:   &Timestamp{referenceTime},
    45  			URL:         Ptr("u"),
    46  		},
    47  		Files: map[GistFilename]GistFile{
    48  			"gistfile.py": {
    49  				Size:     Ptr(167),
    50  				Filename: Ptr("gistfile.py"),
    51  				Language: Ptr("Python"),
    52  				Type:     Ptr("application/x-python"),
    53  				RawURL:   Ptr("raw-url"),
    54  				Content:  Ptr("c"),
    55  			},
    56  		},
    57  		Comments:   Ptr(1),
    58  		HTMLURL:    Ptr("html-url"),
    59  		GitPullURL: Ptr("gitpull-url"),
    60  		GitPushURL: Ptr("gitpush-url"),
    61  		CreatedAt:  &Timestamp{createdAt},
    62  		UpdatedAt:  &Timestamp{updatedAt},
    63  		NodeID:     Ptr("node"),
    64  	}
    65  
    66  	want := `{
    67  		"id": "i",
    68  		"description": "description",
    69  		"public": true,
    70  		"owner": {
    71  			"login": "ll",
    72  			"id": 123,
    73  			"avatar_url": "a",
    74  			"gravatar_id": "g",
    75  			"name": "n",
    76  			"company": "c",
    77  			"blog": "b",
    78  			"location": "l",
    79  			"email": "e",
    80  			"hireable": true,
    81  			"public_repos": 1,
    82  			"followers": 1,
    83  			"following": 1,
    84  			"created_at": ` + referenceTimeStr + `,
    85  			"url": "u"
    86  		},
    87  		"files": {
    88  			"gistfile.py": {
    89  				"size": 167,
    90  				"filename": "gistfile.py",
    91  				"language": "Python",
    92  				"type": "application/x-python",
    93  				"raw_url": "raw-url",
    94  				"content": "c"
    95  			}
    96  		},
    97  		"comments": 1,
    98  		"html_url": "html-url",
    99  		"git_pull_url": "gitpull-url",
   100  		"git_push_url": "gitpush-url",
   101  		"created_at": "2010-02-10T10:10:00Z",
   102  		"updated_at": "2010-02-10T10:10:00Z",
   103  		"node_id": "node"
   104  	}`
   105  
   106  	testJSONMarshal(t, u, want)
   107  }
   108  
   109  func TestGistCommit_Marshal(t *testing.T) {
   110  	t.Parallel()
   111  	testJSONMarshal(t, &GistCommit{}, "{}")
   112  
   113  	u := &GistCommit{
   114  		URL:     Ptr("u"),
   115  		Version: Ptr("v"),
   116  		User: &User{
   117  			Login:       Ptr("ll"),
   118  			ID:          Ptr(int64(123)),
   119  			AvatarURL:   Ptr("a"),
   120  			GravatarID:  Ptr("g"),
   121  			Name:        Ptr("n"),
   122  			Company:     Ptr("c"),
   123  			Blog:        Ptr("b"),
   124  			Location:    Ptr("l"),
   125  			Email:       Ptr("e"),
   126  			Hireable:    Ptr(true),
   127  			PublicRepos: Ptr(1),
   128  			Followers:   Ptr(1),
   129  			Following:   Ptr(1),
   130  			CreatedAt:   &Timestamp{referenceTime},
   131  			URL:         Ptr("u"),
   132  		},
   133  		ChangeStatus: &CommitStats{
   134  			Additions: Ptr(1),
   135  			Deletions: Ptr(1),
   136  			Total:     Ptr(2),
   137  		},
   138  		CommittedAt: &Timestamp{referenceTime},
   139  		NodeID:      Ptr("node"),
   140  	}
   141  
   142  	want := `{
   143  		"url": "u",
   144  		"version": "v",
   145  		"user": {
   146  			"login": "ll",
   147  			"id": 123,
   148  			"avatar_url": "a",
   149  			"gravatar_id": "g",
   150  			"name": "n",
   151  			"company": "c",
   152  			"blog": "b",
   153  			"location": "l",
   154  			"email": "e",
   155  			"hireable": true,
   156  			"public_repos": 1,
   157  			"followers": 1,
   158  			"following": 1,
   159  			"created_at": ` + referenceTimeStr + `,
   160  			"url": "u"
   161  		},
   162  		"change_status": {
   163  			"additions": 1,
   164  			"deletions": 1,
   165  			"total": 2
   166  		},
   167  		"committed_at": ` + referenceTimeStr + `,
   168  		"node_id": "node"
   169  	}`
   170  
   171  	testJSONMarshal(t, u, want)
   172  }
   173  
   174  func TestGistFork_Marshal(t *testing.T) {
   175  	t.Parallel()
   176  	testJSONMarshal(t, &GistFork{}, "{}")
   177  
   178  	u := &GistFork{
   179  		URL: Ptr("u"),
   180  		User: &User{
   181  			Login:       Ptr("ll"),
   182  			ID:          Ptr(int64(123)),
   183  			AvatarURL:   Ptr("a"),
   184  			GravatarID:  Ptr("g"),
   185  			Name:        Ptr("n"),
   186  			Company:     Ptr("c"),
   187  			Blog:        Ptr("b"),
   188  			Location:    Ptr("l"),
   189  			Email:       Ptr("e"),
   190  			Hireable:    Ptr(true),
   191  			PublicRepos: Ptr(1),
   192  			Followers:   Ptr(1),
   193  			Following:   Ptr(1),
   194  			CreatedAt:   &Timestamp{referenceTime},
   195  			URL:         Ptr("u"),
   196  		},
   197  		ID:        Ptr("id"),
   198  		CreatedAt: &Timestamp{referenceTime},
   199  		UpdatedAt: &Timestamp{referenceTime},
   200  		NodeID:    Ptr("node"),
   201  	}
   202  
   203  	want := `{
   204  		"url": "u",
   205  		"user": {
   206  			"login": "ll",
   207  			"id": 123,
   208  			"avatar_url": "a",
   209  			"gravatar_id": "g",
   210  			"name": "n",
   211  			"company": "c",
   212  			"blog": "b",
   213  			"location": "l",
   214  			"email": "e",
   215  			"hireable": true,
   216  			"public_repos": 1,
   217  			"followers": 1,
   218  			"following": 1,
   219  			"created_at": ` + referenceTimeStr + `,
   220  			"url": "u"
   221  		},
   222  		"id": "id",
   223  		"created_at": ` + referenceTimeStr + `,
   224  		"updated_at": ` + referenceTimeStr + `,
   225  		"node_id": "node"
   226  	}`
   227  
   228  	testJSONMarshal(t, u, want)
   229  }
   230  
   231  func TestGistsService_List_specifiedUser(t *testing.T) {
   232  	t.Parallel()
   233  	client, mux, _ := setup(t)
   234  
   235  	since := "2013-01-01T00:00:00Z"
   236  
   237  	mux.HandleFunc("/users/u/gists", func(w http.ResponseWriter, r *http.Request) {
   238  		testMethod(t, r, "GET")
   239  		testFormValues(t, r, values{
   240  			"since": since,
   241  		})
   242  		fmt.Fprint(w, `[{"id": "1"}]`)
   243  	})
   244  
   245  	opt := &GistListOptions{Since: time.Date(2013, time.January, 1, 0, 0, 0, 0, time.UTC)}
   246  	ctx := context.Background()
   247  	gists, _, err := client.Gists.List(ctx, "u", opt)
   248  	if err != nil {
   249  		t.Errorf("Gists.List returned error: %v", err)
   250  	}
   251  
   252  	want := []*Gist{{ID: Ptr("1")}}
   253  	if !cmp.Equal(gists, want) {
   254  		t.Errorf("Gists.List returned %+v, want %+v", gists, want)
   255  	}
   256  
   257  	const methodName = "List"
   258  	testBadOptions(t, methodName, func() (err error) {
   259  		_, _, err = client.Gists.List(ctx, "\n", opt)
   260  		return err
   261  	})
   262  
   263  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   264  		got, resp, err := client.Gists.List(ctx, "u", opt)
   265  		if got != nil {
   266  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   267  		}
   268  		return resp, err
   269  	})
   270  }
   271  
   272  func TestGistsService_List_authenticatedUser(t *testing.T) {
   273  	t.Parallel()
   274  	client, mux, _ := setup(t)
   275  
   276  	mux.HandleFunc("/gists", func(w http.ResponseWriter, r *http.Request) {
   277  		testMethod(t, r, "GET")
   278  		fmt.Fprint(w, `[{"id": "1"}]`)
   279  	})
   280  
   281  	ctx := context.Background()
   282  	gists, _, err := client.Gists.List(ctx, "", nil)
   283  	if err != nil {
   284  		t.Errorf("Gists.List returned error: %v", err)
   285  	}
   286  
   287  	want := []*Gist{{ID: Ptr("1")}}
   288  	if !cmp.Equal(gists, want) {
   289  		t.Errorf("Gists.List returned %+v, want %+v", gists, want)
   290  	}
   291  
   292  	const methodName = "List"
   293  	testBadOptions(t, methodName, func() (err error) {
   294  		_, _, err = client.Gists.List(ctx, "\n", nil)
   295  		return err
   296  	})
   297  
   298  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   299  		got, resp, err := client.Gists.List(ctx, "", nil)
   300  		if got != nil {
   301  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   302  		}
   303  		return resp, err
   304  	})
   305  }
   306  
   307  func TestGistsService_List_invalidUser(t *testing.T) {
   308  	t.Parallel()
   309  	client, _, _ := setup(t)
   310  
   311  	ctx := context.Background()
   312  	_, _, err := client.Gists.List(ctx, "%", nil)
   313  	testURLParseError(t, err)
   314  }
   315  
   316  func TestGistsService_ListAll(t *testing.T) {
   317  	t.Parallel()
   318  	client, mux, _ := setup(t)
   319  
   320  	since := "2013-01-01T00:00:00Z"
   321  
   322  	mux.HandleFunc("/gists/public", func(w http.ResponseWriter, r *http.Request) {
   323  		testMethod(t, r, "GET")
   324  		testFormValues(t, r, values{
   325  			"since": since,
   326  		})
   327  		fmt.Fprint(w, `[{"id": "1"}]`)
   328  	})
   329  
   330  	opt := &GistListOptions{Since: time.Date(2013, time.January, 1, 0, 0, 0, 0, time.UTC)}
   331  	ctx := context.Background()
   332  	gists, _, err := client.Gists.ListAll(ctx, opt)
   333  	if err != nil {
   334  		t.Errorf("Gists.ListAll returned error: %v", err)
   335  	}
   336  
   337  	want := []*Gist{{ID: Ptr("1")}}
   338  	if !cmp.Equal(gists, want) {
   339  		t.Errorf("Gists.ListAll returned %+v, want %+v", gists, want)
   340  	}
   341  
   342  	const methodName = "ListAll"
   343  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   344  		got, resp, err := client.Gists.ListAll(ctx, opt)
   345  		if got != nil {
   346  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   347  		}
   348  		return resp, err
   349  	})
   350  }
   351  
   352  func TestGistsService_ListStarred(t *testing.T) {
   353  	t.Parallel()
   354  	client, mux, _ := setup(t)
   355  
   356  	since := "2013-01-01T00:00:00Z"
   357  
   358  	mux.HandleFunc("/gists/starred", func(w http.ResponseWriter, r *http.Request) {
   359  		testMethod(t, r, "GET")
   360  		testFormValues(t, r, values{
   361  			"since": since,
   362  		})
   363  		fmt.Fprint(w, `[{"id": "1"}]`)
   364  	})
   365  
   366  	opt := &GistListOptions{Since: time.Date(2013, time.January, 1, 0, 0, 0, 0, time.UTC)}
   367  	ctx := context.Background()
   368  	gists, _, err := client.Gists.ListStarred(ctx, opt)
   369  	if err != nil {
   370  		t.Errorf("Gists.ListStarred returned error: %v", err)
   371  	}
   372  
   373  	want := []*Gist{{ID: Ptr("1")}}
   374  	if !cmp.Equal(gists, want) {
   375  		t.Errorf("Gists.ListStarred returned %+v, want %+v", gists, want)
   376  	}
   377  
   378  	const methodName = "ListStarred"
   379  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   380  		got, resp, err := client.Gists.ListStarred(ctx, opt)
   381  		if got != nil {
   382  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   383  		}
   384  		return resp, err
   385  	})
   386  }
   387  
   388  func TestGistsService_Get(t *testing.T) {
   389  	t.Parallel()
   390  	client, mux, _ := setup(t)
   391  
   392  	mux.HandleFunc("/gists/1", func(w http.ResponseWriter, r *http.Request) {
   393  		testMethod(t, r, "GET")
   394  		fmt.Fprint(w, `{"id": "1"}`)
   395  	})
   396  
   397  	ctx := context.Background()
   398  	gist, _, err := client.Gists.Get(ctx, "1")
   399  	if err != nil {
   400  		t.Errorf("Gists.Get returned error: %v", err)
   401  	}
   402  
   403  	want := &Gist{ID: Ptr("1")}
   404  	if !cmp.Equal(gist, want) {
   405  		t.Errorf("Gists.Get returned %+v, want %+v", gist, want)
   406  	}
   407  
   408  	const methodName = "Get"
   409  	testBadOptions(t, methodName, func() (err error) {
   410  		_, _, err = client.Gists.Get(ctx, "\n")
   411  		return err
   412  	})
   413  
   414  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   415  		got, resp, err := client.Gists.Get(ctx, "1")
   416  		if got != nil {
   417  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   418  		}
   419  		return resp, err
   420  	})
   421  }
   422  
   423  func TestGistsService_Get_invalidID(t *testing.T) {
   424  	t.Parallel()
   425  	client, _, _ := setup(t)
   426  
   427  	ctx := context.Background()
   428  	_, _, err := client.Gists.Get(ctx, "%")
   429  	testURLParseError(t, err)
   430  }
   431  
   432  func TestGistsService_GetRevision(t *testing.T) {
   433  	t.Parallel()
   434  	client, mux, _ := setup(t)
   435  
   436  	mux.HandleFunc("/gists/1/s", func(w http.ResponseWriter, r *http.Request) {
   437  		testMethod(t, r, "GET")
   438  		fmt.Fprint(w, `{"id": "1"}`)
   439  	})
   440  
   441  	ctx := context.Background()
   442  	gist, _, err := client.Gists.GetRevision(ctx, "1", "s")
   443  	if err != nil {
   444  		t.Errorf("Gists.Get returned error: %v", err)
   445  	}
   446  
   447  	want := &Gist{ID: Ptr("1")}
   448  	if !cmp.Equal(gist, want) {
   449  		t.Errorf("Gists.Get returned %+v, want %+v", gist, want)
   450  	}
   451  
   452  	const methodName = "GetRevision"
   453  	testBadOptions(t, methodName, func() (err error) {
   454  		_, _, err = client.Gists.GetRevision(ctx, "\n", "\n")
   455  		return err
   456  	})
   457  
   458  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   459  		got, resp, err := client.Gists.GetRevision(ctx, "1", "s")
   460  		if got != nil {
   461  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   462  		}
   463  		return resp, err
   464  	})
   465  }
   466  
   467  func TestGistsService_GetRevision_invalidID(t *testing.T) {
   468  	t.Parallel()
   469  	client, _, _ := setup(t)
   470  
   471  	ctx := context.Background()
   472  	_, _, err := client.Gists.GetRevision(ctx, "%", "%")
   473  	testURLParseError(t, err)
   474  }
   475  
   476  func TestGistsService_Create(t *testing.T) {
   477  	t.Parallel()
   478  	client, mux, _ := setup(t)
   479  
   480  	input := &Gist{
   481  		Description: Ptr("Gist description"),
   482  		Public:      Ptr(false),
   483  		Files: map[GistFilename]GistFile{
   484  			"test.txt": {Content: Ptr("Gist file content")},
   485  		},
   486  	}
   487  
   488  	mux.HandleFunc("/gists", func(w http.ResponseWriter, r *http.Request) {
   489  		v := new(Gist)
   490  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
   491  
   492  		testMethod(t, r, "POST")
   493  		if !cmp.Equal(v, input) {
   494  			t.Errorf("Request body = %+v, want %+v", v, input)
   495  		}
   496  
   497  		fmt.Fprint(w,
   498  			`
   499  			{
   500  				"id": "1",
   501  				"description": "Gist description",
   502  				"public": false,
   503  				"files": {
   504  					"test.txt": {
   505  						"filename": "test.txt"
   506  					}
   507  				}
   508  			}`)
   509  	})
   510  
   511  	ctx := context.Background()
   512  	gist, _, err := client.Gists.Create(ctx, input)
   513  	if err != nil {
   514  		t.Errorf("Gists.Create returned error: %v", err)
   515  	}
   516  
   517  	want := &Gist{
   518  		ID:          Ptr("1"),
   519  		Description: Ptr("Gist description"),
   520  		Public:      Ptr(false),
   521  		Files: map[GistFilename]GistFile{
   522  			"test.txt": {Filename: Ptr("test.txt")},
   523  		},
   524  	}
   525  	if !cmp.Equal(gist, want) {
   526  		t.Errorf("Gists.Create returned %+v, want %+v", gist, want)
   527  	}
   528  
   529  	const methodName = "Create"
   530  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   531  		got, resp, err := client.Gists.Create(ctx, input)
   532  		if got != nil {
   533  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   534  		}
   535  		return resp, err
   536  	})
   537  }
   538  
   539  func TestGistsService_Edit(t *testing.T) {
   540  	t.Parallel()
   541  	client, mux, _ := setup(t)
   542  
   543  	input := &Gist{
   544  		Description: Ptr("New description"),
   545  		Files: map[GistFilename]GistFile{
   546  			"new.txt": {Content: Ptr("new file content")},
   547  		},
   548  	}
   549  
   550  	mux.HandleFunc("/gists/1", func(w http.ResponseWriter, r *http.Request) {
   551  		v := new(Gist)
   552  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
   553  
   554  		testMethod(t, r, "PATCH")
   555  		if !cmp.Equal(v, input) {
   556  			t.Errorf("Request body = %+v, want %+v", v, input)
   557  		}
   558  
   559  		fmt.Fprint(w,
   560  			`
   561  			{
   562  				"id": "1",
   563  				"description": "new description",
   564  				"public": false,
   565  				"files": {
   566  					"test.txt": {
   567  						"filename": "test.txt"
   568  					},
   569  					"new.txt": {
   570  						"filename": "new.txt"
   571  					}
   572  				}
   573  			}`)
   574  	})
   575  
   576  	ctx := context.Background()
   577  	gist, _, err := client.Gists.Edit(ctx, "1", input)
   578  	if err != nil {
   579  		t.Errorf("Gists.Edit returned error: %v", err)
   580  	}
   581  
   582  	want := &Gist{
   583  		ID:          Ptr("1"),
   584  		Description: Ptr("new description"),
   585  		Public:      Ptr(false),
   586  		Files: map[GistFilename]GistFile{
   587  			"test.txt": {Filename: Ptr("test.txt")},
   588  			"new.txt":  {Filename: Ptr("new.txt")},
   589  		},
   590  	}
   591  	if !cmp.Equal(gist, want) {
   592  		t.Errorf("Gists.Edit returned %+v, want %+v", gist, want)
   593  	}
   594  
   595  	const methodName = "Edit"
   596  	testBadOptions(t, methodName, func() (err error) {
   597  		_, _, err = client.Gists.Edit(ctx, "\n", input)
   598  		return err
   599  	})
   600  
   601  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   602  		got, resp, err := client.Gists.Edit(ctx, "1", input)
   603  		if got != nil {
   604  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   605  		}
   606  		return resp, err
   607  	})
   608  }
   609  
   610  func TestGistsService_Edit_invalidID(t *testing.T) {
   611  	t.Parallel()
   612  	client, _, _ := setup(t)
   613  
   614  	ctx := context.Background()
   615  	_, _, err := client.Gists.Edit(ctx, "%", nil)
   616  	testURLParseError(t, err)
   617  }
   618  
   619  func TestGistsService_ListCommits(t *testing.T) {
   620  	t.Parallel()
   621  	client, mux, _ := setup(t)
   622  
   623  	mux.HandleFunc("/gists/1/commits", func(w http.ResponseWriter, r *http.Request) {
   624  		testMethod(t, r, "GET")
   625  		testFormValues(t, r, nil)
   626  		fmt.Fprint(w, `
   627  		  [
   628  		    {
   629  		      "url": "https://api.github.com/gists/1/1",
   630  		      "version": "1",
   631  		      "user": {
   632  		        "id": 1
   633  		      },
   634  		      "change_status": {
   635  		        "deletions": 0,
   636  		        "additions": 180,
   637  		        "total": 180
   638  		      },
   639  		      "committed_at": "2010-01-01T00:00:00Z"
   640  		    }
   641  		  ]
   642  		`)
   643  	})
   644  
   645  	ctx := context.Background()
   646  	gistCommits, _, err := client.Gists.ListCommits(ctx, "1", nil)
   647  	if err != nil {
   648  		t.Errorf("Gists.ListCommits returned error: %v", err)
   649  	}
   650  
   651  	want := []*GistCommit{{
   652  		URL:         Ptr("https://api.github.com/gists/1/1"),
   653  		Version:     Ptr("1"),
   654  		User:        &User{ID: Ptr(int64(1))},
   655  		CommittedAt: &Timestamp{time.Date(2010, time.January, 1, 00, 00, 00, 0, time.UTC)},
   656  		ChangeStatus: &CommitStats{
   657  			Additions: Ptr(180),
   658  			Deletions: Ptr(0),
   659  			Total:     Ptr(180),
   660  		}}}
   661  
   662  	if !cmp.Equal(gistCommits, want) {
   663  		t.Errorf("Gists.ListCommits returned %+v, want %+v", gistCommits, want)
   664  	}
   665  
   666  	const methodName = "ListCommits"
   667  	testBadOptions(t, methodName, func() (err error) {
   668  		_, _, err = client.Gists.ListCommits(ctx, "\n", nil)
   669  		return err
   670  	})
   671  
   672  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   673  		got, resp, err := client.Gists.ListCommits(ctx, "1", nil)
   674  		if got != nil {
   675  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   676  		}
   677  		return resp, err
   678  	})
   679  }
   680  
   681  func TestGistsService_ListCommits_withOptions(t *testing.T) {
   682  	t.Parallel()
   683  	client, mux, _ := setup(t)
   684  
   685  	mux.HandleFunc("/gists/1/commits", func(w http.ResponseWriter, r *http.Request) {
   686  		testMethod(t, r, "GET")
   687  		testFormValues(t, r, values{
   688  			"page": "2",
   689  		})
   690  		fmt.Fprint(w, `[]`)
   691  	})
   692  
   693  	ctx := context.Background()
   694  	_, _, err := client.Gists.ListCommits(ctx, "1", &ListOptions{Page: 2})
   695  	if err != nil {
   696  		t.Errorf("Gists.ListCommits returned error: %v", err)
   697  	}
   698  
   699  	const methodName = "ListCommits"
   700  	testBadOptions(t, methodName, func() (err error) {
   701  		_, _, err = client.Gists.ListCommits(ctx, "\n", &ListOptions{Page: 2})
   702  		return err
   703  	})
   704  
   705  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   706  		got, resp, err := client.Gists.ListCommits(ctx, "1", &ListOptions{Page: 2})
   707  		if got != nil {
   708  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   709  		}
   710  		return resp, err
   711  	})
   712  }
   713  
   714  func TestGistsService_ListCommits_invalidID(t *testing.T) {
   715  	t.Parallel()
   716  	client, _, _ := setup(t)
   717  
   718  	ctx := context.Background()
   719  	_, _, err := client.Gists.ListCommits(ctx, "%", nil)
   720  	testURLParseError(t, err)
   721  }
   722  
   723  func TestGistsService_Delete(t *testing.T) {
   724  	t.Parallel()
   725  	client, mux, _ := setup(t)
   726  
   727  	mux.HandleFunc("/gists/1", func(w http.ResponseWriter, r *http.Request) {
   728  		testMethod(t, r, "DELETE")
   729  	})
   730  
   731  	ctx := context.Background()
   732  	_, err := client.Gists.Delete(ctx, "1")
   733  	if err != nil {
   734  		t.Errorf("Gists.Delete returned error: %v", err)
   735  	}
   736  
   737  	const methodName = "Delete"
   738  	testBadOptions(t, methodName, func() (err error) {
   739  		_, err = client.Gists.Delete(ctx, "\n")
   740  		return err
   741  	})
   742  
   743  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   744  		return client.Gists.Delete(ctx, "1")
   745  	})
   746  }
   747  
   748  func TestGistsService_Delete_invalidID(t *testing.T) {
   749  	t.Parallel()
   750  	client, _, _ := setup(t)
   751  
   752  	ctx := context.Background()
   753  	_, err := client.Gists.Delete(ctx, "%")
   754  	testURLParseError(t, err)
   755  }
   756  
   757  func TestGistsService_Star(t *testing.T) {
   758  	t.Parallel()
   759  	client, mux, _ := setup(t)
   760  
   761  	mux.HandleFunc("/gists/1/star", func(w http.ResponseWriter, r *http.Request) {
   762  		testMethod(t, r, "PUT")
   763  	})
   764  
   765  	ctx := context.Background()
   766  	_, err := client.Gists.Star(ctx, "1")
   767  	if err != nil {
   768  		t.Errorf("Gists.Star returned error: %v", err)
   769  	}
   770  
   771  	const methodName = "Star"
   772  	testBadOptions(t, methodName, func() (err error) {
   773  		_, err = client.Gists.Star(ctx, "\n")
   774  		return err
   775  	})
   776  
   777  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   778  		return client.Gists.Star(ctx, "1")
   779  	})
   780  }
   781  
   782  func TestGistsService_Star_invalidID(t *testing.T) {
   783  	t.Parallel()
   784  	client, _, _ := setup(t)
   785  
   786  	ctx := context.Background()
   787  	_, err := client.Gists.Star(ctx, "%")
   788  	testURLParseError(t, err)
   789  }
   790  
   791  func TestGistsService_Unstar(t *testing.T) {
   792  	t.Parallel()
   793  	client, mux, _ := setup(t)
   794  
   795  	mux.HandleFunc("/gists/1/star", func(w http.ResponseWriter, r *http.Request) {
   796  		testMethod(t, r, "DELETE")
   797  	})
   798  
   799  	ctx := context.Background()
   800  	_, err := client.Gists.Unstar(ctx, "1")
   801  	if err != nil {
   802  		t.Errorf("Gists.Unstar returned error: %v", err)
   803  	}
   804  
   805  	const methodName = "Unstar"
   806  	testBadOptions(t, methodName, func() (err error) {
   807  		_, err = client.Gists.Unstar(ctx, "\n")
   808  		return err
   809  	})
   810  
   811  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   812  		return client.Gists.Unstar(ctx, "1")
   813  	})
   814  }
   815  
   816  func TestGistsService_Unstar_invalidID(t *testing.T) {
   817  	t.Parallel()
   818  	client, _, _ := setup(t)
   819  
   820  	ctx := context.Background()
   821  	_, err := client.Gists.Unstar(ctx, "%")
   822  	testURLParseError(t, err)
   823  }
   824  
   825  func TestGistsService_IsStarred_hasStar(t *testing.T) {
   826  	t.Parallel()
   827  	client, mux, _ := setup(t)
   828  
   829  	mux.HandleFunc("/gists/1/star", func(w http.ResponseWriter, r *http.Request) {
   830  		testMethod(t, r, "GET")
   831  		w.WriteHeader(http.StatusNoContent)
   832  	})
   833  
   834  	ctx := context.Background()
   835  	star, _, err := client.Gists.IsStarred(ctx, "1")
   836  	if err != nil {
   837  		t.Errorf("Gists.Starred returned error: %v", err)
   838  	}
   839  	if want := true; star != want {
   840  		t.Errorf("Gists.Starred returned %+v, want %+v", star, want)
   841  	}
   842  
   843  	const methodName = "IsStarred"
   844  	testBadOptions(t, methodName, func() (err error) {
   845  		_, _, err = client.Gists.IsStarred(ctx, "\n")
   846  		return err
   847  	})
   848  
   849  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   850  		got, resp, err := client.Gists.IsStarred(ctx, "1")
   851  		if got {
   852  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got)
   853  		}
   854  		return resp, err
   855  	})
   856  }
   857  
   858  func TestGistsService_IsStarred_noStar(t *testing.T) {
   859  	t.Parallel()
   860  	client, mux, _ := setup(t)
   861  
   862  	mux.HandleFunc("/gists/1/star", func(w http.ResponseWriter, r *http.Request) {
   863  		testMethod(t, r, "GET")
   864  		w.WriteHeader(http.StatusNotFound)
   865  	})
   866  
   867  	ctx := context.Background()
   868  	star, _, err := client.Gists.IsStarred(ctx, "1")
   869  	if err != nil {
   870  		t.Errorf("Gists.Starred returned error: %v", err)
   871  	}
   872  	if want := false; star != want {
   873  		t.Errorf("Gists.Starred returned %+v, want %+v", star, want)
   874  	}
   875  
   876  	const methodName = "IsStarred"
   877  	testBadOptions(t, methodName, func() (err error) {
   878  		_, _, err = client.Gists.IsStarred(ctx, "\n")
   879  		return err
   880  	})
   881  
   882  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   883  		got, resp, err := client.Gists.IsStarred(ctx, "1")
   884  		if got {
   885  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want false", methodName, got)
   886  		}
   887  		return resp, err
   888  	})
   889  }
   890  
   891  func TestGistsService_IsStarred_invalidID(t *testing.T) {
   892  	t.Parallel()
   893  	client, _, _ := setup(t)
   894  
   895  	ctx := context.Background()
   896  	_, _, err := client.Gists.IsStarred(ctx, "%")
   897  	testURLParseError(t, err)
   898  }
   899  
   900  func TestGistsService_Fork(t *testing.T) {
   901  	t.Parallel()
   902  	client, mux, _ := setup(t)
   903  
   904  	mux.HandleFunc("/gists/1/forks", func(w http.ResponseWriter, r *http.Request) {
   905  		testMethod(t, r, "POST")
   906  		fmt.Fprint(w, `{"id": "2"}`)
   907  	})
   908  
   909  	ctx := context.Background()
   910  	gist, _, err := client.Gists.Fork(ctx, "1")
   911  	if err != nil {
   912  		t.Errorf("Gists.Fork returned error: %v", err)
   913  	}
   914  
   915  	want := &Gist{ID: Ptr("2")}
   916  	if !cmp.Equal(gist, want) {
   917  		t.Errorf("Gists.Fork returned %+v, want %+v", gist, want)
   918  	}
   919  
   920  	const methodName = "Fork"
   921  	testBadOptions(t, methodName, func() (err error) {
   922  		_, _, err = client.Gists.Fork(ctx, "\n")
   923  		return err
   924  	})
   925  
   926  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   927  		got, resp, err := client.Gists.Fork(ctx, "1")
   928  		if got != nil {
   929  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   930  		}
   931  		return resp, err
   932  	})
   933  }
   934  
   935  func TestGistsService_ListForks(t *testing.T) {
   936  	t.Parallel()
   937  	client, mux, _ := setup(t)
   938  
   939  	mux.HandleFunc("/gists/1/forks", func(w http.ResponseWriter, r *http.Request) {
   940  		testMethod(t, r, "GET")
   941  		testFormValues(t, r, nil)
   942  		fmt.Fprint(w, `
   943  		  [
   944  		    {"url": "https://api.github.com/gists/1",
   945  		     "user": {"id": 1},
   946  		     "id": "1",
   947  		     "created_at": "2010-01-01T00:00:00Z",
   948  		     "updated_at": "2013-01-01T00:00:00Z"
   949  		    }
   950  		  ]
   951  		`)
   952  	})
   953  
   954  	ctx := context.Background()
   955  	gistForks, _, err := client.Gists.ListForks(ctx, "1", nil)
   956  	if err != nil {
   957  		t.Errorf("Gists.ListForks returned error: %v", err)
   958  	}
   959  
   960  	want := []*GistFork{{
   961  		URL:       Ptr("https://api.github.com/gists/1"),
   962  		ID:        Ptr("1"),
   963  		User:      &User{ID: Ptr(int64(1))},
   964  		CreatedAt: &Timestamp{time.Date(2010, time.January, 1, 00, 00, 00, 0, time.UTC)},
   965  		UpdatedAt: &Timestamp{time.Date(2013, time.January, 1, 00, 00, 00, 0, time.UTC)}}}
   966  
   967  	if !cmp.Equal(gistForks, want) {
   968  		t.Errorf("Gists.ListForks returned %+v, want %+v", gistForks, want)
   969  	}
   970  
   971  	const methodName = "ListForks"
   972  	testBadOptions(t, methodName, func() (err error) {
   973  		_, _, err = client.Gists.ListForks(ctx, "\n", nil)
   974  		return err
   975  	})
   976  
   977  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   978  		got, resp, err := client.Gists.ListForks(ctx, "1", nil)
   979  		if got != nil {
   980  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   981  		}
   982  		return resp, err
   983  	})
   984  }
   985  
   986  func TestGistsService_ListForks_withOptions(t *testing.T) {
   987  	t.Parallel()
   988  	client, mux, _ := setup(t)
   989  
   990  	mux.HandleFunc("/gists/1/forks", func(w http.ResponseWriter, r *http.Request) {
   991  		testMethod(t, r, "GET")
   992  		testFormValues(t, r, values{
   993  			"page": "2",
   994  		})
   995  		fmt.Fprint(w, `[]`)
   996  	})
   997  
   998  	ctx := context.Background()
   999  	gistForks, _, err := client.Gists.ListForks(ctx, "1", &ListOptions{Page: 2})
  1000  	if err != nil {
  1001  		t.Errorf("Gists.ListForks returned error: %v", err)
  1002  	}
  1003  
  1004  	want := []*GistFork{}
  1005  	if !cmp.Equal(gistForks, want) {
  1006  		t.Errorf("Gists.ListForks returned %+v, want %+v", gistForks, want)
  1007  	}
  1008  
  1009  	const methodName = "ListForks"
  1010  	testBadOptions(t, methodName, func() (err error) {
  1011  		_, _, err = client.Gists.ListForks(ctx, "\n", &ListOptions{Page: 2})
  1012  		return err
  1013  	})
  1014  
  1015  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
  1016  		got, resp, err := client.Gists.ListForks(ctx, "1", &ListOptions{Page: 2})
  1017  		if got != nil {
  1018  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
  1019  		}
  1020  		return resp, err
  1021  	})
  1022  }
  1023  
  1024  func TestGistFile_Marshal(t *testing.T) {
  1025  	t.Parallel()
  1026  	testJSONMarshal(t, &GistFile{}, "{}")
  1027  
  1028  	u := &GistFile{
  1029  		Size:     Ptr(1),
  1030  		Filename: Ptr("fn"),
  1031  		Language: Ptr("lan"),
  1032  		Type:     Ptr("type"),
  1033  		RawURL:   Ptr("rurl"),
  1034  		Content:  Ptr("con"),
  1035  	}
  1036  
  1037  	want := `{
  1038  		"size": 1,
  1039  		"filename": "fn",
  1040  		"language": "lan",
  1041  		"type": "type",
  1042  		"raw_url": "rurl",
  1043  		"content": "con"
  1044  	}`
  1045  
  1046  	testJSONMarshal(t, u, want)
  1047  }