github.com/google/go-github/v68@v68.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  		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: Ptr("1234"), Key: Ptr("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: Ptr("1234"), Key: Ptr("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: Ptr("012345678"), Key: Ptr("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: Ptr(1),
   523  		Repositories: []*Repository{
   524  			{ID: Ptr(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: Ptr(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: Ptr(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: Ptr("1234"), Key: Ptr("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: Ptr("1234"), Key: Ptr("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: Ptr("kid"),
   866  		Key:   Ptr("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: Ptr(1),
   960  		Repositories: []*Repository{
   961  			{
   962  				ID:   Ptr(int64(1)),
   963  				URL:  Ptr("u"),
   964  				Name: Ptr("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  }