File size: 3,222 Bytes
cd8bd0a
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
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();
  });
});