Files
2026-07-13 13:39:12 +08:00

82 lines
2.8 KiB
TypeScript

import { test, describe } from "node:test";
import assert from "node:assert/strict";
const { tryOpenSync } = await import("../../../src/lib/db/adapters/driverFactory.ts");
describe("betterSqliteAdapter", () => {
test("abre DB in-memory e executa CRUD básico", () => {
const adapter = tryOpenSync(":memory:");
if (!adapter || adapter.driver !== "better-sqlite3") {
console.log("SKIP: better-sqlite3 não disponível");
return;
}
adapter.exec("CREATE TABLE test (id INTEGER PRIMARY KEY, val TEXT)");
const result = adapter.prepare("INSERT INTO test (val) VALUES (?)").run("hello");
assert.equal(result.changes, 1);
const row = adapter
.prepare("SELECT val FROM test WHERE id = ?")
.get(result.lastInsertRowid) as {
val: string;
};
assert.equal(row.val, "hello");
const rows = adapter.prepare("SELECT * FROM test").all();
assert.equal(rows.length, 1);
adapter.close();
});
test("pragma retorna valor simples", () => {
const adapter = tryOpenSync(":memory:");
if (!adapter || adapter.driver !== "better-sqlite3") return;
const mode = adapter.pragma("journal_mode", { simple: true });
assert.ok(typeof mode === "string");
adapter.close();
});
test("transaction envolve operações em bloco atômico", () => {
const adapter = tryOpenSync(":memory:");
if (!adapter || adapter.driver !== "better-sqlite3") return;
adapter.exec("CREATE TABLE tx_test (id INTEGER PRIMARY KEY, val TEXT)");
const insertFn = adapter.transaction(() => {
adapter.prepare("INSERT INTO tx_test (val) VALUES (?)").run("a");
adapter.prepare("INSERT INTO tx_test (val) VALUES (?)").run("b");
});
insertFn();
const count = adapter.prepare("SELECT COUNT(*) as cnt FROM tx_test").get() as { cnt: number };
assert.equal(count.cnt, 2);
adapter.close();
});
test("driver é 'better-sqlite3'", () => {
const adapter = tryOpenSync(":memory:");
if (!adapter || adapter.driver !== "better-sqlite3") return;
assert.equal(adapter.driver, "better-sqlite3");
adapter.close();
});
test("transaction com rollback em erro desfaz operações", () => {
const adapter = tryOpenSync(":memory:");
if (!adapter || adapter.driver !== "better-sqlite3") return;
adapter.exec("CREATE TABLE rollback_test (id INTEGER PRIMARY KEY, val TEXT NOT NULL)");
const insertWithError = adapter.transaction(() => {
adapter.prepare("INSERT INTO rollback_test (val) VALUES (?)").run("before-error");
throw new Error("force rollback");
});
assert.throws(() => insertWithError(), /force rollback/);
const count = adapter.prepare("SELECT COUNT(*) as cnt FROM rollback_test").get() as {
cnt: number;
};
assert.equal(count.cnt, 0, "Rollback deve ter desfeito o insert");
adapter.close();
});
});