github.com/Redstoneguy129/cli@v0.0.0-20230211220159-15dca4e91917/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/docker/docker/client" 10 "github.com/spf13/afero" 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 "github.com/Redstoneguy129/cli/internal/testing/apitest" 14 "github.com/Redstoneguy129/cli/internal/utils" 15 "gopkg.in/h2non/gock.v1" 16 ) 17 18 func TestBranchValidation(t *testing.T) { 19 t.Run("branch name is valid", func(t *testing.T) { 20 assert.NoError(t, assertNewBranchIsValid("test-branch", afero.NewMemMapFs())) 21 }) 22 23 t.Run("branch name is reserved", func(t *testing.T) { 24 assert.Error(t, assertNewBranchIsValid("main", afero.NewMemMapFs())) 25 }) 26 27 t.Run("branch name is invalid", func(t *testing.T) { 28 assert.Error(t, assertNewBranchIsValid("@", afero.NewMemMapFs())) 29 }) 30 31 t.Run("branch not a directory", func(t *testing.T) { 32 // Setup in-memory fs 33 fsys := afero.NewMemMapFs() 34 path := "/supabase/.branches/test-branch" 35 _, err := fsys.Create(path) 36 require.NoError(t, err) 37 // Run test 38 assert.Error(t, assertNewBranchIsValid(path, fsys)) 39 }) 40 41 t.Run("branch already exists", func(t *testing.T) { 42 // Setup in-memory fs 43 fsys := afero.NewMemMapFs() 44 path := "/supabase/.branches/test-branch" 45 require.NoError(t, fsys.MkdirAll(path, 0755)) 46 // Run test 47 assert.Error(t, assertNewBranchIsValid(path, fsys)) 48 }) 49 } 50 51 func TestBranchCreation(t *testing.T) { 52 const version = "1.41" 53 utils.DbId = "test-db" 54 55 t.Run("docker exec failure", func(t *testing.T) { 56 // Setup mock docker 57 require.NoError(t, client.WithHTTPClient(http.DefaultClient)(utils.Docker)) 58 defer gock.OffAll() 59 gock.New("http:///var/run/docker.sock"). 60 Head("/_ping"). 61 Reply(http.StatusOK). 62 SetHeader("API-Version", version). 63 SetHeader("OSType", "linux") 64 gock.New("http:///var/run/docker.sock"). 65 Post("/v" + version + "/containers/" + utils.DbId + "/exec"). 66 Reply(http.StatusServiceUnavailable) 67 // Run test 68 assert.Error(t, createBranch(context.Background(), "test-branch")) 69 // Validate api 70 assert.Empty(t, apitest.ListUnmatchedRequests()) 71 }) 72 73 t.Run("docker attach failure", func(t *testing.T) { 74 // Setup mock docker 75 require.NoError(t, client.WithHTTPClient(http.DefaultClient)(utils.Docker)) 76 defer gock.OffAll() 77 gock.New("http:///var/run/docker.sock"). 78 Head("/_ping"). 79 Reply(http.StatusOK). 80 SetHeader("API-Version", version). 81 SetHeader("OSType", "linux") 82 gock.New("http:///var/run/docker.sock"). 83 Post("/v" + version + "/containers/" + utils.DbId + "/exec"). 84 Reply(http.StatusCreated). 85 JSON(types.ContainerJSON{}) 86 // Run test 87 assert.Error(t, createBranch(context.Background(), "test-branch")) 88 // Validate api 89 assert.Empty(t, apitest.ListUnmatchedRequests()) 90 }) 91 } 92 93 func TestCreateCommand(t *testing.T) { 94 const ( 95 version = "1.41" 96 branch = "test-branch" 97 ) 98 99 t.Run("throws error on missing config", func(t *testing.T) { 100 assert.Error(t, Run(branch, afero.NewMemMapFs())) 101 }) 102 103 t.Run("throws error on stopped db", func(t *testing.T) { 104 // Setup in-memory fs 105 fsys := &afero.MemMapFs{} 106 require.NoError(t, utils.WriteConfig(fsys, false)) 107 // Setup mock docker 108 require.NoError(t, client.WithHTTPClient(http.DefaultClient)(utils.Docker)) 109 defer gock.OffAll() 110 gock.New("http:///var/run/docker.sock"). 111 Head("/_ping"). 112 Reply(http.StatusOK). 113 SetHeader("API-Version", version). 114 SetHeader("OSType", "linux") 115 gock.New("http:///var/run/docker.sock"). 116 Get("/v" + version + "/containers"). 117 Reply(http.StatusServiceUnavailable) 118 // Run test 119 assert.Error(t, Run(branch, fsys)) 120 // Validate api 121 assert.Empty(t, apitest.ListUnmatchedRequests()) 122 }) 123 }