github.com/google/go-github/v66@v66.0.0/github/actions_secrets_test.go (about) 1 // Copyright 2020 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 TestPublicKey_UnmarshalJSON(t *testing.T) { 20 t.Parallel() 21 var testCases = map[string]struct { 22 data []byte 23 wantPublicKey PublicKey 24 wantErr bool 25 }{ 26 "Empty": { 27 data: []byte("{}"), 28 wantPublicKey: PublicKey{}, 29 wantErr: false, 30 }, 31 "Invalid JSON": { 32 data: []byte("{"), 33 wantPublicKey: PublicKey{}, 34 wantErr: true, 35 }, 36 "Numeric KeyID": { 37 data: []byte(`{"key_id":1234,"key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`), 38 wantPublicKey: PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")}, 39 wantErr: false, 40 }, 41 "String KeyID": { 42 data: []byte(`{"key_id":"1234","key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`), 43 wantPublicKey: PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")}, 44 wantErr: false, 45 }, 46 "Invalid KeyID": { 47 data: []byte(`{"key_id":["1234"],"key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`), 48 wantPublicKey: PublicKey{KeyID: nil, Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")}, 49 wantErr: true, 50 }, 51 "Invalid Key": { 52 data: []byte(`{"key":123}`), 53 wantPublicKey: PublicKey{KeyID: nil, Key: nil}, 54 wantErr: true, 55 }, 56 "Nil": { 57 data: nil, 58 wantPublicKey: PublicKey{KeyID: nil, Key: nil}, 59 wantErr: true, 60 }, 61 "Empty String": { 62 data: []byte(""), 63 wantPublicKey: PublicKey{KeyID: nil, Key: nil}, 64 wantErr: true, 65 }, 66 "Missing Key": { 67 data: []byte(`{"key_id":"1234"}`), 68 wantPublicKey: PublicKey{KeyID: String("1234")}, 69 wantErr: false, 70 }, 71 "Missing KeyID": { 72 data: []byte(`{"key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`), 73 wantPublicKey: PublicKey{Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")}, 74 wantErr: false, 75 }, 76 } 77 78 for name, tt := range testCases { 79 tt := tt 80 t.Run(name, func(t *testing.T) { 81 t.Parallel() 82 pk := PublicKey{} 83 err := json.Unmarshal(tt.data, &pk) 84 if err == nil && tt.wantErr { 85 t.Errorf("PublicKey.UnmarshalJSON returned nil instead of an error") 86 } 87 if err != nil && !tt.wantErr { 88 t.Errorf("PublicKey.UnmarshalJSON returned an unexpected error: %+v", err) 89 } 90 if !cmp.Equal(tt.wantPublicKey, pk) { 91 t.Errorf("PublicKey.UnmarshalJSON expected public key %+v, got %+v", tt.wantPublicKey, pk) 92 } 93 }) 94 } 95 } 96 97 func TestActionsService_GetRepoPublicKey(t *testing.T) { 98 t.Parallel() 99 client, mux, _ := setup(t) 100 101 mux.HandleFunc("/repos/o/r/actions/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { 102 testMethod(t, r, "GET") 103 fmt.Fprint(w, `{"key_id":"1234","key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) 104 }) 105 106 ctx := context.Background() 107 key, _, err := client.Actions.GetRepoPublicKey(ctx, "o", "r") 108 if err != nil { 109 t.Errorf("Actions.GetRepoPublicKey returned error: %v", err) 110 } 111 112 want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} 113 if !cmp.Equal(key, want) { 114 t.Errorf("Actions.GetRepoPublicKey returned %+v, want %+v", key, want) 115 } 116 117 const methodName = "GetRepoPublicKey" 118 testBadOptions(t, methodName, func() (err error) { 119 _, _, err = client.Actions.GetRepoPublicKey(ctx, "\n", "\n") 120 return err 121 }) 122 123 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 124 got, resp, err := client.Actions.GetRepoPublicKey(ctx, "o", "r") 125 if got != nil { 126 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 127 } 128 return resp, err 129 }) 130 } 131 132 func TestActionsService_GetRepoPublicKeyNumeric(t *testing.T) { 133 t.Parallel() 134 client, mux, _ := setup(t) 135 136 mux.HandleFunc("/repos/o/r/actions/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { 137 testMethod(t, r, "GET") 138 fmt.Fprint(w, `{"key_id":1234,"key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) 139 }) 140 141 ctx := context.Background() 142 key, _, err := client.Actions.GetRepoPublicKey(ctx, "o", "r") 143 if err != nil { 144 t.Errorf("Actions.GetRepoPublicKey returned error: %v", err) 145 } 146 147 want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} 148 if !cmp.Equal(key, want) { 149 t.Errorf("Actions.GetRepoPublicKey returned %+v, want %+v", key, want) 150 } 151 152 const methodName = "GetRepoPublicKey" 153 testBadOptions(t, methodName, func() (err error) { 154 _, _, err = client.Actions.GetRepoPublicKey(ctx, "\n", "\n") 155 return err 156 }) 157 158 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 159 got, resp, err := client.Actions.GetRepoPublicKey(ctx, "o", "r") 160 if got != nil { 161 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 162 } 163 return resp, err 164 }) 165 } 166 167 func TestActionsService_ListRepoSecrets(t *testing.T) { 168 t.Parallel() 169 client, mux, _ := setup(t) 170 171 mux.HandleFunc("/repos/o/r/actions/secrets", func(w http.ResponseWriter, r *http.Request) { 172 testMethod(t, r, "GET") 173 testFormValues(t, r, values{"per_page": "2", "page": "2"}) 174 fmt.Fprint(w, `{"total_count":4,"secrets":[{"name":"A","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"name":"B","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`) 175 }) 176 177 opts := &ListOptions{Page: 2, PerPage: 2} 178 ctx := context.Background() 179 secrets, _, err := client.Actions.ListRepoSecrets(ctx, "o", "r", opts) 180 if err != nil { 181 t.Errorf("Actions.ListRepoSecrets returned error: %v", err) 182 } 183 184 want := &Secrets{ 185 TotalCount: 4, 186 Secrets: []*Secret{ 187 {Name: "A", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, 188 {Name: "B", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, 189 }, 190 } 191 if !cmp.Equal(secrets, want) { 192 t.Errorf("Actions.ListRepoSecrets returned %+v, want %+v", secrets, want) 193 } 194 195 const methodName = "ListRepoSecrets" 196 testBadOptions(t, methodName, func() (err error) { 197 _, _, err = client.Actions.ListRepoSecrets(ctx, "\n", "\n", opts) 198 return err 199 }) 200 201 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 202 got, resp, err := client.Actions.ListRepoSecrets(ctx, "o", "r", opts) 203 if got != nil { 204 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 205 } 206 return resp, err 207 }) 208 } 209 210 func TestActionsService_ListRepoOrgSecrets(t *testing.T) { 211 t.Parallel() 212 client, mux, _ := setup(t) 213 214 mux.HandleFunc("/repos/o/r/actions/organization-secrets", func(w http.ResponseWriter, r *http.Request) { 215 testMethod(t, r, "GET") 216 testFormValues(t, r, values{"per_page": "2", "page": "2"}) 217 fmt.Fprint(w, `{"total_count":4,"secrets":[{"name":"A","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"name":"B","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`) 218 }) 219 220 opts := &ListOptions{Page: 2, PerPage: 2} 221 ctx := context.Background() 222 secrets, _, err := client.Actions.ListRepoOrgSecrets(ctx, "o", "r", opts) 223 if err != nil { 224 t.Errorf("Actions.ListRepoOrgSecrets returned error: %v", err) 225 } 226 227 want := &Secrets{ 228 TotalCount: 4, 229 Secrets: []*Secret{ 230 {Name: "A", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, 231 {Name: "B", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, 232 }, 233 } 234 if !cmp.Equal(secrets, want) { 235 t.Errorf("Actions.ListRepoOrgSecrets returned %+v, want %+v", secrets, want) 236 } 237 238 const methodName = "ListRepoOrgSecrets" 239 testBadOptions(t, methodName, func() (err error) { 240 _, _, err = client.Actions.ListRepoOrgSecrets(ctx, "\n", "\n", opts) 241 return err 242 }) 243 244 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 245 got, resp, err := client.Actions.ListRepoOrgSecrets(ctx, "o", "r", opts) 246 if got != nil { 247 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 248 } 249 return resp, err 250 }) 251 } 252 253 func TestActionsService_GetRepoSecret(t *testing.T) { 254 t.Parallel() 255 client, mux, _ := setup(t) 256 257 mux.HandleFunc("/repos/o/r/actions/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { 258 testMethod(t, r, "GET") 259 fmt.Fprint(w, `{"name":"NAME","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}`) 260 }) 261 262 ctx := context.Background() 263 secret, _, err := client.Actions.GetRepoSecret(ctx, "o", "r", "NAME") 264 if err != nil { 265 t.Errorf("Actions.GetRepoSecret returned error: %v", err) 266 } 267 268 want := &Secret{ 269 Name: "NAME", 270 CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, 271 UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, 272 } 273 if !cmp.Equal(secret, want) { 274 t.Errorf("Actions.GetRepoSecret returned %+v, want %+v", secret, want) 275 } 276 277 const methodName = "GetRepoSecret" 278 testBadOptions(t, methodName, func() (err error) { 279 _, _, err = client.Actions.GetRepoSecret(ctx, "\n", "\n", "\n") 280 return err 281 }) 282 283 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 284 got, resp, err := client.Actions.GetRepoSecret(ctx, "o", "r", "NAME") 285 if got != nil { 286 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 287 } 288 return resp, err 289 }) 290 } 291 292 func TestActionsService_CreateOrUpdateRepoSecret(t *testing.T) { 293 t.Parallel() 294 client, mux, _ := setup(t) 295 296 mux.HandleFunc("/repos/o/r/actions/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { 297 testMethod(t, r, "PUT") 298 testHeader(t, r, "Content-Type", "application/json") 299 testBody(t, r, `{"key_id":"1234","encrypted_value":"QIv="}`+"\n") 300 w.WriteHeader(http.StatusCreated) 301 }) 302 303 input := &EncryptedSecret{ 304 Name: "NAME", 305 EncryptedValue: "QIv=", 306 KeyID: "1234", 307 } 308 ctx := context.Background() 309 _, err := client.Actions.CreateOrUpdateRepoSecret(ctx, "o", "r", input) 310 if err != nil { 311 t.Errorf("Actions.CreateOrUpdateRepoSecret returned error: %v", err) 312 } 313 314 const methodName = "CreateOrUpdateRepoSecret" 315 testBadOptions(t, methodName, func() (err error) { 316 _, err = client.Actions.CreateOrUpdateRepoSecret(ctx, "\n", "\n", input) 317 return err 318 }) 319 320 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 321 return client.Actions.CreateOrUpdateRepoSecret(ctx, "o", "r", input) 322 }) 323 } 324 325 func TestActionsService_DeleteRepoSecret(t *testing.T) { 326 t.Parallel() 327 client, mux, _ := setup(t) 328 329 mux.HandleFunc("/repos/o/r/actions/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { 330 testMethod(t, r, "DELETE") 331 }) 332 333 ctx := context.Background() 334 _, err := client.Actions.DeleteRepoSecret(ctx, "o", "r", "NAME") 335 if err != nil { 336 t.Errorf("Actions.DeleteRepoSecret returned error: %v", err) 337 } 338 339 const methodName = "DeleteRepoSecret" 340 testBadOptions(t, methodName, func() (err error) { 341 _, err = client.Actions.DeleteRepoSecret(ctx, "\n", "\n", "\n") 342 return err 343 }) 344 345 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 346 return client.Actions.DeleteRepoSecret(ctx, "o", "r", "NAME") 347 }) 348 } 349 350 func TestActionsService_GetOrgPublicKey(t *testing.T) { 351 t.Parallel() 352 client, mux, _ := setup(t) 353 354 mux.HandleFunc("/orgs/o/actions/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { 355 testMethod(t, r, "GET") 356 fmt.Fprint(w, `{"key_id":"012345678","key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) 357 }) 358 359 ctx := context.Background() 360 key, _, err := client.Actions.GetOrgPublicKey(ctx, "o") 361 if err != nil { 362 t.Errorf("Actions.GetOrgPublicKey returned error: %v", err) 363 } 364 365 want := &PublicKey{KeyID: String("012345678"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} 366 if !cmp.Equal(key, want) { 367 t.Errorf("Actions.GetOrgPublicKey returned %+v, want %+v", key, want) 368 } 369 370 const methodName = "GetOrgPublicKey" 371 testBadOptions(t, methodName, func() (err error) { 372 _, _, err = client.Actions.GetOrgPublicKey(ctx, "\n") 373 return err 374 }) 375 376 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 377 got, resp, err := client.Actions.GetOrgPublicKey(ctx, "o") 378 if got != nil { 379 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 380 } 381 return resp, err 382 }) 383 } 384 385 func TestActionsService_ListOrgSecrets(t *testing.T) { 386 t.Parallel() 387 client, mux, _ := setup(t) 388 389 mux.HandleFunc("/orgs/o/actions/secrets", func(w http.ResponseWriter, r *http.Request) { 390 testMethod(t, r, "GET") 391 testFormValues(t, r, values{"per_page": "2", "page": "2"}) 392 fmt.Fprint(w, `{"total_count":3,"secrets":[{"name":"GIST_ID","created_at":"2019-08-10T14:59:22Z","updated_at":"2020-01-10T14:59:22Z","visibility":"private"},{"name":"DEPLOY_TOKEN","created_at":"2019-08-10T14:59:22Z","updated_at":"2020-01-10T14:59:22Z","visibility":"all"},{"name":"GH_TOKEN","created_at":"2019-08-10T14:59:22Z","updated_at":"2020-01-10T14:59:22Z","visibility":"selected","selected_repositories_url":"https://api.github.com/orgs/octo-org/actions/secrets/SUPER_SECRET/repositories"}]}`) 393 }) 394 395 opts := &ListOptions{Page: 2, PerPage: 2} 396 ctx := context.Background() 397 secrets, _, err := client.Actions.ListOrgSecrets(ctx, "o", opts) 398 if err != nil { 399 t.Errorf("Actions.ListOrgSecrets returned error: %v", err) 400 } 401 402 want := &Secrets{ 403 TotalCount: 3, 404 Secrets: []*Secret{ 405 {Name: "GIST_ID", CreatedAt: Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 10, 14, 59, 22, 0, time.UTC)}, Visibility: "private"}, 406 {Name: "DEPLOY_TOKEN", CreatedAt: Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 10, 14, 59, 22, 0, time.UTC)}, Visibility: "all"}, 407 {Name: "GH_TOKEN", CreatedAt: Timestamp{time.Date(2019, time.August, 10, 14, 59, 22, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 10, 14, 59, 22, 0, time.UTC)}, Visibility: "selected", SelectedRepositoriesURL: "https://api.github.com/orgs/octo-org/actions/secrets/SUPER_SECRET/repositories"}, 408 }, 409 } 410 if !cmp.Equal(secrets, want) { 411 t.Errorf("Actions.ListOrgSecrets returned %+v, want %+v", secrets, want) 412 } 413 414 const methodName = "ListOrgSecrets" 415 testBadOptions(t, methodName, func() (err error) { 416 _, _, err = client.Actions.ListOrgSecrets(ctx, "\n", opts) 417 return err 418 }) 419 420 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 421 got, resp, err := client.Actions.ListOrgSecrets(ctx, "o", opts) 422 if got != nil { 423 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 424 } 425 return resp, err 426 }) 427 } 428 429 func TestActionsService_GetOrgSecret(t *testing.T) { 430 t.Parallel() 431 client, mux, _ := setup(t) 432 433 mux.HandleFunc("/orgs/o/actions/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { 434 testMethod(t, r, "GET") 435 fmt.Fprint(w, `{"name":"NAME","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z","visibility":"selected","selected_repositories_url":"https://api.github.com/orgs/octo-org/actions/secrets/SUPER_SECRET/repositories"}`) 436 }) 437 438 ctx := context.Background() 439 secret, _, err := client.Actions.GetOrgSecret(ctx, "o", "NAME") 440 if err != nil { 441 t.Errorf("Actions.GetOrgSecret returned error: %v", err) 442 } 443 444 want := &Secret{ 445 Name: "NAME", 446 CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, 447 UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, 448 Visibility: "selected", 449 SelectedRepositoriesURL: "https://api.github.com/orgs/octo-org/actions/secrets/SUPER_SECRET/repositories", 450 } 451 if !cmp.Equal(secret, want) { 452 t.Errorf("Actions.GetOrgSecret returned %+v, want %+v", secret, want) 453 } 454 455 const methodName = "GetOrgSecret" 456 testBadOptions(t, methodName, func() (err error) { 457 _, _, err = client.Actions.GetOrgSecret(ctx, "\n", "\n") 458 return err 459 }) 460 461 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 462 got, resp, err := client.Actions.GetOrgSecret(ctx, "o", "NAME") 463 if got != nil { 464 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 465 } 466 return resp, err 467 }) 468 } 469 470 func TestActionsService_CreateOrUpdateOrgSecret(t *testing.T) { 471 t.Parallel() 472 client, mux, _ := setup(t) 473 474 mux.HandleFunc("/orgs/o/actions/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { 475 testMethod(t, r, "PUT") 476 testHeader(t, r, "Content-Type", "application/json") 477 testBody(t, r, `{"key_id":"1234","encrypted_value":"QIv=","visibility":"selected","selected_repository_ids":[1296269,1269280]}`+"\n") 478 w.WriteHeader(http.StatusCreated) 479 }) 480 481 input := &EncryptedSecret{ 482 Name: "NAME", 483 EncryptedValue: "QIv=", 484 KeyID: "1234", 485 Visibility: "selected", 486 SelectedRepositoryIDs: SelectedRepoIDs{1296269, 1269280}, 487 } 488 ctx := context.Background() 489 _, err := client.Actions.CreateOrUpdateOrgSecret(ctx, "o", input) 490 if err != nil { 491 t.Errorf("Actions.CreateOrUpdateOrgSecret returned error: %v", err) 492 } 493 494 const methodName = "CreateOrUpdateOrgSecret" 495 testBadOptions(t, methodName, func() (err error) { 496 _, err = client.Actions.CreateOrUpdateOrgSecret(ctx, "\n", input) 497 return err 498 }) 499 500 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 501 return client.Actions.CreateOrUpdateOrgSecret(ctx, "o", input) 502 }) 503 } 504 505 func TestActionsService_ListSelectedReposForOrgSecret(t *testing.T) { 506 t.Parallel() 507 client, mux, _ := setup(t) 508 509 mux.HandleFunc("/orgs/o/actions/secrets/NAME/repositories", func(w http.ResponseWriter, r *http.Request) { 510 testMethod(t, r, "GET") 511 fmt.Fprintf(w, `{"total_count":1,"repositories":[{"id":1}]}`) 512 }) 513 514 opts := &ListOptions{Page: 2, PerPage: 2} 515 ctx := context.Background() 516 repos, _, err := client.Actions.ListSelectedReposForOrgSecret(ctx, "o", "NAME", opts) 517 if err != nil { 518 t.Errorf("Actions.ListSelectedReposForOrgSecret returned error: %v", err) 519 } 520 521 want := &SelectedReposList{ 522 TotalCount: Int(1), 523 Repositories: []*Repository{ 524 {ID: Int64(1)}, 525 }, 526 } 527 if !cmp.Equal(repos, want) { 528 t.Errorf("Actions.ListSelectedReposForOrgSecret returned %+v, want %+v", repos, want) 529 } 530 531 const methodName = "ListSelectedReposForOrgSecret" 532 testBadOptions(t, methodName, func() (err error) { 533 _, _, err = client.Actions.ListSelectedReposForOrgSecret(ctx, "\n", "\n", opts) 534 return err 535 }) 536 537 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 538 got, resp, err := client.Actions.ListSelectedReposForOrgSecret(ctx, "o", "NAME", opts) 539 if got != nil { 540 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 541 } 542 return resp, err 543 }) 544 } 545 546 func TestActionsService_SetSelectedReposForOrgSecret(t *testing.T) { 547 t.Parallel() 548 client, mux, _ := setup(t) 549 550 mux.HandleFunc("/orgs/o/actions/secrets/NAME/repositories", func(w http.ResponseWriter, r *http.Request) { 551 testMethod(t, r, "PUT") 552 testHeader(t, r, "Content-Type", "application/json") 553 testBody(t, r, `{"selected_repository_ids":[64780797]}`+"\n") 554 }) 555 556 ctx := context.Background() 557 _, err := client.Actions.SetSelectedReposForOrgSecret(ctx, "o", "NAME", SelectedRepoIDs{64780797}) 558 if err != nil { 559 t.Errorf("Actions.SetSelectedReposForOrgSecret returned error: %v", err) 560 } 561 562 const methodName = "SetSelectedReposForOrgSecret" 563 testBadOptions(t, methodName, func() (err error) { 564 _, err = client.Actions.SetSelectedReposForOrgSecret(ctx, "\n", "\n", SelectedRepoIDs{64780797}) 565 return err 566 }) 567 568 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 569 return client.Actions.SetSelectedReposForOrgSecret(ctx, "o", "NAME", SelectedRepoIDs{64780797}) 570 }) 571 } 572 573 func TestActionsService_AddSelectedRepoToOrgSecret(t *testing.T) { 574 t.Parallel() 575 client, mux, _ := setup(t) 576 577 mux.HandleFunc("/orgs/o/actions/secrets/NAME/repositories/1234", func(w http.ResponseWriter, r *http.Request) { 578 testMethod(t, r, "PUT") 579 }) 580 581 repo := &Repository{ID: Int64(1234)} 582 ctx := context.Background() 583 _, err := client.Actions.AddSelectedRepoToOrgSecret(ctx, "o", "NAME", repo) 584 if err != nil { 585 t.Errorf("Actions.AddSelectedRepoToOrgSecret returned error: %v", err) 586 } 587 588 const methodName = "AddSelectedRepoToOrgSecret" 589 testBadOptions(t, methodName, func() (err error) { 590 _, err = client.Actions.AddSelectedRepoToOrgSecret(ctx, "\n", "\n", repo) 591 return err 592 }) 593 594 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 595 return client.Actions.AddSelectedRepoToOrgSecret(ctx, "o", "NAME", repo) 596 }) 597 } 598 599 func TestActionsService_RemoveSelectedRepoFromOrgSecret(t *testing.T) { 600 t.Parallel() 601 client, mux, _ := setup(t) 602 603 mux.HandleFunc("/orgs/o/actions/secrets/NAME/repositories/1234", func(w http.ResponseWriter, r *http.Request) { 604 testMethod(t, r, "DELETE") 605 }) 606 607 repo := &Repository{ID: Int64(1234)} 608 ctx := context.Background() 609 _, err := client.Actions.RemoveSelectedRepoFromOrgSecret(ctx, "o", "NAME", repo) 610 if err != nil { 611 t.Errorf("Actions.RemoveSelectedRepoFromOrgSecret returned error: %v", err) 612 } 613 614 const methodName = "RemoveSelectedRepoFromOrgSecret" 615 testBadOptions(t, methodName, func() (err error) { 616 _, err = client.Actions.RemoveSelectedRepoFromOrgSecret(ctx, "\n", "\n", repo) 617 return err 618 }) 619 620 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 621 return client.Actions.RemoveSelectedRepoFromOrgSecret(ctx, "o", "NAME", repo) 622 }) 623 } 624 625 func TestActionsService_DeleteOrgSecret(t *testing.T) { 626 t.Parallel() 627 client, mux, _ := setup(t) 628 629 mux.HandleFunc("/orgs/o/actions/secrets/NAME", func(w http.ResponseWriter, r *http.Request) { 630 testMethod(t, r, "DELETE") 631 }) 632 633 ctx := context.Background() 634 _, err := client.Actions.DeleteOrgSecret(ctx, "o", "NAME") 635 if err != nil { 636 t.Errorf("Actions.DeleteOrgSecret returned error: %v", err) 637 } 638 639 const methodName = "DeleteOrgSecret" 640 testBadOptions(t, methodName, func() (err error) { 641 _, err = client.Actions.DeleteOrgSecret(ctx, "\n", "\n") 642 return err 643 }) 644 645 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 646 return client.Actions.DeleteOrgSecret(ctx, "o", "NAME") 647 }) 648 } 649 650 func TestActionsService_GetEnvPublicKey(t *testing.T) { 651 t.Parallel() 652 client, mux, _ := setup(t) 653 654 mux.HandleFunc("/repositories/1/environments/e/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { 655 testMethod(t, r, "GET") 656 fmt.Fprint(w, `{"key_id":"1234","key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) 657 }) 658 659 ctx := context.Background() 660 key, _, err := client.Actions.GetEnvPublicKey(ctx, 1, "e") 661 if err != nil { 662 t.Errorf("Actions.GetEnvPublicKey returned error: %v", err) 663 } 664 665 want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} 666 if !cmp.Equal(key, want) { 667 t.Errorf("Actions.GetEnvPublicKey returned %+v, want %+v", key, want) 668 } 669 670 const methodName = "GetEnvPublicKey" 671 testBadOptions(t, methodName, func() (err error) { 672 _, _, err = client.Actions.GetEnvPublicKey(ctx, 0.0, "\n") 673 return err 674 }) 675 676 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 677 got, resp, err := client.Actions.GetEnvPublicKey(ctx, 1, "e") 678 if got != nil { 679 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 680 } 681 return resp, err 682 }) 683 } 684 685 func TestActionsService_GetEnvPublicKeyNumeric(t *testing.T) { 686 t.Parallel() 687 client, mux, _ := setup(t) 688 689 mux.HandleFunc("/repositories/1/environments/e/secrets/public-key", func(w http.ResponseWriter, r *http.Request) { 690 testMethod(t, r, "GET") 691 fmt.Fprint(w, `{"key_id":1234,"key":"2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234"}`) 692 }) 693 694 ctx := context.Background() 695 key, _, err := client.Actions.GetEnvPublicKey(ctx, 1, "e") 696 if err != nil { 697 t.Errorf("Actions.GetEnvPublicKey returned error: %v", err) 698 } 699 700 want := &PublicKey{KeyID: String("1234"), Key: String("2Sg8iYjAxxmI2LvUXpJjkYrMxURPc8r+dB7TJyvv1234")} 701 if !cmp.Equal(key, want) { 702 t.Errorf("Actions.GetEnvPublicKey returned %+v, want %+v", key, want) 703 } 704 705 const methodName = "GetEnvPublicKey" 706 testBadOptions(t, methodName, func() (err error) { 707 _, _, err = client.Actions.GetEnvPublicKey(ctx, 0.0, "\n") 708 return err 709 }) 710 711 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 712 got, resp, err := client.Actions.GetEnvPublicKey(ctx, 1, "e") 713 if got != nil { 714 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 715 } 716 return resp, err 717 }) 718 } 719 720 func TestActionsService_ListEnvSecrets(t *testing.T) { 721 t.Parallel() 722 client, mux, _ := setup(t) 723 724 mux.HandleFunc("/repositories/1/environments/e/secrets", func(w http.ResponseWriter, r *http.Request) { 725 testMethod(t, r, "GET") 726 testFormValues(t, r, values{"per_page": "2", "page": "2"}) 727 fmt.Fprint(w, `{"total_count":4,"secrets":[{"name":"A","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"},{"name":"B","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}]}`) 728 }) 729 730 opts := &ListOptions{Page: 2, PerPage: 2} 731 ctx := context.Background() 732 secrets, _, err := client.Actions.ListEnvSecrets(ctx, 1, "e", opts) 733 if err != nil { 734 t.Errorf("Actions.ListEnvSecrets returned error: %v", err) 735 } 736 737 want := &Secrets{ 738 TotalCount: 4, 739 Secrets: []*Secret{ 740 {Name: "A", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, 741 {Name: "B", CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}}, 742 }, 743 } 744 if !cmp.Equal(secrets, want) { 745 t.Errorf("Actions.ListEnvSecrets returned %+v, want %+v", secrets, want) 746 } 747 748 const methodName = "ListEnvSecrets" 749 testBadOptions(t, methodName, func() (err error) { 750 _, _, err = client.Actions.ListEnvSecrets(ctx, 0.0, "\n", opts) 751 return err 752 }) 753 754 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 755 got, resp, err := client.Actions.ListEnvSecrets(ctx, 1, "e", opts) 756 if got != nil { 757 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 758 } 759 return resp, err 760 }) 761 } 762 763 func TestActionsService_GetEnvSecret(t *testing.T) { 764 t.Parallel() 765 client, mux, _ := setup(t) 766 767 mux.HandleFunc("/repositories/1/environments/e/secrets/secret", func(w http.ResponseWriter, r *http.Request) { 768 testMethod(t, r, "GET") 769 fmt.Fprint(w, `{"name":"secret","created_at":"2019-01-02T15:04:05Z","updated_at":"2020-01-02T15:04:05Z"}`) 770 }) 771 772 ctx := context.Background() 773 secret, _, err := client.Actions.GetEnvSecret(ctx, 1, "e", "secret") 774 if err != nil { 775 t.Errorf("Actions.GetEnvSecret returned error: %v", err) 776 } 777 778 want := &Secret{ 779 Name: "secret", 780 CreatedAt: Timestamp{time.Date(2019, time.January, 02, 15, 04, 05, 0, time.UTC)}, 781 UpdatedAt: Timestamp{time.Date(2020, time.January, 02, 15, 04, 05, 0, time.UTC)}, 782 } 783 if !cmp.Equal(secret, want) { 784 t.Errorf("Actions.GetEnvSecret returned %+v, want %+v", secret, want) 785 } 786 787 const methodName = "GetEnvSecret" 788 testBadOptions(t, methodName, func() (err error) { 789 _, _, err = client.Actions.GetEnvSecret(ctx, 0.0, "\n", "\n") 790 return err 791 }) 792 793 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 794 got, resp, err := client.Actions.GetEnvSecret(ctx, 1, "e", "secret") 795 if got != nil { 796 t.Errorf("testNewRequestAndDoFailure %v = %#v, want nil", methodName, got) 797 } 798 return resp, err 799 }) 800 } 801 802 func TestActionsService_CreateOrUpdateEnvSecret(t *testing.T) { 803 t.Parallel() 804 client, mux, _ := setup(t) 805 806 mux.HandleFunc("/repositories/1/environments/e/secrets/secret", func(w http.ResponseWriter, r *http.Request) { 807 testMethod(t, r, "PUT") 808 testHeader(t, r, "Content-Type", "application/json") 809 testBody(t, r, `{"key_id":"1234","encrypted_value":"QIv="}`+"\n") 810 w.WriteHeader(http.StatusCreated) 811 }) 812 813 input := &EncryptedSecret{ 814 Name: "secret", 815 EncryptedValue: "QIv=", 816 KeyID: "1234", 817 } 818 ctx := context.Background() 819 _, err := client.Actions.CreateOrUpdateEnvSecret(ctx, 1, "e", input) 820 if err != nil { 821 t.Errorf("Actions.CreateOrUpdateEnvSecret returned error: %v", err) 822 } 823 824 const methodName = "CreateOrUpdateEnvSecret" 825 testBadOptions(t, methodName, func() (err error) { 826 _, err = client.Actions.CreateOrUpdateEnvSecret(ctx, 0.0, "\n", input) 827 return err 828 }) 829 830 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 831 return client.Actions.CreateOrUpdateEnvSecret(ctx, 1, "e", input) 832 }) 833 } 834 835 func TestActionsService_DeleteEnvSecret(t *testing.T) { 836 t.Parallel() 837 client, mux, _ := setup(t) 838 839 mux.HandleFunc("/repositories/1/environments/e/secrets/secret", func(w http.ResponseWriter, r *http.Request) { 840 testMethod(t, r, "DELETE") 841 }) 842 843 ctx := context.Background() 844 _, err := client.Actions.DeleteEnvSecret(ctx, 1, "e", "secret") 845 if err != nil { 846 t.Errorf("Actions.DeleteEnvSecret returned error: %v", err) 847 } 848 849 const methodName = "DeleteEnvSecret" 850 testBadOptions(t, methodName, func() (err error) { 851 _, err = client.Actions.DeleteEnvSecret(ctx, 0.0, "\n", "\n") 852 return err 853 }) 854 855 testNewRequestAndDoFailure(t, methodName, client, func() (*Response, error) { 856 return client.Actions.DeleteEnvSecret(ctx, 1, "r", "secret") 857 }) 858 } 859 860 func TestPublicKey_Marshal(t *testing.T) { 861 t.Parallel() 862 testJSONMarshal(t, &PublicKey{}, "{}") 863 864 u := &PublicKey{ 865 KeyID: String("kid"), 866 Key: String("k"), 867 } 868 869 want := `{ 870 "key_id": "kid", 871 "key": "k" 872 }` 873 874 testJSONMarshal(t, u, want) 875 } 876 877 func TestSecret_Marshal(t *testing.T) { 878 t.Parallel() 879 testJSONMarshal(t, &Secret{}, "{}") 880 881 u := &Secret{ 882 Name: "n", 883 CreatedAt: Timestamp{referenceTime}, 884 UpdatedAt: Timestamp{referenceTime}, 885 Visibility: "v", 886 SelectedRepositoriesURL: "s", 887 } 888 889 want := `{ 890 "name": "n", 891 "created_at": ` + referenceTimeStr + `, 892 "updated_at": ` + referenceTimeStr + `, 893 "visibility": "v", 894 "selected_repositories_url": "s" 895 }` 896 897 testJSONMarshal(t, u, want) 898 } 899 900 func TestSecrets_Marshal(t *testing.T) { 901 t.Parallel() 902 testJSONMarshal(t, &Secrets{}, "{}") 903 904 u := &Secrets{ 905 TotalCount: 1, 906 Secrets: []*Secret{ 907 { 908 Name: "n", 909 CreatedAt: Timestamp{referenceTime}, 910 UpdatedAt: Timestamp{referenceTime}, 911 Visibility: "v", 912 SelectedRepositoriesURL: "s"}, 913 }, 914 } 915 916 want := `{ 917 "total_count": 1, 918 "secrets": [ 919 { 920 "name": "n", 921 "created_at": ` + referenceTimeStr + `, 922 "updated_at": ` + referenceTimeStr + `, 923 "visibility": "v", 924 "selected_repositories_url": "s" 925 } 926 ] 927 }` 928 929 testJSONMarshal(t, u, want) 930 } 931 932 func TestEncryptedSecret_Marshal(t *testing.T) { 933 t.Parallel() 934 testJSONMarshal(t, &EncryptedSecret{}, "{}") 935 936 u := &EncryptedSecret{ 937 Name: "n", 938 KeyID: "kid", 939 EncryptedValue: "e", 940 Visibility: "v", 941 SelectedRepositoryIDs: []int64{1}, 942 } 943 944 want := `{ 945 "key_id": "kid", 946 "encrypted_value": "e", 947 "visibility": "v", 948 "selected_repository_ids": [1] 949 }` 950 951 testJSONMarshal(t, u, want) 952 } 953 954 func TestSelectedReposList_Marshal(t *testing.T) { 955 t.Parallel() 956 testJSONMarshal(t, &SelectedReposList{}, "{}") 957 958 u := &SelectedReposList{ 959 TotalCount: Int(1), 960 Repositories: []*Repository{ 961 { 962 ID: Int64(1), 963 URL: String("u"), 964 Name: String("n"), 965 }, 966 }, 967 } 968 969 want := `{ 970 "total_count": 1, 971 "repositories": [ 972 { 973 "id": 1, 974 "url": "u", 975 "name": "n" 976 } 977 ] 978 }` 979 980 testJSONMarshal(t, u, want) 981 }