Skip to content

Commit 391dee3

Browse files
committed
test: cover sqlite statements after database close
1 parent 131fd84 commit 391dee3

1 file changed

Lines changed: 130 additions & 0 deletions

File tree

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

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

336424
suite('DatabaseSync.prototype.prepare()', () => {
@@ -522,4 +610,46 @@ suite('DatabaseSync.prototype[Symbol.dispose]', () => {
522610
t.assert.strictEqual(db.isOpen, false);
523611
db[Symbol.dispose]();
524612
});
613+
614+
test('invalidates prepared statements', (t) => {
615+
const db = new DatabaseSync(nextDb());
616+
db.exec(`
617+
CREATE TABLE data(key INTEGER PRIMARY KEY, val INTEGER);
618+
INSERT INTO data (key, val) VALUES (1, 2);
619+
`);
620+
621+
const select = db.prepare('SELECT * FROM data');
622+
const insert = db.prepare('INSERT INTO data (key, val) VALUES (?, ?)');
623+
624+
db[Symbol.dispose]();
625+
t.assert.strictEqual(db.isOpen, false);
626+
627+
for (const method of ['prepare', 'exec']) {
628+
t.assert.throws(() => {
629+
db[method]('SELECT 1');
630+
}, {
631+
code: 'ERR_INVALID_STATE',
632+
message: /database is not open/,
633+
});
634+
}
635+
636+
t.assert.throws(() => {
637+
select.get();
638+
}, {
639+
code: 'ERR_INVALID_STATE',
640+
message: /statement has been finalized/,
641+
});
642+
t.assert.throws(() => {
643+
select.all();
644+
}, {
645+
code: 'ERR_INVALID_STATE',
646+
message: /statement has been finalized/,
647+
});
648+
t.assert.throws(() => {
649+
insert.run(2, 4);
650+
}, {
651+
code: 'ERR_INVALID_STATE',
652+
message: /statement has been finalized/,
653+
});
654+
});
525655
});

0 commit comments

Comments
 (0)