package database import ( "context" "path/filepath" "testing" "github.com/pressly/goose/v3" ) // tableExists сообщает, есть ли таблица в схеме. func tableExists(ctx context.Context, t *testing.T, db *DB, name string) bool { t.Helper() var count int if err := db.Reader.QueryRowContext(ctx, `SELECT COUNT(*) FROM sqlite_master WHERE type = 'table' AND name = ?`, name).Scan(&count); err != nil { t.Fatalf("sqlite_master(%s): %v", name, err) } return count > 0 } // TestOAuthRemovalMigration проверяет миграцию 00027 (D-084): вход через // внешние провайдеры удалён, таблица связи внешних аккаунтов уходит из схемы. // Откат возвращает структуру (пустую) — код входа лежит в истории git. func TestOAuthRemovalMigration(t *testing.T) { ctx := context.Background() db, err := Open(ctx, Options{ Path: filepath.Join(t.TempDir(), "glchat.db"), ReadPool: 2, Migrate: true, }) if err != nil { t.Fatalf("open: %v", err) } defer func() { _ = db.Close() }() if tableExists(ctx, t, db, "oauth_accounts") { t.Fatal("после миграций таблицы oauth_accounts быть не должно") } // Откат одной миграции возвращает таблицу, повторный накат снова убирает. if err := goose.DownToContext(ctx, db.Writer, "migrations", 26); err != nil { t.Fatalf("down to 26: %v", err) } if !tableExists(ctx, t, db, "oauth_accounts") { t.Fatal("откат 00027 должен вернуть структуру oauth_accounts") } if err := goose.UpContext(ctx, db.Writer, "migrations"); err != nil { t.Fatalf("up: %v", err) } if tableExists(ctx, t, db, "oauth_accounts") { t.Fatal("повторный накат 00027 должен снова удалить oauth_accounts") } }