package orm
import (
"context"
"database/sql"
"io"
"log/slog"
"path/filepath"
"testing"
)
func TestAppliedMigrationDoesNotNeedTheWriteLock(t *testing.T) {
ctx := context.Background()
dsn := "file:" + filepath.Join(t.TempDir(), "orm.db") + "?_txlock=immediate&_busy_timeout=200"
db, err := sql.Open("sqlite3", dsn)
if err != nil {
t.Fatal(err)
}
t.Cleanup(func() { db.Close() })
if _, err := db.Exec(`
create table migrations (id integer primary key autoincrement, name text unique);
insert into migrations (name) values ('done');
`); err != nil {
t.Fatal(err)
}
holder, err := db.BeginTx(ctx, nil)
if err != nil {
t.Fatal(err)
}
defer holder.Rollback()
conn, err := db.Conn(ctx)
if err != nil {
t.Fatal(err)
}
defer conn.Close()
logger := slog.New(slog.NewTextHandler(io.Discard, nil))
ran := false
err = RunMigration(conn, logger, "done", func(*sql.Tx) error {
ran = true
return nil
})
if err != nil || ran {
t.Fatalf("applied migration with the write lock held = %v, ran %v, want it skipped", err, ran)
}
}