82 lines
2.8 KiB
TypeScript
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();
|
|
});
|
|
});
|