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
|
||||
|
||||
# e2e
|
||||
e2e/*.js
|
||||
e2e/*.map
|
||||
/web/cypress/screenshots/
|
||||
/web/cypress/videos/
|
||||
|
||||
# System Files
|
||||
.DS_Store
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
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 "$@"
|
||||
|
|
|
@ -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
|
||||
########################
|
||||
|
|
|
@ -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
|
||||
########################
|
||||
|
|
|
@ -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
|
||||
########################
|
||||
|
|
|
@ -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
|
||||
########################
|
||||
|
|
|
@ -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: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",
|
||||
|
|
Loading…
Reference in New Issue