55 lines
1.9 KiB
Go
55 lines
1.9 KiB
Go
|
|
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")
|
||
|
|
}
|
||
|
|
}
|