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

     1  package unset
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"testing"
     7  
     8  	"github.com/spf13/afero"
     9  	"github.com/stretchr/testify/assert"
    10  	"github.com/stretchr/testify/require"
    11  	"github.com/Redstoneguy129/cli/internal/testing/apitest"
    12  	"github.com/Redstoneguy129/cli/internal/utils"
    13  	"github.com/Redstoneguy129/cli/pkg/api"
    14  	"gopkg.in/h2non/gock.v1"
    15  )
    16  
    17  func TestSecretUnsetCommand(t *testing.T) {
    18  	t.Run("Unsets secret via cli args", func(t *testing.T) {
    19  		// Setup in-memory fs
    20  		fsys := afero.NewMemMapFs()
    21  		_, err := fsys.Create(utils.ConfigPath)
    22  		require.NoError(t, err)
    23  		// Setup valid project ref
    24  		project := apitest.RandomProjectRef()
    25  		err = afero.WriteFile(fsys, utils.ProjectRefPath, []byte(project), 0644)
    26  		require.NoError(t, err)
    27  		// Setup valid access token
    28  		token := apitest.RandomAccessToken(t)
    29  		t.Setenv("SUPABASE_ACCESS_TOKEN", string(token))
    30  		// Flush pending mocks after test execution
    31  		defer gock.OffAll()
    32  		gock.New("https://api.supabase.io").
    33  			Delete("/v1/projects/" + project + "/secrets").
    34  			MatchType("json").
    35  			JSON(api.DeleteSecretsJSONBody{"my-secret"}).
    36  			Reply(200)
    37  		// Run test
    38  		assert.NoError(t, Run(context.Background(), []string{"my-secret"}, fsys))
    39  		// Validate api
    40  		assert.Empty(t, apitest.ListUnmatchedRequests())
    41  	})
    42  
    43  	t.Run("throws error on missing config file", func(t *testing.T) {
    44  		assert.Error(t, Run(context.Background(), []string{}, afero.NewMemMapFs()))
    45  	})
    46  
    47  	t.Run("throws error on missing project ref", 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  		// Run test
    53  		assert.Error(t, Run(context.Background(), []string{}, fsys))
    54  	})
    55  
    56  	t.Run("throws error on missing access token", func(t *testing.T) {
    57  		// Setup in-memory fs
    58  		fsys := afero.NewMemMapFs()
    59  		_, err := fsys.Create(utils.ConfigPath)
    60  		require.NoError(t, err)
    61  		_, err = fsys.Create(utils.ProjectRefPath)
    62  		require.NoError(t, err)
    63  		// Run test
    64  		assert.Error(t, Run(context.Background(), []string{}, fsys))
    65  	})
    66  
    67  	t.Run("throws error on empty secret", func(t *testing.T) {
    68  		// Setup in-memory fs
    69  		fsys := afero.NewMemMapFs()
    70  		_, err := fsys.Create(utils.ConfigPath)
    71  		require.NoError(t, err)
    72  		// Setup valid project ref
    73  		project := apitest.RandomProjectRef()
    74  		err = afero.WriteFile(fsys, utils.ProjectRefPath, []byte(project), 0644)
    75  		require.NoError(t, err)
    76  		// Setup valid access token
    77  		token := apitest.RandomAccessToken(t)
    78  		t.Setenv("SUPABASE_ACCESS_TOKEN", string(token))
    79  		// Run test
    80  		assert.Error(t, Run(context.Background(), []string{}, fsys))
    81  	})
    82  
    83  	t.Run("throws error on network error", func(t *testing.T) {
    84  		// Setup in-memory fs
    85  		fsys := afero.NewMemMapFs()
    86  		_, err := fsys.Create(utils.ConfigPath)
    87  		require.NoError(t, err)
    88  		// Setup valid project ref
    89  		project := apitest.RandomProjectRef()
    90  		err = afero.WriteFile(fsys, utils.ProjectRefPath, []byte(project), 0644)
    91  		require.NoError(t, err)
    92  		// Setup valid access token
    93  		token := apitest.RandomAccessToken(t)
    94  		t.Setenv("SUPABASE_ACCESS_TOKEN", string(token))
    95  		// Flush pending mocks after test execution
    96  		defer gock.OffAll()
    97  		gock.New("https://api.supabase.io").
    98  			Delete("/v1/projects/" + project + "/secrets").
    99  			MatchType("json").
   100  			JSON(api.DeleteSecretsJSONBody{"my-secret"}).
   101  			ReplyError(errors.New("network error"))
   102  		// Run test
   103  		assert.Error(t, Run(context.Background(), []string{"my-secret"}, fsys))
   104  		// Validate api
   105  		assert.Empty(t, apitest.ListUnmatchedRequests())
   106  	})
   107  
   108  	t.Run("throws error on server unavailable", func(t *testing.T) {
   109  		// Setup in-memory fs
   110  		fsys := afero.NewMemMapFs()
   111  		_, err := fsys.Create(utils.ConfigPath)
   112  		require.NoError(t, err)
   113  		// Setup valid project ref
   114  		project := apitest.RandomProjectRef()
   115  		err = afero.WriteFile(fsys, utils.ProjectRefPath, []byte(project), 0644)
   116  		require.NoError(t, err)
   117  		// Setup valid access token
   118  		token := apitest.RandomAccessToken(t)
   119  		t.Setenv("SUPABASE_ACCESS_TOKEN", string(token))
   120  		// Flush pending mocks after test execution
   121  		defer gock.OffAll()
   122  		gock.New("https://api.supabase.io").
   123  			Delete("/v1/projects/" + project + "/secrets").
   124  			MatchType("json").
   125  			JSON(api.DeleteSecretsJSONBody{"my-secret"}).
   126  			Reply(500).
   127  			JSON(map[string]string{"message": "unavailable"})
   128  		// Run test
   129  		assert.Error(t, Run(context.Background(), []string{"my-secret"}, fsys))
   130  		// Validate api
   131  		assert.Empty(t, apitest.ListUnmatchedRequests())
   132  	})
   133  }