github.com/supabase/cli@v1.168.1/internal/db/dump/dump_test.go (about) 1 package dump 2 3 import ( 4 "context" 5 "net/http" 6 "testing" 7 8 "github.com/jackc/pgconn" 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 var dbConfig = pgconn.Config{ 18 Host: "127.0.0.1", 19 Port: 5432, 20 User: "admin", 21 Password: "password", 22 Database: "postgres", 23 } 24 25 func TestPullCommand(t *testing.T) { 26 imageUrl := utils.GetRegistryImageUrl(utils.Pg15Image) 27 const containerId = "test-container" 28 29 t.Run("pulls from remote", func(t *testing.T) { 30 // Setup in-memory fs 31 fsys := afero.NewMemMapFs() 32 // Setup mock docker 33 require.NoError(t, apitest.MockDocker(utils.Docker)) 34 defer gock.OffAll() 35 apitest.MockDockerStart(utils.Docker, imageUrl, containerId) 36 require.NoError(t, apitest.MockDockerLogs(utils.Docker, containerId, "hello world")) 37 // Run test 38 err := Run(context.Background(), "schema.sql", dbConfig, nil, nil, false, false, false, false, false, fsys) 39 // Check error 40 assert.NoError(t, err) 41 assert.Empty(t, apitest.ListUnmatchedRequests()) 42 // Validate migration 43 contents, err := afero.ReadFile(fsys, "schema.sql") 44 assert.NoError(t, err) 45 assert.Equal(t, []byte("hello world"), contents) 46 }) 47 48 t.Run("writes to stdout", func(t *testing.T) { 49 // Setup in-memory fs 50 fsys := afero.NewMemMapFs() 51 // Setup mock docker 52 require.NoError(t, apitest.MockDocker(utils.Docker)) 53 defer gock.OffAll() 54 apitest.MockDockerStart(utils.Docker, imageUrl, containerId) 55 require.NoError(t, apitest.MockDockerLogs(utils.Docker, containerId, "hello world")) 56 // Run test 57 err := Run(context.Background(), "", dbConfig, []string{"public"}, nil, false, false, false, false, false, fsys) 58 // Check error 59 assert.NoError(t, err) 60 assert.Empty(t, apitest.ListUnmatchedRequests()) 61 }) 62 63 t.Run("throws error on missing docker", func(t *testing.T) { 64 // Setup in-memory fs 65 fsys := afero.NewMemMapFs() 66 // Setup mock docker 67 require.NoError(t, apitest.MockDocker(utils.Docker)) 68 defer gock.OffAll() 69 gock.New(utils.Docker.DaemonHost()). 70 Get("/v" + utils.Docker.ClientVersion() + "/images"). 71 Reply(http.StatusServiceUnavailable) 72 // Run test 73 err := Run(context.Background(), "", dbConfig, nil, nil, false, false, false, false, false, fsys) 74 // Check error 75 assert.ErrorContains(t, err, "request returned Service Unavailable for API route and version") 76 assert.Empty(t, apitest.ListUnmatchedRequests()) 77 }) 78 79 t.Run("throws error on permission denied", func(t *testing.T) { 80 // Setup in-memory fs 81 fsys := afero.NewReadOnlyFs(afero.NewMemMapFs()) 82 // Setup mock docker 83 require.NoError(t, apitest.MockDocker(utils.Docker)) 84 defer gock.OffAll() 85 apitest.MockDockerStart(utils.Docker, imageUrl, containerId) 86 require.NoError(t, apitest.MockDockerLogs(utils.Docker, containerId, "hello world")) 87 // Run test 88 err := Run(context.Background(), "schema.sql", dbConfig, nil, nil, false, false, false, false, false, fsys) 89 // Check error 90 assert.ErrorContains(t, err, "operation not permitted") 91 assert.Empty(t, apitest.ListUnmatchedRequests()) 92 }) 93 }