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 6package github 7 8import ( 9 "context" 10 "encoding/json" 11 "fmt" 12 "net/http" 13 "reflect" 14 "testing" 15) 16 17func TestIssuesService_ListMilestones(t *testing.T) { 18 client, mux, _, teardown := setup() 19 defer teardown() 20 21 mux.HandleFunc("/repos/o/r/milestones", func(w http.ResponseWriter, r *http.Request) { 22 testMethod(t, r, "GET") 23 testFormValues(t, r, values{ 24 "state": "closed", 25 "sort": "due_date", 26 "direction": "asc", 27 "page": "2", 28 }) 29 fmt.Fprint(w, `[{"number":1}]`) 30 }) 31 32 opt := &MilestoneListOptions{"closed", "due_date", "asc", ListOptions{Page: 2}} 33 ctx := context.Background() 34 milestones, _, err := client.Issues.ListMilestones(ctx, "o", "r", opt) 35 if err != nil { 36 t.Errorf("IssuesService.ListMilestones returned error: %v", err) 37 } 38 39 want := []*Milestone{{Number: Int(1)}} 40 if !reflect.DeepEqual(milestones, want) { 41 t.Errorf("IssuesService.ListMilestones returned %+v, want %+v", milestones, want) 42 } 43 44 const methodName = "ListMilestones" 45 testBadOptions(t, methodName, func() (err error) { 46 _, _, err = client.Issues.ListMilestones(ctx, "\n", "\n", opt) 47 return err 48 }) 49 50 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 51 got, resp, err := client.Issues.ListMilestones(ctx, "o", "r", opt) 52 if got != nil { 53 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 54 } 55 return resp, err 56 }) 57} 58 59func TestIssuesService_ListMilestones_invalidOwner(t *testing.T) { 60 client, _, _, teardown := setup() 61 defer teardown() 62 63 ctx := context.Background() 64 _, _, err := client.Issues.ListMilestones(ctx, "%", "r", nil) 65 testURLParseError(t, err) 66} 67 68func TestIssuesService_GetMilestone(t *testing.T) { 69 client, mux, _, teardown := setup() 70 defer teardown() 71 72 mux.HandleFunc("/repos/o/r/milestones/1", func(w http.ResponseWriter, r *http.Request) { 73 testMethod(t, r, "GET") 74 fmt.Fprint(w, `{"number":1}`) 75 }) 76 77 ctx := context.Background() 78 milestone, _, err := client.Issues.GetMilestone(ctx, "o", "r", 1) 79 if err != nil { 80 t.Errorf("IssuesService.GetMilestone returned error: %v", err) 81 } 82 83 want := &Milestone{Number: Int(1)} 84 if !reflect.DeepEqual(milestone, want) { 85 t.Errorf("IssuesService.GetMilestone returned %+v, want %+v", milestone, want) 86 } 87 88 const methodName = "GetMilestone" 89 testBadOptions(t, methodName, func() (err error) { 90 _, _, err = client.Issues.GetMilestone(ctx, "\n", "\n", -1) 91 return err 92 }) 93 94 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 95 got, resp, err := client.Issues.GetMilestone(ctx, "o", "r", 1) 96 if got != nil { 97 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 98 } 99 return resp, err 100 }) 101} 102 103func TestIssuesService_GetMilestone_invalidOwner(t *testing.T) { 104 client, _, _, teardown := setup() 105 defer teardown() 106 107 ctx := context.Background() 108 _, _, err := client.Issues.GetMilestone(ctx, "%", "r", 1) 109 testURLParseError(t, err) 110} 111 112func TestIssuesService_CreateMilestone(t *testing.T) { 113 client, mux, _, teardown := setup() 114 defer teardown() 115 116 input := &Milestone{Title: String("t")} 117 118 mux.HandleFunc("/repos/o/r/milestones", func(w http.ResponseWriter, r *http.Request) { 119 v := new(Milestone) 120 json.NewDecoder(r.Body).Decode(v) 121 122 testMethod(t, r, "POST") 123 if !reflect.DeepEqual(v, input) { 124 t.Errorf("Request body = %+v, want %+v", v, input) 125 } 126 127 fmt.Fprint(w, `{"number":1}`) 128 }) 129 130 ctx := context.Background() 131 milestone, _, err := client.Issues.CreateMilestone(ctx, "o", "r", input) 132 if err != nil { 133 t.Errorf("IssuesService.CreateMilestone returned error: %v", err) 134 } 135 136 want := &Milestone{Number: Int(1)} 137 if !reflect.DeepEqual(milestone, want) { 138 t.Errorf("IssuesService.CreateMilestone returned %+v, want %+v", milestone, want) 139 } 140 141 const methodName = "CreateMilestone" 142 testBadOptions(t, methodName, func() (err error) { 143 _, _, err = client.Issues.CreateMilestone(ctx, "\n", "\n", input) 144 return err 145 }) 146 147 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 148 got, resp, err := client.Issues.CreateMilestone(ctx, "o", "r", input) 149 if got != nil { 150 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 151 } 152 return resp, err 153 }) 154} 155 156func TestIssuesService_CreateMilestone_invalidOwner(t *testing.T) { 157 client, _, _, teardown := setup() 158 defer teardown() 159 160 ctx := context.Background() 161 _, _, err := client.Issues.CreateMilestone(ctx, "%", "r", nil) 162 testURLParseError(t, err) 163} 164 165func TestIssuesService_EditMilestone(t *testing.T) { 166 client, mux, _, teardown := setup() 167 defer teardown() 168 169 input := &Milestone{Title: String("t")} 170 171 mux.HandleFunc("/repos/o/r/milestones/1", func(w http.ResponseWriter, r *http.Request) { 172 v := new(Milestone) 173 json.NewDecoder(r.Body).Decode(v) 174 175 testMethod(t, r, "PATCH") 176 if !reflect.DeepEqual(v, input) { 177 t.Errorf("Request body = %+v, want %+v", v, input) 178 } 179 180 fmt.Fprint(w, `{"number":1}`) 181 }) 182 183 ctx := context.Background() 184 milestone, _, err := client.Issues.EditMilestone(ctx, "o", "r", 1, input) 185 if err != nil { 186 t.Errorf("IssuesService.EditMilestone returned error: %v", err) 187 } 188 189 want := &Milestone{Number: Int(1)} 190 if !reflect.DeepEqual(milestone, want) { 191 t.Errorf("IssuesService.EditMilestone returned %+v, want %+v", milestone, want) 192 } 193 194 const methodName = "EditMilestone" 195 testBadOptions(t, methodName, func() (err error) { 196 _, _, err = client.Issues.EditMilestone(ctx, "\n", "\n", -1, input) 197 return err 198 }) 199 200 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 201 got, resp, err := client.Issues.EditMilestone(ctx, "o", "r", 1, input) 202 if got != nil { 203 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 204 } 205 return resp, err 206 }) 207} 208 209func TestIssuesService_EditMilestone_invalidOwner(t *testing.T) { 210 client, _, _, teardown := setup() 211 defer teardown() 212 213 ctx := context.Background() 214 _, _, err := client.Issues.EditMilestone(ctx, "%", "r", 1, nil) 215 testURLParseError(t, err) 216} 217 218func TestIssuesService_DeleteMilestone(t *testing.T) { 219 client, mux, _, teardown := setup() 220 defer teardown() 221 222 mux.HandleFunc("/repos/o/r/milestones/1", func(w http.ResponseWriter, r *http.Request) { 223 testMethod(t, r, "DELETE") 224 }) 225 226 ctx := context.Background() 227 _, err := client.Issues.DeleteMilestone(ctx, "o", "r", 1) 228 if err != nil { 229 t.Errorf("IssuesService.DeleteMilestone returned error: %v", err) 230 } 231 232 const methodName = "DeleteMilestone" 233 testBadOptions(t, methodName, func() (err error) { 234 _, err = client.Issues.DeleteMilestone(ctx, "\n", "\n", -1) 235 return err 236 }) 237 238 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 239 return client.Issues.DeleteMilestone(ctx, "o", "r", 1) 240 }) 241} 242 243func TestIssuesService_DeleteMilestone_invalidOwner(t *testing.T) { 244 client, _, _, teardown := setup() 245 defer teardown() 246 247 ctx := context.Background() 248 _, err := client.Issues.DeleteMilestone(ctx, "%", "r", 1) 249 testURLParseError(t, err) 250} 251