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 }