From 9e425528999bd5759ff925cf97bd7193ccb92b70 Mon Sep 17 00:00:00 2001 From: Gerard Mendoza Date: Wed, 5 Aug 2020 09:56:53 +0800 Subject: [PATCH] commit for training --- README.md | 28 +- e2e/data/test.data.ts | 23 + e2e/features/sampleCRUD.feature | 35 ++ e2e/features/security.feature | 18 + e2e/features/support/parameterTypes.ts | 30 + e2e/hooks/generic.hooks.ts | 7 + e2e/models/enums/pages.enum.ts | 4 + e2e/po/dashboard.po.ts | 81 +++ e2e/po/dashboard_form.po.ts | 65 +++ e2e/po/dashboard_msgAlert.po.ts | 8 + e2e/po/security.po.ts | 44 ++ e2e/protractor.conf.js | 32 -- .../samplecrud.definitions.ts | 63 ++ e2e/step_definitions/security.definitions.ts | 42 ++ e2e/{tsconfig.json => tsconfig.e2e.json} | 0 e2e/utils/helper.utils.ts | 52 ++ package-lock.json | 536 ++++++++++++++++-- package.json | 4 + protractor.conf.js | 60 ++ reports/report.json | 377 ++++++++++++ 20 files changed, 1407 insertions(+), 102 deletions(-) create mode 100644 e2e/data/test.data.ts create mode 100644 e2e/features/sampleCRUD.feature create mode 100644 e2e/features/security.feature create mode 100644 e2e/features/support/parameterTypes.ts create mode 100644 e2e/hooks/generic.hooks.ts create mode 100644 e2e/models/enums/pages.enum.ts create mode 100644 e2e/po/dashboard.po.ts create mode 100644 e2e/po/dashboard_form.po.ts create mode 100644 e2e/po/dashboard_msgAlert.po.ts create mode 100644 e2e/po/security.po.ts delete mode 100644 e2e/protractor.conf.js create mode 100644 e2e/step_definitions/samplecrud.definitions.ts create mode 100644 e2e/step_definitions/security.definitions.ts rename e2e/{tsconfig.json => tsconfig.e2e.json} (100%) create mode 100644 e2e/utils/helper.utils.ts create mode 100644 protractor.conf.js create mode 100644 reports/report.json diff --git a/README.md b/README.md index e23bc40..70b0665 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,7 @@ -# ProjectAssessment +Install first all the dependencies using the command `npm i` -This project was generated with [Angular CLI](https://github.com/angular/angular-cli) version 8.2.2. +Update webdriver if necessary by `webdriver-update` -## Development server +After downloading and updating the resources, run the server by `ng server` -Run `ng serve` for a dev server. Navigate to `http://localhost:4200/`. The app will automatically reload if you change any of the source files. - -## Code scaffolding - -Run `ng generate component component-name` to generate a new component. You can also use `ng generate directive|pipe|service|class|guard|interface|enum|module`. - -## Build - -Run `ng build` to build the project. The build artifacts will be stored in the `dist/` directory. Use the `--prod` flag for a production build. - -## Running unit tests - -Run `ng test` to execute the unit tests via [Karma](https://karma-runner.github.io). - -## Running end-to-end tests - -Run `ng e2e` to execute the end-to-end tests via [Protractor](http://www.protractortest.org/). - -## Further help - -To get more help on the Angular CLI use `ng help` or go check out the [Angular CLI README](https://github.com/angular/angular-cli/blob/master/README.md). +Keep the server running and run the test cases using `protractor` \ No newline at end of file diff --git a/e2e/data/test.data.ts b/e2e/data/test.data.ts new file mode 100644 index 0000000..aad6a1d --- /dev/null +++ b/e2e/data/test.data.ts @@ -0,0 +1,23 @@ +module.exports = { + "customerInfo":{ + "firstName": "Jane", + "lastName": "Doe", + "country": "PH", + "nationality": "Filipino", + "company": "IT", + "designation": "CTO", + "workExperience": "5yrs", + "dataSource": "Google" + }, + + "updateCustomerInfo":{ + "firstName": "John", + "lastName": "Doe", + "country": "PH", + "nationality": "Filipino", + "company": "IT", + "designation": "CTO", + "workExperience": "10", + "dataSource": "Twitter" + } +} \ No newline at end of file diff --git a/e2e/features/sampleCRUD.feature b/e2e/features/sampleCRUD.feature new file mode 100644 index 0000000..d020c68 --- /dev/null +++ b/e2e/features/sampleCRUD.feature @@ -0,0 +1,35 @@ +Feature: CRUD Sample application + As an Admin user, I want to create, update and delete an Employee on my system + + @Login + Scenario: Login + Given I am on the "login" page + When I "login" as "Admin" + Then I should see the "dashboard" page + + @Create + Scenario: Create a new employee + Given I am on the "dashboard" page + When I "create" an employee entry + Then I should see the "add" success message + And I should see it "added" on the employee list table + + @Read + Scenario: Read an employee details + Given I am on the "dashboard" page + When I "view" an employee entry + Then I should see the employee entry details on the list + + @Update + Scenario: Update an employee + Given I am on the "dashboard" page + When I "update" an employee entry + Then I should see the "update" success message + And I should see it "updated" on the employee list table + + @Delete + Scenario: Update an employee + Given I am on the "dashboard" page + When I "delete" an employee entry + Then I should see the "update" success message + And I should see it "deleted" on the employee list table \ No newline at end of file diff --git a/e2e/features/security.feature b/e2e/features/security.feature new file mode 100644 index 0000000..936047e --- /dev/null +++ b/e2e/features/security.feature @@ -0,0 +1,18 @@ +Feature: Security of the application + As a registered user, I want to be able to access the application + As an unregistered user, I should not be able to access the application + + Scenario Outline: Login as + Given I am on the "login" page + When I "login" as "" + Then I should see the "dashboard" page + + Examples: + | role | + | Admin | + | Employee | + + Scenario: Logout + Given I am on the "dashboard" page + When I "logout" + Then I should see the "login" page \ No newline at end of file diff --git a/e2e/features/support/parameterTypes.ts b/e2e/features/support/parameterTypes.ts new file mode 100644 index 0000000..a43f63a --- /dev/null +++ b/e2e/features/support/parameterTypes.ts @@ -0,0 +1,30 @@ +// import { defineParameterType } from "cucumber"; +// import { enumPages } from "../../models/enums/pages.enum"; +// import { securityPage } from '../../po/security.po'; +// import { dashBoardPage } from '../../po/dashboard.po'; + +// export class ParameterUtil { +// static toOrFormat(enumToTransform: any) { +// const enumArray = []; +// Object.keys(enumToTransform).forEach(key => { +// enumArray.push(enumPages[key]); +// }); +// const regexp = new RegExp(`(${enumArray.join('|')})`) +// return regexp; +// } +// } + +// defineParameterType({ +// regexp: ParameterUtil.toOrFormat(enumPages), +// transformer: input => { +// let currentPage; + +// if (input === 'login') { +// currentPage = new securityPage(); +// } else { +// currentPage = new dashBoardPage(); +// } +// return currentPage; +// }, +// name: 'page' +// }); \ No newline at end of file diff --git a/e2e/hooks/generic.hooks.ts b/e2e/hooks/generic.hooks.ts new file mode 100644 index 0000000..20d9f4a --- /dev/null +++ b/e2e/hooks/generic.hooks.ts @@ -0,0 +1,7 @@ +import { BeforeAll, setDefaultTimeout } from 'cucumber'; +import { browser } from "protractor"; + +BeforeAll(async () => { + browser.waitForAngularEnabled(false); + setDefaultTimeout(60 * 10000); +}); \ No newline at end of file diff --git a/e2e/models/enums/pages.enum.ts b/e2e/models/enums/pages.enum.ts new file mode 100644 index 0000000..f949dd2 --- /dev/null +++ b/e2e/models/enums/pages.enum.ts @@ -0,0 +1,4 @@ +export enum enumPages { + LOGIN = 'login', + DASHBOARD = 'dashboard' +} \ No newline at end of file diff --git a/e2e/po/dashboard.po.ts b/e2e/po/dashboard.po.ts new file mode 100644 index 0000000..dd8b8ac --- /dev/null +++ b/e2e/po/dashboard.po.ts @@ -0,0 +1,81 @@ +import { browser, element, by, protractor } from 'protractor'; +import { dashboard_fillForm } from './dashboard_form.po'; +import { utils } from '../utils/helper.utils'; + +const form = new dashboard_fillForm(); + +export class dashBoardPage { + + private url = "http://localhost:4200/dashboard"; + private componentName = "app-dashboard"; + private testData = require("../data/test.data"); + + //get objects + getURL(){ return this.url; } + + get logoutButton(){ return element(by.css(`${this.componentName} a[href='/login']`)); } + + get newEmployeeBtn(){ return element(by.xpath('//span[contains(text(),"New Employee")]')); } + + get nextPageBtn(){ return element(by.css(`${this.componentName} span[class="ui-paginator-icon pi pi-caret-right"]`)); } + + + //Methods + navigate(){ browser.get(this.url); } + + async getwelcomeMessage(){ return await element(by.css(`${this.componentName} h2`)).getText(); } + + async logout(){ await this.logoutButton.click(); } + + async createNewEmployee(){ + await this.newEmployeeBtn.click(); + await form.fillEmployeeDetails("add"); + } + + async nextPage(){ + await this.nextPageBtn.click(); + } + + async verifyEmployee(action: string){ + if(action === 'add' || action === 'view'){ + await utils.verifyTableElements("verify", this.testData.customerInfo.firstName + " "+this.testData.customerInfo.lastName); + } else if(action === 'verify') { + await utils.verifyTableElements("verify", this.testData.updateCustomerInfo.firstName + " "+this.testData.updateCustomerInfo.lastName); + } + } + + async updateEmployee(){ + //code for listing all TD + // const rows = await element.all(by.tagName("tr")); + // for (let i = 0; i < rows.length; i++) { + // //console.log("DEBUG: ", await rows[i].getText()); + // const rowText = await rows[i].getText(); + // if(rowText.includes(this.testData.customerInfo.firstName + " "+this.testData.customerInfo.lastName)){ + // await rows[i].click(); + // } + // } + + await utils.verifyTableElements("click", this.testData.customerInfo.firstName + " "+this.testData.customerInfo.lastName); + + await browser.sleep(2000); + await form.fillEmployeeDetails("update"); + } + + async deleteEmployee(){ + //code for listing all TD + // const rows = await element.all(by.tagName("tr")); + + // for (let i = 0; i < rows.length; i++) { + // //console.log("DEBUG: ", await rows[i].getText()); + // const rowText = await rows[i].getText(); + // if(rowText.includes(this.testData.updateCustomerInfo.firstName + " "+this.testData.updateCustomerInfo.lastName)){ + // await rows[i].$$('button').click(); + // } + // } + + await utils.verifyTableElements("delete", this.testData.updateCustomerInfo.firstName + " "+this.testData.updateCustomerInfo.lastName); + + utils.verifyAndCloseAlert("Are you sure you want to remove "+this.testData.updateCustomerInfo.firstName + " "+this.testData.updateCustomerInfo.lastName+" from the list of employees?"); + await browser.sleep(2000); + } +} \ No newline at end of file diff --git a/e2e/po/dashboard_form.po.ts b/e2e/po/dashboard_form.po.ts new file mode 100644 index 0000000..2e6637d --- /dev/null +++ b/e2e/po/dashboard_form.po.ts @@ -0,0 +1,65 @@ +import { element, by, browser, protractor } from 'protractor'; +import { utils } from '../utils/helper.utils'; + +export class dashboard_fillForm { + + private formName = "form"; + private testData = require("../data/test.data"); + + //GET ALL THE FIELDS + get firstNameField(){ return element(by.tagName(`${this.formName} input[ng-reflect-name="firstName"]`)); } + + get lastNameField(){ return element(by.tagName(`${this.formName} input[ng-reflect-name="lastName"]`)); } + + get countryField(){ return element(by.tagName(`${this.formName} input[ng-reflect-name="country"]`)); } + + get nationalityField(){ return element(by.tagName(`${this.formName} input[ng-reflect-name="nationality"]`)); } + + get companyField(){ return element(by.tagName(`${this.formName} input[ng-reflect-name="company"]`)); } + + get designationField(){ return element(by.tagName(`${this.formName} input[ng-reflect-name="designation"]`)); } + + get workExpField(){ return element(by.tagName(`${this.formName} input[ng-reflect-name="workExp"]`)); } + + get dataSrc(){return element(by.tagName(`${this.formName} label`)); } + + get addButton(){ return element(by.tagName(`${this.formName} button[ng-reflect-label="Add"]`)); } + + get updateButton(){ return element(by.tagName(`${this.formName} button[ng-reflect-label="Update"]`)); } + + get dataSrcList(){ + return element.all(by.xpath("//li[@role='option']")); + } + + //METHODS OR ACTION + async fillEmployeeDetails(action: string){ + let jsonAction; + + if(action == 'add'){ + jsonAction = this.testData.customerInfo; + } else { + jsonAction = this.testData.updateCustomerInfo; + } + + utils.type_(this.firstNameField, jsonAction.firstName); + utils.type_(this.lastNameField, jsonAction.lastName); + utils.type_(this.countryField, jsonAction.country); + utils.type_(this.nationalityField, jsonAction.nationality); + utils.type_(this.companyField, jsonAction.company); + utils.type_(this.designationField, jsonAction.designation); + utils.type_(this.workExpField, jsonAction.workExperience); + await this.dataSrc.click(); + + const dpdElement = element.all(by.xpath("//li[@role='option']")); + const dpdItems = await dpdElement.getText(); + //console.log('DEBUG: ', dpdItems); + + dpdElement.get(dpdItems.indexOf(jsonAction.dataSource)).click(); + + if(action == 'add'){ + await this.addButton.click(); + } else { + await this.updateButton.click(); + } + } +} \ No newline at end of file diff --git a/e2e/po/dashboard_msgAlert.po.ts b/e2e/po/dashboard_msgAlert.po.ts new file mode 100644 index 0000000..321df2c --- /dev/null +++ b/e2e/po/dashboard_msgAlert.po.ts @@ -0,0 +1,8 @@ +import { element, by } from 'protractor'; + +export class dashboard_messageAlert { + + async getSuccessMessage(){ + return element(by.id("success-message")).getText(); + } +} \ No newline at end of file diff --git a/e2e/po/security.po.ts b/e2e/po/security.po.ts new file mode 100644 index 0000000..74dfe29 --- /dev/null +++ b/e2e/po/security.po.ts @@ -0,0 +1,44 @@ +import { by, element, browser } from 'protractor' + +export class securityPage { + // elements within the page + // action that you could do to/within the page + // get properties of the page + + private url = "http://localhost:4200/login" + private componentName = "app-login"; + + getURL(){ + return this.url; + } + + get loginHeader(){ + return element(by.css(`${this.componentName} span[class='ui-panel-title ng-tns-c2-6 ng-star-inserted']`)); + } + + get userNameField(){ + //Template Literals `` + return element(by.css(`${this.componentName} input[id='username-field']`)); //String interpolation + } + + get passwordField(){ + return element(by.css(`${this.componentName} input[id='password-field']`)); + } + + get logInButton(){ + return element(by.css(`${this.componentName} button[label='Login']`)); + } + + async navigate(){ + await browser.get(this.url); + } + + async login(role: string = "Employee"){ + const userCredentials = browser.params.users[role]; + + // input username and password then click button + await this.userNameField.sendKeys(userCredentials.username); + await this.passwordField.sendKeys(userCredentials.password); + await this.logInButton.click(); + } +} \ No newline at end of file diff --git a/e2e/protractor.conf.js b/e2e/protractor.conf.js deleted file mode 100644 index 73e4e68..0000000 --- a/e2e/protractor.conf.js +++ /dev/null @@ -1,32 +0,0 @@ -// @ts-check -// Protractor configuration file, see link for more information -// https://github.com/angular/protractor/blob/master/lib/config.ts - -const { SpecReporter } = require('jasmine-spec-reporter'); - -/** - * @type { import("protractor").Config } - */ -exports.config = { - allScriptsTimeout: 11000, - specs: [ - './src/**/*.e2e-spec.ts' - ], - capabilities: { - 'browserName': 'chrome' - }, - directConnect: true, - baseUrl: 'http://localhost:4200/', - framework: 'jasmine', - jasmineNodeOpts: { - showColors: true, - defaultTimeoutInterval: 30000, - print: function() {} - }, - onPrepare() { - require('ts-node').register({ - project: require('path').join(__dirname, './tsconfig.json') - }); - jasmine.getEnv().addReporter(new SpecReporter({ spec: { displayStacktrace: true } })); - } -}; \ No newline at end of file diff --git a/e2e/step_definitions/samplecrud.definitions.ts b/e2e/step_definitions/samplecrud.definitions.ts new file mode 100644 index 0000000..49d3640 --- /dev/null +++ b/e2e/step_definitions/samplecrud.definitions.ts @@ -0,0 +1,63 @@ +import { Given, When, Then } from 'cucumber'; +import { securityPage } from '../po/security.po'; +import { browser } from 'protractor'; +import { dashBoardPage } from '../po/dashboard.po'; +import { dashboard_messageAlert } from '../po/dashboard_msgAlert.po'; +import { currentId } from 'async_hooks'; + +const chai = require("chai").use(require("chai-as-promised")); +const expect = chai.expect; + +When('I {string} an employee entry', async function (action: string) { + // Write code here that turns the phrase above into concrete actions + this.currentPage = new dashBoardPage(); + switch(action){ + case 'create': + await this.currentPage.createNewEmployee(); + break; + case 'view': + //screenshot library if possible + break; + case 'update': + await this.currentPage.updateEmployee(); + break; + case 'delete': + await this.currentPage.deleteEmployee(); + break; + default: + throw Error("Invalid action"); + } +}); + +Then('I should see the {string} success message', async function (notif: string) { + const dboard_mesg = new dashboard_messageAlert(); + switch(notif){ + case 'add': + expect("Success: Data has been added!").to.equal(await dboard_mesg.getSuccessMessage()); + break; + case 'update': + expect("Success: Data has been updated!").to.equal(await dboard_mesg.getSuccessMessage()); + break; + } +}) + +Then('I should see the employee entry details on the list', async function () { + this.currentPage = new dashBoardPage(); + await this.currentPage.verifyEmployee("view"); +}) + +Then('I should see it {string} on the employee list table', async function (pastAction: string) { + this.currentPage = new dashBoardPage(); + await this.currentPage.nextPage(); + + switch(pastAction){ + case 'added': + await this.currentPage.verifyEmployee("add"); + break; + case 'updated': + await this.currentPage.verifyEmployee("verify"); + break; + case 'deleted': + break; + } +}) \ No newline at end of file diff --git a/e2e/step_definitions/security.definitions.ts b/e2e/step_definitions/security.definitions.ts new file mode 100644 index 0000000..1445918 --- /dev/null +++ b/e2e/step_definitions/security.definitions.ts @@ -0,0 +1,42 @@ +import { Given, When, Then } from 'cucumber'; +import { securityPage } from '../po/security.po'; +import { browser } from 'protractor'; +import { dashBoardPage } from '../po/dashboard.po'; + +const chai = require("chai").use(require("chai-as-promised")); +const expect = chai.expect; + +Given('I am on the {string} page', async function (page: string) { + if (page === 'login'){ + this.currentPage = new securityPage(); //Using World + } else { + this.currentPage = new dashBoardPage(); //Using World + } + + if (await browser.getCurrentUrl() !== this.currentPage.getURL()) { + await this.currentPage.navigate(); + } +}); + +When('I {string} as {string}', async function (action: string, role: string) { + // Write code here that turns the phrase above into concrete actions + if (action === 'login'){ + await this.currentPage.login(role); + } else { + await this.currentPage.logout(); + } +}); + +When('I {string}', async function (action: string) { + await this.currentPage.logout(); +}); + +Then('I should see the {string} page', async function (page: string) { + if (page === 'dashboard'){ + const dashboard = new dashBoardPage(); + expect("Welcome, Asd").to.equal(await dashboard.getwelcomeMessage()); + } else { + const secPage = new securityPage(); + expect(await secPage.loginHeader.getText()).to.be.equal("Please Login"); + } +}); \ No newline at end of file diff --git a/e2e/tsconfig.json b/e2e/tsconfig.e2e.json similarity index 100% rename from e2e/tsconfig.json rename to e2e/tsconfig.e2e.json diff --git a/e2e/utils/helper.utils.ts b/e2e/utils/helper.utils.ts new file mode 100644 index 0000000..6e6b850 --- /dev/null +++ b/e2e/utils/helper.utils.ts @@ -0,0 +1,52 @@ +import { browser, protractor, element, by, $$, $ } from 'protractor'; + +const chai = require("chai").use(require("chai-as-promised")); +const expect = chai.expect; + +export class utils { + static async verifyAndCloseAlert(textToVerify: String){ //function for dismisssing or confirming an alert + //browser.wait(protractor.ExpectedConditions.alertIsPresent(), 4000, "Alert not found!"); //wait for the expected condition, wait period, if the condition id not expected + + let alert = await browser.switchTo().alert(); // a var for to switch to alert + let alertText = await alert.getText(); // a var to get all the alert text + + expect(alertText).to.equal(textToVerify); //verify or assert alert + alert.accept(); //confirm alert + } + + static type_(locator: any, textToType: string){ + let ec = protractor.ExpectedConditions; + browser.wait(ec.visibilityOf(locator)); + + locator.sendKeys(protractor.Key.chord(protractor.Key.CONTROL, "a")); + locator.sendKeys(textToType); + } + + static async verifyTableElements(action: string, dataToVerify: any){ + //code for listing all TD + const rows = await element.all(by.tagName("tr")); + for (let i = 0; i < rows.length; i++) { + //console.log("DEBUG: ", await rows[i].getText()); + const rowText = await rows[i].getText(); + if(rowText.includes(dataToVerify)){ + switch(action){ + case 'click': + await rows[i].click(); + //console.log('Element was clicked!'); + break; + case 'verify': + //console.log('DEBUG:', rowText); + expect(rowText).to.contain(dataToVerify); //verify or assert alert + //console.log('Element was verified!'); + break; + case 'delete': + await rows[i].$$('button').click(); + //console.log('Element was deleted!'); + break; + default: + throw Error('ERROR!!!'); + } + } + } + } + } \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 2c33e83..a4f105f 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1127,6 +1127,22 @@ "integrity": "sha512-E5BN68cqR7dhKan1SfqgPGhQ178bkVKpXTPEXnFJBrEt8/DKRZlybmy+IgYLTeN7tp1R5Ccmbm2rBk17sHYU3g==", "dev": true }, + "@babel/runtime-corejs3": { + "version": "7.10.5", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.10.5.tgz", + "integrity": "sha512-RMafpmrNB5E/bwdSphLr8a8++9TosnyJp98RZzI6VOx2R2CCMpsXXXRvmI700O9oEKpXdZat6oEK68/F0zjd4A==", + "requires": { + "core-js-pure": "^3.0.0", + "regenerator-runtime": "^0.13.4" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.13.7", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.7.tgz", + "integrity": "sha512-a54FxoJDIr27pgf7IgeQGxmqUNYrcV338lf/6gH456HZ/PhX+5BcwHXG9ajESmwe6WRO0tAzRUrRmNONWgkrew==" + } + } + }, "@babel/template": { "version": "7.4.4", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz", @@ -1630,6 +1646,11 @@ "color-convert": "^1.9.0" } }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=" + }, "anymatch": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.0.3.tgz", @@ -1793,8 +1814,29 @@ "assert-plus": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", - "dev": true + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + }, + "assertion-error": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", + "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==" + }, + "assertion-error-formatter": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/assertion-error-formatter/-/assertion-error-formatter-3.0.0.tgz", + "integrity": "sha512-6YyAVLrEze0kQ7CmJfUgrLHb+Y7XghmL2Ie7ijVa2Y9ynP3LV+VDiwFk62Dn0qtqbmY0BT0ss6p1xxpiF2PYbQ==", + "requires": { + "diff": "^4.0.1", + "pad-right": "^0.2.2", + "repeat-string": "^1.6.1" + }, + "dependencies": { + "diff": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", + "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==" + } + } }, "assign-symbols": { "version": "1.0.0", @@ -2023,8 +2065,7 @@ "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", - "dev": true + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" }, "base": { "version": "0.11.2", @@ -2114,6 +2155,11 @@ "tweetnacl": "^0.14.3" } }, + "becke-ch--regex--s0-0-v1--base--pl--lib": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/becke-ch--regex--s0-0-v1--base--pl--lib/-/becke-ch--regex--s0-0-v1--base--pl--lib-1.4.0.tgz", + "integrity": "sha1-Qpzuu/pffpNueNc/vcfacWKyDiA=" + }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -2153,8 +2199,7 @@ "bluebird": { "version": "3.5.5", "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.5.tgz", - "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==", - "dev": true + "integrity": "sha512-5am6HnnfN+urzt4yfg7IgTbotDjIT/u8AJpEt0sIU9FtXfVeezXAPKswrG+xKUCOYAINpSdgZVDU6QFh+cuH3w==" }, "bn.js": { "version": "4.11.8", @@ -2212,7 +2257,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -2492,6 +2536,27 @@ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", "dev": true }, + "chai": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", + "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", + "requires": { + "assertion-error": "^1.1.0", + "check-error": "^1.0.2", + "deep-eql": "^3.0.1", + "get-func-name": "^2.0.0", + "pathval": "^1.1.0", + "type-detect": "^4.0.5" + } + }, + "chai-as-promised": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chai-as-promised/-/chai-as-promised-7.1.1.tgz", + "integrity": "sha512-azL6xMoi+uxu6z4rhWQ1jbdUhOMhis2PvscD/xjLqNMkv3BPPp2JyyuTHOrf9BOosGpNQ11v6BKv/g57RXbiaA==", + "requires": { + "check-error": "^1.0.2" + } + }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", @@ -2509,6 +2574,11 @@ "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=" + }, "chokidar": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.0.2.tgz", @@ -2616,6 +2686,16 @@ "restore-cursor": "^2.0.0" } }, + "cli-table3": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.1.tgz", + "integrity": "sha512-7Qg2Jrep1S/+Q3EceiZtQcDPWxhAvBw+ERf1162v4sikJrvojMHFqXt8QIVha8UlH9rgU0BeWPytZ9/TzYqlUw==", + "requires": { + "colors": "^1.1.2", + "object-assign": "^4.1.0", + "string-width": "^2.1.1" + } + }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", @@ -2739,8 +2819,7 @@ "colors": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", - "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", - "dev": true + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=" }, "combined-stream": { "version": "1.0.8", @@ -2814,8 +2893,7 @@ "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", - "dev": true + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" }, "concat-stream": { "version": "1.6.2", @@ -2944,11 +3022,15 @@ "integrity": "sha512-YNZN8lt82XIMLnLirj9MhKDFZHalwzzrL9YLt6eb0T5D0EDl4IQ90IGkua8mHbnxNrkj1d8hbdizMc0Qmg1WnQ==", "dev": true }, + "core-js-pure": { + "version": "3.6.5", + "resolved": "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.6.5.tgz", + "integrity": "sha512-lacdXOimsiD0QyNf9BC/mxivNJ/ybBGJXQFKzRekp1WTHoVUWsUHEn+2T8GJAzzIhyOuXA+gOxCVN3l+5PLPUA==" + }, "core-util-is": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", - "dev": true + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" }, "cosmiconfig": { "version": "5.2.1", @@ -3071,6 +3153,86 @@ "integrity": "sha1-yBSQPkViM3GgR3tAEJqq++6t27Q=", "dev": true }, + "cucumber": { + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/cucumber/-/cucumber-6.0.5.tgz", + "integrity": "sha512-x+W9Fwk6TvcapQsYMxwFU5AsQJDOIJVGrPKmH15OC7jzb9/Dk7Hb0ZAyw4WcpaDcUDRc8bi2k2yJejDp5eTRlg==", + "requires": { + "assertion-error-formatter": "^3.0.0", + "bluebird": "^3.4.1", + "cli-table3": "^0.5.1", + "colors": "^1.1.2", + "commander": "^3.0.1", + "cucumber-expressions": "^8.1.0", + "cucumber-tag-expressions": "^2.0.2", + "duration": "^0.2.1", + "escape-string-regexp": "^2.0.0", + "figures": "^3.0.0", + "gherkin": "5.0.0", + "glob": "^7.1.3", + "indent-string": "^4.0.0", + "is-generator": "^1.0.2", + "is-stream": "^2.0.0", + "knuth-shuffle-seeded": "^1.0.6", + "lodash": "^4.17.14", + "mz": "^2.4.0", + "progress": "^2.0.0", + "resolve": "^1.3.3", + "serialize-error": "^4.1.0", + "stack-chain": "^2.0.0", + "stacktrace-js": "^2.0.0", + "string-argv": "^0.3.0", + "title-case": "^2.1.1", + "util-arity": "^1.0.2", + "verror": "^1.9.0" + }, + "dependencies": { + "commander": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/commander/-/commander-3.0.2.tgz", + "integrity": "sha512-Gar0ASD4BDyKC4hl4DwHqDrmvjoxWKZigVnAbn5H1owvm4CxCPdb0HQDehwNYMJpla5+M2tPmPARzhtYuwpHow==" + }, + "escape-string-regexp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", + "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==" + }, + "figures": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz", + "integrity": "sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==", + "requires": { + "escape-string-regexp": "^1.0.5" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + } + } + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==" + } + } + }, + "cucumber-expressions": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/cucumber-expressions/-/cucumber-expressions-8.3.0.tgz", + "integrity": "sha512-cP2ya0EiorwXBC7Ll7Cj7NELYbasNv9Ty42L4u7sso9KruWemWG1ZiTq4PMqir3SNDSrbykoqI5wZgMbLEDjLQ==", + "requires": { + "becke-ch--regex--s0-0-v1--base--pl--lib": "^1.4.0", + "xregexp": "^4.2.4" + } + }, + "cucumber-tag-expressions": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/cucumber-tag-expressions/-/cucumber-tag-expressions-2.0.3.tgz", + "integrity": "sha512-+x5j1IfZrBtbvYHuoUX0rl4nUGxaey6Do9sM0CABmZfDCcWXuuRm1fQeCaklIYQgOFHQ6xOHvDSdkMHHpni6tQ==" + }, "custom-event": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/custom-event/-/custom-event-1.0.1.tgz", @@ -3083,6 +3245,15 @@ "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=", "dev": true }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, "damerau-levenshtein": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.5.tgz", @@ -3137,6 +3308,14 @@ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", "dev": true }, + "deep-eql": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", + "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", + "requires": { + "type-detect": "^4.0.0" + } + }, "deep-equal": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.0.1.tgz", @@ -3396,6 +3575,15 @@ "stream-shift": "^1.0.0" } }, + "duration": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/duration/-/duration-0.2.2.tgz", + "integrity": "sha512-06kgtea+bGreF5eKYgI/36A6pLXggY7oR4p1pq4SmdFBn1ReOL5D8RhG64VrqfTTKNucqqtBAwEj8aB88mcqrg==", + "requires": { + "d": "1", + "es5-ext": "~0.10.46" + } + }, "ecc-jsbn": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", @@ -3590,6 +3778,14 @@ "is-arrayish": "^0.2.1" } }, + "error-stack-parser": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/error-stack-parser/-/error-stack-parser-2.0.6.tgz", + "integrity": "sha512-d51brTeqC+BHlwF0BhPtcYgF5nlzf9ZZ0ZIUQNZpc9ZB9qw5IJ2diTrBY9jlCJkTLITYPjmiX6OWCwH+fuyNgQ==", + "requires": { + "stackframe": "^1.1.1" + } + }, "es-abstract": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", @@ -3615,6 +3811,26 @@ "is-symbol": "^1.0.2" } }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, "es6-promise": { "version": "4.2.8", "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", @@ -3630,6 +3846,15 @@ "es6-promise": "^4.0.3" } }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -3824,6 +4049,21 @@ } } }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.0.0.tgz", + "integrity": "sha512-KBt58xCHry4Cejnc2ISQAF7QY+ORngsWfxezO68+12hKV6lQY8P/psIkcbjeHWn7MqcgciWJyCCevFMJdIXpow==" + } + } + }, "extend": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", @@ -3930,8 +4170,7 @@ "extsprintf": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", - "dev": true + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" }, "fast-deep-equal": { "version": "2.0.1", @@ -4205,8 +4444,7 @@ "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", - "dev": true + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" }, "fsevents": { "version": "2.0.7", @@ -4233,6 +4471,11 @@ "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=" + }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", @@ -4257,11 +4500,15 @@ "assert-plus": "^1.0.0" } }, + "gherkin": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gherkin/-/gherkin-5.0.0.tgz", + "integrity": "sha1-lt70EZjsOQgli1Ea909lWidk0qE=" + }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", - "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -4757,6 +5004,11 @@ "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, + "indent-string": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-4.0.0.tgz", + "integrity": "sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==" + }, "indexof": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", @@ -4773,7 +5025,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" @@ -4782,8 +5033,7 @@ "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "ini": { "version": "1.3.5", @@ -4994,8 +5244,12 @@ "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", - "dev": true + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-generator": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-generator/-/is-generator-1.0.3.tgz", + "integrity": "sha1-wUwhBX7TbjKNuANHlmxpP4hjifM=" }, "is-glob": { "version": "4.0.1", @@ -6279,6 +6533,14 @@ "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", "dev": true }, + "knuth-shuffle-seeded": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/knuth-shuffle-seeded/-/knuth-shuffle-seeded-1.0.6.tgz", + "integrity": "sha1-AfG2VzOqdUDuCNiwF0Fk0iCB5OE=", + "requires": { + "seed-random": "~2.2.0" + } + }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", @@ -6374,8 +6636,7 @@ "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", - "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", - "dev": true + "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==" }, "lodash.clonedeep": { "version": "4.5.0", @@ -6434,6 +6695,11 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, "lru-cache": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", @@ -6770,7 +7036,6 @@ "version": "3.0.4", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "dev": true, "requires": { "brace-expansion": "^1.1.7" } @@ -6916,6 +7181,16 @@ "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "requires": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, "nan": { "version": "2.14.0", "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.0.tgz", @@ -6954,12 +7229,25 @@ "integrity": "sha512-iyam8fBuCUpWeKPGpaNMetEocMt364qkCsfL9JuhjXX6dRnguRVOfk2GZaDpPjcOKiiXCPINZC1GczQ7iTq3Zw==", "dev": true }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz", + "integrity": "sha512-rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==", + "requires": { + "lower-case": "^1.1.1" + } + }, "node-fetch-npm": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", @@ -7182,8 +7470,7 @@ "object-assign": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", - "dev": true + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" }, "object-component": { "version": "0.0.3", @@ -7281,7 +7568,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "dev": true, "requires": { "wrappy": "1" } @@ -7374,8 +7660,7 @@ "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", - "dev": true + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" }, "osenv": { "version": "0.1.5", @@ -7510,6 +7795,14 @@ } } }, + "pad-right": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/pad-right/-/pad-right-0.2.2.tgz", + "integrity": "sha1-b7ySQEXSRPKiokRQMGDTv8YAl3Q=", + "requires": { + "repeat-string": "^1.5.2" + } + }, "pako": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.10.tgz", @@ -7608,8 +7901,7 @@ "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", - "dev": true + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" }, "path-is-inside": { "version": "1.0.2", @@ -7626,8 +7918,7 @@ "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", - "dev": true + "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" }, "path-to-regexp": { "version": "0.1.7", @@ -7652,6 +7943,11 @@ } } }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=" + }, "pbkdf2": { "version": "3.0.17", "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz", @@ -7836,6 +8132,11 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "dev": true }, + "progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" + }, "promise": { "version": "7.3.1", "resolved": "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz", @@ -8028,6 +8329,37 @@ } } }, + "protractor-cucumber-framework": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/protractor-cucumber-framework/-/protractor-cucumber-framework-6.2.1.tgz", + "integrity": "sha512-ZKOvX0Yoq2aL1nrlX5RzeHB9jtWGGiuaqqTPUvPXpyAFbrs3wfDAmMwrdWjg8m62wEhamZMVQIYqSPMPd9obMw==", + "requires": { + "debug": "^3.1.0", + "glob": "^7.1.2", + "q": "^1.5.1", + "tmp": "^0.0.33" + }, + "dependencies": { + "debug": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", + "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", + "requires": { + "ms": "^2.1.1" + } + }, + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=" + } + } + }, "proxy-addr": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", @@ -8364,8 +8696,7 @@ "repeat-string": { "version": "1.6.1", "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", - "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", - "dev": true + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" }, "repeating": { "version": "2.0.1", @@ -8426,7 +8757,6 @@ "version": "1.12.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", - "dev": true, "requires": { "path-parse": "^1.0.6" } @@ -8609,6 +8939,11 @@ "ajv-keywords": "^3.1.0" } }, + "seed-random": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/seed-random/-/seed-random-2.2.0.tgz", + "integrity": "sha1-KpsZ4lCoFwmSMaW5mk2vgLf77VQ=" + }, "select-hose": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz", @@ -8716,6 +9051,14 @@ } } }, + "serialize-error": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/serialize-error/-/serialize-error-4.1.0.tgz", + "integrity": "sha512-5j9GgyGsP9vV9Uj1S0lDCvlsd+gc2LEPVK7HHHte7IyPwOD4lVQFeaX143gx3U5AnoCi+wbcb3mvaxVysjpxEw==", + "requires": { + "type-fest": "^0.3.0" + } + }, "serialize-javascript": { "version": "1.8.0", "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.8.0.tgz", @@ -9410,6 +9753,50 @@ "figgy-pudding": "^3.5.1" } }, + "stack-chain": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/stack-chain/-/stack-chain-2.0.0.tgz", + "integrity": "sha512-GGrHXePi305aW7XQweYZZwiRwR7Js3MWoK/EHzzB9ROdc75nCnjSJVi21rdAGxFl+yCx2L2qdfl5y7NO4lTyqg==" + }, + "stack-generator": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/stack-generator/-/stack-generator-2.0.5.tgz", + "integrity": "sha512-/t1ebrbHkrLrDuNMdeAcsvynWgoH/i4o8EGGfX7dEYDoTXOYVAkEpFdtshlvabzc6JlJ8Kf9YdFEoz7JkzGN9Q==", + "requires": { + "stackframe": "^1.1.1" + } + }, + "stackframe": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/stackframe/-/stackframe-1.2.0.tgz", + "integrity": "sha512-GrdeshiRmS1YLMYgzF16olf2jJ/IzxXY9lhKOskuVziubpTYcYqyOwYeJKzQkwy7uN0fYSsbsC4RQaXf9LCrYA==" + }, + "stacktrace-gps": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/stacktrace-gps/-/stacktrace-gps-3.0.4.tgz", + "integrity": "sha512-qIr8x41yZVSldqdqe6jciXEaSCKw1U8XTXpjDuy0ki/apyTn/r3w9hDAAQOhZdxvsC93H+WwwEu5cq5VemzYeg==", + "requires": { + "source-map": "0.5.6", + "stackframe": "^1.1.1" + }, + "dependencies": { + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=" + } + } + }, + "stacktrace-js": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/stacktrace-js/-/stacktrace-js-2.0.2.tgz", + "integrity": "sha512-Je5vBeY4S1r/RnLydLl0TBTi3F2qdfWmYsGvtfZgEI+SCprPppaIhQf5nGcal4gI4cGpCV/duLcAzT1np6sQqg==", + "requires": { + "error-stack-parser": "^2.0.6", + "stack-generator": "^2.0.5", + "stacktrace-gps": "^3.0.4" + } + }, "static-extend": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", @@ -9512,11 +9899,15 @@ "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=", "dev": true }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==" + }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" @@ -9525,14 +9916,12 @@ "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" }, "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, "requires": { "ansi-regex": "^3.0.0" } @@ -9710,6 +10099,22 @@ } } }, + "thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "requires": { + "any-promise": "^1.0.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "requires": { + "thenify": ">= 3.1.0 < 4" + } + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", @@ -9741,11 +10146,19 @@ "setimmediate": "^1.0.4" } }, + "title-case": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/title-case/-/title-case-2.1.1.tgz", + "integrity": "sha1-PhJyFtpY0rxb7PE3q5Ha46fNj6o=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.0.3" + } + }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", - "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -9925,6 +10338,21 @@ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", "dev": true }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==" + }, + "type-fest": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.3.1.tgz", + "integrity": "sha512-cUGJnCdr4STbePCgqNFbpVNCepa+kAVohJs1sLhxzdH+gnEoOd8VhbYa7pD3zZYGiURWM2xzEII3fQcRizDkYQ==" + }, "type-is": { "version": "1.6.18", "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", @@ -10089,6 +10517,11 @@ "integrity": "sha512-kXpym8nmDmlCBr7nKdIx8P2jNBa+pBpIUFRnKJ4dr8htyYGJFokkr2ZvERRtUN+9SY+JqXouNgUPtv6JQva/2Q==", "dev": true }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", @@ -10183,6 +10616,11 @@ } } }, + "util-arity": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/util-arity/-/util-arity-1.1.0.tgz", + "integrity": "sha1-WdAa8f2z/t4KxOYysKtfbOl8kzA=" + }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -10239,7 +10677,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "dev": true, "requires": { "assert-plus": "^1.0.0", "core-util-is": "1.0.2", @@ -11940,8 +12377,7 @@ "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", - "dev": true + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" }, "ws": { "version": "3.3.3", @@ -11984,6 +12420,14 @@ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=", "dev": true }, + "xregexp": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/xregexp/-/xregexp-4.3.0.tgz", + "integrity": "sha512-7jXDIFXh5yJ/orPn4SXjuVrWWoi4Cr8jfV1eHv9CixKSbU+jY4mxfrBwAuDvupPNKpMUY+FeIqsVw/JLT9+B8g==", + "requires": { + "@babel/runtime-corejs3": "^7.8.3" + } + }, "xtend": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", diff --git a/package.json b/package.json index 3c90325..eaaa874 100644 --- a/package.json +++ b/package.json @@ -20,9 +20,13 @@ "@angular/platform-browser": "~8.2.0", "@angular/platform-browser-dynamic": "~8.2.0", "@angular/router": "~8.2.0", + "chai": "^4.2.0", + "chai-as-promised": "^7.1.1", + "cucumber": "^6.0.5", "font-awesome": "^4.7.0", "primeicons": "^2.0.0", "primeng": "^8.0.2", + "protractor-cucumber-framework": "^6.2.1", "rxjs": "~6.4.0", "tslib": "^1.10.0", "zone.js": "~0.9.1" diff --git a/protractor.conf.js b/protractor.conf.js new file mode 100644 index 0000000..8f9f48b --- /dev/null +++ b/protractor.conf.js @@ -0,0 +1,60 @@ +// Protractor configuration file, see link for more information +// https://github.com/angular/protractor/blob/master/lib/config.ts +exports.config = { + allScriptsTimeout: 11000, + getPageTimeout: 60000, + capabilities: { + 'browserName': 'chrome', + 'chromeOptions': { + 'args': [ + '--start-maximized', // Uncomment to launch tests using the browser and comment the argument `properties` below + // '--headless', + // '--disable-gpu', + // '--window-size=1920,1080', + // '--no-sandbox', + // '--disable-dev-shm-usage' + ], + 'excludeSwitches': ['enable-logging'] + } + }, + directConnect: true, + baseUrl: 'localhost:4200', + specs: [ + './e2e/features/sampleCRUD.feature' + ], + framework: 'custom', + frameworkPath: require.resolve('protractor-cucumber-framework'), + cucumberOpts: { + require: [ + './e2e/features/support/parameterTypes.ts', + './e2e/hooks/generic.hooks.ts', + './e2e/step_definitions/security.definitions.ts', + './e2e/step_definitions/samplecrud.definitions.ts' + ], + tags: [], + strict: true, + format: [ + `json:reports/report.json`, + ], + dryRun: false, + compiler: [] + }, + params: { + users: { + Admin: { + username: 'asd', + password: 'asd' + }, + Employee: { + username: 'asd', + password: 'asd' + } + } + }, + onPrepare() { + require('ts-node').register({ + project: 'e2e/tsconfig.e2e.json' + }); + }, + // ignoreUncaughtExceptions: true, +}; \ No newline at end of file diff --git a/reports/report.json b/reports/report.json new file mode 100644 index 0000000..1f88129 --- /dev/null +++ b/reports/report.json @@ -0,0 +1,377 @@ +[ + { + "description": " As an Admin user, I want to create, update and delete an Employee on my system", + "keyword": "Feature", + "name": "CRUD Sample application", + "line": 1, + "id": "crud-sample-application", + "tags": [], + "uri": "e2e\\features\\sampleCRUD.feature", + "elements": [ + { + "id": "crud-sample-application;login", + "keyword": "Scenario", + "line": 5, + "name": "Login", + "tags": [ + { + "name": "@Login", + "line": 4 + } + ], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Given ", + "line": 6, + "name": "I am on the \"login\" page", + "match": { + "location": "e2e\\step_definitions\\security.definitions.ts:9" + }, + "result": { + "status": "passed", + "duration": 2102000000 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 7, + "name": "I \"login\" as \"Admin\"", + "match": { + "location": "e2e\\step_definitions\\security.definitions.ts:21" + }, + "result": { + "status": "passed", + "duration": 564000000 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 8, + "name": "I should see the \"dashboard\" page", + "match": { + "location": "e2e\\step_definitions\\security.definitions.ts:34" + }, + "result": { + "status": "passed", + "duration": 151000000 + } + }, + { + "keyword": "After", + "hidden": true, + "match": { + "location": "node_modules\\protractor-cucumber-framework\\lib\\resultsCapturer.js:27" + }, + "result": { + "status": "passed", + "duration": 1000000 + } + } + ] + }, + { + "id": "crud-sample-application;create-a-new-employee", + "keyword": "Scenario", + "line": 11, + "name": "Create a new employee", + "tags": [ + { + "name": "@Create", + "line": 10 + } + ], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Given ", + "line": 12, + "name": "I am on the \"dashboard\" page", + "match": { + "location": "e2e\\step_definitions\\security.definitions.ts:9" + }, + "result": { + "status": "passed", + "duration": 11000000 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 13, + "name": "I \"create\" an employee entry", + "match": { + "location": "e2e\\step_definitions\\samplecrud.definitions.ts:11" + }, + "result": { + "status": "passed", + "duration": 2540000000 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 14, + "name": "I should see the \"add\" success message", + "match": { + "location": "e2e\\step_definitions\\samplecrud.definitions.ts:32" + }, + "result": { + "status": "passed", + "duration": 47000000 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 15, + "name": "I should see it \"added\" on the employee list table", + "match": { + "location": "e2e\\step_definitions\\samplecrud.definitions.ts:49" + }, + "result": { + "status": "passed", + "duration": 286000000 + } + }, + { + "keyword": "After", + "hidden": true, + "match": { + "location": "node_modules\\protractor-cucumber-framework\\lib\\resultsCapturer.js:27" + }, + "result": { + "status": "passed", + "duration": 1000000 + } + } + ] + }, + { + "id": "crud-sample-application;read-an-employee-details", + "keyword": "Scenario", + "line": 18, + "name": "Read an employee details", + "tags": [ + { + "name": "@Read", + "line": 17 + } + ], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Given ", + "line": 19, + "name": "I am on the \"dashboard\" page", + "match": { + "location": "e2e\\step_definitions\\security.definitions.ts:9" + }, + "result": { + "status": "passed", + "duration": 8000000 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 20, + "name": "I \"view\" an employee entry", + "match": { + "location": "e2e\\step_definitions\\samplecrud.definitions.ts:11" + }, + "result": { + "status": "passed", + "duration": 1000000 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 21, + "name": "I should see the employee entry details on the list", + "match": { + "location": "e2e\\step_definitions\\samplecrud.definitions.ts:44" + }, + "result": { + "status": "passed", + "duration": 168000000 + } + }, + { + "keyword": "After", + "hidden": true, + "match": { + "location": "node_modules\\protractor-cucumber-framework\\lib\\resultsCapturer.js:27" + }, + "result": { + "status": "passed", + "duration": 0 + } + } + ] + }, + { + "id": "crud-sample-application;update-an-employee", + "keyword": "Scenario", + "line": 24, + "name": "Update an employee", + "tags": [ + { + "name": "@Update", + "line": 23 + } + ], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Given ", + "line": 25, + "name": "I am on the \"dashboard\" page", + "match": { + "location": "e2e\\step_definitions\\security.definitions.ts:9" + }, + "result": { + "status": "passed", + "duration": 18000000 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 26, + "name": "I \"update\" an employee entry", + "match": { + "location": "e2e\\step_definitions\\samplecrud.definitions.ts:11" + }, + "result": { + "status": "passed", + "duration": 4071000000 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 27, + "name": "I should see the \"update\" success message", + "match": { + "location": "e2e\\step_definitions\\samplecrud.definitions.ts:32" + }, + "result": { + "status": "passed", + "duration": 33000000 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 28, + "name": "I should see it \"updated\" on the employee list table", + "match": { + "location": "e2e\\step_definitions\\samplecrud.definitions.ts:49" + }, + "result": { + "status": "passed", + "duration": 202000000 + } + }, + { + "keyword": "After", + "hidden": true, + "match": { + "location": "node_modules\\protractor-cucumber-framework\\lib\\resultsCapturer.js:27" + }, + "result": { + "status": "passed", + "duration": 1000000 + } + } + ] + }, + { + "id": "crud-sample-application;update-an-employee", + "keyword": "Scenario", + "line": 31, + "name": "Update an employee", + "tags": [ + { + "name": "@Delete", + "line": 30 + } + ], + "type": "scenario", + "steps": [ + { + "arguments": [], + "keyword": "Given ", + "line": 32, + "name": "I am on the \"dashboard\" page", + "match": { + "location": "e2e\\step_definitions\\security.definitions.ts:9" + }, + "result": { + "status": "passed", + "duration": 8000000 + } + }, + { + "arguments": [], + "keyword": "When ", + "line": 33, + "name": "I \"delete\" an employee entry", + "match": { + "location": "e2e\\step_definitions\\samplecrud.definitions.ts:11" + }, + "result": { + "status": "passed", + "duration": 2210000000 + } + }, + { + "arguments": [], + "keyword": "Then ", + "line": 34, + "name": "I should see the \"update\" success message", + "match": { + "location": "e2e\\step_definitions\\samplecrud.definitions.ts:32" + }, + "result": { + "status": "passed", + "duration": 28000000 + } + }, + { + "arguments": [], + "keyword": "And ", + "line": 35, + "name": "I should see it \"deleted\" on the employee list table", + "match": { + "location": "e2e\\step_definitions\\samplecrud.definitions.ts:49" + }, + "result": { + "status": "passed", + "duration": 44000000 + } + }, + { + "keyword": "After", + "hidden": true, + "match": { + "location": "node_modules\\protractor-cucumber-framework\\lib\\resultsCapturer.js:27" + }, + "result": { + "status": "passed", + "duration": 0 + } + } + ] + } + ] + } +] \ No newline at end of file