2018-11-16 13:23:22 +01:00
|
|
|
#!/usr/bin/env jake
|
|
|
|
'use strict';
|
|
|
|
/* eslint-disable no-undef */
|
|
|
|
/* eslint-disable no-console */
|
|
|
|
|
|
|
|
const os = require('os');
|
|
|
|
const fs = require('fs');
|
|
|
|
const rimrafSync = require('rimraf').sync;
|
|
|
|
const path = require('path');
|
|
|
|
const sqlite3 = require('sqlite3');
|
|
|
|
const { assert } = require('chai');
|
2018-12-30 18:11:57 +02:00
|
|
|
const { assertExec } = require('../../jake-util/helpers/migration-test-helper');
|
|
|
|
const knexfile = require('../../jake-util/knexfile/knexfile.js');
|
2018-11-16 13:23:22 +01:00
|
|
|
|
2018-12-03 23:14:34 +01:00
|
|
|
const KNEX = path.normalize(__dirname + '/../../../bin/cli.js');
|
2018-11-16 13:23:22 +01:00
|
|
|
|
|
|
|
/* * * HELPERS * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
|
|
|
|
const taskList = [];
|
|
|
|
function test(description, func) {
|
|
|
|
const tmpDirPath = os.tmpdir() + '/knex-test-';
|
|
|
|
let itFails = false;
|
|
|
|
rimrafSync(tmpDirPath);
|
|
|
|
const tempFolder = fs.mkdtempSync(tmpDirPath);
|
|
|
|
fs.mkdirSync(tempFolder + '/migrations');
|
|
|
|
desc(description);
|
|
|
|
const taskName = description.replace(/[^a-z0-9]/g, '');
|
|
|
|
taskList.push(taskName);
|
|
|
|
task(taskName, { async: true }, () =>
|
|
|
|
func(tempFolder)
|
|
|
|
.then(() => console.log('☑ ' + description))
|
|
|
|
.catch((err) => {
|
|
|
|
console.log('☒ ' + err.message);
|
|
|
|
itFails = true;
|
|
|
|
})
|
|
|
|
.then(() => {
|
|
|
|
jake.exec(`rm -r ${tempFolder}`);
|
|
|
|
if (itFails) {
|
|
|
|
process.exit(1);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/* * * TESTS * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
|
|
|
|
|
|
|
test('Create a migration file', (temp) =>
|
|
|
|
assertExec(`${KNEX} migrate:make \
|
|
|
|
--client=sqlite3 \
|
|
|
|
--migrations-directory=${temp}/migrations \
|
|
|
|
create_rule_table`)
|
|
|
|
.then(() =>
|
|
|
|
assertExec(
|
|
|
|
`ls ${temp}/migrations/*_create_rule_table.js`,
|
|
|
|
'Find the migration file'
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.then(() =>
|
|
|
|
assertExec(
|
|
|
|
`grep exports.up ${temp}/migrations/*_create_rule_table.js`,
|
|
|
|
'Migration created with boilerplate'
|
|
|
|
)
|
|
|
|
));
|
|
|
|
|
|
|
|
test('Create a migration file without client passed', (temp) =>
|
|
|
|
assertExec(`${KNEX} migrate:make \
|
|
|
|
--migrations-directory=${temp}/migrations \
|
|
|
|
create_rule_table`)
|
|
|
|
.then(() =>
|
|
|
|
assertExec(
|
|
|
|
`ls ${temp}/migrations/*_create_rule_table.js`,
|
|
|
|
'Find the migration file'
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.then(() =>
|
|
|
|
assertExec(
|
|
|
|
`grep exports.up ${temp}/migrations/*_create_rule_table.js`,
|
|
|
|
'Migration created with boilerplate'
|
|
|
|
)
|
|
|
|
));
|
|
|
|
|
|
|
|
test('Run migrations', (temp) =>
|
|
|
|
new Promise((resolve, reject) =>
|
|
|
|
fs.writeFile(
|
|
|
|
temp + '/migrations/000_create_rule_table.js',
|
|
|
|
`
|
|
|
|
exports.up = (knex)=> knex.schema.createTable('rules', (table)=> {
|
|
|
|
table.string('name');
|
|
|
|
});
|
|
|
|
exports.down = (knex)=> knex.schema.dropTable('rules');
|
|
|
|
`,
|
|
|
|
(err) => (err ? reject(err) : resolve())
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.then(() =>
|
|
|
|
assertExec(`${KNEX} migrate:latest \
|
|
|
|
--client=sqlite3 --connection=${temp}/db \
|
|
|
|
--migrations-directory=${temp}/migrations \
|
|
|
|
create_rule_table`)
|
|
|
|
)
|
|
|
|
.then(() => assertExec(`ls ${temp}/db`, 'Find the database file'))
|
|
|
|
.then(() => new sqlite3.Database(temp + '/db'))
|
|
|
|
.then(
|
|
|
|
(db) =>
|
|
|
|
new Promise((resolve, reject) =>
|
|
|
|
db.get('SELECT name FROM knex_migrations', function(err, row) {
|
|
|
|
err ? reject(err) : resolve(row);
|
|
|
|
})
|
|
|
|
)
|
|
|
|
)
|
|
|
|
.then((row) => assert.equal(row.name, '000_create_rule_table.js')));
|
|
|
|
|
2018-12-30 18:11:57 +02:00
|
|
|
test('migrate:latest prints non verbose logs', (temp) => {
|
|
|
|
const db = knexfile.connection.filename;
|
|
|
|
if (fs.existsSync(db)) {
|
|
|
|
fs.unlinkSync(db);
|
|
|
|
}
|
|
|
|
|
|
|
|
return assertExec(
|
|
|
|
`node ${KNEX} migrate:latest --knexfile=test/jake-util/knexfile/knexfile.js --knexpath=../knex.js`
|
|
|
|
).then(({ stdout }) => {
|
|
|
|
assert.include(stdout, 'Batch 1 run: 1 migrations');
|
|
|
|
assert.notInclude(stdout, 'simple_migration.js');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
test('migrate:rollback prints non verbose logs', (temp) => {
|
|
|
|
return assertExec(
|
|
|
|
`node ${KNEX} migrate:rollback --knexfile=test/jake-util/knexfile/knexfile.js --knexpath=../knex.js`
|
|
|
|
).then(({ stdout }) => {
|
|
|
|
assert.include(stdout, 'Batch 1 rolled back: 1 migrations');
|
|
|
|
assert.notInclude(stdout, 'simple_migration.js');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
test('migrate:latest prints verbose logs', (temp) => {
|
|
|
|
return assertExec(
|
|
|
|
`node ${KNEX} migrate:latest --knexfile=test/jake-util/knexfile/knexfile.js --knexpath=../knex.js --verbose`
|
|
|
|
).then(({ stdout }) => {
|
|
|
|
assert.include(stdout, 'Batch 1 run: 1 migrations');
|
|
|
|
assert.include(stdout, 'simple_migration.js');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
test('migrate:rollback prints verbose logs', (temp) => {
|
|
|
|
return assertExec(
|
|
|
|
`node ${KNEX} migrate:rollback --knexfile=test/jake-util/knexfile/knexfile.js --knexpath=../knex.js --verbose`
|
|
|
|
).then(({ stdout }) => {
|
|
|
|
assert.include(stdout, 'Batch 1 rolled back: 1 migrations');
|
|
|
|
assert.include(stdout, 'simple_migration.js');
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
2018-12-03 23:14:34 +01:00
|
|
|
module.exports = {
|
|
|
|
taskList,
|
|
|
|
};
|