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 }