supabase-cli/pkg/migration/list_test.go

93 lines
2.6 KiB
Go

package migration
import (
"context"
"testing"
fs "testing/fstest"
"github.com/jackc/pgerrcode"
"github.com/stretchr/testify/assert"
"github.com/supabase/cli/pkg/pgtest"
)
func TestRemoteMigrations(t *testing.T) {
t.Run("loads migration versions", func(t *testing.T) {
// Setup mock postgres
conn := pgtest.NewConn()
defer conn.Close(t)
conn.Query(LIST_MIGRATION_VERSION).
Reply("SELECT 1", []interface{}{"20220727064247"})
// Run test
versions, err := ListRemoteMigrations(context.Background(), conn.MockClient(t))
// Check error
assert.NoError(t, err)
assert.ElementsMatch(t, []string{"20220727064247"}, versions)
})
t.Run("loads empty migrations on missing table", func(t *testing.T) {
// Setup mock postgres
conn := pgtest.NewConn()
defer conn.Close(t)
conn.Query(LIST_MIGRATION_VERSION).
ReplyError(pgerrcode.UndefinedTable, "relation \"supabase_migrations.schema_migrations\" does not exist")
// Run test
versions, err := ListRemoteMigrations(context.Background(), conn.MockClient(t))
// Check error
assert.NoError(t, err)
assert.Empty(t, versions)
})
t.Run("throws error on invalid row", func(t *testing.T) {
// Setup mock postgres
conn := pgtest.NewConn()
defer conn.Close(t)
conn.Query(LIST_MIGRATION_VERSION).
Reply("SELECT 1", []interface{}{})
// Run test
_, err := ListRemoteMigrations(context.Background(), conn.MockClient(t))
// Check error
assert.ErrorContains(t, err, "number of field descriptions must equal number of destinations, got 0 and 1")
})
}
func TestLocalMigrations(t *testing.T) {
t.Run("loads migration versions", func(t *testing.T) {
// Setup in-memory fs
files := []string{
"20220727064246_test.sql",
"20220727064248_test.sql",
}
fsys := fs.MapFS{}
for _, name := range files {
fsys[name] = &fs.MapFile{}
}
// Run test
versions, err := ListLocalMigrations(".", fsys)
// Check error
assert.NoError(t, err)
assert.ElementsMatch(t, files, versions)
})
t.Run("ignores outdated and invalid files", func(t *testing.T) {
// Setup in-memory fs
fsys := fs.MapFS{
"20211208000000_init.sql": &fs.MapFile{},
"20211208000001_invalid.ts": &fs.MapFile{},
}
// Run test
versions, err := ListLocalMigrations(".", fsys)
// Check error
assert.NoError(t, err)
assert.Empty(t, versions)
})
t.Run("throws error on open failure", func(t *testing.T) {
// Setup in-memory fs
fsys := fs.MapFS{"migrations": &fs.MapFile{}}
// Run test
_, err := ListLocalMigrations("migrations", fsys)
// Check error
assert.ErrorContains(t, err, "failed to read directory:")
})
}