mssql-ease
Version:
Promise style ease-of-use module for working with Microsoft SQL Server from Node.js.
114 lines (102 loc) • 3.27 kB
JavaScript
require('./config-from-env');
const { Connections } = require('../');
const fs = require('fs');
const path = require('path');
const { log, inspect, promisify } = require('util');
const readdir = promisify(fs.readdir);
const readFile = promisify(fs.readFile);
const laureates = require('./laureate.json');
const pools = new Connections();
async function connector(where) {
return await pools.connect(where || process.env.MSSQL_CONNECTION);
}
async function readFilesInDir(dir) {
const files = await readdir(dir);
return Promise.all(files.reduce((acc, file) => {
acc.push(readFile(path.join(dir, file)));
return acc;
}, []));
}
async function executeAllScriptsInDir(cn, dir) {
const files = await readFilesInDir(dir);
let i = -1;
const len = files.length;
while (++i < len) {
await cn.statement(files[i].toString('utf8')).execute();
}
}
async function safeExec(connect, action) {
const cn = await connect();
try {
return await action(cn);
} finally {
await cn.release();
}
}
async function createLaureates(cn) {
let i = -1;
const len = laureates.length;
while (++i < len) {
const data = laureates[i];
try {
await cn.statement(`INSERT INTO
Laureates(id, firstName, surname, born, died, bornCountry, bornCity, diedCountry, diedCountryCode, diedCity, gender)
values(@id, @firstName, @surname, @born, @died, @bornCountry, @bornCity, @diedCountry, @diedCountryCode, @diedCity, @gender);
`).execute(
(binder, TYPES) => {
binder.addParameter('id', TYPES.Int, data.id);
binder.addParameter('firstName', TYPES.NVarChar, data.firstname);
binder.addParameter('surname', TYPES.NVarChar, data.surname);
binder.addParameter('born', TYPES.NVarChar, data.born);
binder.addParameter('died', TYPES.NVarChar, data.died);
binder.addParameter('bornCountry', TYPES.NVarChar, data.bornCountry);
binder.addParameter('bornCity', TYPES.NVarChar, data.bornCity);
binder.addParameter('diedCountry', TYPES.NVarChar, data.diedCountry);
binder.addParameter('diedCountryCode', TYPES.NVarChar, data.diedCountryCode);
binder.addParameter('diedCity', TYPES.NVarChar, data.diedCity);
binder.addParameter('gender', TYPES.NVarChar, data.gender);
});
} catch (err) {
log(inspect(data));
return Promise.reject(err);
}
}
return undefined;
}
beforeAll(async (done) => {
try {
await safeExec(connector, cn =>
executeAllScriptsInDir(cn, path.resolve(__dirname, './sql/before')));
await safeExec(connector, createLaureates);
done();
} catch (err) {
done(err);
}
}, 30000);
afterAll(async done => {
try {
await safeExec(connector, cn => executeAllScriptsInDir(cn, path.resolve(__dirname, './sql/after')));
} catch (err) {
done(err);
} finally {
try {
await pools.drain();
} catch (err) {
done(err);
}
}
done();
}, 30000);
test('.connect(str) succeeds', async () => {
const cns = new Connections();
try {
const cn = await cns.connect(process.env.MSSQL_CONNECTION);
try {
expect(cn).toBeDefined();
} finally {
await cn.release();
}
} finally {
await cns.drain();
}
});