diff options
author | EuAndreh <eu@euandre.org> | 2024-02-23 11:11:38 -0300 |
---|---|---|
committer | EuAndreh <eu@euandre.org> | 2024-02-23 11:21:21 -0300 |
commit | cd50a23dab8623f232da7d6b1b9511f4590e9788 (patch) | |
tree | 349e111763eac7853d9f1dd7a61e9bce117f3993 /tests/js/db.mjs | |
parent | Big cleanup (diff) | |
download | papod-cd50a23dab8623f232da7d6b1b9511f4590e9788.tar.gz papod-cd50a23dab8623f232da7d6b1b9511f4590e9788.tar.xz |
Implement accretion.runMigrations() and wrappings of node-sqlite3
Diffstat (limited to 'tests/js/db.mjs')
-rw-r--r-- | tests/js/db.mjs | 126 |
1 files changed, 123 insertions, 3 deletions
diff --git a/tests/js/db.mjs b/tests/js/db.mjs index e4a8a51..372f64a 100644 --- a/tests/js/db.mjs +++ b/tests/js/db.mjs @@ -1,15 +1,135 @@ +import assert from "node:assert/strict"; + +import sqlite from "../../src/sqlite.cjs"; + import { runTests } from "../runner.mjs"; -import { init } from "../../src/db.mjs"; +import { promisify, promisifyDb, open, db, init } from "../../src/db.mjs"; + + +const test_promisify = t => { + t.start("promisify()"); + + t.test("we wrap the callbacky function", async () => { + const okFn1 = (a, b, cb) => + setTimeout(() => cb(null, { a, b, ok: true })); + const errFn1 = (a, b, c, cb) => + setTimeout(() => cb({ err: true, a }, "ignored")); + + const okFn2 = promisify(okFn1); + const errFn2 = promisify(errFn1); + + assert.deepEqual( + await okFn2("a-value", "b-value"), + { + a: "a-value", + b: "b-value", + ok: true, + }, + ); + + assert.rejects( + async () => await errFn2("aa", "bb", "cc"), + { + err: true, + a: "aa", + }, + ); + }); +}; +const test_promisifyDb = t => { + t.start("promisifyDb()"); + + const createTable = "CREATE TABLE table_ (column INTEGER NOT NULL PRIMARY KEY);"; + + t.test("we can access the underlying database and statement ref", async () => { + const db = await open(":memory:"); + assert.ok(db.ref instanceof sqlite.Database); + + const stmt = await db.prepare("SELECT 1;"); + assert.ok(stmt.ref instanceof sqlite.Statement); + }); + + t.test("we can run the wrapped fns", async () => { + const db = await open(":memory:"); + + await db.exec(createTable); + const stmt = await db.prepare("INSERT INTO table_ (column) VALUES ($column)"); + await stmt.run({ $column: 3 }); + await stmt.run({ $column: 1 }); + await stmt.finalize(); + assert.rejects( + async () => await stmt.run({ $column: 2 }), + { + message: "SQLITE_MISUSE: Statement is already finalized", + code: "SQLITE_MISUSE", + }, + ); + + const selectAll = "SELECT column FROM table_ ORDER BY column;"; + + const all = await db.all(selectAll); + assert.deepEqual(all, [{ column: 1 }, { column: 3 }]); + + const contents = []; + const cb = row => contents.push(row); + await db.each(selectAll, cb); + assert.deepEqual(contents, [{ column: 1 }, { column: 3 }]); + }); +}; + +const test_open = t => { + t.start("open()"); + + t.test("we must provide a name", () => { + assert.rejects( + async () => await open(), + assert.AssertionError, + ); + + assert.rejects( + async () => await open(undefined), + assert.AssertionError, + ); + + assert.rejects( + async () => await open(null), + assert.AssertionError, + ); + + assert.rejects( + async () => await open(""), + assert.AssertionError, + ); + }); + + t.test("failure to open causes a promise rejection", () => { + assert.rejects( + async () => await open("tests/non/existing/directory/and/file"), + { + message: "SQLITE_CANTOPEN: unable to open database file", + code: "SQLITE_CANTOPEN", + }, + ); + }); +}; const test_init = t => { t.start("init()"); - t.test("FIXME", () => { - // init(); + t.test("we only know how to deal with 1 database", async () => { + await init(); + const ref1 = db; + await init(); + const ref2 = db; + + assert.notDeepEqual(ref1, ref2); }); }; await runTests([ + test_promisify, + test_promisifyDb, + test_open, test_init, ]); |