TSK-1356: added cypress e2e testing

* Add initial cypress files and testcases

* Fix cypress workbasket merge errors

* change testValue for WorkbasketSelection

* TSK-1356: added cypress e2e testing to ci pipeline

* TSK-1356: Fixed cypress tests

Also changed default example data, so that workbaskets contain valid owners

* TSK-1356: hopefully fixed small startup problem in travis

* TSK-1356: revert of test-data

* TSK-1356: Modified ldif to support our test data

* TSK-1356: Removed unused cypress.json

Co-authored-by: Tobias Baden <16336696+tbdn@users.noreply.github.com>
This commit is contained in:
Tristan2357 2020-08-11 15:41:50 +02:00 committed by GitHub
parent 64701e785c
commit 9b65838a79
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
22 changed files with 2105 additions and 27 deletions

4
.gitignore vendored
View File

@ -52,8 +52,8 @@ testem.log
/typings
# e2e
e2e/*.js
e2e/*.map
/web/cypress/screenshots/
/web/cypress/videos/
# System Files
.DS_Store

View File

@ -50,14 +50,13 @@ before_cache: rm -rf "$HOME/.m2/repository/pro/taskana"
jobs:
include:
- stage: Test
language: node_js
node_js: $NODE_VERSION
before_script: nvm install $NODE_VERSION
install: skip
env: DB=WEB
script: ci/test.sh "$DB"
before_cache: rm -rf "$HOME/.m2/repository/pro/taskana"
# We are using the environment variable 'MODULE' to force travis into using a different cache for each build.
# We are using the environment variable 'MODULE' to force travis into using a different cache for each build.
# See https://docs.travis-ci.com/user/caching/#caches-and-build-matrices for detailed information on
# which characteristics determine the cache selection.
- stage: Compile

17
ci/cypress.json Normal file
View File

@ -0,0 +1,17 @@
{
"env": {
"baseUrl": "http://localhost:8080/taskana",
"monitorUrl": "/monitor",
"adminUrl": "/administration",
"appUrl": "http://localhost:8080/taskana/#/taskana",
"pageReload": 200,
"dropdownWait": 50,
"testValueClassificationSelectionName": "L10303",
"testValueClassifications": "CY-TEST-CLASSIFICATIONS",
"testValueWorkbasketSelectionName": "basxet0",
"testValueWorkbaskets": "CY-TEST-WORKBASKETS",
"screenshotOnRunFailure": false,
"video": false,
"videoUploadOnPasses": false
}
}

View File

@ -69,9 +69,19 @@ function main() {
;;
WEB)
set -x
(cd $REL/../web && npm install --silent && npm run test)
### INSTALL ###
(cd $REL/../web && npm install --silent && npm run build:prod-silent)
mvn -q install -B -f $REL/.. -am -T 4C -pl :taskana-rest-spring-example-boot -Dasciidoctor.skip -DskipTests -Dmaven.javadoc.skip -Dcheckstyle.skip
mvn spring-boot:run -f $REL/../rest/taskana-rest-spring-example-boot > /dev/null &
### TEST ###
(cd $REL/../web && npm run test -- --coverageReporters text-summary)
(cd $REL/../web && npm run e2e -- --config-file ../ci/cypress.json)
### CLEANUP ###
jobs -p | xargs -rn10 kill
;;
esac
}
main "$@"

View File

@ -119,6 +119,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
cn: Elena Eifrig
userPassword: user-1-2
dn: uid=Max,cn=users,OU=Test,O=TASKANA
objectclass: inetorgperson
objectclass: organizationalperson
objectclass: person
objectclass: top
givenName: Max
description: desc
uid: Max
sn: Mustermann
ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
cn: Max Mustermann
userPassword: Max
########################
# Users KSC 2
########################
@ -161,6 +174,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
cn: Tim Schläfrig
userPassword: user-2-1
dn: uid=owner0815,cn=users,OU=Test,O=TASKANA
objectclass: inetorgperson
objectclass: organizationalperson
objectclass: person
objectclass: top
givenName: Hans
description: desc
uid: owner0815
sn: Hafer
ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
cn: Hans Hafer
userPassword: owner0815
########################
# Users Domäne B
########################

View File

@ -119,6 +119,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
cn: Elena Eifrig
userPassword: user-1-2
dn: uid=Max,cn=users,OU=Test,O=TASKANA
objectclass: inetorgperson
objectclass: organizationalperson
objectclass: person
objectclass: top
givenName: Max
description: desc
uid: Max
sn: Mustermann
ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
cn: Max Mustermann
userPassword: Max
########################
# Users KSC 2
########################
@ -161,6 +174,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
cn: Tim Schläfrig
userPassword: user-2-1
dn: uid=owner0815,cn=users,OU=Test,O=TASKANA
objectclass: inetorgperson
objectclass: organizationalperson
objectclass: person
objectclass: top
givenName: Hans
description: desc
uid: owner0815
sn: Hafer
ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
cn: Hans Hafer
userPassword: owner0815
########################
# Users Domäne B
########################

View File

@ -119,6 +119,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
cn: Elena Eifrig
userPassword: user-1-2
dn: uid=Max,cn=users,OU=Test,O=TASKANA
objectclass: inetorgperson
objectclass: organizationalperson
objectclass: person
objectclass: top
givenName: Max
description: desc
uid: Max
sn: Mustermann
ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
cn: Max Mustermann
userPassword: Max
########################
# Users KSC 2
########################
@ -161,6 +174,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
cn: Tim Schläfrig
userPassword: user-2-1
dn: uid=owner0815,cn=users,OU=Test,O=TASKANA
objectclass: inetorgperson
objectclass: organizationalperson
objectclass: person
objectclass: top
givenName: Hans
description: desc
uid: owner0815
sn: Hafer
ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
cn: Hans Hafer
userPassword: owner0815
########################
# Users Domäne B
########################

View File

@ -119,6 +119,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
cn: Elena Eifrig
userPassword: user-1-2
dn: uid=Max,cn=users,OU=Test,O=TASKANA
objectclass: inetorgperson
objectclass: organizationalperson
objectclass: person
objectclass: top
givenName: Max
description: desc
uid: Max
sn: Mustermann
ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
cn: Max Mustermann
userPassword: Max
########################
# Users KSC 2
########################
@ -161,6 +174,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
cn:: VGltIFNjaGzDpGZyaWc=
userPassword: user-2-1
dn: uid=owner0815,cn=users,OU=Test,O=TASKANA
objectclass: inetorgperson
objectclass: organizationalperson
objectclass: person
objectclass: top
givenName: Hans
description: desc
uid: owner0815
sn: Hafer
ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
cn: Hans Hafer
userPassword: owner0815
########################
# Users Domäne B
########################

15
web/cypress.json Normal file
View File

@ -0,0 +1,15 @@
{
"env": {
"baseUrl": "http://localhost:8080/taskana",
"monitorUrl": "/monitor",
"adminUrl": "/administration",
"appUrl": "http://localhost:8080/taskana/#/taskana",
"pageReload": 200,
"dropdownWait": 50,
"testValueClassificationSelectionName": "L10303",
"testValueClassifications": "CY-TEST-CLASSIFICATIONS",
"testValueWorkbasketSelectionName": "basxet0",
"testValueWorkbaskets": "CY-TEST-WORKBASKETS",
"isLocal": true
}
}

View File

@ -0,0 +1,17 @@
// ***********************************************************
// This example plugins/index.js can be used to load plugins
//
// You can change the location of this file or turn off loading
// the plugins file with the 'pluginsFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/plugins-guide
// ***********************************************************
// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)
module.exports = (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
}

View File

@ -0,0 +1,25 @@
// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add("login", (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })

View File

@ -0,0 +1,20 @@
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import commands.js using ES2015 syntax:
import './commands'
// Alternatively you can use CommonJS syntax:
// require('./commands')

View File

@ -0,0 +1,5 @@
{
"name": "Using fixtures to represent data",
"email": "hello@cypress.io",
"body": "Fixtures are a great way to mock data for responses to routes"
}

View File

@ -0,0 +1,151 @@
context('TASKANA Classifications', () => {
beforeEach(() => cy.loginAs('admin'));
it('should be able to visit Classifications and filter by manual', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('adminUrl') + '/classifications');
cy.get('#dropdown-classification-filter')
.click()
.then(() => {
cy.contains('MANUAL').click();
cy.get('tree-node-collection').find('tree-node').should('have.length', 2);
});
});
it('should be possible to edit the Name of a classification', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('adminUrl') + '/classifications');
cy.contains(Cypress.env('testValueClassificationSelectionName')).click();
const editedValue = 'CY-TEST';
cy.get('#classification-name').clear().type(editedValue);
cy.get('[title="Save"] > .material-icons').click();
cy.reload();
cy.wait(Cypress.env('pageReload'));
cy.get('#classification-name').should('have.value', editedValue);
});
it('should be possible to edit the Priority of a classification', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('adminUrl') + '/classifications');
cy.contains(Cypress.env('testValueClassificationSelectionName')).click();
cy.get('input[name="number"]')
.invoke('val')
.then((oldPriorityValue) => {
oldPriorityValue = parseFloat(oldPriorityValue);
cy.get('[title="increase value"] > .material-icons').click();
cy.get('[title="Save"] > .material-icons').click();
cy.reload();
cy.wait(Cypress.env('pageReload'));
cy.get('.input-group > .form-control')
.invoke('val')
.then((newValueOfPriority) => {
newValueOfPriority = parseFloat(newValueOfPriority);
expect(newValueOfPriority).to.eq(oldPriorityValue + 1);
});
});
});
it('should be possible to edit the Category of a classification', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('adminUrl') + '/classifications');
cy.contains(Cypress.env('testValueClassificationSelectionName')).click();
cy.get('.required > .dropdown > .btn').click();
cy.wait(Cypress.env('dropdownWait'));
cy.get('.dropdown-menu.show > li').contains('PROCESS').click();
cy.get('[title="Save"] > .material-icons').click();
cy.reload();
cy.wait(Cypress.env('pageReload'));
// assure that its process now
cy.get('.required > .dropdown > .btn').contains('PROCESS').should('be.visible');
// change back to external
cy.get('.required > .dropdown > .btn').click();
cy.wait(Cypress.env('dropdownWait'));
cy.get('.dropdown-menu.show > li').contains('EXTERNAL').should('be.visible').click();
cy.get('[title="Save"] > .material-icons').click();
});
it('should be possible to edit the Description of a classification', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('adminUrl') + '/classifications');
cy.contains(Cypress.env('testValueClassificationSelectionName')).click();
const editedValue = 'CY-TEST-DESC';
cy.get('#classification-description').clear().type(editedValue);
cy.get('[title="Save"] > .material-icons').click();
cy.reload();
cy.wait(Cypress.env('pageReload'));
cy.get('#classification-description').should('have.value', editedValue);
});
it('should be possible to edit the Service Level of a classification', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('adminUrl') + '/classifications');
cy.contains(Cypress.env('testValueClassificationSelectionName')).click();
const editedValue = 'P99D';
cy.get('#classification-service-level').clear().type(editedValue);
cy.get('[title="Save"] > .material-icons').click();
cy.reload();
cy.wait(Cypress.env('pageReload'));
cy.get('#classification-service-level').should('have.value', editedValue);
});
it('should be possible to edit classification custom 1 to 8', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('adminUrl') + '/classifications');
cy.contains(Cypress.env('testValueClassificationSelectionName')).click();
cy.wrap([1, 2, 4, 5, 6, 7, 8]).each((index) => {
cy.get('#classification-custom-' + index)
.clear()
.type(Cypress.env('testValueClassifications'));
cy.get('[title="Save"] > .material-icons').click();
cy.reload();
cy.wait(Cypress.env('pageReload'));
cy.get('#classification-custom-' + index).should('have.value', Cypress.env('testValueClassifications'));
});
});
it('should be possible to edit the application entry point', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('adminUrl') + '/classifications');
cy.contains(Cypress.env('testValueClassificationSelectionName')).click();
cy.get('#classification-application-entry-point').clear().type(Cypress.env('testValueClassifications'));
cy.get('[title="Save"] > .material-icons').click();
cy.reload();
cy.wait(Cypress.env('pageReload'));
cy.get('#classification-application-entry-point').should('have.value', Cypress.env('testValueClassifications'));
});
});

View File

@ -0,0 +1,33 @@
context('TASKANA Login', () => {
if (Cypress.env('isLocal')) {
it('should not be run because its local development', () => {
cy.log('Local development - No need for testing login functionality');
expect(true).to.be.true;
});
} else {
it('should redirect to login when not logged in yet', () => {
cy.visit(Cypress.env('baseUrl') + '/taskana/workplace');
cy.location().should((location) => {
expect(location.href).to.eq(Cypress.env('baseUrl') + '/login');
});
});
it('should login via taskana login page', () => {
cy.visit(Cypress.env('baseUrl') + '/login');
cy.get('#username').type('admin').should('have.value', 'admin');
cy.get('#password').type('admin').should('have.value', 'admin');
cy.get('#login-submit').click();
cy.reload();
cy.wait(Cypress.env('pageReload'));
cy.location().should((location) => {
expect(location.href).to.eq(Cypress.env('baseUrl') + '/#/taskana/workplace/tasks');
});
});
}
});

View File

@ -0,0 +1,63 @@
context('TASKANA Monitor', () => {
beforeEach(() => cy.loginAs('admin'));
it('should visit taskana tasks monitor page', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('monitorUrl'));
cy.location().should((location) => {
expect(location.href).to.eq(Cypress.env('appUrl') + Cypress.env('monitorUrl'));
});
cy.get('li.active').find('> a').should('have.text', 'Tasks');
cy.get('.col-xs-12 > .chartjs-render-monitor').should('be.visible');
});
it('should visit taskana workbaskets monitor page', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('monitorUrl'));
cy.location().should((location) => {
expect(location.href).to.eq(Cypress.env('appUrl') + Cypress.env('monitorUrl'));
});
cy.get('.nav a').contains('Workbaskets').click();
cy.get('li.active').find('> a').should('have.text', 'Workbaskets');
cy.get('.panel > .panel-body').should('be.visible');
cy.get('.row > .col-xs-12 > > .chartjs-render-monitor').should('be.visible');
});
it('should visit taskana classifications monitor page', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('monitorUrl'));
cy.location().should((location) => {
expect(location.href).to.eq(Cypress.env('appUrl') + Cypress.env('monitorUrl'));
});
cy.get('.nav a').contains('Classifications').click();
cy.get('li.active').find('> a').should('have.text', 'Classifications');
cy.get('.panel > .panel-body').should('be.visible');
cy.get('.panel-body > .row > .col-xs-12 > [style="display: block;"] > .chartjs-render-monitor').should(
'be.visible'
);
});
it('should visit taskana timestamp monitor page', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('monitorUrl'));
cy.location().should((location) => {
expect(location.href).to.eq(Cypress.env('appUrl') + Cypress.env('monitorUrl'));
});
cy.get('.nav a').contains('Timestamp').click();
cy.get('li.active').find('> a').should('have.text', 'Timestamp');
cy.get('.panel > .panel-body').should('be.visible');
cy.get(
'.panel > .panel-body > taskana-monitor-report-table > .report > .table-header > .table-row > .table-cell--justify'
).should('be.visible');
});
});

View File

@ -0,0 +1,119 @@
context('TASKANA Workbaskets', () => {
beforeEach(() => cy.loginAs('admin'));
it('should be able to see all Workbaskets', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('adminUrl') + '/workbaskets');
cy.location().should((location) => {
expect(location.href).to.eq(Cypress.env('appUrl') + Cypress.env('adminUrl') + '/workbaskets');
});
// should contain #wb-list-container
});
it('should be able to filter workbaskets via owner', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('adminUrl') + '/workbaskets').then(() =>
cy.get('#collapsedMenufilterWb').click()
);
cy.get('[placeholder="Filter owner"]')
.type('owner0815')
.type('{enter}')
.then(() => {
// Length equal to 2 because the empty starting element of the list, only one ListEntry with values added
cy.get('#wb-list-container').find('.list-group-item').should('have.length', 2);
});
});
it('should be possible to edit workbasket information custom 1 to 4', () => {
cy.visitTestWorkbasket();
cy.wrap([1, 2, 4]).each((index) => {
cy.get('#wb-custom-' + index)
.clear()
.type(Cypress.env('testValueWorkbaskets'));
cy.saveWorkbaskets();
cy.reloadPageWithWait();
cy.get('#wb-custom-' + index).should('have.value', Cypress.env('testValueWorkbaskets'));
});
});
it('should be possible to edit workbasket information OrgLevel 1 to 4', () => {
cy.visitTestWorkbasket();
cy.wrap([1, 2, 3, 4]).each((index) => {
cy.get('#wb-org-level-' + index)
.clear()
.type(Cypress.env('testValueWorkbaskets'));
cy.saveWorkbaskets();
cy.reloadPageWithWait();
cy.get('#wb-org-level-' + index).should('have.value', Cypress.env('testValueWorkbaskets'));
});
});
it('should be possible to edit workbasket description', () => {
cy.visitTestWorkbasket();
cy.get('#wb-description')
.clear()
.type(Cypress.env('testValueWorkbaskets'))
.then(() => {
cy.saveWorkbaskets();
cy.reloadPageWithWait();
cy.get('#wb-description').should('have.value', Cypress.env('testValueWorkbaskets'));
});
});
it('should be possible to edit the Type of a workbasket', () => {
cy.visitTestWorkbasket();
cy.get('#dropdownMenu24').click();
cy.wait(Cypress.env('dropdownWait'));
cy.get('.col-xs-4 > .dropdown > .dropdown-menu > li > ').contains('Clearance').click();
cy.saveWorkbaskets();
cy.reloadPageWithWait();
// assure that its process now
cy.get('#dropdownMenu24').contains('Clearance').should('be.visible');
// change back to external
cy.get('#dropdownMenu24').click();
cy.wait(Cypress.env('dropdownWait'));
cy.get('.col-xs-4 > .dropdown > .dropdown-menu > li > ').contains('Group').should('be.visible').click();
cy.saveWorkbaskets();
});
it('should be possible to visit the access page', () => {
cy.visitTestWorkbasket();
cy.visitWorkbasketsAccessPage();
});
it('should be possible to add new access', () => {
cy.visitTestWorkbasket();
cy.visitWorkbasketsAccessPage();
cy.get('[title="Add new access"]')
.click()
.then(() => {
cy.get(
'.ng-invalid.ng-star-inserted > .text-align > > .custom-form-control > :nth-child(2) > .input-group > .form-control'
)
// .contains("Access id is required")
.type('teamlead-2');
cy.get('.input-group > .dropdown > .dropdown-menu >').click();
cy.saveWorkbaskets();
});
cy.reloadPageWithWait();
});
});

View File

@ -0,0 +1,17 @@
// ***********************************************************
// This example plugins/index.js can be used to load plugins
//
// You can change the location of this file or turn off loading
// the plugins file with the 'pluginsFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/plugins-guide
// ***********************************************************
// This function is called when a project is opened or re-opened (e.g. due to
// the project's config changing)
module.exports = (on, config) => {
// `on` is used to hook into various events Cypress emits
// `config` is the resolved Cypress config
};

View File

@ -0,0 +1,55 @@
// ***********************************************
// This example commands.js shows you how to
// create various custom commands and overwrite
// existing commands.
//
// For more comprehensive examples of custom
// commands please read more here:
// https://on.cypress.io/custom-commands
// ***********************************************
//
//
// -- This is a parent command --
// Cypress.Commands.add("login", (email, password) => { ... })
//
//
// -- This is a child command --
// Cypress.Commands.add("drag", { prevSubject: 'element'}, (subject, options) => { ... })
//
//
// -- This is a dual command --
// Cypress.Commands.add("dismiss", { prevSubject: 'optional'}, (subject, options) => { ... })
//
//
// -- This will overwrite an existing command --
// Cypress.Commands.overwrite("visit", (originalFn, url, options) => { ... })
Cypress.Commands.add('visitWorkbasketsAccessPage', () => {
cy.get('.nav a').contains('Access').click();
});
Cypress.Commands.add('saveWorkbaskets', () => {
cy.get('.tab-pane.active > > .panel>.panel-heading>.pull-right > .btn-primary').click();
});
Cypress.Commands.add('visitTestWorkbasket', () => {
cy.visit(Cypress.env('appUrl') + Cypress.env('adminUrl') + '/workbaskets');
cy.contains(Cypress.env('testValueWorkbasketSelectionName')).click();
});
Cypress.Commands.add('reloadPageWithWait', () => {
cy.reload();
cy.wait(Cypress.env('pageReload'));
});
Cypress.Commands.add('loginAs', (username) => {
return cy.request({
method: 'POST',
url: Cypress.env('baseUrl') + '/login',
form: true,
body: {
username,
password: username
}
});
});

View File

@ -0,0 +1,20 @@
// ***********************************************************
// This example support/index.js is processed and
// loaded automatically before your test files.
//
// This is a great place to put global configuration and
// behavior that modifies Cypress.
//
// You can change the location of this file or turn off
// automatically serving support files with the
// 'supportFile' configuration option.
//
// You can read more here:
// https://on.cypress.io/configuration
// ***********************************************************
// Import commands.js using ES2015 syntax:
import "./commands";
// Alternatively you can use CommonJS syntax:
// require('./commands')

1442
web/package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -13,7 +13,9 @@
"lint": "eslint --ext .ts src",
"lint:fix": "eslint --ext .ts src --fix",
"format": "prettier --write \"**/*.{js,ts,css,scss,md,json,yml}\"",
"format:html": "prettier --write \"**/*.{html,}\""
"format:html": "prettier --write \"**/*.{html,}\"",
"e2e": "cypress install && cypress run",
"e2e:open": "cypress install && cypress open"
},
"private": true,
"dependencies": {
@ -56,6 +58,8 @@
"@typescript-eslint/eslint-plugin-tslint": "2.15.0",
"@typescript-eslint/parser": "2.15.0",
"compression-webpack-plugin": "4.0.0",
"cypress": "^3.8.3",
"cypress-intellij-reporter": "0.0.4",
"eslint": "6.8.0",
"eslint-config-prettier": "6.11.0",
"eslint-plugin-import": "2.22.0",