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)
	}
}
