2018-08-27 20:58:26 +02:00
|
|
|
const spawn = require('child_process').spawn;
|
2018-10-19 18:58:11 +02:00
|
|
|
const fs = require('fs');
|
2018-05-21 17:04:25 +02:00
|
|
|
const path = require('path');
|
2018-10-19 18:58:11 +02:00
|
|
|
const shell = require('shelljs');
|
2018-11-22 19:19:04 +01:00
|
|
|
const cypress = require('cypress')
|
2018-10-19 18:58:11 +02:00
|
|
|
const { deleteApp } = require('./helpers/deleteFolder');
|
2018-05-21 17:04:25 +02:00
|
|
|
|
|
|
|
const strapiBin = path.resolve('./packages/strapi/bin/strapi.js');
|
|
|
|
const appName = 'testApp';
|
2018-08-27 20:58:26 +02:00
|
|
|
let testExitCode = 0;
|
2018-05-21 17:04:25 +02:00
|
|
|
let appStart;
|
|
|
|
|
2018-06-01 14:31:30 +02:00
|
|
|
const databases = {
|
2018-08-27 20:58:26 +02:00
|
|
|
mongo: `--dbclient=mongo --dbhost=127.0.0.1 --dbport=27017 --dbname=strapi-test-${new Date().getTime()} --dbusername= --dbpassword=`,
|
|
|
|
postgres: '--dbclient=postgres --dbhost=127.0.0.1 --dbport=5432 --dbname=strapi-test --dbusername= --dbpassword=',
|
|
|
|
mysql: '--dbclient=mysql --dbhost=127.0.0.1 --dbport=3306 --dbname=strapi-test --dbusername=root --dbpassword=root'
|
2018-06-01 14:31:30 +02:00
|
|
|
};
|
|
|
|
|
2018-05-21 17:04:25 +02:00
|
|
|
const {runCLI: jest} = require('jest-cli/build/cli');
|
|
|
|
|
|
|
|
const main = async () => {
|
|
|
|
const clean = () => {
|
2018-10-19 18:58:11 +02:00
|
|
|
return new Promise(async (resolve) => {
|
|
|
|
try {
|
|
|
|
fs.accessSync(appName);
|
|
|
|
await deleteApp(path.resolve(appName));
|
|
|
|
} catch(err) {
|
|
|
|
// Silent
|
|
|
|
}
|
|
|
|
resolve();
|
2018-05-21 17:04:25 +02:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2018-06-01 14:31:30 +02:00
|
|
|
const generate = (database) => {
|
2018-06-03 20:46:43 +02:00
|
|
|
return new Promise((resolve, reject) => {
|
2018-08-27 20:58:26 +02:00
|
|
|
const appCreation = spawn('node', `${strapiBin} new ${appName} --dev ${database}`.split(' '), { detached: true });
|
2018-05-21 17:04:25 +02:00
|
|
|
|
|
|
|
appCreation.stdout.on('data', data => {
|
2018-10-31 17:20:09 +01:00
|
|
|
console.log(data.toString().trim());
|
2018-05-21 17:04:25 +02:00
|
|
|
|
|
|
|
if (data.includes('is ready at')) {
|
2018-10-31 17:20:09 +01:00
|
|
|
process.kill(appCreation.pid);
|
2018-05-21 17:04:25 +02:00
|
|
|
return resolve();
|
|
|
|
}
|
|
|
|
|
|
|
|
if (data.includes('Database connection has failed')) {
|
2018-10-31 17:20:09 +01:00
|
|
|
process.kill(appCreation.pid);
|
2018-08-27 20:58:26 +02:00
|
|
|
return reject(new Error('Database connection has failed'));
|
2018-05-21 17:04:25 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
const start = () => {
|
2018-08-27 20:58:26 +02:00
|
|
|
return new Promise((resolve, reject) => {
|
2018-06-12 17:41:28 +02:00
|
|
|
try {
|
2018-10-19 18:58:11 +02:00
|
|
|
shell.cd('./testApp');
|
2018-10-31 17:20:09 +01:00
|
|
|
appStart = shell.exec(`strapi start`, { async: true, silent: true });
|
2018-10-19 18:58:11 +02:00
|
|
|
appStart.stdout.on('data', (data) => {
|
2018-06-12 17:41:28 +02:00
|
|
|
if (data.includes('To shut down your server')) {
|
2018-10-19 18:58:11 +02:00
|
|
|
shell.cd('..');
|
2018-06-12 17:41:28 +02:00
|
|
|
return resolve();
|
2018-10-31 17:20:09 +01:00
|
|
|
} else {
|
|
|
|
console.log(data.trim());
|
2018-06-12 17:41:28 +02:00
|
|
|
}
|
|
|
|
});
|
|
|
|
|
|
|
|
} catch (e) {
|
2018-11-22 19:19:04 +01:00
|
|
|
console.log(e)
|
2018-08-27 20:58:26 +02:00
|
|
|
if (typeof appStart !== 'undefined') {
|
2018-10-31 17:20:09 +01:00
|
|
|
process.kill(appStart.pid);
|
2018-08-27 20:58:26 +02:00
|
|
|
}
|
|
|
|
return reject(e);
|
2018-06-12 17:41:28 +02:00
|
|
|
}
|
2018-05-21 17:04:25 +02:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2018-11-22 19:19:04 +01:00
|
|
|
|
2018-05-21 17:04:25 +02:00
|
|
|
const test = () => {
|
|
|
|
return new Promise(async (resolve) => {
|
2018-06-12 17:41:28 +02:00
|
|
|
// Run setup tests to generate the app.
|
|
|
|
await jest({
|
2018-08-26 17:13:58 +02:00
|
|
|
passWithNoTests: true,
|
|
|
|
testURL: 'http://localhost/'
|
2018-06-12 17:41:28 +02:00
|
|
|
}, [process.cwd()]);
|
|
|
|
|
2018-10-31 17:20:09 +01:00
|
|
|
const packagesPath = path.resolve(process.cwd(), 'packages');
|
|
|
|
|
|
|
|
const packages = fs.readdirSync(packagesPath)
|
2018-06-12 17:41:28 +02:00
|
|
|
.filter(file => file.indexOf('strapi') !== -1);
|
|
|
|
|
|
|
|
// Run tests in every packages.
|
|
|
|
for (let i in packages) {
|
|
|
|
await jest({
|
2018-06-13 15:31:33 +02:00
|
|
|
passWithNoTests: true,
|
2018-08-26 17:13:58 +02:00
|
|
|
testURL: 'http://localhost/'
|
2018-10-31 17:20:09 +01:00
|
|
|
}, [path.resolve(packagesPath, packages[i])]);
|
2018-06-12 17:41:28 +02:00
|
|
|
}
|
2018-05-21 17:04:25 +02:00
|
|
|
|
|
|
|
resolve();
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2018-11-22 19:19:04 +01:00
|
|
|
const cypressTest = () => {
|
|
|
|
return cypress
|
2018-11-27 14:13:07 +01:00
|
|
|
.run({ spec: './packages/**/cypress/integration/*', browser: 'chrome' });
|
2018-11-22 19:19:04 +01:00
|
|
|
}
|
|
|
|
|
2018-06-01 14:31:30 +02:00
|
|
|
const testProcess = async (database) => {
|
2018-08-27 20:58:26 +02:00
|
|
|
try {
|
|
|
|
await clean();
|
|
|
|
await generate(database);
|
|
|
|
await start();
|
2018-11-22 19:19:04 +01:00
|
|
|
await cypressTest();
|
|
|
|
// await test();
|
2018-10-31 17:20:09 +01:00
|
|
|
process.kill(appStart.pid);
|
2018-08-27 20:58:26 +02:00
|
|
|
} catch (e) {
|
|
|
|
console.error(e.message);
|
|
|
|
testExitCode = 1;
|
|
|
|
}
|
2018-06-01 14:31:30 +02:00
|
|
|
};
|
2018-05-21 17:04:25 +02:00
|
|
|
|
2018-06-01 14:31:30 +02:00
|
|
|
await testProcess(databases.mongo);
|
2018-10-19 18:58:11 +02:00
|
|
|
// await testProcess(databases.postgres);
|
|
|
|
// await testProcess(databases.mysql);
|
2018-11-22 19:19:04 +01:00
|
|
|
// process.exit(testExitCode);
|
2018-05-21 17:04:25 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
main();
|