blob: b4f72e4a77893eb793bb32bb09e63bbb35643600 [file] [log] [blame]
package expectedschema_test
import (
"context"
"testing"
"github.com/stretchr/testify/require"
"go.skia.org/infra/go/deepequal/assertdeep"
"go.skia.org/infra/go/sql/schema"
"go.skia.org/infra/perf/go/config"
"go.skia.org/infra/perf/go/sql"
"go.skia.org/infra/perf/go/sql/expectedschema"
"go.skia.org/infra/perf/go/sql/sqltest"
)
func Test_NoMigrationNeeded(t *testing.T) {
ctx := context.Background()
// Load DB loaded with schema from schema.go
db := sqltest.NewSpannerDBForTests(t, "desc")
// Newly created schema should already be up to date, so no error should pop up.
err := expectedschema.ValidateAndMigrateNewSchema(ctx, db)
require.NoError(t, err)
}
const CreateInvalidTable = `
DROP TABLE IF EXISTS Alerts;
CREATE TABLE IF NOT EXISTS Alerts (
alert TEXT PRIMARY KEY
);
`
func Test_InvalidSchema(t *testing.T) {
ctx := context.Background()
db := sqltest.NewSpannerDBForTests(t, "desc")
_, err := db.Exec(ctx, CreateInvalidTable)
require.NoError(t, err)
// Live schema doesn't match next or prev schema versions. This shouldn't happen.
err = expectedschema.ValidateAndMigrateNewSchema(ctx, db)
require.Error(t, err)
}
func Test_MigrationNeeded(t *testing.T) {
ctx := context.Background()
db := sqltest.NewSpannerDBForTests(t, "desc")
next, err := expectedschema.Load()
require.NoError(t, err)
prev, err := expectedschema.LoadPrev()
require.NoError(t, err)
_, err = db.Exec(ctx, expectedschema.FromNextToLiveSpanner)
require.NoError(t, err)
actual, err := schema.GetDescription(ctx, db, sql.Tables{}, string(config.SpannerDataStoreType))
require.NoError(t, err)
// Current schema should now match prev.
assertdeep.Equal(t, prev, *actual)
// Since live matches the prev schema, it should get migrated to next.
err = expectedschema.ValidateAndMigrateNewSchema(ctx, db)
require.NoError(t, err)
actual, err = schema.GetDescription(ctx, db, sql.Tables{}, string(config.SpannerDataStoreType))
require.NoError(t, err)
assertdeep.Equal(t, next, *actual)
}