github.com/supabase/cli@v1.168.1/internal/db/branch/create/create_test.go (about) 1 package create 2 3 import ( 4 "context" 5 "net/http" 6 "testing" 7 8 "github.com/docker/docker/api/types" 9 "github.com/spf13/afero" 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 "github.com/supabase/cli/internal/testing/apitest" 13 "github.com/supabase/cli/internal/utils" 14 "gopkg.in/h2non/gock.v1" 15 ) 16 17 func TestBranchValidation(t *testing.T) { 18 t.Run("branch name is valid", func(t *testing.T) { 19 assert.NoError(t, assertNewBranchIsValid("test-branch", afero.NewMemMapFs())) 20 }) 21 22 t.Run("branch name is reserved", func(t *testing.T) { 23 assert.Error(t, assertNewBranchIsValid("main", afero.NewMemMapFs())) 24 }) 25 26 t.Run("branch name is invalid", func(t *testing.T) { 27 assert.Error(t, assertNewBranchIsValid("@", afero.NewMemMapFs())) 28 }) 29 30 t.Run("branch not a directory", func(t *testing.T) { 31 // Setup in-memory fs 32 fsys := afero.NewMemMapFs() 33 path := "/supabase/.branches/test-branch" 34 _, err := fsys.Create(path) 35 require.NoError(t, err) 36 // Run test 37 assert.Error(t, assertNewBranchIsValid(path, fsys)) 38 }) 39 40 t.Run("branch already exists", func(t *testing.T) { 41 // Setup in-memory fs 42 fsys := afero.NewMemMapFs() 43 path := "/supabase/.branches/test-branch" 44 require.NoError(t, fsys.MkdirAll(path, 0755)) 45 // Run test 46 assert.Error(t, assertNewBranchIsValid(path, fsys)) 47 }) 48 } 49 50 func TestBranchCreation(t *testing.T) { 51 utils.DbId = "test-db" 52 53 t.Run("docker exec failure", func(t *testing.T) { 54 // Setup mock docker 55 require.NoError(t, apitest.MockDocker(utils.Docker)) 56 defer gock.OffAll() 57 gock.New(utils.Docker.DaemonHost()). 58 Post("/v" + utils.Docker.ClientVersion() + "/containers/" + utils.DbId + "/exec"). 59 Reply(http.StatusServiceUnavailable) 60 // Run test 61 err := createBranch(context.Background(), "test-branch") 62 // Validate api 63 assert.ErrorContains(t, err, "request returned Service Unavailable for API route and version") 64 assert.Empty(t, apitest.ListUnmatchedRequests()) 65 }) 66 67 t.Run("docker attach failure", func(t *testing.T) { 68 // Setup mock docker 69 require.NoError(t, apitest.MockDocker(utils.Docker)) 70 defer gock.OffAll() 71 gock.New(utils.Docker.DaemonHost()). 72 Post("/v" + utils.Docker.ClientVersion() + "/containers/" + utils.DbId + "/exec"). 73 Reply(http.StatusCreated). 74 JSON(types.ContainerJSON{}) 75 // Run test 76 err := createBranch(context.Background(), "test-branch") 77 // Validate api 78 assert.ErrorContains(t, err, "unable to upgrade to tcp, received 404") 79 assert.Empty(t, apitest.ListUnmatchedRequests()) 80 }) 81 } 82 83 func TestCreateCommand(t *testing.T) { 84 const branch = "test-branch" 85 86 t.Run("throws error on missing config", func(t *testing.T) { 87 assert.Error(t, Run(branch, afero.NewMemMapFs())) 88 }) 89 90 t.Run("throws error on stopped db", func(t *testing.T) { 91 // Setup in-memory fs 92 fsys := &afero.MemMapFs{} 93 require.NoError(t, utils.WriteConfig(fsys, false)) 94 // Setup mock docker 95 require.NoError(t, apitest.MockDocker(utils.Docker)) 96 defer gock.OffAll() 97 gock.New(utils.Docker.DaemonHost()). 98 Get("/v" + utils.Docker.ClientVersion() + "/containers"). 99 Reply(http.StatusNotFound) 100 // Run test 101 err := Run(branch, fsys) 102 // Validate api 103 assert.ErrorIs(t, err, utils.ErrNotRunning) 104 assert.Empty(t, apitest.ListUnmatchedRequests()) 105 }) 106 }