@qavajs/template
Advanced tools
+1
-1
@@ -10,3 +10,3 @@ { | ||
| "jsxBracketSameLine": false, | ||
| "tabWidth": 2, | ||
| "tabWidth": 4, | ||
| "semi": true, | ||
@@ -13,0 +13,0 @@ "endOfLine": "crlf" |
+4
-0
@@ -0,1 +1,5 @@ | ||
| ## 0.0.6 | ||
| - :rocket: added capability to pass cucumber multiline | ||
| - :rocket: added capability to pass key value params | ||
| ## 0.0.5 | ||
@@ -2,0 +6,0 @@ - :beetle: fixed issue with multiple call of parametrised template in other template |
+39
-9
@@ -37,2 +37,3 @@ "use strict"; | ||
| const glob = (0, util_1.promisify)(glob_1.default); | ||
| const QAVAJS_MULTILINE = 'qavajsMultiline'; | ||
| function findStepDefinition(id, supportCodeLibrary) { | ||
@@ -91,3 +92,3 @@ return supportCodeLibrary.stepDefinitions.find((definition) => definition.id === id); | ||
| } | ||
| async function runTemplate(templateDefs, compositeStep, callerSteps) { | ||
| async function runTemplate(templateDefs, pickleStep, callerSteps) { | ||
| if (this.isSkippingSteps()) { | ||
@@ -99,10 +100,10 @@ return { | ||
| } | ||
| if (callerSteps.includes(compositeStep)) { | ||
| if (callerSteps.includes(pickleStep.text)) { | ||
| return { | ||
| status: messages_1.TestStepResultStatus.FAILED, | ||
| message: `${compositeStep} has recursive call`, | ||
| message: `${pickleStep.text} has recursive call`, | ||
| duration: messages_1.TimeConversion.millisecondsToDuration(0), | ||
| }; | ||
| } | ||
| const scenario = templateDefs.find((s) => s.templateRegex.test(compositeStep)); | ||
| const scenario = templateDefs.find((s) => s.templateRegex.test(pickleStep.text)); | ||
| if (!scenario) { | ||
@@ -115,5 +116,17 @@ return { | ||
| // get scenario arguments | ||
| const matchArgs = compositeStep.match(scenario.templateRegex); | ||
| const matchArgs = pickleStep.text.match(scenario.templateRegex); | ||
| const args = matchArgs ? matchArgs.splice(1) : []; | ||
| const scenarioArgs = scenario.argNames.map((name, index) => ({ name, value: args[index] })); | ||
| const scenarioArgs = scenario.argNames.map((name, index) => ({ name: name.replace(/(^<)|(>$)/g, ''), value: args[index] })); | ||
| // if data table or multiline exist add them to scenario args | ||
| if (pickleStep?.argument?.docString) { | ||
| scenarioArgs.push({ | ||
| name: QAVAJS_MULTILINE, | ||
| value: pickleStep?.argument?.docString?.content, | ||
| }); | ||
| } | ||
| if (pickleStep?.argument?.dataTable) { | ||
| for (const row of pickleStep.argument.dataTable.rows) { | ||
| scenarioArgs.push({ name: row.cells[0].value, value: row.cells[1].value }); | ||
| } | ||
| } | ||
| // get step defs | ||
@@ -124,8 +137,25 @@ const stepDefs = cucumber_1.supportCodeLibraryBuilder.buildStepDefinitions(templateDefs.map((step) => step.id)); | ||
| const stepTemplateText = step.text; | ||
| step.text = scenarioArgs.reduce((text, arg) => text.replace(new RegExp(arg.name, 'g'), arg.value), step.text); | ||
| step.text = scenarioArgs.reduce((text, arg) => text.replace(new RegExp(`<${arg.name}>`, 'g'), arg.value), step.text); | ||
| const stepDefinition = stepDefs.stepDefinitions.find((sd) => sd.matchesStepName(step.text)); | ||
| if (step.docString) { | ||
| // @ts-ignore | ||
| step.argument = { | ||
| docString: { content: step.docString.content }, | ||
| }; | ||
| // @ts-ignore | ||
| step.argument.docString.content = scenarioArgs.reduce((text, arg) => text.replace(new RegExp(`<${arg.name}>`, 'g'), arg.value), | ||
| // @ts-ignore | ||
| step.argument.docString.content); | ||
| } | ||
| if (step.dataTable) { | ||
| // @ts-ignore | ||
| step.argument = { | ||
| dataTable: { rows: step.dataTable.rows }, | ||
| }; | ||
| } | ||
| const stepResults = []; | ||
| // try to find template | ||
| if (!stepDefinition) { | ||
| const result = await runTemplate.apply(this, [templateDefs, step.text, [...callerSteps, compositeStep]]); | ||
| // @ts-ignore | ||
| const result = await runTemplate.apply(this, [templateDefs, step, [...callerSteps, pickleStep.text]]); | ||
| if (result.status === messages_1.TestStepResultStatus.UNDEFINED) { | ||
@@ -185,3 +215,3 @@ return { | ||
| const templates = await loadTemplates(); | ||
| return runTemplate.apply(this, [templates, pickleStep.text, []]); | ||
| return runTemplate.apply(this, [templates, pickleStep, []]); | ||
| } | ||
@@ -188,0 +218,0 @@ return originRunStep.apply(this, [pickleStep, testStep]); |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} |
+4
-0
| "use strict"; | ||
| Object.defineProperty(exports, "__esModule", { value: true }); | ||
| exports.cloneDeep = void 0; | ||
| /** | ||
| * Clone object | ||
| * @param obj | ||
| */ | ||
| function cloneDeep(obj) { | ||
@@ -5,0 +9,0 @@ return JSON.parse(JSON.stringify(obj)); |
+1
-1
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA,SAAgB,SAAS,CAAC,GAAQ;IAChC,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AACzC,CAAC;AAFD,8BAEC"} | ||
| {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;AAAA;;;GAGG;AACH,SAAgB,SAAS,CAAC,GAAQ;IAC9B,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;AAC3C,CAAC;AAFD,8BAEC"} |
+21
-19
| { | ||
| "name": "@qavajs/template", | ||
| "version": "0.0.5", | ||
| "version": "0.0.6", | ||
| "description": "library that allow to define step definitions on Gherkin language", | ||
@@ -8,3 +8,3 @@ "scripts": { | ||
| "test": "jest --coverage", | ||
| "test:e2e": "ts-node node_modules/.bin/qavajs run --config test-e2e/template.ts", | ||
| "test:e2e": "ts-node --esm --project tsconfig.json node_modules/@qavajs/cli/bin/qavajs.js run --config test-e2e/template.ts", | ||
| "lint:write": "npm run pretty && eslint ./src/ --fix", | ||
@@ -23,3 +23,4 @@ "pretty": "prettier --write ./src/" | ||
| "authors": [ | ||
| "Alexandr Galichenko" | ||
| "Alexandr Galichenko", | ||
| "Alexandr Legchilov" | ||
| ], | ||
@@ -32,33 +33,34 @@ "license": "MIT", | ||
| "devDependencies": { | ||
| "@cucumber/cucumber": "^8.10.0", | ||
| "@cucumber/cucumber": "^9.0.1", | ||
| "@cucumber/gherkin-streams": "^5.0.1", | ||
| "@cucumber/messages": "^21.0.1", | ||
| "@jest/globals": "^29.3.1", | ||
| "@qavajs/cli": "^0.0.15", | ||
| "@qavajs/memory": "^1.1.1", | ||
| "@jest/globals": "^29.5.0", | ||
| "@qavajs/cli": "^0.0.19", | ||
| "@qavajs/console-formatter": "^0.2.1", | ||
| "@qavajs/memory": "^1.2.0", | ||
| "@qavajs/xunit-formatter": "^0.0.3", | ||
| "@types/chai": "^4.3.4", | ||
| "@types/glob": "^8.0.0", | ||
| "@types/jest": "^29.2.5", | ||
| "@types/node": "^18.11.18", | ||
| "@typescript-eslint/eslint-plugin": "^5.48.1", | ||
| "@typescript-eslint/parser": "^5.48.1", | ||
| "@types/glob": "^8.1.0", | ||
| "@types/jest": "^29.5.0", | ||
| "@types/node": "^18.15.5", | ||
| "@typescript-eslint/eslint-plugin": "^5.54.0", | ||
| "@typescript-eslint/parser": "^5.56.0", | ||
| "chai": "^4.3.7", | ||
| "eslint": "8.31.0", | ||
| "eslint": "8.36.0", | ||
| "eslint-config-airbnb": "19.0.4", | ||
| "eslint-config-airbnb-base": "^15.0.0", | ||
| "eslint-config-prettier": "^8.6.0", | ||
| "eslint-config-prettier": "^8.8.0", | ||
| "eslint-import-resolver-typescript": "^3.5.3", | ||
| "eslint-plugin-import": "^2.27.4", | ||
| "eslint-plugin-import": "^2.27.5", | ||
| "eslint-plugin-prettier": "^4.2.1", | ||
| "husky": "^8.0.3", | ||
| "jest": "^29.3.1", | ||
| "prettier": "^2.8.2", | ||
| "jest": "^29.5.0", | ||
| "prettier": "^2.8.5", | ||
| "ts-jest": "^29.0.5", | ||
| "ts-node": "^10.9.1", | ||
| "typescript": "^4.9.4" | ||
| "typescript": "^5.0.2" | ||
| }, | ||
| "dependencies": { | ||
| "glob": "^8.0.3" | ||
| "glob": "^8.1.0" | ||
| } | ||
| } |
+60
-13
| # @qavajs/template | ||
| Library that allow to define step definitions on Gherkin language. | ||
| ## Templates | ||
| ```gherkin | ||
@@ -24,4 +25,20 @@ Feature: Templates | ||
| Templates also can accept parameters as < param> e.g | ||
| ## Configuration | ||
| To use templates their location need to be passed to templates property of config file and library need to be listed | ||
| in require | ||
| ```javascript | ||
| module.exports = { | ||
| default: { | ||
| requireModule: [ | ||
| '@qavajs/template' | ||
| ], | ||
| templates: ['templates/*.feature'] | ||
| } | ||
| } | ||
| ``` | ||
| ## Parameters | ||
| Templates also can accept parameters as `<param>` e.g | ||
| ```gherkin | ||
@@ -46,15 +63,45 @@ Feature: Templates | ||
| ``` | ||
| To use templates their location need to be passed to templates property of config file and library need to be listed | ||
| in require | ||
| ```javascript | ||
| module.exports = { | ||
| default: { | ||
| requireModule: [ | ||
| '@qavajs/template' | ||
| ], | ||
| templates: ['templates/*.feature'] | ||
| } | ||
| } | ||
| ## Multiline parameter | ||
| It is also possible to pass multi line parameter to template | ||
| ```gherkin | ||
| Feature: TextArea | ||
| Scenario: Verify that user is able to login | ||
| When I set text area: | ||
| """ | ||
| this | ||
| is | ||
| multiline | ||
| text | ||
| """ | ||
| ``` | ||
| Multiline data can be accessed by `<qavajsMultiline>` formal parameter in template | ||
| ```gherkin | ||
| Feature: Templates | ||
| Scenario: I set text area: | ||
| When I type '<qavajsMultiline>' to 'Form > Text Area' | ||
| ``` | ||
| ## Key Value Params | ||
| Multiple parameters can be passed in form of key-value data table | ||
| ```gherkin | ||
| Feature: TextArea | ||
| Scenario: Verify that user is able to login | ||
| When I fill registration form: | ||
| | name | John Dou | | ||
| | position | Test Automation Engineer | | ||
| ``` | ||
| And values can be accessed by corresponding keys | ||
| ```gherkin | ||
| Feature: Templates | ||
| Scenario: I fill registration form: | ||
| When I type '<name>' to 'Form > Name' | ||
| When I type '<position>' to 'Form > Position' | ||
| ``` | ||
+167
-133
| import * as testCaseRunner from '@cucumber/cucumber/lib/runtime/test_case_runner'; | ||
| import { | ||
| FeatureChild, | ||
| getWorstTestStepResult, | ||
| GherkinDocument, | ||
| PickleStep, | ||
| Scenario, Step, | ||
| TestStep, TestStepResult, | ||
| TestStepResultStatus, | ||
| TimeConversion, | ||
| FeatureChild, | ||
| getWorstTestStepResult, | ||
| GherkinDocument, | ||
| PickleStep, | ||
| Scenario, | ||
| Step, | ||
| TestStep, | ||
| TestStepResult, | ||
| TestStepResultStatus, | ||
| TimeConversion, | ||
| } from '@cucumber/messages'; | ||
@@ -20,15 +22,16 @@ import { GherkinStreams } from '@cucumber/gherkin-streams'; | ||
| declare global { | ||
| // eslint-disable-next-line no-var | ||
| var config: any; | ||
| // eslint-disable-next-line no-var | ||
| var config: any; | ||
| } | ||
| type ScenarioTemplate = Scenario & { | ||
| templateRegex: RegExp; | ||
| argNames: Array<string>; | ||
| templateRegex: RegExp; | ||
| argNames: Array<string>; | ||
| }; | ||
| type GlobFunction = (arg: string) => Promise<Array<string>>; | ||
| const glob: GlobFunction = promisify(globCb); | ||
| const QAVAJS_MULTILINE = 'qavajsMultiline'; | ||
| function findStepDefinition(id: string, supportCodeLibrary: ISupportCodeLibrary) { | ||
| return supportCodeLibrary.stepDefinitions.find((definition) => definition.id === id); | ||
| return supportCodeLibrary.stepDefinitions.find((definition) => definition.id === id); | ||
| } | ||
@@ -42,22 +45,22 @@ | ||
| function formatErrorMessage(result: TestStepResult, step: Step): TestStepResult { | ||
| result.message = `${step.keyword}${step.text}\n${result.message}`; | ||
| return result; | ||
| result.message = `${step.keyword}${step.text}\n${result.message}`; | ||
| return result; | ||
| } | ||
| function parseGherkin(paths: Array<string>): Promise<Array<GherkinDocument>> { | ||
| // guard to check if templates found, otherwise gherkin streams hangs | ||
| if (paths.length === 0) return Promise.resolve([]); | ||
| return new Promise((resolve, reject) => { | ||
| const messageStream = GherkinStreams.fromPaths(paths, {}); | ||
| const gherkinDocuments: Array<GherkinDocument> = []; | ||
| messageStream.on('data', (envelope) => { | ||
| if (envelope.gherkinDocument) { | ||
| gherkinDocuments.push(envelope.gherkinDocument); | ||
| } | ||
| // guard to check if templates found, otherwise gherkin streams hangs | ||
| if (paths.length === 0) return Promise.resolve([]); | ||
| return new Promise((resolve, reject) => { | ||
| const messageStream = GherkinStreams.fromPaths(paths, {}); | ||
| const gherkinDocuments: Array<GherkinDocument> = []; | ||
| messageStream.on('data', (envelope) => { | ||
| if (envelope.gherkinDocument) { | ||
| gherkinDocuments.push(envelope.gherkinDocument); | ||
| } | ||
| }); | ||
| messageStream.on('end', () => { | ||
| resolve(gherkinDocuments); | ||
| }); | ||
| messageStream.on('error', reject); | ||
| }); | ||
| messageStream.on('end', () => { | ||
| resolve(gherkinDocuments); | ||
| }); | ||
| messageStream.on('error', reject); | ||
| }); | ||
| } | ||
@@ -67,100 +70,131 @@ | ||
| let gherkinDocuments: Array<GherkinDocument>; | ||
| async function loadTemplates() { | ||
| const templatePaths = await global.config.templates.reduce( | ||
| async (paths: Array<string>, pattern: string) => (await paths).concat(await glob(pattern)), | ||
| [], | ||
| ); | ||
| if (!gherkinDocuments) { | ||
| gherkinDocuments = await parseGherkin(templatePaths); | ||
| } | ||
| const argRegexp = /(<.+?>)/g; | ||
| // memo templates | ||
| const templates: Array<ScenarioTemplate> = cloneDeep(gherkinDocuments) | ||
| .reduce((scenarios: Array<FeatureChild>, doc: GherkinDocument) => scenarios.concat(doc.feature ? doc.feature.children : []), []) | ||
| .map((featureChild: FeatureChild) => { | ||
| const scenario = featureChild.scenario; | ||
| if (!scenario) throw new Error('Scenario is not defined'); | ||
| return { | ||
| ...scenario, | ||
| templateRegex: new RegExp(`^${scenario.name.replace(argRegexp, '(.+?)')}$`), | ||
| argNames: scenario.name.match(argRegexp) ?? [], | ||
| }; | ||
| }); | ||
| return templates; | ||
| const templatePaths = await global.config.templates.reduce( | ||
| async (paths: Array<string>, pattern: string) => (await paths).concat(await glob(pattern)), | ||
| [], | ||
| ); | ||
| if (!gherkinDocuments) { | ||
| gherkinDocuments = await parseGherkin(templatePaths); | ||
| } | ||
| const argRegexp = /(<.+?>)/g; | ||
| // memo templates | ||
| const templates: Array<ScenarioTemplate> = cloneDeep(gherkinDocuments) | ||
| .reduce((scenarios: Array<FeatureChild>, doc: GherkinDocument) => scenarios.concat(doc.feature ? doc.feature.children : []), []) | ||
| .map((featureChild: FeatureChild) => { | ||
| const scenario = featureChild.scenario; | ||
| if (!scenario) throw new Error('Scenario is not defined'); | ||
| return { | ||
| ...scenario, | ||
| templateRegex: new RegExp(`^${scenario.name.replace(argRegexp, '(.+?)')}$`), | ||
| argNames: scenario.name.match(argRegexp) ?? [], | ||
| }; | ||
| }); | ||
| return templates; | ||
| } | ||
| async function runTemplate(this: any, templateDefs: Array<ScenarioTemplate>, compositeStep: string, callerSteps: Array<string>) { | ||
| if (this.isSkippingSteps()) { | ||
| return { | ||
| status: TestStepResultStatus.SKIPPED, | ||
| duration: TimeConversion.millisecondsToDuration(0), | ||
| }; | ||
| } | ||
| if (callerSteps.includes(compositeStep)) { | ||
| return { | ||
| status: TestStepResultStatus.FAILED, | ||
| message: `${compositeStep} has recursive call`, | ||
| duration: TimeConversion.millisecondsToDuration(0), | ||
| }; | ||
| } | ||
| const scenario = templateDefs.find((s) => s.templateRegex.test(compositeStep)); | ||
| if (!scenario) { | ||
| return { | ||
| status: TestStepResultStatus.UNDEFINED, | ||
| duration: TimeConversion.millisecondsToDuration(0), | ||
| }; | ||
| } | ||
| // get scenario arguments | ||
| const matchArgs = compositeStep.match(scenario.templateRegex); | ||
| const args = matchArgs ? matchArgs.splice(1) : []; | ||
| const scenarioArgs = scenario.argNames.map((name, index) => ({ name, value: args[index] })); | ||
| // get step defs | ||
| const stepDefs = supportCodeLibraryBuilder.buildStepDefinitions(templateDefs.map((step) => step.id)); | ||
| // execute steps | ||
| for (const step of scenario.steps) { | ||
| const stepTemplateText = step.text; | ||
| step.text = scenarioArgs.reduce((text, arg) => text.replace(new RegExp(arg.name, 'g'), arg.value), step.text); | ||
| const stepDefinition = stepDefs.stepDefinitions.find((sd) => sd.matchesStepName(step.text)); | ||
| const stepResults = []; | ||
| // try to find template | ||
| if (!stepDefinition) { | ||
| const result = await runTemplate.apply(this, [templateDefs, step.text, [...callerSteps, compositeStep]]); | ||
| if (result.status === TestStepResultStatus.UNDEFINED) { | ||
| async function runTemplate(this: any, templateDefs: Array<ScenarioTemplate>, pickleStep: PickleStep, callerSteps: Array<string>) { | ||
| if (this.isSkippingSteps()) { | ||
| return { | ||
| status: TestStepResultStatus.FAILED, | ||
| message: `${step.text} is not defined`, | ||
| duration: TimeConversion.millisecondsToDuration(0), | ||
| status: TestStepResultStatus.SKIPPED, | ||
| duration: TimeConversion.millisecondsToDuration(0), | ||
| }; | ||
| } | ||
| stepResults.push(result); | ||
| } else { | ||
| // run BeforeStep hooks | ||
| stepResults.push(...(await this.runStepHooks(this.getBeforeStepHookDefinitions(), step))); | ||
| // run step itself | ||
| let stepResult; | ||
| if (getWorstTestStepResult(stepResults).status !== TestStepResultStatus.FAILED) { | ||
| const hookParameter = { | ||
| gherkinDocument: this.gherkinDocument, | ||
| pickle: this.pickle, | ||
| testCaseStartedId: this.currentTestCaseStartedId, | ||
| } | ||
| if (callerSteps.includes(pickleStep.text)) { | ||
| return { | ||
| status: TestStepResultStatus.FAILED, | ||
| message: `${pickleStep.text} has recursive call`, | ||
| duration: TimeConversion.millisecondsToDuration(0), | ||
| }; | ||
| stepResult = await this.invokeStep(step, stepDefinition, hookParameter); | ||
| stepResults.push(stepResult); | ||
| } | ||
| // run AfterStep hooks | ||
| const afterStepHookResults = await this.runStepHooks(this.getAfterStepHookDefinitions(), step, stepResult); | ||
| stepResults.push(...afterStepHookResults); | ||
| } | ||
| // finalizing scenario | ||
| const finalStepResult = getWorstTestStepResult(stepResults); | ||
| step.text = stepTemplateText; | ||
| if (finalStepResult.status === TestStepResultStatus.FAILED) { | ||
| return formatErrorMessage(finalStepResult, step); | ||
| const scenario = templateDefs.find((s) => s.templateRegex.test(pickleStep.text)); | ||
| if (!scenario) { | ||
| return { | ||
| status: TestStepResultStatus.UNDEFINED, | ||
| duration: TimeConversion.millisecondsToDuration(0), | ||
| }; | ||
| } | ||
| } | ||
| return { | ||
| status: TestStepResultStatus.PASSED, | ||
| duration: TimeConversion.millisecondsToDuration(0), | ||
| }; | ||
| // get scenario arguments | ||
| const matchArgs = pickleStep.text.match(scenario.templateRegex); | ||
| const args = matchArgs ? matchArgs.splice(1) : []; | ||
| const scenarioArgs = scenario.argNames.map((name, index) => ({ name: name.replace(/(^<)|(>$)/g, ''), value: args[index] })); | ||
| // if data table or multiline exist add them to scenario args | ||
| if (pickleStep?.argument?.docString) { | ||
| scenarioArgs.push({ | ||
| name: QAVAJS_MULTILINE, | ||
| value: pickleStep?.argument?.docString?.content, | ||
| }); | ||
| } | ||
| if (pickleStep?.argument?.dataTable) { | ||
| for (const row of pickleStep.argument.dataTable.rows) { | ||
| scenarioArgs.push({ name: row.cells[0].value as any, value: row.cells[1].value as any }); | ||
| } | ||
| } | ||
| // get step defs | ||
| const stepDefs = supportCodeLibraryBuilder.buildStepDefinitions(templateDefs.map((step) => step.id)); | ||
| // execute steps | ||
| for (const step of scenario.steps) { | ||
| const stepTemplateText = step.text; | ||
| step.text = scenarioArgs.reduce((text, arg) => text.replace(new RegExp(`<${arg.name}>`, 'g'), arg.value), step.text); | ||
| const stepDefinition = stepDefs.stepDefinitions.find((sd) => sd.matchesStepName(step.text)); | ||
| if (step.docString) { | ||
| // @ts-ignore | ||
| step.argument = { | ||
| docString: { content: step.docString.content }, | ||
| }; | ||
| // @ts-ignore | ||
| step.argument.docString.content = scenarioArgs.reduce( | ||
| (text, arg) => text.replace(new RegExp(`<${arg.name}>`, 'g'), arg.value), | ||
| // @ts-ignore | ||
| step.argument.docString.content, | ||
| ); | ||
| } | ||
| if (step.dataTable) { | ||
| // @ts-ignore | ||
| step.argument = { | ||
| dataTable: { rows: step.dataTable.rows }, | ||
| }; | ||
| } | ||
| const stepResults = []; | ||
| // try to find template | ||
| if (!stepDefinition) { | ||
| // @ts-ignore | ||
| const result = await runTemplate.apply(this, [templateDefs, step, [...callerSteps, pickleStep.text]]); | ||
| if (result.status === TestStepResultStatus.UNDEFINED) { | ||
| return { | ||
| status: TestStepResultStatus.FAILED, | ||
| message: `${step.text} is not defined`, | ||
| duration: TimeConversion.millisecondsToDuration(0), | ||
| }; | ||
| } | ||
| stepResults.push(result); | ||
| } else { | ||
| // run BeforeStep hooks | ||
| stepResults.push(...(await this.runStepHooks(this.getBeforeStepHookDefinitions(), step))); | ||
| // run step itself | ||
| let stepResult; | ||
| if (getWorstTestStepResult(stepResults).status !== TestStepResultStatus.FAILED) { | ||
| const hookParameter = { | ||
| gherkinDocument: this.gherkinDocument, | ||
| pickle: this.pickle, | ||
| testCaseStartedId: this.currentTestCaseStartedId, | ||
| }; | ||
| stepResult = await this.invokeStep(step, stepDefinition, hookParameter); | ||
| stepResults.push(stepResult); | ||
| } | ||
| // run AfterStep hooks | ||
| const afterStepHookResults = await this.runStepHooks(this.getAfterStepHookDefinitions(), step, stepResult); | ||
| stepResults.push(...afterStepHookResults); | ||
| } | ||
| // finalizing scenario | ||
| const finalStepResult = getWorstTestStepResult(stepResults); | ||
| step.text = stepTemplateText; | ||
| if (finalStepResult.status === TestStepResultStatus.FAILED) { | ||
| return formatErrorMessage(finalStepResult, step); | ||
| } | ||
| } | ||
| return { | ||
| status: TestStepResultStatus.PASSED, | ||
| duration: TimeConversion.millisecondsToDuration(0), | ||
| }; | ||
| } | ||
@@ -171,17 +205,17 @@ | ||
| testCaseRunner.default.prototype.runStep = async function (this: any, pickleStep: PickleStep, testStep: TestStep) { | ||
| // @ts-ignore | ||
| const stepDefinitions = testStep.stepDefinitionIds.map((stepDefinitionId) => findStepDefinition(stepDefinitionId, this.supportCodeLibrary)); | ||
| if (stepDefinitions.length === 0) { | ||
| // guard to check if templates property provided | ||
| if (!global.config.templates) { | ||
| console.warn('Property templates is not defined. Make sure you have added it to config file'); | ||
| return { | ||
| status: TestStepResultStatus.UNDEFINED, | ||
| duration: TimeConversion.millisecondsToDuration(0), | ||
| }; | ||
| // @ts-ignore | ||
| const stepDefinitions = testStep.stepDefinitionIds.map((stepDefinitionId) => findStepDefinition(stepDefinitionId, this.supportCodeLibrary)); | ||
| if (stepDefinitions.length === 0) { | ||
| // guard to check if templates property provided | ||
| if (!global.config.templates) { | ||
| console.warn('Property templates is not defined. Make sure you have added it to config file'); | ||
| return { | ||
| status: TestStepResultStatus.UNDEFINED, | ||
| duration: TimeConversion.millisecondsToDuration(0), | ||
| }; | ||
| } | ||
| const templates = await loadTemplates(); | ||
| return runTemplate.apply(this, [templates, pickleStep, []]); | ||
| } | ||
| const templates = await loadTemplates(); | ||
| return runTemplate.apply(this, [templates, pickleStep.text, []]); | ||
| } | ||
| return originRunStep.apply(this, [pickleStep, testStep]); | ||
| return originRunStep.apply(this, [pickleStep, testStep]); | ||
| }; |
+5
-1
@@ -0,3 +1,7 @@ | ||
| /** | ||
| * Clone object | ||
| * @param obj | ||
| */ | ||
| export function cloneDeep(obj: any): any { | ||
| return JSON.parse(JSON.stringify(obj)); | ||
| return JSON.parse(JSON.stringify(obj)); | ||
| } |
35682
17.92%498
16.9%106
79.66%28
3.7%Updated