github.com/supabase/cli@v1.168.1/internal/db/test/test_test.go (about)

     1  package test
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"testing"
     7  
     8  	"github.com/jackc/pgconn"
     9  	"github.com/jackc/pgerrcode"
    10  	"github.com/spf13/afero"
    11  	"github.com/stretchr/testify/assert"
    12  	"github.com/stretchr/testify/require"
    13  	"github.com/supabase/cli/internal/testing/apitest"
    14  	"github.com/supabase/cli/internal/testing/pgtest"
    15  	"github.com/supabase/cli/internal/utils"
    16  	"gopkg.in/h2non/gock.v1"
    17  )
    18  
    19  var dbConfig = pgconn.Config{
    20  	Host:     "db.supabase.co",
    21  	Port:     5432,
    22  	User:     "admin",
    23  	Password: "password",
    24  	Database: "postgres",
    25  }
    26  
    27  func TestRunCommand(t *testing.T) {
    28  	t.Run("runs tests with pg_prove", func(t *testing.T) {
    29  		// Setup in-memory fs
    30  		fsys := afero.NewMemMapFs()
    31  		require.NoError(t, utils.WriteConfig(fsys, false))
    32  		// Setup mock postgres
    33  		conn := pgtest.NewConn()
    34  		defer conn.Close(t)
    35  		conn.Query(ENABLE_PGTAP).
    36  			Reply("CREATE EXTENSION").
    37  			Query(DISABLE_PGTAP).
    38  			Reply("DROP EXTENSION")
    39  		// Setup mock docker
    40  		require.NoError(t, apitest.MockDocker(utils.Docker))
    41  		defer gock.OffAll()
    42  		containerId := "test-pg-prove"
    43  		apitest.MockDockerStart(utils.Docker, utils.GetRegistryImageUrl(utils.PgProveImage), containerId)
    44  		require.NoError(t, apitest.MockDockerLogs(utils.Docker, containerId, "Result: SUCCESS"))
    45  		// Run test
    46  		err := Run(context.Background(), []string{"nested"}, dbConfig, fsys, conn.Intercept)
    47  		// Check error
    48  		assert.NoError(t, err)
    49  	})
    50  
    51  	t.Run("throws error on connect failure", func(t *testing.T) {
    52  		// Setup in-memory fs
    53  		fsys := afero.NewMemMapFs()
    54  		require.NoError(t, utils.WriteConfig(fsys, false))
    55  		// Run test
    56  		err := Run(context.Background(), nil, dbConfig, fsys)
    57  		// Check error
    58  		assert.ErrorContains(t, err, "failed to connect to postgres")
    59  	})
    60  
    61  	t.Run("throws error on pgtap failure", func(t *testing.T) {
    62  		// Setup in-memory fs
    63  		fsys := afero.NewMemMapFs()
    64  		require.NoError(t, utils.WriteConfig(fsys, false))
    65  		// Setup mock postgres
    66  		conn := pgtest.NewConn()
    67  		defer conn.Close(t)
    68  		conn.Query(ENABLE_PGTAP).
    69  			ReplyError(pgerrcode.DuplicateObject, `extension "pgtap" already exists, skipping`)
    70  		// Run test
    71  		err := Run(context.Background(), nil, dbConfig, fsys, conn.Intercept)
    72  		// Check error
    73  		assert.ErrorContains(t, err, "failed to enable pgTAP")
    74  	})
    75  
    76  	t.Run("throws error on network failure", func(t *testing.T) {
    77  		errNetwork := errors.New("network error")
    78  		// Setup in-memory fs
    79  		fsys := afero.NewMemMapFs()
    80  		require.NoError(t, utils.WriteConfig(fsys, false))
    81  		// Setup mock postgres
    82  		conn := pgtest.NewConn()
    83  		defer conn.Close(t)
    84  		conn.Query(ENABLE_PGTAP).
    85  			Reply("CREATE EXTENSION").
    86  			Query(DISABLE_PGTAP).
    87  			Reply("DROP EXTENSION")
    88  		// Setup mock docker
    89  		require.NoError(t, apitest.MockDocker(utils.Docker))
    90  		defer gock.OffAll()
    91  		gock.New(utils.Docker.DaemonHost()).
    92  			Get("/v" + utils.Docker.ClientVersion() + "/images/" + utils.GetRegistryImageUrl(utils.PgProveImage) + "/json").
    93  			ReplyError(errNetwork)
    94  		// Run test
    95  		err := Run(context.Background(), nil, dbConfig, fsys, conn.Intercept)
    96  		// Check error
    97  		assert.ErrorIs(t, err, errNetwork)
    98  		assert.Empty(t, apitest.ListUnmatchedRequests())
    99  	})
   100  }