github.com/google/go-github/v74@v74.0.0/github/issues_milestones_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  	"encoding/json"
    11  	"fmt"
    12  	"net/http"
    13  	"testing"
    14  
    15  	"github.com/google/go-cmp/cmp"
    16  )
    17  
    18  func TestIssuesService_ListMilestones(t *testing.T) {
    19  	t.Parallel()
    20  	client, mux, _ := setup(t)
    21  
    22  	mux.HandleFunc("/repos/o/r/milestones", func(w http.ResponseWriter, r *http.Request) {
    23  		testMethod(t, r, "GET")
    24  		testFormValues(t, r, values{
    25  			"state":     "closed",
    26  			"sort":      "due_date",
    27  			"direction": "asc",
    28  			"page":      "2",
    29  		})
    30  		fmt.Fprint(w, `[{"number":1}]`)
    31  	})
    32  
    33  	opt := &MilestoneListOptions{"closed", "due_date", "asc", ListOptions{Page: 2}}
    34  	ctx := context.Background()
    35  	milestones, _, err := client.Issues.ListMilestones(ctx, "o", "r", opt)
    36  	if err != nil {
    37  		t.Errorf("IssuesService.ListMilestones returned error: %v", err)
    38  	}
    39  
    40  	want := []*Milestone{{Number: Ptr(1)}}
    41  	if !cmp.Equal(milestones, want) {
    42  		t.Errorf("IssuesService.ListMilestones returned %+v, want %+v", milestones, want)
    43  	}
    44  
    45  	const methodName = "ListMilestones"
    46  	testBadOptions(t, methodName, func() (err error) {
    47  		_, _, err = client.Issues.ListMilestones(ctx, "\n", "\n", opt)
    48  		return err
    49  	})
    50  
    51  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    52  		got, resp, err := client.Issues.ListMilestones(ctx, "o", "r", 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 TestIssuesService_ListMilestones_invalidOwner(t *testing.T) {
    61  	t.Parallel()
    62  	client, _, _ := setup(t)
    63  
    64  	ctx := context.Background()
    65  	_, _, err := client.Issues.ListMilestones(ctx, "%", "r", nil)
    66  	testURLParseError(t, err)
    67  }
    68  
    69  func TestIssuesService_GetMilestone(t *testing.T) {
    70  	t.Parallel()
    71  	client, mux, _ := setup(t)
    72  
    73  	mux.HandleFunc("/repos/o/r/milestones/1", func(w http.ResponseWriter, r *http.Request) {
    74  		testMethod(t, r, "GET")
    75  		fmt.Fprint(w, `{"number":1}`)
    76  	})
    77  
    78  	ctx := context.Background()
    79  	milestone, _, err := client.Issues.GetMilestone(ctx, "o", "r", 1)
    80  	if err != nil {
    81  		t.Errorf("IssuesService.GetMilestone returned error: %v", err)
    82  	}
    83  
    84  	want := &Milestone{Number: Ptr(1)}
    85  	if !cmp.Equal(milestone, want) {
    86  		t.Errorf("IssuesService.GetMilestone returned %+v, want %+v", milestone, want)
    87  	}
    88  
    89  	const methodName = "GetMilestone"
    90  	testBadOptions(t, methodName, func() (err error) {
    91  		_, _, err = client.Issues.GetMilestone(ctx, "\n", "\n", -1)
    92  		return err
    93  	})
    94  
    95  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
    96  		got, resp, err := client.Issues.GetMilestone(ctx, "o", "r", 1)
    97  		if got != nil {
    98  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
    99  		}
   100  		return resp, err
   101  	})
   102  }
   103  
   104  func TestIssuesService_GetMilestone_invalidOwner(t *testing.T) {
   105  	t.Parallel()
   106  	client, _, _ := setup(t)
   107  
   108  	ctx := context.Background()
   109  	_, _, err := client.Issues.GetMilestone(ctx, "%", "r", 1)
   110  	testURLParseError(t, err)
   111  }
   112  
   113  func TestIssuesService_CreateMilestone(t *testing.T) {
   114  	t.Parallel()
   115  	client, mux, _ := setup(t)
   116  
   117  	input := &Milestone{Title: Ptr("t")}
   118  
   119  	mux.HandleFunc("/repos/o/r/milestones", func(w http.ResponseWriter, r *http.Request) {
   120  		v := new(Milestone)
   121  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
   122  
   123  		testMethod(t, r, "POST")
   124  		if !cmp.Equal(v, input) {
   125  			t.Errorf("Request body = %+v, want %+v", v, input)
   126  		}
   127  
   128  		fmt.Fprint(w, `{"number":1}`)
   129  	})
   130  
   131  	ctx := context.Background()
   132  	milestone, _, err := client.Issues.CreateMilestone(ctx, "o", "r", input)
   133  	if err != nil {
   134  		t.Errorf("IssuesService.CreateMilestone returned error: %v", err)
   135  	}
   136  
   137  	want := &Milestone{Number: Ptr(1)}
   138  	if !cmp.Equal(milestone, want) {
   139  		t.Errorf("IssuesService.CreateMilestone returned %+v, want %+v", milestone, want)
   140  	}
   141  
   142  	const methodName = "CreateMilestone"
   143  	testBadOptions(t, methodName, func() (err error) {
   144  		_, _, err = client.Issues.CreateMilestone(ctx, "\n", "\n", input)
   145  		return err
   146  	})
   147  
   148  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   149  		got, resp, err := client.Issues.CreateMilestone(ctx, "o", "r", input)
   150  		if got != nil {
   151  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   152  		}
   153  		return resp, err
   154  	})
   155  }
   156  
   157  func TestIssuesService_CreateMilestone_invalidOwner(t *testing.T) {
   158  	t.Parallel()
   159  	client, _, _ := setup(t)
   160  
   161  	ctx := context.Background()
   162  	_, _, err := client.Issues.CreateMilestone(ctx, "%", "r", nil)
   163  	testURLParseError(t, err)
   164  }
   165  
   166  func TestIssuesService_EditMilestone(t *testing.T) {
   167  	t.Parallel()
   168  	client, mux, _ := setup(t)
   169  
   170  	input := &Milestone{Title: Ptr("t")}
   171  
   172  	mux.HandleFunc("/repos/o/r/milestones/1", func(w http.ResponseWriter, r *http.Request) {
   173  		v := new(Milestone)
   174  		assertNilError(t, json.NewDecoder(r.Body).Decode(v))
   175  
   176  		testMethod(t, r, "PATCH")
   177  		if !cmp.Equal(v, input) {
   178  			t.Errorf("Request body = %+v, want %+v", v, input)
   179  		}
   180  
   181  		fmt.Fprint(w, `{"number":1}`)
   182  	})
   183  
   184  	ctx := context.Background()
   185  	milestone, _, err := client.Issues.EditMilestone(ctx, "o", "r", 1, input)
   186  	if err != nil {
   187  		t.Errorf("IssuesService.EditMilestone returned error: %v", err)
   188  	}
   189  
   190  	want := &Milestone{Number: Ptr(1)}
   191  	if !cmp.Equal(milestone, want) {
   192  		t.Errorf("IssuesService.EditMilestone returned %+v, want %+v", milestone, want)
   193  	}
   194  
   195  	const methodName = "EditMilestone"
   196  	testBadOptions(t, methodName, func() (err error) {
   197  		_, _, err = client.Issues.EditMilestone(ctx, "\n", "\n", -1, input)
   198  		return err
   199  	})
   200  
   201  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   202  		got, resp, err := client.Issues.EditMilestone(ctx, "o", "r", 1, input)
   203  		if got != nil {
   204  			t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got)
   205  		}
   206  		return resp, err
   207  	})
   208  }
   209  
   210  func TestIssuesService_EditMilestone_invalidOwner(t *testing.T) {
   211  	t.Parallel()
   212  	client, _, _ := setup(t)
   213  
   214  	ctx := context.Background()
   215  	_, _, err := client.Issues.EditMilestone(ctx, "%", "r", 1, nil)
   216  	testURLParseError(t, err)
   217  }
   218  
   219  func TestIssuesService_DeleteMilestone(t *testing.T) {
   220  	t.Parallel()
   221  	client, mux, _ := setup(t)
   222  
   223  	mux.HandleFunc("/repos/o/r/milestones/1", func(_ http.ResponseWriter, r *http.Request) {
   224  		testMethod(t, r, "DELETE")
   225  	})
   226  
   227  	ctx := context.Background()
   228  	_, err := client.Issues.DeleteMilestone(ctx, "o", "r", 1)
   229  	if err != nil {
   230  		t.Errorf("IssuesService.DeleteMilestone returned error: %v", err)
   231  	}
   232  
   233  	const methodName = "DeleteMilestone"
   234  	testBadOptions(t, methodName, func() (err error) {
   235  		_, err = client.Issues.DeleteMilestone(ctx, "\n", "\n", -1)
   236  		return err
   237  	})
   238  
   239  	testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) {
   240  		return client.Issues.DeleteMilestone(ctx, "o", "r", 1)
   241  	})
   242  }
   243  
   244  func TestIssuesService_DeleteMilestone_invalidOwner(t *testing.T) {
   245  	t.Parallel()
   246  	client, _, _ := setup(t)
   247  
   248  	ctx := context.Background()
   249  	_, err := client.Issues.DeleteMilestone(ctx, "%", "r", 1)
   250  	testURLParseError(t, err)
   251  }
   252  
   253  func TestMilestone_Marshal(t *testing.T) {
   254  	t.Parallel()
   255  	testJSONMarshal(t, &Milestone{}, "{}")
   256  
   257  	u := &Milestone{
   258  		URL:         Ptr("url"),
   259  		HTMLURL:     Ptr("hurl"),
   260  		LabelsURL:   Ptr("lurl"),
   261  		ID:          Ptr(int64(1)),
   262  		Number:      Ptr(1),
   263  		State:       Ptr("state"),
   264  		Title:       Ptr("title"),
   265  		Description: Ptr("desc"),
   266  		Creator: &User{
   267  			Login:           Ptr("l"),
   268  			ID:              Ptr(int64(1)),
   269  			URL:             Ptr("u"),
   270  			AvatarURL:       Ptr("a"),
   271  			GravatarID:      Ptr("g"),
   272  			Name:            Ptr("n"),
   273  			Company:         Ptr("c"),
   274  			Blog:            Ptr("b"),
   275  			Location:        Ptr("l"),
   276  			Email:           Ptr("e"),
   277  			Hireable:        Ptr(true),
   278  			Bio:             Ptr("b"),
   279  			TwitterUsername: Ptr("tu"),
   280  			PublicRepos:     Ptr(1),
   281  			Followers:       Ptr(1),
   282  			Following:       Ptr(1),
   283  			CreatedAt:       &Timestamp{referenceTime},
   284  			SuspendedAt:     &Timestamp{referenceTime},
   285  		},
   286  		OpenIssues:   Ptr(1),
   287  		ClosedIssues: Ptr(1),
   288  		CreatedAt:    &Timestamp{referenceTime},
   289  		UpdatedAt:    &Timestamp{referenceTime},
   290  		ClosedAt:     &Timestamp{referenceTime},
   291  		DueOn:        &Timestamp{referenceTime},
   292  		NodeID:       Ptr("nid"),
   293  	}
   294  
   295  	want := `{
   296  		"url": "url",
   297  		"html_url": "hurl",
   298  		"labels_url": "lurl",
   299  		"id": 1,
   300  		"number": 1,
   301  		"state": "state",
   302  		"title": "title",
   303  		"description": "desc",
   304  		"creator": {
   305  			"login": "l",
   306  			"id": 1,
   307  			"avatar_url": "a",
   308  			"gravatar_id": "g",
   309  			"name": "n",
   310  			"company": "c",
   311  			"blog": "b",
   312  			"location": "l",
   313  			"email": "e",
   314  			"hireable": true,
   315  			"bio": "b",
   316  			"twitter_username": "tu",
   317  			"public_repos": 1,
   318  			"followers": 1,
   319  			"following": 1,
   320  			"created_at": ` + referenceTimeStr + `,
   321  			"suspended_at": ` + referenceTimeStr + `,
   322  			"url": "u"
   323  		},
   324  		"open_issues": 1,
   325  		"closed_issues": 1,
   326  		"created_at": ` + referenceTimeStr + `,
   327  		"updated_at": ` + referenceTimeStr + `,
   328  		"closed_at": ` + referenceTimeStr + `,
   329  		"due_on": ` + referenceTimeStr + `,
   330  		"node_id": "nid"
   331  	}`
   332  
   333  	testJSONMarshal(t, u, want)
   334  }