refactor: replace hand-written test SQL with Drizzle migration runner
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -1,124 +1,17 @@
|
|||||||
import { Database } from "bun:sqlite";
|
import { Database } from "bun:sqlite";
|
||||||
import { drizzle } from "drizzle-orm/bun-sqlite";
|
import { drizzle } from "drizzle-orm/bun-sqlite";
|
||||||
|
import { migrate } from "drizzle-orm/bun-sqlite/migrator";
|
||||||
import * as schema from "../../src/db/schema.ts";
|
import * as schema from "../../src/db/schema.ts";
|
||||||
|
|
||||||
export function createTestDb() {
|
export function createTestDb() {
|
||||||
const sqlite = new Database(":memory:");
|
const sqlite = new Database(":memory:");
|
||||||
sqlite.run("PRAGMA foreign_keys = ON");
|
sqlite.run("PRAGMA foreign_keys = ON");
|
||||||
|
|
||||||
// Create tables matching the Drizzle schema
|
|
||||||
sqlite.run(`
|
|
||||||
CREATE TABLE categories (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
name TEXT NOT NULL UNIQUE,
|
|
||||||
icon TEXT NOT NULL DEFAULT 'package',
|
|
||||||
created_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
||||||
)
|
|
||||||
`);
|
|
||||||
|
|
||||||
sqlite.run(`
|
|
||||||
CREATE TABLE items (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
name TEXT NOT NULL,
|
|
||||||
weight_grams REAL,
|
|
||||||
price_cents INTEGER,
|
|
||||||
category_id INTEGER NOT NULL REFERENCES categories(id),
|
|
||||||
notes TEXT,
|
|
||||||
product_url TEXT,
|
|
||||||
image_filename TEXT,
|
|
||||||
image_source_url TEXT,
|
|
||||||
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
||||||
updated_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
||||||
)
|
|
||||||
`);
|
|
||||||
|
|
||||||
sqlite.run(`
|
|
||||||
CREATE TABLE threads (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
name TEXT NOT NULL,
|
|
||||||
status TEXT NOT NULL DEFAULT 'active',
|
|
||||||
resolved_candidate_id INTEGER,
|
|
||||||
category_id INTEGER NOT NULL REFERENCES categories(id),
|
|
||||||
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
||||||
updated_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
||||||
)
|
|
||||||
`);
|
|
||||||
|
|
||||||
sqlite.run(`
|
|
||||||
CREATE TABLE thread_candidates (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
thread_id INTEGER NOT NULL REFERENCES threads(id) ON DELETE CASCADE,
|
|
||||||
name TEXT NOT NULL,
|
|
||||||
weight_grams REAL,
|
|
||||||
price_cents INTEGER,
|
|
||||||
category_id INTEGER NOT NULL REFERENCES categories(id),
|
|
||||||
notes TEXT,
|
|
||||||
product_url TEXT,
|
|
||||||
image_filename TEXT,
|
|
||||||
image_source_url TEXT,
|
|
||||||
status TEXT NOT NULL DEFAULT 'researching',
|
|
||||||
pros TEXT,
|
|
||||||
cons TEXT,
|
|
||||||
sort_order REAL NOT NULL DEFAULT 0,
|
|
||||||
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
||||||
updated_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
||||||
)
|
|
||||||
`);
|
|
||||||
|
|
||||||
sqlite.run(`
|
|
||||||
CREATE TABLE setups (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
name TEXT NOT NULL,
|
|
||||||
created_at INTEGER NOT NULL DEFAULT (unixepoch()),
|
|
||||||
updated_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
||||||
)
|
|
||||||
`);
|
|
||||||
|
|
||||||
sqlite.run(`
|
|
||||||
CREATE TABLE setup_items (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
setup_id INTEGER NOT NULL REFERENCES setups(id) ON DELETE CASCADE,
|
|
||||||
item_id INTEGER NOT NULL REFERENCES items(id) ON DELETE CASCADE,
|
|
||||||
classification TEXT NOT NULL DEFAULT 'base'
|
|
||||||
)
|
|
||||||
`);
|
|
||||||
|
|
||||||
sqlite.run(`
|
|
||||||
CREATE TABLE settings (
|
|
||||||
key TEXT PRIMARY KEY,
|
|
||||||
value TEXT NOT NULL
|
|
||||||
)
|
|
||||||
`);
|
|
||||||
|
|
||||||
sqlite.run(`
|
|
||||||
CREATE TABLE users (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
username TEXT NOT NULL UNIQUE,
|
|
||||||
password_hash TEXT NOT NULL,
|
|
||||||
created_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
||||||
)
|
|
||||||
`);
|
|
||||||
|
|
||||||
sqlite.run(`
|
|
||||||
CREATE TABLE sessions (
|
|
||||||
id TEXT PRIMARY KEY,
|
|
||||||
user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
|
|
||||||
expires_at INTEGER NOT NULL
|
|
||||||
)
|
|
||||||
`);
|
|
||||||
|
|
||||||
sqlite.run(`
|
|
||||||
CREATE TABLE api_keys (
|
|
||||||
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
||||||
name TEXT NOT NULL,
|
|
||||||
key_hash TEXT NOT NULL,
|
|
||||||
key_prefix TEXT NOT NULL,
|
|
||||||
created_at INTEGER NOT NULL DEFAULT (unixepoch())
|
|
||||||
)
|
|
||||||
`);
|
|
||||||
|
|
||||||
const db = drizzle(sqlite, { schema });
|
const db = drizzle(sqlite, { schema });
|
||||||
|
|
||||||
|
// Apply all migrations to create tables
|
||||||
|
migrate(db, { migrationsFolder: "./drizzle" });
|
||||||
|
|
||||||
// Seed default Uncategorized category
|
// Seed default Uncategorized category
|
||||||
db.insert(schema.categories)
|
db.insert(schema.categories)
|
||||||
.values({ name: "Uncategorized", icon: "package" })
|
.values({ name: "Uncategorized", icon: "package" })
|
||||||
|
|||||||
Reference in New Issue
Block a user