github.com/google/go-github/v33@v33.0.0/github/issues_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  	"reflect"
    14  	"testing"
    15  	"time"
    16  )
    17  
    18  func TestIssuesService_List_all(t *testing.T) {
    19  	client, mux, _, teardown := setup()
    20  	defer teardown()
    21  
    22  	mux.HandleFunc("/issues", func(w http.ResponseWriter, r *http.Request) {
    23  		testMethod(t, r, "GET")
    24  		testHeader(t, r, "Accept", mediaTypeReactionsPreview)
    25  		testFormValues(t, r, values{
    26  			"filter":    "all",
    27  			"state":     "closed",
    28  			"labels":    "a,b",
    29  			"sort":      "updated",
    30  			"direction": "asc",
    31  			"since":     "2002-02-10T15:30:00Z",
    32  			"page":      "1",
    33  			"per_page":  "2",
    34  		})
    35  		fmt.Fprint(w, `[{"number":1}]`)
    36  	})
    37  
    38  	opt := &IssueListOptions{
    39  		"all", "closed", []string{"a", "b"}, "updated", "asc",
    40  		time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC),
    41  		ListOptions{Page: 1, PerPage: 2},
    42  	}
    43  	issues, _, err := client.Issues.List(context.Background(), true, opt)
    44  	if err != nil {
    45  		t.Errorf("Issues.List returned error: %v", err)
    46  	}
    47  
    48  	want := []*Issue{{Number: Int(1)}}
    49  	if !reflect.DeepEqual(issues, want) {
    50  		t.Errorf("Issues.List returned %+v, want %+v", issues, want)
    51  	}
    52  }
    53  
    54  func TestIssuesService_List_owned(t *testing.T) {
    55  	client, mux, _, teardown := setup()
    56  	defer teardown()
    57  
    58  	mux.HandleFunc("/user/issues", func(w http.ResponseWriter, r *http.Request) {
    59  		testMethod(t, r, "GET")
    60  		testHeader(t, r, "Accept", mediaTypeReactionsPreview)
    61  		fmt.Fprint(w, `[{"number":1}]`)
    62  	})
    63  
    64  	issues, _, err := client.Issues.List(context.Background(), false, nil)
    65  	if err != nil {
    66  		t.Errorf("Issues.List returned error: %v", err)
    67  	}
    68  
    69  	want := []*Issue{{Number: Int(1)}}
    70  	if !reflect.DeepEqual(issues, want) {
    71  		t.Errorf("Issues.List returned %+v, want %+v", issues, want)
    72  	}
    73  }
    74  
    75  func TestIssuesService_ListByOrg(t *testing.T) {
    76  	client, mux, _, teardown := setup()
    77  	defer teardown()
    78  
    79  	mux.HandleFunc("/orgs/o/issues", func(w http.ResponseWriter, r *http.Request) {
    80  		testMethod(t, r, "GET")
    81  		testHeader(t, r, "Accept", mediaTypeReactionsPreview)
    82  		fmt.Fprint(w, `[{"number":1}]`)
    83  	})
    84  
    85  	issues, _, err := client.Issues.ListByOrg(context.Background(), "o", nil)
    86  	if err != nil {
    87  		t.Errorf("Issues.ListByOrg returned error: %v", err)
    88  	}
    89  
    90  	want := []*Issue{{Number: Int(1)}}
    91  	if !reflect.DeepEqual(issues, want) {
    92  		t.Errorf("Issues.List returned %+v, want %+v", issues, want)
    93  	}
    94  }
    95  
    96  func TestIssuesService_ListByOrg_invalidOrg(t *testing.T) {
    97  	client, _, _, teardown := setup()
    98  	defer teardown()
    99  
   100  	_, _, err := client.Issues.ListByOrg(context.Background(), "%", nil)
   101  	testURLParseError(t, err)
   102  }
   103  
   104  func TestIssuesService_ListByRepo(t *testing.T) {
   105  	client, mux, _, teardown := setup()
   106  	defer teardown()
   107  
   108  	mux.HandleFunc("/repos/o/r/issues", func(w http.ResponseWriter, r *http.Request) {
   109  		testMethod(t, r, "GET")
   110  		testHeader(t, r, "Accept", mediaTypeReactionsPreview)
   111  		testFormValues(t, r, values{
   112  			"milestone": "*",
   113  			"state":     "closed",
   114  			"assignee":  "a",
   115  			"creator":   "c",
   116  			"mentioned": "m",
   117  			"labels":    "a,b",
   118  			"sort":      "updated",
   119  			"direction": "asc",
   120  			"since":     "2002-02-10T15:30:00Z",
   121  		})
   122  		fmt.Fprint(w, `[{"number":1}]`)
   123  	})
   124  
   125  	opt := &IssueListByRepoOptions{
   126  		"*", "closed", "a", "c", "m", []string{"a", "b"}, "updated", "asc",
   127  		time.Date(2002, time.February, 10, 15, 30, 0, 0, time.UTC),
   128  		ListOptions{0, 0},
   129  	}
   130  	issues, _, err := client.Issues.ListByRepo(context.Background(), "o", "r", opt)
   131  	if err != nil {
   132  		t.Errorf("Issues.ListByOrg returned error: %v", err)
   133  	}
   134  
   135  	want := []*Issue{{Number: Int(1)}}
   136  	if !reflect.DeepEqual(issues, want) {
   137  		t.Errorf("Issues.List returned %+v, want %+v", issues, want)
   138  	}
   139  }
   140  
   141  func TestIssuesService_ListByRepo_invalidOwner(t *testing.T) {
   142  	client, _, _, teardown := setup()
   143  	defer teardown()
   144  
   145  	_, _, err := client.Issues.ListByRepo(context.Background(), "%", "r", nil)
   146  	testURLParseError(t, err)
   147  }
   148  
   149  func TestIssuesService_Get(t *testing.T) {
   150  	client, mux, _, teardown := setup()
   151  	defer teardown()
   152  
   153  	mux.HandleFunc("/repos/o/r/issues/1", func(w http.ResponseWriter, r *http.Request) {
   154  		testMethod(t, r, "GET")
   155  		testHeader(t, r, "Accept", mediaTypeReactionsPreview)
   156  		fmt.Fprint(w, `{"number":1, "author_association": "MEMBER","labels": [{"url": "u", "name": "n", "color": "c"}]}`)
   157  	})
   158  
   159  	issue, _, err := client.Issues.Get(context.Background(), "o", "r", 1)
   160  	if err != nil {
   161  		t.Errorf("Issues.Get returned error: %v", err)
   162  	}
   163  
   164  	want := &Issue{
   165  		Number:            Int(1),
   166  		AuthorAssociation: String("MEMBER"),
   167  		Labels: []*Label{{
   168  			URL:   String("u"),
   169  			Name:  String("n"),
   170  			Color: String("c"),
   171  		}},
   172  	}
   173  	if !reflect.DeepEqual(issue, want) {
   174  		t.Errorf("Issues.Get returned %+v, want %+v", issue, want)
   175  	}
   176  }
   177  
   178  func TestIssuesService_Get_invalidOwner(t *testing.T) {
   179  	client, _, _, teardown := setup()
   180  	defer teardown()
   181  
   182  	_, _, err := client.Issues.Get(context.Background(), "%", "r", 1)
   183  	testURLParseError(t, err)
   184  }
   185  
   186  func TestIssuesService_Create(t *testing.T) {
   187  	client, mux, _, teardown := setup()
   188  	defer teardown()
   189  
   190  	input := &IssueRequest{
   191  		Title:    String("t"),
   192  		Body:     String("b"),
   193  		Assignee: String("a"),
   194  		Labels:   &[]string{"l1", "l2"},
   195  	}
   196  
   197  	mux.HandleFunc("/repos/o/r/issues", func(w http.ResponseWriter, r *http.Request) {
   198  		v := new(IssueRequest)
   199  		json.NewDecoder(r.Body).Decode(v)
   200  
   201  		testMethod(t, r, "POST")
   202  		if !reflect.DeepEqual(v, input) {
   203  			t.Errorf("Request body = %+v, want %+v", v, input)
   204  		}
   205  
   206  		fmt.Fprint(w, `{"number":1}`)
   207  	})
   208  
   209  	issue, _, err := client.Issues.Create(context.Background(), "o", "r", input)
   210  	if err != nil {
   211  		t.Errorf("Issues.Create returned error: %v", err)
   212  	}
   213  
   214  	want := &Issue{Number: Int(1)}
   215  	if !reflect.DeepEqual(issue, want) {
   216  		t.Errorf("Issues.Create returned %+v, want %+v", issue, want)
   217  	}
   218  }
   219  
   220  func TestIssuesService_Create_invalidOwner(t *testing.T) {
   221  	client, _, _, teardown := setup()
   222  	defer teardown()
   223  
   224  	_, _, err := client.Issues.Create(context.Background(), "%", "r", nil)
   225  	testURLParseError(t, err)
   226  }
   227  
   228  func TestIssuesService_Edit(t *testing.T) {
   229  	client, mux, _, teardown := setup()
   230  	defer teardown()
   231  
   232  	input := &IssueRequest{Title: String("t")}
   233  
   234  	mux.HandleFunc("/repos/o/r/issues/1", func(w http.ResponseWriter, r *http.Request) {
   235  		v := new(IssueRequest)
   236  		json.NewDecoder(r.Body).Decode(v)
   237  
   238  		testMethod(t, r, "PATCH")
   239  		if !reflect.DeepEqual(v, input) {
   240  			t.Errorf("Request body = %+v, want %+v", v, input)
   241  		}
   242  
   243  		fmt.Fprint(w, `{"number":1}`)
   244  	})
   245  
   246  	issue, _, err := client.Issues.Edit(context.Background(), "o", "r", 1, input)
   247  	if err != nil {
   248  		t.Errorf("Issues.Edit returned error: %v", err)
   249  	}
   250  
   251  	want := &Issue{Number: Int(1)}
   252  	if !reflect.DeepEqual(issue, want) {
   253  		t.Errorf("Issues.Edit returned %+v, want %+v", issue, want)
   254  	}
   255  }
   256  
   257  func TestIssuesService_Edit_invalidOwner(t *testing.T) {
   258  	client, _, _, teardown := setup()
   259  	defer teardown()
   260  
   261  	_, _, err := client.Issues.Edit(context.Background(), "%", "r", 1, nil)
   262  	testURLParseError(t, err)
   263  }
   264  
   265  func TestIssuesService_Lock(t *testing.T) {
   266  	client, mux, _, teardown := setup()
   267  	defer teardown()
   268  
   269  	mux.HandleFunc("/repos/o/r/issues/1/lock", func(w http.ResponseWriter, r *http.Request) {
   270  		testMethod(t, r, "PUT")
   271  
   272  		w.WriteHeader(http.StatusNoContent)
   273  	})
   274  
   275  	if _, err := client.Issues.Lock(context.Background(), "o", "r", 1, nil); err != nil {
   276  		t.Errorf("Issues.Lock returned error: %v", err)
   277  	}
   278  }
   279  
   280  func TestIssuesService_LockWithReason(t *testing.T) {
   281  	client, mux, _, teardown := setup()
   282  	defer teardown()
   283  
   284  	mux.HandleFunc("/repos/o/r/issues/1/lock", func(w http.ResponseWriter, r *http.Request) {
   285  		testMethod(t, r, "PUT")
   286  		w.WriteHeader(http.StatusNoContent)
   287  	})
   288  
   289  	opt := &LockIssueOptions{LockReason: "off-topic"}
   290  
   291  	if _, err := client.Issues.Lock(context.Background(), "o", "r", 1, opt); err != nil {
   292  		t.Errorf("Issues.Lock returned error: %v", err)
   293  	}
   294  }
   295  
   296  func TestIssuesService_Unlock(t *testing.T) {
   297  	client, mux, _, teardown := setup()
   298  	defer teardown()
   299  
   300  	mux.HandleFunc("/repos/o/r/issues/1/lock", func(w http.ResponseWriter, r *http.Request) {
   301  		testMethod(t, r, "DELETE")
   302  
   303  		w.WriteHeader(http.StatusNoContent)
   304  	})
   305  
   306  	if _, err := client.Issues.Unlock(context.Background(), "o", "r", 1); err != nil {
   307  		t.Errorf("Issues.Unlock returned error: %v", err)
   308  	}
   309  }
   310  
   311  func TestIsPullRequest(t *testing.T) {
   312  	i := new(Issue)
   313  	if i.IsPullRequest() == true {
   314  		t.Errorf("expected i.IsPullRequest (%v) to return false, got true", i)
   315  	}
   316  	i.PullRequestLinks = &PullRequestLinks{URL: String("http://example.com")}
   317  	if i.IsPullRequest() == false {
   318  		t.Errorf("expected i.IsPullRequest (%v) to return true, got false", i)
   319  	}
   320  }