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