package database_test import ( "context" "database/sql" "path/filepath" "testing" "havenllo/internal/database" ) func TestOpenMigratesSeedsAndEnforcesCascade(t *testing.T) { t.Parallel() ctx := context.Background() path := filepath.Join(t.TempDir(), "havenllo.db") db, err := database.Open(ctx, path) if err != nil { t.Fatalf("Open: %v", err) } defer db.Close() var count int if err := db.QueryRowContext(ctx, "SELECT COUNT(*) FROM lists").Scan(&count); err != nil { t.Fatal(err) } if count != 3 { t.Fatalf("seeded lists = %d, want 3", count) } var listID int64 if err := db.QueryRowContext(ctx, "SELECT id FROM lists ORDER BY position LIMIT 1").Scan(&listID); err != nil { t.Fatal(err) } if _, err := db.ExecContext(ctx, `INSERT INTO cards (list_id, title, description, position, done, created_at, updated_at) VALUES (?, 'test', '', 1024, 0, '2026-01-01T00:00:00Z', '2026-01-01T00:00:00Z')`, listID); err != nil { t.Fatal(err) } if _, err := db.ExecContext(ctx, "DELETE FROM lists WHERE id = ?", listID); err != nil { t.Fatal(err) } if err := db.QueryRowContext(ctx, "SELECT COUNT(*) FROM cards").Scan(&count); err != nil { t.Fatal(err) } if count != 0 { t.Fatalf("cascade left %d cards", count) } } func TestOpenIsIdempotent(t *testing.T) { t.Parallel() ctx := context.Background() path := filepath.Join(t.TempDir(), "havenllo.db") db, err := database.Open(ctx, path) if err != nil { t.Fatal(err) } _ = db.Close() db, err = database.Open(ctx, path) if err != nil { t.Fatal(err) } defer db.Close() var count int if err := db.QueryRowContext(ctx, "SELECT COUNT(*) FROM schema_migrations").Scan(&count); err != nil && err != sql.ErrNoRows { t.Fatal(err) } if count != 1 { t.Fatalf("migrations = %d, want 1", count) } }