Skip to content

Commit 85c2832

Browse files
committed
test: cover sqlite statements after database close
1 parent bac030c commit 85c2832

2 files changed

Lines changed: 130 additions & 0 deletions

File tree

test/parallel/test-sqlite-database-sync-dispose.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,46 @@ suite('DatabaseSync.prototype[Symbol.dispose]()', () => {
3030
db.close();
3131
}, /database is not open/);
3232
});
33+
34+
test('invalidates prepared statements', () => {
35+
const db = new DatabaseSync(nextDb());
36+
db.exec(`
37+
CREATE TABLE data(key INTEGER PRIMARY KEY, val INTEGER);
38+
INSERT INTO data (key, val) VALUES (1, 2);
39+
`);
40+
41+
const select = db.prepare('SELECT * FROM data');
42+
const insert = db.prepare('INSERT INTO data (key, val) VALUES (?, ?)');
43+
44+
db[Symbol.dispose]();
45+
assert.strictEqual(db.isOpen, false);
46+
47+
for (const method of ['prepare', 'exec']) {
48+
assert.throws(() => {
49+
db[method]('SELECT 1');
50+
}, {
51+
code: 'ERR_INVALID_STATE',
52+
message: /database is not open/,
53+
});
54+
}
55+
56+
assert.throws(() => {
57+
select.get();
58+
}, {
59+
code: 'ERR_INVALID_STATE',
60+
message: /statement has been finalized/,
61+
});
62+
assert.throws(() => {
63+
select.all();
64+
}, {
65+
code: 'ERR_INVALID_STATE',
66+
message: /statement has been finalized/,
67+
});
68+
assert.throws(() => {
69+
insert.run(2, 4);
70+
}, {
71+
code: 'ERR_INVALID_STATE',
72+
message: /statement has been finalized/,
73+
});
74+
});
3375
});

test/parallel/test-sqlite-database-sync.js

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,94 @@ suite('DatabaseSync.prototype.close()', () => {
343343
});
344344
t.assert.strictEqual(db.isOpen, false);
345345
});
346+
347+
test('invalidates prepared statements', (t) => {
348+
const db = new DatabaseSync(nextDb());
349+
db.exec(`
350+
CREATE TABLE data(key INTEGER PRIMARY KEY, val INTEGER);
351+
INSERT INTO data (key, val) VALUES (1, 2);
352+
`);
353+
354+
const select = db.prepare('SELECT * FROM data');
355+
const insert = db.prepare('INSERT INTO data (key, val) VALUES (?, ?)');
356+
357+
t.assert.strictEqual(db.close(), undefined);
358+
t.assert.strictEqual(db.isOpen, false);
359+
360+
for (const method of ['prepare', 'exec']) {
361+
t.assert.throws(() => {
362+
db[method]('SELECT 1');
363+
}, {
364+
code: 'ERR_INVALID_STATE',
365+
message: /database is not open/,
366+
});
367+
}
368+
369+
t.assert.throws(() => {
370+
select.get();
371+
}, {
372+
code: 'ERR_INVALID_STATE',
373+
message: /statement has been finalized/,
374+
});
375+
t.assert.throws(() => {
376+
select.all();
377+
}, {
378+
code: 'ERR_INVALID_STATE',
379+
message: /statement has been finalized/,
380+
});
381+
t.assert.throws(() => {
382+
insert.run(2, 4);
383+
}, {
384+
code: 'ERR_INVALID_STATE',
385+
message: /statement has been finalized/,
386+
});
387+
});
388+
389+
test('keeps prepared statements invalid after reopening', (t) => {
390+
const db = new DatabaseSync(nextDb());
391+
t.after(() => {
392+
if (db.isOpen) db.close();
393+
});
394+
395+
db.exec(`
396+
CREATE TABLE data(key INTEGER PRIMARY KEY, val INTEGER);
397+
INSERT INTO data (key, val) VALUES (1, 2);
398+
`);
399+
400+
const select = db.prepare('SELECT * FROM data');
401+
const insert = db.prepare('INSERT INTO data (key, val) VALUES (?, ?)');
402+
403+
db.close();
404+
db.open();
405+
406+
t.assert.throws(() => {
407+
select.get();
408+
}, {
409+
code: 'ERR_INVALID_STATE',
410+
message: /statement has been finalized/,
411+
});
412+
t.assert.throws(() => {
413+
select.all();
414+
}, {
415+
code: 'ERR_INVALID_STATE',
416+
message: /statement has been finalized/,
417+
});
418+
t.assert.throws(() => {
419+
insert.run(2, 4);
420+
}, {
421+
code: 'ERR_INVALID_STATE',
422+
message: /statement has been finalized/,
423+
});
424+
425+
t.assert.deepStrictEqual(
426+
db.prepare('SELECT * FROM data').all(),
427+
[{ __proto__: null, key: 1, val: 2 }],
428+
);
429+
t.assert.strictEqual(
430+
db.exec('INSERT INTO data (key, val) VALUES (2, 4)'),
431+
undefined,
432+
);
433+
});
346434
});
347435

348436
suite('DatabaseSync.prototype.prepare()', () => {

0 commit comments

Comments
 (0)