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:
parent
64701e785c
commit
9b65838a79
|
|
@ -52,8 +52,8 @@ testem.log
|
||||||
/typings
|
/typings
|
||||||
|
|
||||||
# e2e
|
# e2e
|
||||||
e2e/*.js
|
/web/cypress/screenshots/
|
||||||
e2e/*.map
|
/web/cypress/videos/
|
||||||
|
|
||||||
# System Files
|
# System Files
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
|
||||||
|
|
@ -50,8 +50,7 @@ before_cache: rm -rf "$HOME/.m2/repository/pro/taskana"
|
||||||
jobs:
|
jobs:
|
||||||
include:
|
include:
|
||||||
- stage: Test
|
- stage: Test
|
||||||
language: node_js
|
before_script: nvm install $NODE_VERSION
|
||||||
node_js: $NODE_VERSION
|
|
||||||
install: skip
|
install: skip
|
||||||
env: DB=WEB
|
env: DB=WEB
|
||||||
script: ci/test.sh "$DB"
|
script: ci/test.sh "$DB"
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
14
ci/test.sh
14
ci/test.sh
|
|
@ -69,9 +69,19 @@ function main() {
|
||||||
;;
|
;;
|
||||||
WEB)
|
WEB)
|
||||||
set -x
|
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
|
esac
|
||||||
}
|
}
|
||||||
|
|
||||||
main "$@"
|
main "$@"
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
|
||||||
cn: Elena Eifrig
|
cn: Elena Eifrig
|
||||||
userPassword: user-1-2
|
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
|
# Users KSC 2
|
||||||
########################
|
########################
|
||||||
|
|
@ -161,6 +174,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
|
||||||
cn: Tim Schläfrig
|
cn: Tim Schläfrig
|
||||||
userPassword: user-2-1
|
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
|
# Users Domäne B
|
||||||
########################
|
########################
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
|
||||||
cn: Elena Eifrig
|
cn: Elena Eifrig
|
||||||
userPassword: user-1-2
|
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
|
# Users KSC 2
|
||||||
########################
|
########################
|
||||||
|
|
@ -161,6 +174,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
|
||||||
cn: Tim Schläfrig
|
cn: Tim Schläfrig
|
||||||
userPassword: user-2-1
|
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
|
# Users Domäne B
|
||||||
########################
|
########################
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
|
||||||
cn: Elena Eifrig
|
cn: Elena Eifrig
|
||||||
userPassword: user-1-2
|
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
|
# Users KSC 2
|
||||||
########################
|
########################
|
||||||
|
|
@ -161,6 +174,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
|
||||||
cn: Tim Schläfrig
|
cn: Tim Schläfrig
|
||||||
userPassword: user-2-1
|
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
|
# Users Domäne B
|
||||||
########################
|
########################
|
||||||
|
|
|
||||||
|
|
@ -119,6 +119,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 1
|
||||||
cn: Elena Eifrig
|
cn: Elena Eifrig
|
||||||
userPassword: user-1-2
|
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
|
# Users KSC 2
|
||||||
########################
|
########################
|
||||||
|
|
@ -161,6 +174,19 @@ ou: Organisationseinheit/Organisationseinheit KSC/Organisationseinheit KSC 2
|
||||||
cn:: VGltIFNjaGzDpGZyaWc=
|
cn:: VGltIFNjaGzDpGZyaWc=
|
||||||
userPassword: user-2-1
|
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
|
# Users Domäne B
|
||||||
########################
|
########################
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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) => { ... })
|
||||||
|
|
@ -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')
|
||||||
|
|
@ -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"
|
||||||
|
}
|
||||||
|
|
@ -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'));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
@ -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');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
@ -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');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
@ -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();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
@ -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
|
||||||
|
};
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
@ -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')
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -13,7 +13,9 @@
|
||||||
"lint": "eslint --ext .ts src",
|
"lint": "eslint --ext .ts src",
|
||||||
"lint:fix": "eslint --ext .ts src --fix",
|
"lint:fix": "eslint --ext .ts src --fix",
|
||||||
"format": "prettier --write \"**/*.{js,ts,css,scss,md,json,yml}\"",
|
"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,
|
"private": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
|
|
@ -56,6 +58,8 @@
|
||||||
"@typescript-eslint/eslint-plugin-tslint": "2.15.0",
|
"@typescript-eslint/eslint-plugin-tslint": "2.15.0",
|
||||||
"@typescript-eslint/parser": "2.15.0",
|
"@typescript-eslint/parser": "2.15.0",
|
||||||
"compression-webpack-plugin": "4.0.0",
|
"compression-webpack-plugin": "4.0.0",
|
||||||
|
"cypress": "^3.8.3",
|
||||||
|
"cypress-intellij-reporter": "0.0.4",
|
||||||
"eslint": "6.8.0",
|
"eslint": "6.8.0",
|
||||||
"eslint-config-prettier": "6.11.0",
|
"eslint-config-prettier": "6.11.0",
|
||||||
"eslint-plugin-import": "2.22.0",
|
"eslint-plugin-import": "2.22.0",
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue