Merge pull request 'gulp-jasmine replaced by jasmine' (#971) from gulp-jasmine_deprecation into dev
gitea/salix/pipeline/head This commit looks good
Details
gitea/salix/pipeline/head This commit looks good
Details
Reviewed-on: #971 Reviewed-by: Joan Sanchez <joan@verdnatura.es>
This commit is contained in:
commit
3c738efb2a
|
@ -62,13 +62,13 @@ pipeline {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// stage('Backend') {
|
stage('Backend') {
|
||||||
// steps {
|
steps {
|
||||||
// nodejs('node-v14') {
|
nodejs('node-v14') {
|
||||||
// sh 'gulp launchBackTest --ci'
|
sh 'npm run test:back:ci'
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('Build') {
|
stage('Build') {
|
||||||
|
|
|
@ -54,17 +54,17 @@ $ gulp docker
|
||||||
|
|
||||||
For client-side unit tests run from project's root.
|
For client-side unit tests run from project's root.
|
||||||
```
|
```
|
||||||
$ jest
|
$ npm run test:front
|
||||||
```
|
```
|
||||||
|
|
||||||
For server-side unit tests run from project's root.
|
For server-side unit tests run from project's root.
|
||||||
```
|
```
|
||||||
$ gulp backTest
|
$ npm run test:back
|
||||||
```
|
```
|
||||||
|
|
||||||
For end-to-end tests run from project's root.
|
For end-to-end tests run from project's root.
|
||||||
```
|
```
|
||||||
$ gulp e2e
|
$ npm run test:e2e
|
||||||
```
|
```
|
||||||
|
|
||||||
## Visual Studio Code extensions
|
## Visual Studio Code extensions
|
||||||
|
|
|
@ -1,9 +1,12 @@
|
||||||
const app = require('vn-loopback/server/server');
|
const {models} = require('vn-loopback/server/server');
|
||||||
|
|
||||||
describe('account changePassword()', () => {
|
describe('account changePassword()', () => {
|
||||||
it('should throw an error when old password is wrong', async() => {
|
it('should throw an error when old password is wrong', async() => {
|
||||||
let req = app.models.Account.changePassword(null, 1, 'wrongOldPass', 'newPass');
|
let err;
|
||||||
|
await models.Account.changePassword(1, 'wrongPassword', 'nightmare.9999')
|
||||||
|
.catch(error => err = error.sqlMessage);
|
||||||
|
|
||||||
await expectAsync(req).toBeRejected();
|
expect(err).toBeDefined();
|
||||||
|
expect(err).toEqual('Invalid password');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
const app = require('vn-loopback/server/server');
|
const app = require('vn-loopback/server/server');
|
||||||
|
|
||||||
// #3400 analizar que hacer con rutas de back colletion
|
describe('newCollection()', () => {
|
||||||
xdescribe('newCollection()', () => {
|
it('should return a new collection', async() => {
|
||||||
it('return a new collection', async() => {
|
pending('#3400 analizar que hacer con rutas de back collection');
|
||||||
let ctx = {req: {accessToken: {userId: 1106}}};
|
let ctx = {req: {accessToken: {userId: 1106}}};
|
||||||
let response = await app.models.Collection.newCollection(ctx, 1, 1, 1);
|
let response = await app.models.Collection.newCollection(ctx, 1, 1, 1);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
"verbose": true,
|
||||||
|
"watch": [
|
||||||
|
"back/**/*.js",
|
||||||
|
"modules/**/*.js"
|
||||||
|
],
|
||||||
|
"ignore": [
|
||||||
|
"modules/account/front/**/*",
|
||||||
|
"modules/claim/front/**/*",
|
||||||
|
"modules/client/front/**/*",
|
||||||
|
"modules/entry/front/**/*",
|
||||||
|
"modules/invoiceIn/front/**/*",
|
||||||
|
"modules/invoiceOut/front/**/*",
|
||||||
|
"modules/item/front/**/*",
|
||||||
|
"modules/monitor/front/**/*",
|
||||||
|
"modules/order/front/**/*",
|
||||||
|
"modules/route/front/**/*",
|
||||||
|
"modules/supplier/front/**/*",
|
||||||
|
"modules/ticket/front/**/*",
|
||||||
|
"modules/travel/front/**/*",
|
||||||
|
"modules/worker/front/**/*",
|
||||||
|
"modules/zone/front/**/*"
|
||||||
|
]
|
||||||
|
}
|
|
@ -1,4 +1,5 @@
|
||||||
require('require-yaml');
|
const Docker = require('../db/docker.js');
|
||||||
|
let dataSources = require('../loopback/server/datasources.json');
|
||||||
|
|
||||||
process.on('warning', warning => {
|
process.on('warning', warning => {
|
||||||
console.log(warning.name);
|
console.log(warning.name);
|
||||||
|
@ -6,34 +7,64 @@ process.on('warning', warning => {
|
||||||
console.log(warning.stack);
|
console.log(warning.stack);
|
||||||
});
|
});
|
||||||
|
|
||||||
let verbose = false;
|
async function test() {
|
||||||
|
let isCI = false;
|
||||||
|
|
||||||
if (process.argv[2] === '--v')
|
if (process.argv[2] === 'ci')
|
||||||
verbose = true;
|
isCI = true;
|
||||||
|
|
||||||
let Jasmine = require('jasmine');
|
const container = new Docker();
|
||||||
let jasmine = new Jasmine();
|
|
||||||
let SpecReporter = require('jasmine-spec-reporter').SpecReporter;
|
|
||||||
|
|
||||||
let serviceSpecs = [
|
await container.run(isCI);
|
||||||
`${__dirname}/**/*[sS]pec.js`,
|
dataSources = JSON.parse(JSON.stringify(dataSources));
|
||||||
`${__dirname}/../loopback/**/*[sS]pec.js`,
|
|
||||||
`${__dirname}/../modules/*/back/**/*.[sS]pec.js`
|
|
||||||
];
|
|
||||||
|
|
||||||
jasmine.loadConfig({
|
Object.assign(dataSources.vn, {
|
||||||
spec_dir: '.',
|
host: container.dbConf.host,
|
||||||
spec_files: serviceSpecs,
|
port: container.dbConf.port
|
||||||
helpers: []
|
});
|
||||||
});
|
|
||||||
|
|
||||||
jasmine.addReporter(new SpecReporter({
|
const bootOptions = {dataSources};
|
||||||
spec: {
|
const app = require('vn-loopback/server/server');
|
||||||
// displayStacktrace: 'summary',
|
app.boot(bootOptions);
|
||||||
displaySuccessful: verbose,
|
|
||||||
displayFailedSpec: true,
|
const Jasmine = require('jasmine');
|
||||||
displaySpecDuration: true
|
const jasmine = new Jasmine();
|
||||||
|
|
||||||
|
const SpecReporter = require('jasmine-spec-reporter').SpecReporter;
|
||||||
|
jasmine.addReporter(new SpecReporter({
|
||||||
|
spec: {
|
||||||
|
displaySuccessful: isCI,
|
||||||
|
displayPending: isCI
|
||||||
|
},
|
||||||
|
summary: {
|
||||||
|
displayPending: false,
|
||||||
|
}
|
||||||
|
}));
|
||||||
|
|
||||||
|
if (isCI) {
|
||||||
|
const JunitReporter = require('jasmine-reporters');
|
||||||
|
jasmine.addReporter(new JunitReporter.JUnitXmlReporter());
|
||||||
|
|
||||||
|
jasmine.jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;
|
||||||
}
|
}
|
||||||
}));
|
|
||||||
|
|
||||||
jasmine.execute();
|
const backSpecs = [
|
||||||
|
'./back/**/*[sS]pec.js',
|
||||||
|
'./loopback/**/*[sS]pec.js',
|
||||||
|
'./modules/*/back/**/*.[sS]pec.js'
|
||||||
|
];
|
||||||
|
|
||||||
|
jasmine.loadConfig({
|
||||||
|
spec_dir: '.',
|
||||||
|
spec_files: backSpecs,
|
||||||
|
helpers: [],
|
||||||
|
});
|
||||||
|
|
||||||
|
jasmine.exitOnCompletion = false;
|
||||||
|
await jasmine.execute();
|
||||||
|
if (app) await app.disconnect();
|
||||||
|
if (container) await container.rm();
|
||||||
|
console.log('app disconnected & container removed');
|
||||||
|
}
|
||||||
|
|
||||||
|
test();
|
||||||
|
|
|
@ -24,7 +24,10 @@ module.exports = class Docker {
|
||||||
let d = new Date();
|
let d = new Date();
|
||||||
let pad = v => v < 10 ? '0' + v : v;
|
let pad = v => v < 10 ? '0' + v : v;
|
||||||
let stamp = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
|
let stamp = `${d.getFullYear()}-${pad(d.getMonth() + 1)}-${pad(d.getDate())}`;
|
||||||
|
|
||||||
|
log('Building container image...');
|
||||||
await this.execP(`docker build --build-arg STAMP=${stamp} -t salix-db ./db`);
|
await this.execP(`docker build --build-arg STAMP=${stamp} -t salix-db ./db`);
|
||||||
|
log('Image built.');
|
||||||
|
|
||||||
let dockerArgs;
|
let dockerArgs;
|
||||||
|
|
||||||
|
@ -39,6 +42,7 @@ module.exports = class Docker {
|
||||||
|
|
||||||
let runChown = process.platform != 'linux';
|
let runChown = process.platform != 'linux';
|
||||||
|
|
||||||
|
log('Starting container...');
|
||||||
const container = await this.execP(`docker run --env RUN_CHOWN=${runChown} -d ${dockerArgs} salix-db`);
|
const container = await this.execP(`docker run --env RUN_CHOWN=${runChown} -d ${dockerArgs} salix-db`);
|
||||||
this.id = container.stdout.trim();
|
this.id = container.stdout.trim();
|
||||||
|
|
||||||
|
@ -158,6 +162,7 @@ module.exports = class Docker {
|
||||||
return reject(new Error('Docker exited, please see the docker logs for more info'));
|
return reject(new Error('Docker exited, please see the docker logs for more info'));
|
||||||
|
|
||||||
let conn = mysql.createConnection(myConf);
|
let conn = mysql.createConnection(myConf);
|
||||||
|
|
||||||
conn.on('error', () => {});
|
conn.on('error', () => {});
|
||||||
conn.connect(err => {
|
conn.connect(err => {
|
||||||
conn.destroy();
|
conn.destroy();
|
||||||
|
|
|
@ -983,7 +983,7 @@ export default {
|
||||||
},
|
},
|
||||||
invoiceInTax: {
|
invoiceInTax: {
|
||||||
addTaxButton: 'vn-invoice-in-tax vn-icon-button[vn-tooltip="Add tax"]',
|
addTaxButton: 'vn-invoice-in-tax vn-icon-button[vn-tooltip="Add tax"]',
|
||||||
thirdExpence: 'vn-invoice-in-tax vn-horizontal:nth-child(3) > vn-autocomplete[ng-model="invoiceInTax.expenseFk"]',
|
thirdExpense: 'vn-invoice-in-tax vn-horizontal:nth-child(3) > vn-autocomplete[ng-model="invoiceInTax.expenseFk"]',
|
||||||
thirdTaxableBase: 'vn-invoice-in-tax vn-horizontal:nth-child(3) > vn-input-number[ng-model="invoiceInTax.taxableBase"]',
|
thirdTaxableBase: 'vn-invoice-in-tax vn-horizontal:nth-child(3) > vn-input-number[ng-model="invoiceInTax.taxableBase"]',
|
||||||
thirdTaxType: 'vn-invoice-in-tax vn-horizontal:nth-child(3) > vn-autocomplete[ng-model="invoiceInTax.taxTypeSageFk"]',
|
thirdTaxType: 'vn-invoice-in-tax vn-horizontal:nth-child(3) > vn-autocomplete[ng-model="invoiceInTax.taxTypeSageFk"]',
|
||||||
thirdTransactionType: 'vn-invoice-in-tax vn-horizontal:nth-child(3) > vn-autocomplete[ng-model="invoiceInTax.transactionTypeSageFk"]',
|
thirdTransactionType: 'vn-invoice-in-tax vn-horizontal:nth-child(3) > vn-autocomplete[ng-model="invoiceInTax.transactionTypeSageFk"]',
|
||||||
|
|
|
@ -0,0 +1,87 @@
|
||||||
|
require('@babel/register')({presets: ['@babel/env']});
|
||||||
|
require('core-js/stable');
|
||||||
|
require('regenerator-runtime/runtime');
|
||||||
|
|
||||||
|
const axios = require('axios');
|
||||||
|
const Docker = require('../../db/docker.js');
|
||||||
|
const e2eConfig = require('./config.js');
|
||||||
|
const log = require('fancy-log');
|
||||||
|
|
||||||
|
process.on('warning', warning => {
|
||||||
|
console.log(warning.name);
|
||||||
|
console.log(warning.message);
|
||||||
|
console.log(warning.stack);
|
||||||
|
});
|
||||||
|
|
||||||
|
async function test() {
|
||||||
|
if (process.argv[2] === 'show')
|
||||||
|
process.env.E2E_SHOW = true;
|
||||||
|
|
||||||
|
const container = new Docker('salix-db');
|
||||||
|
|
||||||
|
await container.run();
|
||||||
|
|
||||||
|
const Jasmine = require('jasmine');
|
||||||
|
const jasmine = new Jasmine();
|
||||||
|
|
||||||
|
const specFiles = [
|
||||||
|
`./e2e/paths/01*/*[sS]pec.js`,
|
||||||
|
`./e2e/paths/02*/*[sS]pec.js`,
|
||||||
|
`./e2e/paths/03*/*[sS]pec.js`,
|
||||||
|
`./e2e/paths/04*/*[sS]pec.js`,
|
||||||
|
`./e2e/paths/05*/*[sS]pec.js`,
|
||||||
|
`./e2e/paths/06*/*[sS]pec.js`,
|
||||||
|
`./e2e/paths/07*/*[sS]pec.js`,
|
||||||
|
`./e2e/paths/08*/*[sS]pec.js`,
|
||||||
|
`./e2e/paths/09*/*[sS]pec.js`,
|
||||||
|
`./e2e/paths/10*/*[sS]pec.js`,
|
||||||
|
`./e2e/paths/11*/*[sS]pec.js`,
|
||||||
|
`./e2e/paths/12*/*[sS]pec.js`,
|
||||||
|
`./e2e/paths/13*/*[sS]pec.js`,
|
||||||
|
`./e2e/paths/**/*[sS]pec.js`
|
||||||
|
];
|
||||||
|
|
||||||
|
jasmine.loadConfig({
|
||||||
|
spec_dir: '.',
|
||||||
|
spec_files: specFiles,
|
||||||
|
helpers: [],
|
||||||
|
random: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
await backendStatus();
|
||||||
|
|
||||||
|
jasmine.jasmine.DEFAULT_TIMEOUT_INTERVAL = 30000;
|
||||||
|
await jasmine.execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
async function backendStatus() {
|
||||||
|
log('Awaiting backend connection...');
|
||||||
|
|
||||||
|
const milliseconds = 1000;
|
||||||
|
const maxAttempts = 10;
|
||||||
|
|
||||||
|
return new Promise(resolve => {
|
||||||
|
let timer;
|
||||||
|
let attempts = 1;
|
||||||
|
timer = setInterval(async() => {
|
||||||
|
try {
|
||||||
|
attempts++;
|
||||||
|
const url = `${e2eConfig.url}/api/Applications/status`;
|
||||||
|
const {data} = await axios.get(url);
|
||||||
|
|
||||||
|
if (data == true) {
|
||||||
|
clearInterval(timer);
|
||||||
|
log('Backend connection stablished!');
|
||||||
|
resolve(attempts);
|
||||||
|
}
|
||||||
|
} catch (error) {
|
||||||
|
if (error && attempts >= maxAttempts) {
|
||||||
|
log('Could not connect to backend');
|
||||||
|
process.exit();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}, milliseconds);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
test();
|
|
@ -19,7 +19,7 @@ describe('InvoiceIn tax path', () => {
|
||||||
|
|
||||||
it('should add a new tax', async() => {
|
it('should add a new tax', async() => {
|
||||||
await page.waitToClick(selectors.invoiceInTax.addTaxButton);
|
await page.waitToClick(selectors.invoiceInTax.addTaxButton);
|
||||||
await page.autocompleteSearch(selectors.invoiceInTax.thirdExpence, '6210000567');
|
await page.autocompleteSearch(selectors.invoiceInTax.thirdExpense, '6210000567');
|
||||||
await page.write(selectors.invoiceInTax.thirdTaxableBase, '100');
|
await page.write(selectors.invoiceInTax.thirdTaxableBase, '100');
|
||||||
await page.autocompleteSearch(selectors.invoiceInTax.thirdTaxType, '6');
|
await page.autocompleteSearch(selectors.invoiceInTax.thirdTaxType, '6');
|
||||||
await page.autocompleteSearch(selectors.invoiceInTax.thirdTransactionType, 'Operaciones exentas');
|
await page.autocompleteSearch(selectors.invoiceInTax.thirdTransactionType, 'Operaciones exentas');
|
||||||
|
@ -37,9 +37,9 @@ describe('InvoiceIn tax path', () => {
|
||||||
expect(result).toEqual('Taxable base €1,323.16');
|
expect(result).toEqual('Taxable base €1,323.16');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should navigate back to the tax section and check the reciently added line contains the expected expense', async() => {
|
it('should navigate back to tax section, check the reciently added line contains the expected expense', async() => {
|
||||||
await page.accessToSection('invoiceIn.card.tax');
|
await page.accessToSection('invoiceIn.card.tax');
|
||||||
const result = await page.waitToGetProperty(selectors.invoiceInTax.thirdExpence, 'value');
|
const result = await page.waitToGetProperty(selectors.invoiceInTax.thirdExpense, 'value');
|
||||||
|
|
||||||
expect(result).toEqual('6210000567: Alquiler VNH');
|
expect(result).toEqual('6210000567: Alquiler VNH');
|
||||||
});
|
});
|
||||||
|
|
189
gulpfile.js
189
gulpfile.js
|
@ -3,8 +3,6 @@ const gulp = require('gulp');
|
||||||
const PluginError = require('plugin-error');
|
const PluginError = require('plugin-error');
|
||||||
const argv = require('minimist')(process.argv.slice(2));
|
const argv = require('minimist')(process.argv.slice(2));
|
||||||
const log = require('fancy-log');
|
const log = require('fancy-log');
|
||||||
const got = require('got');
|
|
||||||
const e2eConfig = require('./e2e/helpers/config.js');
|
|
||||||
const Docker = require('./db/docker.js');
|
const Docker = require('./db/docker.js');
|
||||||
|
|
||||||
// Configuration
|
// Configuration
|
||||||
|
@ -67,187 +65,6 @@ back.description = `Starts backend and database service`;
|
||||||
|
|
||||||
const defaultTask = gulp.parallel(front, back);
|
const defaultTask = gulp.parallel(front, back);
|
||||||
defaultTask.description = `Starts all application services`;
|
defaultTask.description = `Starts all application services`;
|
||||||
|
|
||||||
// Backend tests - Private method
|
|
||||||
|
|
||||||
async function launchBackTest(done) {
|
|
||||||
let err;
|
|
||||||
let dataSources = require('./loopback/server/datasources.json');
|
|
||||||
|
|
||||||
const container = new Docker();
|
|
||||||
await container.run(argv.ci);
|
|
||||||
|
|
||||||
dataSources = JSON.parse(JSON.stringify(dataSources));
|
|
||||||
|
|
||||||
Object.assign(dataSources.vn, {
|
|
||||||
host: container.dbConf.host,
|
|
||||||
port: container.dbConf.port
|
|
||||||
});
|
|
||||||
|
|
||||||
let bootOptions = {dataSources};
|
|
||||||
|
|
||||||
let app = require(`./loopback/server/server`);
|
|
||||||
|
|
||||||
try {
|
|
||||||
app.boot(bootOptions);
|
|
||||||
|
|
||||||
await new Promise((resolve, reject) => {
|
|
||||||
const jasmine = require('gulp-jasmine');
|
|
||||||
|
|
||||||
const options = {
|
|
||||||
verbose: false,
|
|
||||||
includeStackTrace: false,
|
|
||||||
errorOnFail: false,
|
|
||||||
timeout: 5000,
|
|
||||||
config: {}
|
|
||||||
};
|
|
||||||
|
|
||||||
if (argv.ci) {
|
|
||||||
const reporters = require('jasmine-reporters');
|
|
||||||
options.reporter = new reporters.JUnitXmlReporter();
|
|
||||||
}
|
|
||||||
|
|
||||||
let backSpecFiles = [
|
|
||||||
'back/**/*.spec.js',
|
|
||||||
'loopback/**/*.spec.js',
|
|
||||||
'modules/*/back/**/*.spec.js'
|
|
||||||
];
|
|
||||||
|
|
||||||
gulp.src(backSpecFiles)
|
|
||||||
.pipe(jasmine(options))
|
|
||||||
.on('end', resolve)
|
|
||||||
.on('error', reject)
|
|
||||||
.resume();
|
|
||||||
});
|
|
||||||
} catch (e) {
|
|
||||||
err = e;
|
|
||||||
}
|
|
||||||
await app.disconnect();
|
|
||||||
await container.rm();
|
|
||||||
done();
|
|
||||||
if (err)
|
|
||||||
throw err;
|
|
||||||
}
|
|
||||||
launchBackTest.description = `
|
|
||||||
Runs the backend tests once using a random container, can receive --ci arg to save reports on a xml file`;
|
|
||||||
|
|
||||||
// Backend tests
|
|
||||||
|
|
||||||
function backTest(done) {
|
|
||||||
const nodemon = require('gulp-nodemon');
|
|
||||||
|
|
||||||
nodemon({
|
|
||||||
exec: ['node --tls-min-v1.0 ./node_modules/gulp/bin/gulp.js'],
|
|
||||||
args: ['launchBackTest'],
|
|
||||||
watch: backSources,
|
|
||||||
done: done
|
|
||||||
});
|
|
||||||
}
|
|
||||||
backTest.description = `Watches for changes in modules to execute backTest task`;
|
|
||||||
|
|
||||||
// End to end tests
|
|
||||||
function e2eSingleRun() {
|
|
||||||
require('@babel/register')({presets: ['@babel/env']});
|
|
||||||
require('core-js/stable');
|
|
||||||
require('regenerator-runtime/runtime');
|
|
||||||
|
|
||||||
const jasmine = require('gulp-jasmine');
|
|
||||||
const SpecReporter = require('jasmine-spec-reporter').SpecReporter;
|
|
||||||
|
|
||||||
if (argv.show || argv.s)
|
|
||||||
process.env.E2E_SHOW = true;
|
|
||||||
|
|
||||||
const specFiles = [
|
|
||||||
`${__dirname}/e2e/paths/01*/*[sS]pec.js`,
|
|
||||||
`${__dirname}/e2e/paths/02*/*[sS]pec.js`,
|
|
||||||
`${__dirname}/e2e/paths/03*/*[sS]pec.js`,
|
|
||||||
`${__dirname}/e2e/paths/04*/*[sS]pec.js`,
|
|
||||||
`${__dirname}/e2e/paths/05*/*[sS]pec.js`,
|
|
||||||
`${__dirname}/e2e/paths/06*/*[sS]pec.js`,
|
|
||||||
`${__dirname}/e2e/paths/07*/*[sS]pec.js`,
|
|
||||||
`${__dirname}/e2e/paths/08*/*[sS]pec.js`,
|
|
||||||
`${__dirname}/e2e/paths/09*/*[sS]pec.js`,
|
|
||||||
`${__dirname}/e2e/paths/10*/*[sS]pec.js`,
|
|
||||||
`${__dirname}/e2e/paths/11*/*[sS]pec.js`,
|
|
||||||
`${__dirname}/e2e/paths/12*/*[sS]pec.js`,
|
|
||||||
`${__dirname}/e2e/paths/13*/*[sS]pec.js`,
|
|
||||||
`${__dirname}/e2e/paths/**/*[sS]pec.js`
|
|
||||||
];
|
|
||||||
|
|
||||||
return gulp.src(specFiles).pipe(jasmine({
|
|
||||||
errorOnFail: false,
|
|
||||||
timeout: 30000,
|
|
||||||
config: {
|
|
||||||
random: false,
|
|
||||||
// TODO: Waiting for this option to be implemented
|
|
||||||
// https://github.com/jasmine/jasmine/issues/1533
|
|
||||||
stopSpecOnExpectationFailure: false
|
|
||||||
},
|
|
||||||
reporter: [
|
|
||||||
new SpecReporter({
|
|
||||||
spec: {
|
|
||||||
displayStacktrace: 'none',
|
|
||||||
displaySuccessful: true,
|
|
||||||
displayFailedSpec: true,
|
|
||||||
displaySpecDuration: true,
|
|
||||||
},
|
|
||||||
summary: {
|
|
||||||
displayStacktrace: 'raw',
|
|
||||||
displayPending: false
|
|
||||||
},
|
|
||||||
colors: {
|
|
||||||
enabled: true,
|
|
||||||
successful: 'brightGreen',
|
|
||||||
failed: 'brightRed'
|
|
||||||
},
|
|
||||||
// stacktrace: {
|
|
||||||
// filter: stacktrace => {
|
|
||||||
// const lines = stacktrace.split('\n');
|
|
||||||
// const filtered = [];
|
|
||||||
// for (let i = 1; i < lines.length; i++) {
|
|
||||||
// if (/e2e\/paths/.test(lines[i]))
|
|
||||||
// filtered.push(lines[i]);
|
|
||||||
// }
|
|
||||||
// return filtered.join('\n');
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
})
|
|
||||||
]
|
|
||||||
}));
|
|
||||||
}
|
|
||||||
|
|
||||||
e2e = gulp.series(docker, async function isBackendReady() {
|
|
||||||
const attempts = await backendStatus();
|
|
||||||
log(`Backend ready after ${attempts} attempt(s)`);
|
|
||||||
|
|
||||||
return attempts;
|
|
||||||
}, e2eSingleRun);
|
|
||||||
e2e.description = `Restarts database and runs the e2e tests`;
|
|
||||||
|
|
||||||
async function backendStatus() {
|
|
||||||
const milliseconds = 250;
|
|
||||||
return new Promise(resolve => {
|
|
||||||
let timer;
|
|
||||||
let attempts = 1;
|
|
||||||
timer = setInterval(async() => {
|
|
||||||
try {
|
|
||||||
const url = `${e2eConfig.url}/api/Applications/status`;
|
|
||||||
const {body} = await got.get(url);
|
|
||||||
|
|
||||||
if (body == 'true') {
|
|
||||||
clearInterval(timer);
|
|
||||||
resolve(attempts);
|
|
||||||
} else
|
|
||||||
attempts++;
|
|
||||||
} catch (error) {
|
|
||||||
if (error || attempts > 100) // 250ms * 100 => 25s timeout
|
|
||||||
throw new Error('Could not connect to backend');
|
|
||||||
}
|
|
||||||
}, milliseconds);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
backendStatus.description = `Performs a simple requests to check the backend status`;
|
|
||||||
|
|
||||||
function install() {
|
function install() {
|
||||||
const install = require('gulp-install');
|
const install = require('gulp-install');
|
||||||
const print = require('gulp-print');
|
const print = require('gulp-print');
|
||||||
|
@ -431,9 +248,6 @@ module.exports = {
|
||||||
back,
|
back,
|
||||||
backOnly,
|
backOnly,
|
||||||
backWatch,
|
backWatch,
|
||||||
backTest,
|
|
||||||
launchBackTest,
|
|
||||||
e2e,
|
|
||||||
i,
|
i,
|
||||||
install,
|
install,
|
||||||
build,
|
build,
|
||||||
|
@ -444,6 +258,5 @@ module.exports = {
|
||||||
locales,
|
locales,
|
||||||
localesRoutes,
|
localesRoutes,
|
||||||
watch,
|
watch,
|
||||||
docker,
|
docker
|
||||||
backendStatus,
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -47,5 +47,6 @@ module.exports = {
|
||||||
'^.+\\.js?$': 'babel-jest',
|
'^.+\\.js?$': 'babel-jest',
|
||||||
'^.+\\.html$': 'html-loader-jest'
|
'^.+\\.html$': 'html-loader-jest'
|
||||||
},
|
},
|
||||||
|
reporters: ['default', 'jest-junit']
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -12,11 +12,13 @@ describe('Client updatePortfolio', () => {
|
||||||
|
|
||||||
const expectedResult = 841.63;
|
const expectedResult = 841.63;
|
||||||
|
|
||||||
await models.Client.rawSql(`UPDATE vn.client SET salesPersonFk = ${salesPersonId} WHERE id = ${clientId}; `);
|
const clientQuery = `UPDATE vn.client SET salesPersonFk = ${salesPersonId} WHERE id = ${clientId}; `;
|
||||||
|
await models.Client.rawSql(clientQuery);
|
||||||
|
|
||||||
await models.Client.updatePortfolio();
|
await models.Client.updatePortfolio();
|
||||||
|
|
||||||
let [salesPerson] = await models.Client.rawSql(`SELECT portfolioWeight FROM bs.salesPerson WHERE workerFk = ${salesPersonId}; `, null, options);
|
const portfolioQuery = `SELECT portfolioWeight FROM bs.salesPerson WHERE workerFk = ${salesPersonId}; `;
|
||||||
|
const [salesPerson] = await models.Client.rawSql(portfolioQuery, null, options);
|
||||||
|
|
||||||
expect(salesPerson.portfolioWeight).toEqual(expectedResult);
|
expect(salesPerson.portfolioWeight).toEqual(expectedResult);
|
||||||
|
|
||||||
|
@ -26,8 +28,9 @@ describe('Client updatePortfolio', () => {
|
||||||
throw e;
|
throw e;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// task 3817
|
|
||||||
xit('should keep the same portfolioWeight when a salesperson is unassigned of a client', async() => {
|
it('should keep the same portfolioWeight when a salesperson is unassigned of a client', async() => {
|
||||||
|
pending('task 3817');
|
||||||
const salesPersonId = 19;
|
const salesPersonId = 19;
|
||||||
const tx = await models.Client.beginTransaction({});
|
const tx = await models.Client.beginTransaction({});
|
||||||
|
|
||||||
|
@ -40,7 +43,8 @@ describe('Client updatePortfolio', () => {
|
||||||
|
|
||||||
await models.Client.updatePortfolio();
|
await models.Client.updatePortfolio();
|
||||||
|
|
||||||
let [salesPerson] = await models.Client.rawSql(`SELECT portfolioWeight FROM bs.salesPerson WHERE workerFk = ${salesPersonId}; `, null, options);
|
const portfolioQuery = `SELECT portfolioWeight FROM bs.salesPerson WHERE workerFk = ${salesPersonId}; `;
|
||||||
|
const [salesPerson] = await models.Client.rawSql(portfolioQuery, null, options);
|
||||||
|
|
||||||
expect(salesPerson.portfolioWeight).toEqual(expectedResult);
|
expect(salesPerson.portfolioWeight).toEqual(expectedResult);
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@ describe('loopback model address', () => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
beforeEach(() => {
|
beforeAll(() => {
|
||||||
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
|
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
|
||||||
active: activeCtx
|
active: activeCtx
|
||||||
});
|
});
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
const models = require('vn-loopback/server/server').models;
|
const models = require('vn-loopback/server/server').models;
|
||||||
const LoopBackContext = require('loopback-context');
|
const LoopBackContext = require('loopback-context');
|
||||||
|
const activeCtx = {accessToken: {userId: 9}};
|
||||||
|
|
||||||
describe('entry importBuysPreview()', () => {
|
describe('entry importBuysPreview()', () => {
|
||||||
const entryId = 1;
|
const entryId = 1;
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
const models = require('vn-loopback/server/server').models;
|
const models = require('vn-loopback/server/server').models;
|
||||||
|
|
||||||
// Include after #3638 export database
|
describe('AgencyTerm createInvoiceIn()', () => {
|
||||||
xdescribe('AgencyTerm createInvoiceIn()', () => {
|
|
||||||
const rows = [
|
const rows = [
|
||||||
{
|
{
|
||||||
routeFk: 2,
|
routeFk: 2,
|
||||||
|
@ -17,6 +16,7 @@ xdescribe('AgencyTerm createInvoiceIn()', () => {
|
||||||
];
|
];
|
||||||
|
|
||||||
it('should make an invoiceIn', async() => {
|
it('should make an invoiceIn', async() => {
|
||||||
|
pending('Include after #3638 export database');
|
||||||
const tx = await models.AgencyTerm.beginTransaction({});
|
const tx = await models.AgencyTerm.beginTransaction({});
|
||||||
const options = {transaction: tx};
|
const options = {transaction: tx};
|
||||||
|
|
||||||
|
@ -32,8 +32,12 @@ xdescribe('AgencyTerm createInvoiceIn()', () => {
|
||||||
await models.AgencyTerm.createInvoiceIn(rows, dms, options);
|
await models.AgencyTerm.createInvoiceIn(rows, dms, options);
|
||||||
|
|
||||||
const [newInvoiceIn] = await models.InvoiceIn.rawSql('SELECT MAX(id) id FROM invoiceIn', null, options);
|
const [newInvoiceIn] = await models.InvoiceIn.rawSql('SELECT MAX(id) id FROM invoiceIn', null, options);
|
||||||
const [newInvoiceInDueDay] = await models.InvoiceInDueDay.rawSql('SELECT MAX(id) id FROM invoiceInDueDay', null, options);
|
|
||||||
const [newInvoiceInTax] = await models.InvoiceInTax.rawSql('SELECT MAX(id) id FROM invoiceInTax', null, options);
|
const dueDayQuery = 'SELECT MAX(id) id FROM invoiceInDueDay';
|
||||||
|
const [newInvoiceInDueDay] = await models.InvoiceInDueDay.rawSql(dueDayQuery, null, options);
|
||||||
|
|
||||||
|
const taxQuery = 'SELECT MAX(id) id FROM invoiceInTax';
|
||||||
|
const [newInvoiceInTax] = await models.InvoiceInTax.rawSql(taxQuery, null, options);
|
||||||
|
|
||||||
expect(newInvoiceIn.id).toBeGreaterThan(oldInvoiceIn.id);
|
expect(newInvoiceIn.id).toBeGreaterThan(oldInvoiceIn.id);
|
||||||
expect(newInvoiceInDueDay.id).toBeGreaterThan(oldInvoiceInDueDay.id);
|
expect(newInvoiceInDueDay.id).toBeGreaterThan(oldInvoiceInDueDay.id);
|
||||||
|
|
|
@ -1,9 +1,21 @@
|
||||||
const app = require('vn-loopback/server/server');
|
const app = require('vn-loopback/server/server');
|
||||||
|
const LoopBackContext = require('loopback-context');
|
||||||
|
|
||||||
describe('route guessPriority()', () => {
|
describe('route guessPriority()', () => {
|
||||||
const targetRouteId = 7;
|
const targetRouteId = 7;
|
||||||
let routeTicketsToRestore;
|
let routeTicketsToRestore;
|
||||||
|
|
||||||
|
const activeCtx = {
|
||||||
|
accessToken: {userId: 9},
|
||||||
|
__: () => {}
|
||||||
|
};
|
||||||
|
|
||||||
|
beforeAll(() => {
|
||||||
|
spyOn(LoopBackContext, 'getCurrentContext').and.returnValue({
|
||||||
|
active: activeCtx
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
afterAll(async() => {
|
afterAll(async() => {
|
||||||
let restoreFixtures = [];
|
let restoreFixtures = [];
|
||||||
routeTicketsToRestore.forEach(ticket => {
|
routeTicketsToRestore.forEach(ticket => {
|
||||||
|
@ -12,12 +24,9 @@ describe('route guessPriority()', () => {
|
||||||
await Promise.all(restoreFixtures);
|
await Promise.all(restoreFixtures);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should call guessPriority() and then check the tickets in the target route now have their priorities defined', async() => {
|
it('should call guessPriority() then check all tickets in that route have their priorities defined', async() => {
|
||||||
const ctx = {
|
const ctx = {
|
||||||
req: {
|
req: activeCtx
|
||||||
accessToken: {userId: 9},
|
|
||||||
__: () => {}
|
|
||||||
},
|
|
||||||
};
|
};
|
||||||
routeTicketsToRestore = await app.models.Ticket.find({where: {routeFk: targetRouteId}});
|
routeTicketsToRestore = await app.models.Ticket.find({where: {routeFk: targetRouteId}});
|
||||||
|
|
||||||
|
|
|
@ -28,8 +28,9 @@ describe('ticket setDeleted()', () => {
|
||||||
|
|
||||||
expect(error.message).toEqual('You must delete the claim id %d first');
|
expect(error.message).toEqual('You must delete the claim id %d first');
|
||||||
});
|
});
|
||||||
// test excluded by task #3693
|
|
||||||
xit('should delete the ticket, remove the stowaway link and change the stowaway ticket state to "FIXING" and get rid of the itemshelving', async() => {
|
it('should delete ticket, remove stowaway and itemshelving then change stowaway state to "FIXING" ', async() => {
|
||||||
|
pending('test excluded by task #3693');
|
||||||
const tx = await models.Ticket.beginTransaction({});
|
const tx = await models.Ticket.beginTransaction({});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
const app = require('vn-loopback/server/server');
|
const app = require('vn-loopback/server/server');
|
||||||
|
|
||||||
// #2687 - Cannot make a data rollback because of the triggers
|
describe('Travel cloneWithEntries()', () => {
|
||||||
xdescribe('Travel cloneWithEntries()', () => {
|
|
||||||
const models = app.models;
|
const models = app.models;
|
||||||
const travelId = 5;
|
const travelId = 5;
|
||||||
const currentUserId = 1102;
|
const currentUserId = 1102;
|
||||||
|
@ -9,44 +8,45 @@ xdescribe('Travel cloneWithEntries()', () => {
|
||||||
let travelBefore;
|
let travelBefore;
|
||||||
let newTravelId;
|
let newTravelId;
|
||||||
|
|
||||||
afterAll(async() => {
|
// afterAll(async() => {
|
||||||
try {
|
// try {
|
||||||
const entries = await models.Entry.find({
|
// const entries = await models.Entry.find({
|
||||||
where: {
|
// where: {
|
||||||
travelFk: newTravelId
|
// travelFk: newTravelId
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
const entriesId = entries.map(entry => entry.id);
|
// const entriesId = entries.map(entry => entry.id);
|
||||||
|
|
||||||
// Destroy all entries buys
|
// // Destroy all entries buys
|
||||||
await models.Buy.destroyAll({
|
// await models.Buy.destroyAll({
|
||||||
where: {
|
// where: {
|
||||||
entryFk: {inq: entriesId}
|
// entryFk: {inq: entriesId}
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
|
|
||||||
// Destroy travel entries
|
// // Destroy travel entries
|
||||||
await models.Entry.destroyAll({
|
// await models.Entry.destroyAll({
|
||||||
where: {
|
// where: {
|
||||||
travelFk: newTravelId
|
// travelFk: newTravelId
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
|
|
||||||
// Destroy new travel
|
// // Destroy new travel
|
||||||
await models.Travel.destroyById(newTravelId);
|
// await models.Travel.destroyById(newTravelId);
|
||||||
|
|
||||||
// Restore original travel shipped & landed
|
// // Restore original travel shipped & landed
|
||||||
const travel = await models.Travel.findById(travelId);
|
// const travel = await models.Travel.findById(travelId);
|
||||||
await travel.updateAttributes({
|
// await travel.updateAttributes({
|
||||||
shipped: travelBefore.shipped,
|
// shipped: travelBefore.shipped,
|
||||||
landed: travelBefore.landed
|
// landed: travelBefore.landed
|
||||||
});
|
// });
|
||||||
} catch (error) {
|
// } catch (error) {
|
||||||
console.error(error);
|
// console.error(error);
|
||||||
}
|
// }
|
||||||
});
|
// });
|
||||||
|
|
||||||
it(`should clone the travel and the containing entries`, async() => {
|
it(`should clone the travel and the containing entries`, async() => {
|
||||||
|
pending('#2687 - Cannot make a data rollback because of the triggers');
|
||||||
const warehouseThree = 3;
|
const warehouseThree = 3;
|
||||||
const agencyModeOne = 1;
|
const agencyModeOne = 1;
|
||||||
const yesterday = new Date();
|
const yesterday = new Date();
|
||||||
|
|
10
package.json
10
package.json
|
@ -68,7 +68,6 @@
|
||||||
"gulp-env": "^0.4.0",
|
"gulp-env": "^0.4.0",
|
||||||
"gulp-file": "^0.4.0",
|
"gulp-file": "^0.4.0",
|
||||||
"gulp-install": "^1.1.0",
|
"gulp-install": "^1.1.0",
|
||||||
"gulp-jasmine": "^4.0.0",
|
|
||||||
"gulp-merge-json": "^1.3.1",
|
"gulp-merge-json": "^1.3.1",
|
||||||
"gulp-nodemon": "^2.5.0",
|
"gulp-nodemon": "^2.5.0",
|
||||||
"gulp-print": "^2.0.1",
|
"gulp-print": "^2.0.1",
|
||||||
|
@ -78,7 +77,7 @@
|
||||||
"html-loader-jest": "^0.2.1",
|
"html-loader-jest": "^0.2.1",
|
||||||
"html-webpack-plugin": "^4.0.0-beta.11",
|
"html-webpack-plugin": "^4.0.0-beta.11",
|
||||||
"identity-obj-proxy": "^3.0.0",
|
"identity-obj-proxy": "^3.0.0",
|
||||||
"jasmine": "^3.10.0",
|
"jasmine": "^4.1.0",
|
||||||
"jasmine-reporters": "^2.4.0",
|
"jasmine-reporters": "^2.4.0",
|
||||||
"jasmine-spec-reporter": "^7.0.0",
|
"jasmine-spec-reporter": "^7.0.0",
|
||||||
"jest": "^26.0.1",
|
"jest": "^26.0.1",
|
||||||
|
@ -88,7 +87,7 @@
|
||||||
"minimist": "^1.2.5",
|
"minimist": "^1.2.5",
|
||||||
"mysql2": "^1.7.0",
|
"mysql2": "^1.7.0",
|
||||||
"node-sass": "^4.14.1",
|
"node-sass": "^4.14.1",
|
||||||
"nodemon": "^1.19.4",
|
"nodemon": "^2.0.16",
|
||||||
"plugin-error": "^1.0.1",
|
"plugin-error": "^1.0.1",
|
||||||
"raw-loader": "^1.0.0",
|
"raw-loader": "^1.0.0",
|
||||||
"regenerator-runtime": "^0.13.7",
|
"regenerator-runtime": "^0.13.7",
|
||||||
|
@ -102,7 +101,10 @@
|
||||||
},
|
},
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dbtest": "nodemon -q db/tests.js -w db/tests",
|
"dbtest": "nodemon -q db/tests.js -w db/tests",
|
||||||
"test": "jest --watch",
|
"test:back": "nodemon -q back/tests.js --config back/nodemonConfig.json",
|
||||||
|
"test:back:ci": "node back/tests.js ci",
|
||||||
|
"test:e2e": "node e2e/helpers/tests.js",
|
||||||
|
"test:front": "jest --watch",
|
||||||
"back": "nodemon --inspect -w modules ./node_modules/gulp/bin/gulp.js back",
|
"back": "nodemon --inspect -w modules ./node_modules/gulp/bin/gulp.js back",
|
||||||
"lint": "eslint ./ --cache --ignore-pattern .gitignore",
|
"lint": "eslint ./ --cache --ignore-pattern .gitignore",
|
||||||
"docker": "docker build --progress=plain -t salix-db ./db"
|
"docker": "docker build --progress=plain -t salix-db ./db"
|
||||||
|
|
Loading…
Reference in New Issue