38 lines
1.4 KiB
TypeScript
38 lines
1.4 KiB
TypeScript
import { expect, test } from "bun:test";
|
|
import type { Db } from "../src/driver.ts";
|
|
import { addSeedData, removeSeedData, runSeedQuery } from "../src/seed.ts";
|
|
|
|
function fakeDb() {
|
|
const calls: Array<{ sql: string; parameters: unknown[] }> = [];
|
|
const db = {
|
|
exec: async (sql: string, parameters: unknown[] = []) => {
|
|
calls.push({ sql, parameters });
|
|
return { changes: 1 };
|
|
},
|
|
} as unknown as Db;
|
|
return { db, calls };
|
|
}
|
|
|
|
test("seed helpers parameterize object rows and removals", async () => {
|
|
const { db, calls } = fakeDb();
|
|
await addSeedData(db, [{ code: "free", credits: 10 }, { code: "pro", credits: 20 }], "plans", {
|
|
conflict: "ignore",
|
|
});
|
|
await removeSeedData(db, { code: "free" }, "plans");
|
|
expect(calls[0]).toEqual({
|
|
sql: "INSERT OR IGNORE INTO plans (code, credits) VALUES (?, ?)",
|
|
parameters: ["free", 10],
|
|
});
|
|
expect(calls[2]).toEqual({ sql: "DELETE FROM plans WHERE code = ?", parameters: ["free"] });
|
|
});
|
|
|
|
test("custom seed queries stay parameterized and unsafe identifiers are refused", async () => {
|
|
const { db, calls } = fakeDb();
|
|
await runSeedQuery(db, "UPDATE plans SET credits = ? WHERE code = ?", [50, "free"]);
|
|
expect(calls[0]?.parameters).toEqual([50, "free"]);
|
|
await expect(addSeedData(db, { id: 1 }, "plans; DROP TABLE plans")).rejects.toThrow(
|
|
"safe SQL identifier",
|
|
);
|
|
await expect(removeSeedData(db, {}, "plans")).rejects.toThrow("match fields");
|
|
});
|