Big News: Socket raises $60M Series C at a $1B valuation to secure software supply chains for AI-driven development.Announcement
Sign In

@qavajs/template

Package Overview
Dependencies
Maintainers
2
Versions
12
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@qavajs/template - npm Package Compare versions

Comparing version
0.0.5
to
0.0.6
+1
-1
.prettierrc

@@ -10,3 +10,3 @@ {

"jsxBracketSameLine": false,
"tabWidth": 2,
"tabWidth": 4,
"semi": true,

@@ -13,0 +13,0 @@ "endOfLine": "crlf"

@@ -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

@@ -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 +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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"}
"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 +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"}
{
"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]);
};

@@ -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));
}