Fix cypress test run in docker

This commit is contained in:
Thilina Pituwala
2020-05-24 01:29:36 +02:00
parent c366248434
commit b68401efeb
50 changed files with 4359 additions and 1872 deletions
+1
View File
@@ -2,6 +2,7 @@
.buildpath .buildpath
.project .project
.idea/ .idea/
app/config.php
build build
deployment/clients/dev/data/ deployment/clients/dev/data/
deployment/clients/test/data/ deployment/clients/test/data/
-17
View File
@@ -1,17 +0,0 @@
version: "3.5"
services:
# Cypress container
cypress:
network_mode: host
# the Docker image to use from https://github.com/cypress-io/cypress-docker-images
image: "cypress/included:3.2.0"
environment:
# pass base url to test pointing at the web application
- CYPRESS_baseUrl=http://icehrm:8090
# share the current folder as volume to avoid copying
working_dir: /e2e
volumes:
- ./test/frontend:/e2e
volumes:
db_data:
+15
View File
@@ -19,6 +19,21 @@ services:
dockerfile: Dockerfile-testing dockerfile: Dockerfile-testing
ports: ports:
- 8090:8090 - 8090:8090
logging:
driver: none
# Cypress container
cypress:
# the Docker image to use from https://github.com/cypress-io/cypress-docker-images
image: "cypress/included:3.2.0"
depends_on:
- icehrm-testing
environment:
# pass base url to test pointing at the web application
- CYPRESS_baseUrl=http://icehrm-testing:8090
# share the current folder as volume to avoid copying
working_dir: /e2e
volumes:
- ./test/frontend:/e2e
volumes: volumes:
db_data: db_data:
+4
View File
@@ -17,5 +17,9 @@ services:
build: . build: .
ports: ports:
- 8080:8080 - 8080:8080
volumes:
- ./app:/var/www/html/app
- ./web:/var/www/html/web
- ./core:/var/www/html/core
volumes: volumes:
db_data: db_data:
+2 -2
View File
@@ -4,8 +4,8 @@ ini_set('error_log', 'data/icehrm.log');
define('CLIENT_NAME', 'icehrm'); define('CLIENT_NAME', 'icehrm');
define('APP_BASE_PATH', '/var/www/html/core/'); define('APP_BASE_PATH', '/var/www/html/core/');
define('CLIENT_BASE_PATH', '/var/www/html/app/'); define('CLIENT_BASE_PATH', '/var/www/html/app/');
define('BASE_URL','http://icehrm:8090/web/'); define('BASE_URL','http://icehrm-testing:8090/web/');
define('CLIENT_BASE_URL','http://icehrm:8090/app/'); define('CLIENT_BASE_URL','http://icehrm-testing:8090/app/');
define('APP_DB', 'icehrm'); define('APP_DB', 'icehrm');
define('APP_USERNAME', 'testing'); define('APP_USERNAME', 'testing');
+58 -14
View File
@@ -12,11 +12,22 @@ const es = require('event-stream');
const rename = require('gulp-rename'); const rename = require('gulp-rename');
const concat = require('gulp-concat'); const concat = require('gulp-concat');
const copy = require('gulp-copy'); const copy = require('gulp-copy');
const babel = require('gulp-babel');
const less = require('gulp-less');
const path = require('path');
const cleanCSS = require('gulp-clean-css');
const paths = { const paths = {
pages: ['src/*.html'], pages: ['src/*.html'],
}; };
let mod = process.argv.filter((item) => item.substr(0, 3) === '--m');
if (mod.length === 1) {
mod = mod[0].substr(3);
} else {
mod = null;
}
gulp.task('pack-js', (done) => { gulp.task('pack-js', (done) => {
gulp.src([ gulp.src([
'web/js/jquery2.0.2.min.js', 'web/js/jquery2.0.2.min.js',
@@ -46,11 +57,23 @@ gulp.task('pack-js', (done) => {
done(); done();
}); });
gulp.task('compile-ant-less', (done) => {
gulp.src([
'web/node_modules/antd/dist/antd.less',
]).pipe(less({
paths: [path.join(__dirname, 'less', 'includes')],
javascriptEnabled: true,
}))
.pipe(concat('antd.css'))
.pipe(gulp.dest('web/dist'));
done();
});
gulp.task('pack-css', (done) => { gulp.task('pack-css', (done) => {
gulp.src([ gulp.src([
'web/themecss/bootstrap.min.css', 'web/themecss/bootstrap.min.css',
'web/themecss/fa-all-5.8.2.min.css', 'web/themecss/fa-all-5.8.2.min.css',
//'web/themecss/font-awesome.css', // 'web/themecss/font-awesome.css',
'web/themecss/ionicons.min.css', 'web/themecss/ionicons.min.css',
'web/bower_components/material-design-icons/iconfont/material-icons.css', 'web/bower_components/material-design-icons/iconfont/material-icons.css',
'web/js/fullcaledar/fullcalendar.css', 'web/js/fullcaledar/fullcalendar.css',
@@ -64,7 +87,10 @@ gulp.task('pack-css', (done) => {
'web/css/fa-animations.css', 'web/css/fa-animations.css',
'web/css/style.css', 'web/css/style.css',
'web/bower_components/simplemde/dist/simplemde.min.css', 'web/bower_components/simplemde/dist/simplemde.min.css',
'web/node_modules/codemirror/lib/codemirror.css',
'web/dist/antd.css',
]) ])
.pipe(cleanCSS())
.pipe(concat('third-party.css')) .pipe(concat('third-party.css'))
.pipe(gulp.dest('web/dist')); .pipe(gulp.dest('web/dist'));
done(); done();
@@ -95,8 +121,9 @@ gulp.task('api-common', (done) => {
packageCache: {}, packageCache: {},
}) })
.transform('babelify', { .transform('babelify', {
presets: ['es2015'], extensions: ['.js'], presets: ['@babel/preset-env', '@babel/preset-react'], extensions: ['.js', '.jsx'],
}) })
.transform(require('browserify-css'))
.bundle() .bundle()
.pipe(source('common.js')) .pipe(source('common.js'))
.pipe(buffer()) .pipe(buffer())
@@ -124,11 +151,12 @@ gulp.task('api-common', (done) => {
gulp.task('admin-js', (done) => { gulp.task('admin-js', (done) => {
// we define our input files, which we want to have // we define our input files, which we want to have
// bundled: // bundled:
const files = [ let files = [
'attendance', 'attendance',
'company_structure', 'company_structure',
'dashboard', 'dashboard',
'data', 'data',
'documents',
'employees', 'employees',
'fieldnames', 'fieldnames',
'jobs', 'jobs',
@@ -146,8 +174,13 @@ gulp.task('admin-js', (done) => {
'travel', 'travel',
'users', 'users',
]; ];
// map them to our stream function
const tasks = files.map(entry => browserify({ if (mod != null) {
files = files.filter((item) => item === mod);
}
// map them to our stream function
const tasks = files.map((entry) => browserify({
entries: [`web/admin/src/${entry}/index.js`], entries: [`web/admin/src/${entry}/index.js`],
basedir: '.', basedir: '.',
debug: true, debug: true,
@@ -155,11 +188,15 @@ gulp.task('admin-js', (done) => {
packageCache: {}, packageCache: {},
}) })
.transform('babelify', { .transform('babelify', {
presets: ['es2015'], extensions: ['.js'], plugins: [
['@babel/plugin-proposal-class-properties', { loose: true }],
],
presets: ['@babel/preset-env', '@babel/preset-react'],
extensions: ['.js', '.jsx'],
}) })
.transform(require('browserify-css'))
.bundle() .bundle()
.pipe(source(`${entry}/lib.js`)) .pipe(source(`${entry}/lib.js`))
// rename them to have "bundle as postfix"
.pipe(rename(`${entry}.js`)) .pipe(rename(`${entry}.js`))
.pipe(buffer()) .pipe(buffer())
.pipe(sourcemaps.init({ loadMaps: true })) .pipe(sourcemaps.init({ loadMaps: true }))
@@ -173,17 +210,18 @@ gulp.task('admin-js', (done) => {
)) ))
.pipe(sourcemaps.write('./')) .pipe(sourcemaps.write('./'))
.pipe(gulp.dest('./web/admin/dist/'))); .pipe(gulp.dest('./web/admin/dist/')));
// create a merged stream // create a merged stream
es.merge.apply(null, tasks).on('end', done); es.merge.apply(null, tasks).on('end', done);
}); });
gulp.task('modules-js', (done) => { gulp.task('modules-js', (done) => {
// we define our input files, which we want to have // we define our input files, which we want to have
// bundled: // bundled:
const files = [ let files = [
'attendance', 'attendance',
'dashboard', 'dashboard',
'dependents', 'dependents',
'documents',
'emergency_contact', 'emergency_contact',
'employees', 'employees',
'loans', 'loans',
@@ -196,8 +234,13 @@ gulp.task('modules-js', (done) => {
'time_sheets', 'time_sheets',
'travel', 'travel',
]; ];
// map them to our stream function
const tasks = files.map(entry => browserify({ if (mod != null) {
files = files.filter((item) => item === mod);
}
// map them to our stream function
const tasks = files.map((entry) => browserify({
entries: [`web/modules/src/${entry}/index.js`], entries: [`web/modules/src/${entry}/index.js`],
basedir: '.', basedir: '.',
debug: true, debug: true,
@@ -205,11 +248,11 @@ gulp.task('modules-js', (done) => {
packageCache: {}, packageCache: {},
}) })
.transform('babelify', { .transform('babelify', {
presets: ['es2015'], extensions: ['.js'], presets: ['@babel/preset-env', '@babel/preset-react'], extensions: ['.js', '.jsx'],
}) })
.transform(require('browserify-css'))
.bundle() .bundle()
.pipe(source(`${entry}/lib.js`)) .pipe(source(`${entry}/lib.js`))
// rename them to have "bundle as postfix"
.pipe(rename(`${entry}.js`)) .pipe(rename(`${entry}.js`))
.pipe(buffer()) .pipe(buffer())
.pipe(sourcemaps.init({ loadMaps: true })) .pipe(sourcemaps.init({ loadMaps: true }))
@@ -223,11 +266,12 @@ gulp.task('modules-js', (done) => {
)) ))
.pipe(sourcemaps.write('./')) .pipe(sourcemaps.write('./'))
.pipe(gulp.dest('./web/modules/dist/'))); .pipe(gulp.dest('./web/modules/dist/')));
// create a merged stream // create a merged stream
es.merge.apply(null, tasks).on('end', done); es.merge.apply(null, tasks).on('end', done);
}); });
gulp.task('default', gulp.series( gulp.task('default', gulp.series(
'compile-ant-less',
'pack-js', 'pack-js',
'pack-css', 'pack-css',
'copy-assets', 'copy-assets',
+4188 -1681
View File
File diff suppressed because it is too large Load Diff
+29 -19
View File
@@ -1,7 +1,7 @@
{ {
"name": "icehrm", "name": "icehrm",
"version": "1.0.0", "version": "",
"description": "IceHrm is a human resource management system", "description": "Simple HR Management",
"main": "gulpfile.js", "main": "gulpfile.js",
"directories": { "directories": {
"test": "test" "test": "test"
@@ -12,31 +12,41 @@
"author": "", "author": "",
"license": "ISC", "license": "ISC",
"devDependencies": { "devDependencies": {
"acorn": "^6.0.4", "@babel/core": "^7.9.0",
"babel-core": "^6.26.3", "@babel/plugin-proposal-class-properties": "^7.8.3",
"babel-preset-es2015": "^6.24.1", "@babel/preset-env": "^7.9.0",
"babelify": "^8.0.0", "@babel/preset-react": "^7.9.4",
"browserify": "^16.2.2", "acorn": "^7.1.1",
"eslint": "^5.11.0", "babelify": "^10.0.0",
"eslint-config-airbnb": "^17.1.0", "browserify": "^16.5.1",
"eslint-plugin-import": "^2.14.0", "browserify-css": "^0.15.0",
"eslint-plugin-jsx-a11y": "^6.1.2", "eslint": "^6.8.0",
"eslint-plugin-react": "^7.11.1", "eslint-config-airbnb": "^18.1.0",
"eslint-plugin-import": "^2.20.2",
"eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-react": "^7.19.0",
"gulp": "^4.0.2", "gulp": "^4.0.2",
"gulp-babel": "^8.0.0",
"gulp-clean-css": "^4.3.0",
"gulp-concat": "^2.6.1",
"gulp-copy": "^4.0.1",
"gulp-minify": "^3.1.0", "gulp-minify": "^3.1.0",
"gulp-obfuscate": "^0.2.9", "gulp-obfuscate": "^0.2.9",
"gulp-sourcemaps": "^2.6.4", "gulp-rename": "^2.0.0",
"gulp-uglify": "^3.0.1", "gulp-sourcemaps": "^2.6.5",
"gulp-uglify-es": "^1.0.4", "gulp-uglify": "^3.0.2",
"gulp-uglify-es": "^2.0.0",
"stdio": "^2.1.1",
"vinyl-buffer": "^1.0.1", "vinyl-buffer": "^1.0.1",
"vinyl-source-stream": "^2.0.0" "vinyl-source-stream": "^2.0.0"
}, },
"dependencies": { "dependencies": {
"browserify-less": "0.0.1",
"d3": "^5.9.1", "d3": "^5.9.1",
"event-stream": "^4.0.1", "event-stream": "^4.0.1",
"gulp-concat": "^2.6.1", "gulp-less": "^4.0.1",
"gulp-copy": "^4.0.1", "path": "^0.12.7",
"gulp-rename": "^1.4.0", "qrcode": "^1.3.3",
"qrcode": "^1.3.3" "reqwest": "^2.0.5"
} }
} }
@@ -63,21 +63,10 @@ class IceCypressTest {
clickSave(cy) { clickSave(cy) {
cy.get(`#${this.element}Form .saveBtn`).should("be.visible").click(); cy.get(`#${this.element}Form .saveBtn`).should("be.visible").click();
cy.wait(config.WAIT_TIME);
} }
editElementValidate(cy, validation = [], editButtonSelector) { editElementValidate(cy, validation = [], editButtonSelector) {
if (this.isRemoteTable) {
cy.server().route('GET', `/${config.URL_PREFIX}/data.php*`).as('getAfterSave');
} else {
cy.server().route('POST', `/${config.URL_PREFIX}/service.php*`).as('getAfterSave');
}
// Wait for data table response
if (config.WAIT_ON_TIME) {
cy.wait(config.WAIT_TIME);
} else {
cy.wait('@getAfterSave').its('status').should('be', config.DEFAULT_STATUS);
}
cy.server().route('POST', `/${config.URL_PREFIX}/service.php*`).as('getElementAfterSave'); cy.server().route('POST', `/${config.URL_PREFIX}/service.php*`).as('getElementAfterSave');
// Click on edit and wait // Click on edit and wait
@@ -85,11 +74,7 @@ class IceCypressTest {
.should("be.visible") .should("be.visible")
.click(); .click();
if (config.WAIT_ON_TIME) { cy.wait('@getElementAfterSave').its('status').should('be', config.DEFAULT_STATUS);
cy.wait(config.WAIT_TIME);
} else {
cy.wait('@getElementAfterSave').its('status').should('be', config.DEFAULT_STATUS);
}
validation.forEach((item) => { validation.forEach((item) => {
cy.get(item[0]).then(element => expect(element.val()).eq(item[1])); cy.get(item[0]).then(element => expect(element.val()).eq(item[1]));
@@ -1,44 +0,0 @@
const IceCypressTest = require('../../commmon/ice-cypress-test');
const config = require('../../support/config');
const test = new IceCypressTest(
'g=admin&n=teams&m=admin_Employees',
'TeamMembers',
false,
);
context('Admin Teams Module - Team Members Tab', () => {
it('admin can view list', () => {
cy.login('admin', 'admin');
test.loadModule(cy);
test.switchTab(cy);
test.loadTable(cy, 2);
});
it('admin can edit element', () => {
cy.login('admin', 'admin');
test.loadModule(cy);
test.switchTab(cy);
cy.get('#TeamMembers table tbody').find('tr').first().find('.center div img[data-original-title=\'Edit\']')
.click();
test.select2Click('team', 'beta');
test.clickSave(cy);
});
it('manager can view list', () => {
cy.login('manager', config.DEFAULT_USER_PASS);
test.loadModule(cy);
test.switchTab(cy);
test.loadTable(cy, 2);
});
it('manager can edit element', () => {
cy.login('manager', config.DEFAULT_USER_PASS);
test.loadModule(cy);
test.switchTab(cy);
cy.get('#TeamMembers table tbody').find('tr').first().find('.center div img[data-original-title=\'Edit\']')
.click();
test.select2Click('team', 'beta');
test.clickSave(cy);
});
});
@@ -1,40 +0,0 @@
const IceCypressTest = require('../../commmon/ice-cypress-test');
const config = require('../../support/config');
const test = new IceCypressTest(
'g=admin&n=teams&m=admin_Employees',
'Teams',
false,
);
context('Admin Teams Module - Teams Tab', () => {
it('admin can view list', () => {
cy.login('admin', 'admin');
test.loadModule(cy);
test.loadTable(cy, 2);
});
it('admin can edit element', () => {
cy.login('admin', 'admin');
test.loadModule(cy);
test.editElement(cy, [['#description', 'creative designing team']]);
test.select2Click('department', 'Head Office');
test.clickSave(cy);
test.editElementValidate(cy, [['#description', 'creative designing team']]);
});
it('manager can view list', () => {
cy.login('manager', config.DEFAULT_USER_PASS);
test.loadModule(cy);
test.loadTable(cy, 2);
});
it('manager can edit element', () => {
cy.login('manager', config.DEFAULT_USER_PASS);
test.loadModule(cy);
test.editElement(cy, [['#description', 'creative designing team']]);
test.select2Click('department', 'Head Office');
test.clickSave(cy);
test.editElementValidate(cy, [['#description', 'creative designing team']]);
});
});
+2 -2
View File
@@ -1,11 +1,11 @@
const BASE_URL = 'http://icehrm:8090/app/'; const BASE_URL = 'http://icehrm-testing:8090/app/';
//const BASE_URL = 'http://clients.icehrmpro.test/test/'; //const BASE_URL = 'http://clients.icehrmpro.test/test/';
const DEFAULT_MAX_PAGE_SIZE = 15; const DEFAULT_MAX_PAGE_SIZE = 15;
const DEFAULT_STATUS = 200; const DEFAULT_STATUS = 200;
const DEFAULT_USER_PASS = 'demouserpwd'; const DEFAULT_USER_PASS = 'demouserpwd';
const URL_PREFIX = 'app'; const URL_PREFIX = 'app';
const WAIT_ON_TIME = true; const WAIT_ON_TIME = false;
const WAIT_TIME = 500; const WAIT_TIME = 500;
module.exports = { module.exports = {
+1 -1
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+2
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+5 -1
View File
@@ -1213,7 +1213,11 @@ class TerminatedEmployeeAdapter extends EmployeeAdapter {
getActionButtonsHtml(id) { getActionButtonsHtml(id) {
// eslint-disable-next-line max-len // eslint-disable-next-line max-len
let html = '<div style="width:110px;"><img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;margin-left:15px;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img><img class="tableActionButton" src="_BASE_images/edit.png" style="display:none;cursor:pointer;margin-left:15px;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img><img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Archive Employee" onclick="modJs.deleteEmployee(_id_);return false;"></img><img class="tableActionButton" src="_BASE_images/redo.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Restore Employee" onclick="modJs.activateEmployee(_id_);return false;"></img></div>'; let html = `<div style="width:110px;">
<img class="tableActionButton" src="_BASE_images/edit.png" style="cursor:pointer;margin-left:15px;" rel="tooltip" title="Edit" onclick="modJs.edit(_id_);return false;"></img>
<img class="tableActionButton" src="_BASE_images/delete.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Archive Employee" onclick="modJs.deleteEmployee(_id_);return false;"></img>
<img class="tableActionButton" src="_BASE_images/redo.png" style="margin-left:15px;cursor:pointer;" rel="tooltip" title="Restore Employee" onclick="modJs.activateEmployee(_id_);return false;"></img>
</div>`;
html = html.replace(/_id_/g, id); html = html.replace(/_id_/g, id);
html = html.replace(/_BASE_/g, this.baseUrl); html = html.replace(/_BASE_/g, this.baseUrl);
return html; return html;
+8 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+2
View File
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
+8 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long
+1 -1
View File
File diff suppressed because one or more lines are too long