github.com/Redstoneguy129/cli@v0.0.0-20230211220159-15dca4e91917/internal/secrets/set/set_test.go (about)

     1  package set
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"os"
     7  	"testing"
     8  
     9  	"github.com/spf13/afero"
    10  	"github.com/stretchr/testify/assert"
    11  	"github.com/stretchr/testify/require"
    12  	"github.com/Redstoneguy129/cli/internal/testing/apitest"
    13  	"github.com/Redstoneguy129/cli/internal/utils"
    14  	"github.com/Redstoneguy129/cli/pkg/api"
    15  	"gopkg.in/h2non/gock.v1"
    16  )
    17  
    18  func TestSecretSetCommand(t *testing.T) {
    19  	dummy := api.CreateSecretBody{Name: "my-name", Value: "my-value"}
    20  	dummyEnv := dummy.Name + "=" + dummy.Value
    21  
    22  	t.Run("Sets secret via cli args", func(t *testing.T) {
    23  		// Setup in-memory fs
    24  		fsys := afero.NewMemMapFs()
    25  		_, err := fsys.Create(utils.ConfigPath)
    26  		require.NoError(t, err)
    27  		// Setup valid project ref
    28  		project := apitest.RandomProjectRef()
    29  		err = afero.WriteFile(fsys, utils.ProjectRefPath, []byte(project), 0644)
    30  		require.NoError(t, err)
    31  		// Setup valid access token
    32  		token := apitest.RandomAccessToken(t)
    33  		t.Setenv("SUPABASE_ACCESS_TOKEN", string(token))
    34  		// Flush pending mocks after test execution
    35  		defer gock.OffAll()
    36  		gock.New("https://api.supabase.io").
    37  			Post("/v1/projects/" + project + "/secrets").
    38  			MatchType("json").
    39  			JSON(api.CreateSecretsJSONBody{dummy}).
    40  			Reply(200)
    41  		// Run test
    42  		assert.NoError(t, Run(context.Background(), "", []string{dummyEnv}, fsys))
    43  		// Validate api
    44  		assert.Empty(t, apitest.ListUnmatchedRequests())
    45  	})
    46  
    47  	t.Run("Sets secret value via env file", func(t *testing.T) {
    48  		// Setup in-memory fs
    49  		fsys := afero.NewMemMapFs()
    50  		_, err := fsys.Create(utils.ConfigPath)
    51  		require.NoError(t, err)
    52  		// Setup valid project ref
    53  		project := apitest.RandomProjectRef()
    54  		err = afero.WriteFile(fsys, utils.ProjectRefPath, []byte(project), 0644)
    55  		require.NoError(t, err)
    56  		// Setup valid access token
    57  		token := apitest.RandomAccessToken(t)
    58  		t.Setenv("SUPABASE_ACCESS_TOKEN", string(token))
    59  		// Setup dotenv file
    60  		tmpfile, err := os.CreateTemp("", "secret")
    61  		require.NoError(t, err)
    62  		defer os.Remove(tmpfile.Name())
    63  		_, err = tmpfile.Write([]byte(dummyEnv))
    64  		require.NoError(t, err)
    65  		// Flush pending mocks after test execution
    66  		defer gock.OffAll()
    67  		gock.New("https://api.supabase.io").
    68  			Post("/v1/projects/" + project + "/secrets").
    69  			MatchType("json").
    70  			JSON(api.CreateSecretsJSONBody{dummy}).
    71  			Reply(200)
    72  		// Run test
    73  		assert.NoError(t, Run(context.Background(), tmpfile.Name(), []string{}, fsys))
    74  		// Validate api
    75  		assert.Empty(t, apitest.ListUnmatchedRequests())
    76  	})
    77  
    78  	t.Run("throws error on missing config file", func(t *testing.T) {
    79  		assert.Error(t, Run(context.Background(), "", []string{}, afero.NewMemMapFs()))
    80  	})
    81  
    82  	t.Run("throws error on missing project ref", func(t *testing.T) {
    83  		// Setup in-memory fs
    84  		fsys := afero.NewMemMapFs()
    85  		_, err := fsys.Create(utils.ConfigPath)
    86  		require.NoError(t, err)
    87  		// Run test
    88  		assert.Error(t, Run(context.Background(), "", []string{}, fsys))
    89  	})
    90  
    91  	t.Run("throws error on missing access token", func(t *testing.T) {
    92  		// Setup in-memory fs
    93  		fsys := afero.NewMemMapFs()
    94  		_, err := fsys.Create(utils.ConfigPath)
    95  		require.NoError(t, err)
    96  		_, err = fsys.Create(utils.ProjectRefPath)
    97  		require.NoError(t, err)
    98  		// Run test
    99  		assert.Error(t, Run(context.Background(), "", []string{}, fsys))
   100  	})
   101  
   102  	t.Run("throws error on empty secret", func(t *testing.T) {
   103  		// Setup in-memory fs
   104  		fsys := afero.NewMemMapFs()
   105  		_, err := fsys.Create(utils.ConfigPath)
   106  		require.NoError(t, err)
   107  		// Setup valid project ref
   108  		project := apitest.RandomProjectRef()
   109  		err = afero.WriteFile(fsys, utils.ProjectRefPath, []byte(project), 0644)
   110  		require.NoError(t, err)
   111  		// Setup valid access token
   112  		token := apitest.RandomAccessToken(t)
   113  		t.Setenv("SUPABASE_ACCESS_TOKEN", string(token))
   114  		// Run test
   115  		assert.Error(t, Run(context.Background(), "", []string{}, fsys))
   116  	})
   117  
   118  	t.Run("throws error on malformed secret", func(t *testing.T) {
   119  		// Setup in-memory fs
   120  		fsys := afero.NewMemMapFs()
   121  		_, err := fsys.Create(utils.ConfigPath)
   122  		require.NoError(t, err)
   123  		// Setup valid project ref
   124  		project := apitest.RandomProjectRef()
   125  		err = afero.WriteFile(fsys, utils.ProjectRefPath, []byte(project), 0644)
   126  		require.NoError(t, err)
   127  		// Setup valid access token
   128  		token := apitest.RandomAccessToken(t)
   129  		t.Setenv("SUPABASE_ACCESS_TOKEN", string(token))
   130  		// Run test
   131  		assert.Error(t, Run(context.Background(), "", []string{"malformed"}, fsys))
   132  	})
   133  
   134  	t.Run("throws error on network error", func(t *testing.T) {
   135  		// Setup in-memory fs
   136  		fsys := afero.NewMemMapFs()
   137  		_, err := fsys.Create(utils.ConfigPath)
   138  		require.NoError(t, err)
   139  		// Setup valid project ref
   140  		project := apitest.RandomProjectRef()
   141  		err = afero.WriteFile(fsys, utils.ProjectRefPath, []byte(project), 0644)
   142  		require.NoError(t, err)
   143  		// Setup valid access token
   144  		token := apitest.RandomAccessToken(t)
   145  		t.Setenv("SUPABASE_ACCESS_TOKEN", string(token))
   146  		// Flush pending mocks after test execution
   147  		defer gock.OffAll()
   148  		gock.New("https://api.supabase.io").
   149  			Post("/v1/projects/" + project + "/secrets").
   150  			MatchType("json").
   151  			JSON(api.CreateSecretsJSONBody{dummy}).
   152  			ReplyError(errors.New("network error"))
   153  		// Run test
   154  		assert.Error(t, Run(context.Background(), "", []string{dummyEnv}, fsys))
   155  		// Validate api
   156  		assert.Empty(t, apitest.ListUnmatchedRequests())
   157  	})
   158  
   159  	t.Run("throws error on server unavailable", func(t *testing.T) {
   160  		// Setup in-memory fs
   161  		fsys := afero.NewMemMapFs()
   162  		_, err := fsys.Create(utils.ConfigPath)
   163  		require.NoError(t, err)
   164  		// Setup valid project ref
   165  		project := apitest.RandomProjectRef()
   166  		err = afero.WriteFile(fsys, utils.ProjectRefPath, []byte(project), 0644)
   167  		require.NoError(t, err)
   168  		// Setup valid access token
   169  		token := apitest.RandomAccessToken(t)
   170  		t.Setenv("SUPABASE_ACCESS_TOKEN", string(token))
   171  		// Flush pending mocks after test execution
   172  		defer gock.OffAll()
   173  		gock.New("https://api.supabase.io").
   174  			Post("/v1/projects/" + project + "/secrets").
   175  			MatchType("json").
   176  			JSON(api.CreateSecretsJSONBody{dummy}).
   177  			Reply(500).
   178  			JSON(map[string]string{"message": "unavailable"})
   179  		// Run test
   180  		assert.Error(t, Run(context.Background(), "", []string{dummyEnv}, fsys))
   181  		// Validate api
   182  		assert.Empty(t, apitest.ListUnmatchedRequests())
   183  	})
   184  }