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  }