github.com/Redstoneguy129/cli@v0.0.0-20230211220159-15dca4e91917/internal/db/test/test_test.go (about) 1 package test 2 3 import ( 4 "bytes" 5 "context" 6 "errors" 7 "io/fs" 8 "net/http" 9 "os" 10 "path/filepath" 11 "strings" 12 "testing" 13 14 "github.com/Redstoneguy129/cli/internal/testing/apitest" 15 "github.com/Redstoneguy129/cli/internal/utils" 16 "github.com/docker/docker/api/types" 17 "github.com/spf13/afero" 18 "github.com/stretchr/testify/assert" 19 "github.com/stretchr/testify/require" 20 "gopkg.in/h2non/gock.v1" 21 ) 22 23 type MockFs struct { 24 afero.MemMapFs 25 DenyPath string 26 } 27 28 func (m *MockFs) Open(name string) (afero.File, error) { 29 if strings.HasPrefix(name, m.DenyPath) { 30 return nil, fs.ErrPermission 31 } 32 return m.MemMapFs.Open(name) 33 } 34 35 func TestTarDirectory(t *testing.T) { 36 t.Run("tars a given directory", func(t *testing.T) { 37 // Setup in-memory fs 38 fsys := afero.NewMemMapFs() 39 pgtap := "/tests/order_test.sql" 40 require.NoError(t, afero.WriteFile(fsys, pgtap, []byte("SELECT 0;"), 0644)) 41 // Run test 42 var buf bytes.Buffer 43 assert.NoError(t, compress(filepath.Dir(pgtap), &buf, fsys)) 44 }) 45 46 t.Run("throws error on permission denied", func(t *testing.T) { 47 // Setup in-memory fs 48 pgtap := "/tests/order_test.sql" 49 fsys := &MockFs{DenyPath: pgtap} 50 require.NoError(t, afero.WriteFile(fsys, pgtap, []byte("SELECT 0;"), 0644)) 51 // Run test 52 var buf bytes.Buffer 53 err := compress(filepath.Dir(pgtap), &buf, fsys) 54 // Check error 55 assert.ErrorContains(t, err, "permission denied") 56 }) 57 } 58 59 func TestPgProve(t *testing.T) { 60 t.Run("throws error on copy failure", func(t *testing.T) { 61 utils.DbId = "test_db" 62 // Setup in-memory fs 63 fsys := afero.NewMemMapFs() 64 require.NoError(t, fsys.Mkdir(utils.DbTestsDir, 0755)) 65 // Setup mock docker 66 require.NoError(t, apitest.MockDocker(utils.Docker)) 67 gock.New(utils.Docker.DaemonHost()). 68 Put("/v" + utils.Docker.ClientVersion() + "/containers/test_db/archive"). 69 Reply(http.StatusServiceUnavailable) 70 // Run test 71 err := pgProve(context.Background(), "/tmp", fsys) 72 // Check error 73 assert.ErrorContains(t, err, "request returned Service Unavailable for API route and version") 74 assert.Empty(t, apitest.ListUnmatchedRequests()) 75 }) 76 77 t.Run("throws error on exec failure", func(t *testing.T) { 78 utils.DbId = "test_db" 79 // Setup in-memory fs 80 fsys := afero.NewMemMapFs() 81 require.NoError(t, fsys.Mkdir(utils.DbTestsDir, 0755)) 82 // Setup mock docker 83 require.NoError(t, apitest.MockDocker(utils.Docker)) 84 gock.New(utils.Docker.DaemonHost()). 85 Put("/v" + utils.Docker.ClientVersion() + "/containers/test_db/archive"). 86 Reply(http.StatusOK) 87 gock.New(utils.Docker.DaemonHost()). 88 Post("/v" + utils.Docker.ClientVersion() + "/containers/test_db/exec"). 89 ReplyError(errors.New("network error")) 90 // Run test 91 err := pgProve(context.Background(), "/tmp", fsys) 92 // Check error 93 assert.ErrorContains(t, err, "network error") 94 assert.Empty(t, apitest.ListUnmatchedRequests()) 95 }) 96 } 97 98 func TestRunCommand(t *testing.T) { 99 t.Run("throws error on missing config", func(t *testing.T) { 100 // Setup in-memory fs 101 fsys := afero.NewMemMapFs() 102 // Run test 103 err := Run(context.Background(), fsys) 104 // Check error 105 assert.ErrorIs(t, err, os.ErrNotExist) 106 }) 107 108 t.Run("throws error on missing database", func(t *testing.T) { 109 // Setup in-memory fs 110 fsys := afero.NewMemMapFs() 111 require.NoError(t, utils.WriteConfig(fsys, false)) 112 // Setup mock docker 113 require.NoError(t, apitest.MockDocker(utils.Docker)) 114 gock.New(utils.Docker.DaemonHost()). 115 Get("/v" + utils.Docker.ClientVersion() + "/containers/supabase_db_"). 116 ReplyError(errors.New("network error")) 117 // Run test 118 err := Run(context.Background(), fsys) 119 // Check error 120 assert.ErrorContains(t, err, "supabase start is not running.") 121 assert.Empty(t, apitest.ListUnmatchedRequests()) 122 }) 123 124 t.Run("throws error on missing tests", func(t *testing.T) { 125 // Setup in-memory fs 126 fsys := afero.NewMemMapFs() 127 require.NoError(t, utils.WriteConfig(fsys, false)) 128 // Setup mock docker 129 require.NoError(t, apitest.MockDocker(utils.Docker)) 130 gock.New(utils.Docker.DaemonHost()). 131 Get("/v" + utils.Docker.ClientVersion() + "/containers/supabase_db_"). 132 Reply(http.StatusOK). 133 JSON(types.ContainerJSON{}) 134 // Run test 135 err := Run(context.Background(), fsys) 136 // Check error 137 assert.ErrorContains(t, err, "open supabase/tests: file does not exist") 138 assert.Empty(t, apitest.ListUnmatchedRequests()) 139 }) 140 }