You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
223 lines
6.6 KiB
223 lines
6.6 KiB
4 weeks ago
|
const assert = require('assert');
|
||
|
const fs = require('fs');
|
||
|
const Database = require('../sqlite-async');
|
||
|
|
||
|
let db;
|
||
|
let statement;
|
||
|
|
||
|
describe('Module', function () {
|
||
|
describe('Database', function () {
|
||
|
describe('SQLITE3_VERSION', function () {
|
||
|
it('should log the version number', function () {
|
||
|
return console.log(' sqlite3 version: ' + Database.SQLITE3_VERSION);
|
||
|
});
|
||
|
});
|
||
|
describe('open', function () {
|
||
|
it('should open the database', function () {
|
||
|
return Database.open('test.db').then((_db) => {
|
||
|
db = _db;
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe('exec', function () {
|
||
|
it('should create a table', function () {
|
||
|
return db.exec(
|
||
|
`CREATE TABLE test (
|
||
|
id INT PRIMARY KEY,
|
||
|
name TEXT NOT NULL
|
||
|
)`
|
||
|
);
|
||
|
});
|
||
|
});
|
||
|
describe('run (insert)', function () {
|
||
|
it('should insert a row', function () {
|
||
|
return db.run('INSERT INTO test VALUES (1, "inserted")');
|
||
|
});
|
||
|
});
|
||
|
describe('run (update)', function () {
|
||
|
it('should update a value', function () {
|
||
|
return db.run('UPDATE test SET name = "test" WHERE id = 1').then((result) => {
|
||
|
assert.strictEqual(result.changes, 1, 'Expected one change in the database');
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe('run (delete)', function () {
|
||
|
it('should delete a row', function () {
|
||
|
return db.run('INSERT INTO test VALUES (2, "test")').then((_) => {
|
||
|
return db.run('DELETE FROM test WHERE id = 2').then((result) => {
|
||
|
assert.strictEqual(result.changes, 1, 'Expected one change in the database');
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe('get', function () {
|
||
|
it('should select one row', function () {
|
||
|
return db.get('SELECT * FROM test').then((row) => {
|
||
|
assert.deepStrictEqual(row, {
|
||
|
id: 1,
|
||
|
name: 'test',
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe('all', function () {
|
||
|
it('should select all rows', function () {
|
||
|
return db.all('SELECT * FROM test').then((rows) => {
|
||
|
assert.deepStrictEqual(rows, [
|
||
|
{
|
||
|
id: 1,
|
||
|
name: 'test',
|
||
|
},
|
||
|
]);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe('each', function () {
|
||
|
it('should select rows and pass each to a callback', function () {
|
||
|
return db.each('SELECT * FROM test WHERE id = 1', (err, row) => {
|
||
|
assert.deepStrictEqual(row, {
|
||
|
id: 1,
|
||
|
name: 'test',
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('transaction (success)', function () {
|
||
|
it('should execute and rollback a failed transaction', function () {
|
||
|
return db
|
||
|
.transaction((db) => {
|
||
|
return Promise.all([
|
||
|
db.run('INSERT INTO test VALUES (2, "two")'),
|
||
|
db.run('INSERT INTO test VALUES (3, NULL)'),
|
||
|
]);
|
||
|
})
|
||
|
.then(
|
||
|
(_) => {
|
||
|
throw new Error('The transaction should not have succeeded.');
|
||
|
},
|
||
|
(err) => {
|
||
|
assert.strictEqual(err.code, 'SQLITE_CONSTRAINT');
|
||
|
}
|
||
|
);
|
||
|
});
|
||
|
it('should leave the database unchanged', function () {
|
||
|
return db.all('SELECT * FROM test').then((rows) => {
|
||
|
assert.strictEqual(rows.length, 1, 'Expected only one row in the database.');
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe('transaction (success)', function () {
|
||
|
it('should execute and commit a successful transaction', function () {
|
||
|
return db.transaction((db) => {
|
||
|
return Promise.all([
|
||
|
db.run('INSERT INTO test VALUES (2, "two")'),
|
||
|
db.run('INSERT INTO test VALUES (3, "three")'),
|
||
|
]);
|
||
|
});
|
||
|
});
|
||
|
it('should have added two rows to the database', function () {
|
||
|
return db.all('SELECT * FROM test').then((rows) => {
|
||
|
assert.strictEqual(rows.length, 3, 'Expected three rows in the database.');
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe('prepare', function () {
|
||
|
it('should prepare a statement', function () {
|
||
|
return db.prepare('SELECT * FROM test WHERE id = ?').then((_statement) => {
|
||
|
statement = _statement;
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('Statement', function () {
|
||
|
describe('bind', function () {
|
||
|
it('should bind a value to the statement', function () {
|
||
|
return statement.bind(1);
|
||
|
});
|
||
|
});
|
||
|
describe('get', function () {
|
||
|
it('should select one row', function () {
|
||
|
return statement.get().then((row) => {
|
||
|
assert.deepStrictEqual(row, {
|
||
|
id: 1,
|
||
|
name: 'test',
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe('all', function () {
|
||
|
it('should select all rows', function () {
|
||
|
return statement.all().then((rows) => {
|
||
|
assert.deepStrictEqual(rows, [
|
||
|
{
|
||
|
id: 1,
|
||
|
name: 'test',
|
||
|
},
|
||
|
]);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe('each', function () {
|
||
|
it('should select rows and pass each to a callback', function () {
|
||
|
return statement.each((err, row) => {
|
||
|
assert.deepStrictEqual(row, {
|
||
|
id: 1,
|
||
|
name: 'test',
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe('run', function () {
|
||
|
it('should delete all rows from the database', function () {
|
||
|
return db.prepare('DELETE FROM test').then((statement) => {
|
||
|
return statement.run().then((result) => {
|
||
|
assert.strictEqual(result.changes, 3, 'Expected three changes in the database');
|
||
|
return statement.finalize();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe('finalize', function () {
|
||
|
it('should finalize the statement', function () {
|
||
|
return statement.finalize();
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
describe('Database', function () {
|
||
|
describe('close', function () {
|
||
|
it('should close database', function () {
|
||
|
return db.close();
|
||
|
});
|
||
|
});
|
||
|
describe('open', function () {
|
||
|
it('should open the database again', function () {
|
||
|
return Database.open('test.db').then((_db) => {
|
||
|
db = _db;
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
describe('close', function () {
|
||
|
it('should close database after executing the promise', function () {
|
||
|
return db
|
||
|
.close((arg) => {
|
||
|
assert(arg === db);
|
||
|
return Promise.resolve('success');
|
||
|
})
|
||
|
.then((result) => {
|
||
|
assert.strictEqual(result, 'success');
|
||
|
});
|
||
|
});
|
||
|
it('should no longer be able to use the database', function () {
|
||
|
assert(db.db === null);
|
||
|
});
|
||
|
});
|
||
|
});
|
||
|
|
||
|
after(function (done) {
|
||
|
fs.unlink('test.db', done);
|
||
|
});
|
||
|
});
|