| import { test, describe } from "node:test"; | |
| import assert from "node:assert/strict"; | |
| const { createSqlJsAdapter } = await import("../../../src/lib/db/adapters/sqljsAdapter.ts"); | |
| describe("sqljsAdapter", () => { | |
| test("abre DB in-memory e executa CRUD básico", async () => { | |
| const adapter = await createSqlJsAdapter(":memory:"); | |
| 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("driver é 'sql.js'", async () => { | |
| const adapter = await createSqlJsAdapter(":memory:"); | |
| assert.equal(adapter.driver, "sql.js"); | |
| adapter.close(); | |
| }); | |
| test("pragma retorna valor", async () => { | |
| const adapter = await createSqlJsAdapter(":memory:"); | |
| const mode = adapter.pragma("journal_mode", { simple: true }); | |
| assert.ok(mode !== null && mode !== undefined); | |
| adapter.close(); | |
| }); | |
| test("transaction é atômica — rollback em erro", async () => { | |
| const adapter = await createSqlJsAdapter(":memory:"); | |
| adapter.exec("CREATE TABLE tx_test (id INTEGER PRIMARY KEY, val TEXT NOT NULL)"); | |
| const insert = adapter.transaction(() => { | |
| adapter.prepare("INSERT INTO tx_test (val) VALUES (?)").run("ok"); | |
| throw new Error("rollback!"); | |
| }); | |
| assert.throws(() => insert(), /rollback/); | |
| const count = adapter.prepare("SELECT COUNT(*) as cnt FROM tx_test").get() as { cnt: number }; | |
| assert.equal(count.cnt, 0, "Rollback deve ter desfeito o insert"); | |
| adapter.close(); | |
| }); | |
| test("transaction confirma quando não lança erro", async () => { | |
| const adapter = await createSqlJsAdapter(":memory:"); | |
| adapter.exec("CREATE TABLE commit_test (id INTEGER PRIMARY KEY, val TEXT)"); | |
| const insert = adapter.transaction(() => { | |
| adapter.prepare("INSERT INTO commit_test (val) VALUES (?)").run("committed"); | |
| }); | |
| insert(); | |
| const count = adapter.prepare("SELECT COUNT(*) as cnt FROM commit_test").get() as { | |
| cnt: number; | |
| }; | |
| assert.equal(count.cnt, 1); | |
| adapter.close(); | |
| }); | |
| test("escreve em arquivo e relê corretamente", async (t) => { | |
| const os = await import("node:os"); | |
| const path = await import("node:path"); | |
| const fs = await import("node:fs"); | |
| const tmpFile = path.join(os.tmpdir(), `sqljs_test_${Date.now()}.sqlite`); | |
| t.after(() => { | |
| try { | |
| fs.unlinkSync(tmpFile); | |
| } catch {} | |
| }); | |
| const writer = await createSqlJsAdapter(tmpFile); | |
| writer.exec("CREATE TABLE items (id INTEGER PRIMARY KEY, name TEXT)"); | |
| writer.prepare("INSERT INTO items (name) VALUES (?)").run("test-value"); | |
| writer.close(); | |
| const reader = await createSqlJsAdapter(tmpFile); | |
| const row = reader.prepare("SELECT name FROM items WHERE id = 1").get() as { name: string }; | |
| assert.equal(row.name, "test-value"); | |
| reader.close(); | |
| }); | |
| }); | |