diff --git a/.github/workflows/npm-publish.yml b/.github/workflows/npm-publish.yml index 7e32fe8..6a9dd89 100644 --- a/.github/workflows/npm-publish.yml +++ b/.github/workflows/npm-publish.yml @@ -1,11 +1,12 @@ -# This workflow will run tests using node and then publish a package to GitHub Packages when a release is created -# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages - -name: Node.js Package +name: Publish Package on: release: - types: [created] + types: [published] + +permissions: + id-token: write + contents: read jobs: publish-npm: @@ -18,6 +19,4 @@ jobs: registry-url: https://registry.npmjs.org/ - run: npm ci - run: npm run build - - run: npm publish --access public - env: - NODE_AUTH_TOKEN: ${{secrets.npm_token}} + - run: npm publish --access public \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index f64c0b5..4211d6b 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,16 @@ Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how :microscope: - experimental +## [1.7.0] +- :rocket: added `filter` grep utility function +```typescript +import { filter } from '@qavajs/playwright-runner-adapter'; +export default defineConfig({ + grep: filter(name => name.includes('login test')) +}); +``` +- :rocket: expose `uri` test annotation + ## [1.6.0] - :rocket: added `Template` utility function ```typescript diff --git a/README.md b/README.md index 242d1bc..2f6b97a 100644 --- a/README.md +++ b/README.md @@ -75,14 +75,23 @@ class ExtendedPlaywrightWorld extends PlaywrightWorld { } ``` -### Tag expression +### Tag expression and filter It is possible to use regular tag expressions via `tags` util function ```typescript import { tags } from '@qavajs/playwright-runner-adapter'; export default defineConfig({ grep: tags('@oneTag and @anotherTag') -}) +}); +``` + +or filter tests by predicate + +```typescript +import { filter } from '@qavajs/playwright-runner-adapter'; +export default defineConfig({ + grep: filter(name => name.includes('login test')) +}); ``` ## Limitation diff --git a/package-lock.json b/package-lock.json index 4acf3c0..f29b9bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,22 +1,22 @@ { "name": "@qavajs/playwright-runner-adapter", - "version": "1.6.0", + "version": "1.7.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@qavajs/playwright-runner-adapter", - "version": "1.6.0", + "version": "1.7.0", "license": "MIT", "dependencies": { "@cucumber/cucumber": "^12.2.0", - "@cucumber/gherkin": "^35.1.0", - "@cucumber/tag-expressions": "^6.2.0", + "@cucumber/gherkin": "^36.0.0", + "@cucumber/tag-expressions": "^8.0.0", "glob": "^11.0.3" }, "devDependencies": { - "@playwright/test": "^1.55.1", - "@types/node": "^24.6.2", + "@playwright/test": "^1.56.1", + "@types/node": "^24.9.1", "typescript": "^5.9.3" } }, @@ -145,6 +145,12 @@ "uuid": "11.1.0" } }, + "node_modules/@cucumber/cucumber/node_modules/@cucumber/tag-expressions": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-6.2.0.tgz", + "integrity": "sha512-KIF0eLcafHbWOuSDWFw0lMmgJOLdDRWjEL1kfXEWrqHmx2119HxVAr35WuEd9z542d3Yyg+XNqSr+81rIKqEdg==", + "license": "MIT" + }, "node_modules/@cucumber/cucumber/node_modules/uuid": { "version": "11.1.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", @@ -159,12 +165,12 @@ } }, "node_modules/@cucumber/gherkin": { - "version": "35.1.0", - "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-35.1.0.tgz", - "integrity": "sha512-JtQZLlhclejUb1lmnztMBin2Qu5lvSuet9dCl/nizrP8Icr8ywZk6PaDfcFXwS5iNQAKV+wH9FLsPxhhxME0sQ==", + "version": "36.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-36.0.0.tgz", + "integrity": "sha512-L/WomevUuGSHWeJqLN9yEsz37ns0M1BiRu8Isp+hlYTBAYzt6ZkLiUEK3W9gT5STu++lL/2tE04bD8Ma1p0AYw==", "license": "MIT", "dependencies": { - "@cucumber/messages": ">=19.1.4 <30" + "@cucumber/messages": ">=19.1.4 <31" } }, "node_modules/@cucumber/gherkin-streams": { @@ -337,9 +343,9 @@ } }, "node_modules/@cucumber/tag-expressions": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-6.2.0.tgz", - "integrity": "sha512-KIF0eLcafHbWOuSDWFw0lMmgJOLdDRWjEL1kfXEWrqHmx2119HxVAr35WuEd9z542d3Yyg+XNqSr+81rIKqEdg==", + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-8.0.0.tgz", + "integrity": "sha512-2G+GMMhazdW4oiWSarDdRQ5uLx70zEvuVyf53HzJ7gwGeFiOB1tLIxyKiCIAjF63be65sRLPdjDqGxFuT5w8FQ==", "license": "MIT" }, "node_modules/@isaacs/balanced-match": { @@ -431,13 +437,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.55.1", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.55.1.tgz", - "integrity": "sha512-IVAh/nOJaw6W9g+RJVlIQJ6gSiER+ae6mKQ5CX1bERzQgbC1VSeBlwdvczT7pxb0GWiyrxH4TGKbMfDb4Sq/ig==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.56.1.tgz", + "integrity": "sha512-vSMYtL/zOcFpvJCW71Q/OEGQb7KYBPAdKh35WNSkaZA75JlAO8ED8UN6GUNTm3drWomcbcqRPFqQbLae8yBTdg==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright": "1.55.1" + "playwright": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -455,13 +461,13 @@ } }, "node_modules/@types/node": { - "version": "24.6.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.6.2.tgz", - "integrity": "sha512-d2L25Y4j+W3ZlNAeMKcy7yDsK425ibcAOO2t7aPTz6gNMH0z2GThtwENCDc0d/Pw9wgyRqE5Px1wkV7naz8ang==", + "version": "24.9.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.9.1.tgz", + "integrity": "sha512-QoiaXANRkSXK6p0Duvt56W208du4P9Uye9hWLWgGMDTEoKPhuenzNcC4vGUmrNkiOKTlIrBoyNQYNpSwfEZXSg==", "dev": true, "license": "MIT", "dependencies": { - "undici-types": "~7.13.0" + "undici-types": "~7.16.0" } }, "node_modules/@types/normalize-package-data": { @@ -1105,13 +1111,13 @@ "license": "ISC" }, "node_modules/playwright": { - "version": "1.55.1", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.55.1.tgz", - "integrity": "sha512-cJW4Xd/G3v5ovXtJJ52MAOclqeac9S/aGGgRzLabuF8TnIb6xHvMzKIa6JmrRzUkeXJgfL1MhukP0NK6l39h3A==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.56.1.tgz", + "integrity": "sha512-aFi5B0WovBHTEvpM3DzXTUaeN6eN0qWnTkKx4NQaH4Wvcmc153PdaY2UBdSYKaGYw+UyWXSVyxDUg5DoPEttjw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.55.1" + "playwright-core": "1.56.1" }, "bin": { "playwright": "cli.js" @@ -1124,9 +1130,9 @@ } }, "node_modules/playwright-core": { - "version": "1.55.1", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.55.1.tgz", - "integrity": "sha512-Z6Mh9mkwX+zxSlHqdr5AOcJnfp+xUWLCt9uKV18fhzA8eyxUd8NUWzAjxUh55RZKSYwDGX0cfaySdhZJGMoJ+w==", + "version": "1.56.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.56.1.tgz", + "integrity": "sha512-hutraynyn31F+Bifme+Ps9Vq59hKuUCz7H1kDOcBs+2oGguKkWTU50bBWrtz34OUWmIwpBTWDxaRPXrIXkgvmQ==", "dev": true, "license": "Apache-2.0", "bin": { @@ -1485,9 +1491,9 @@ } }, "node_modules/undici-types": { - "version": "7.13.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.13.0.tgz", - "integrity": "sha512-Ov2Rr9Sx+fRgagJ5AX0qvItZG/JKKoBRAVITs1zk7IqZGTJUwgUr7qoYBpWwakpWilTZFM98rG/AFRocu10iIQ==", + "version": "7.16.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz", + "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index ec726a9..45dbc65 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@qavajs/playwright-runner-adapter", - "version": "1.6.0", + "version": "1.7.0", "description": "adapter for playwright test runner", "main": "adapter/index.js", "types": "adapter/index.d.ts", @@ -19,14 +19,39 @@ "url": "https://github.com/qavajs/playwright-runner-adapter/issues" }, "dependencies": { - "@cucumber/gherkin": "^35.1.0", - "@cucumber/tag-expressions": "^6.2.0", + "@cucumber/gherkin": "^36.0.0", + "@cucumber/tag-expressions": "^8.0.0", "glob": "^11.0.3", "@cucumber/cucumber": "^12.2.0" }, "devDependencies": { - "@playwright/test": "^1.55.1", - "@types/node": "^24.6.2", + "@playwright/test": "^1.56.1", + "@types/node": "^24.9.1", "typescript": "^5.9.3" - } + }, + "keywords": [ + "test", + "automation", + "testing", + "qa", + "quality-assurance", + "test-framework", + "test-runner", + "test-automation", + "e2e", + "end-to-end", + "ui-testing", + "integration-testing", + "acceptance-testing", + "functional-testing", + "browser-testing", + "mobile-testing", + "cross-browser", + "bdd", + "gherkin", + "assertions", + "continuous-delivery", + "automation-framework", + "playwright" + ] } diff --git a/src/cucumber.spec.ts b/src/cucumber.spec.ts index b05ff26..d69690c 100644 --- a/src/cucumber.spec.ts +++ b/src/cucumber.spec.ts @@ -63,10 +63,11 @@ for (const feature of features) { const tag = [...new Set(testCase.tags.map((tag: { name: string }) => tag.name))]; const annotation = [ { type: 'name', description: testCase.name }, + { type: 'uri', description: testCase.uri }, { type: 'testId', description: testCase.id }, { type: 'tags', description: JSON.stringify(tag) } ]; - test(testCase.name, { tag, annotation: annotation }, async () => { + test(testCase.name, { tag, annotation }, async () => { const testInfo = test.info(); testInfo.result = { status: 'passed' }; for (const pickleStep of testCase.steps) { diff --git a/src/tags.ts b/src/filter.ts similarity index 53% rename from src/tags.ts rename to src/filter.ts index bc409c3..9fe8a75 100644 --- a/src/tags.ts +++ b/src/filter.ts @@ -1,4 +1,4 @@ -import parse from '@cucumber/tag-expressions' +import parse from '@cucumber/tag-expressions'; class TagExpression extends RegExp { private expressionNode: { @@ -23,8 +23,31 @@ class TagExpression extends RegExp { * import { tags } from '@qavajs/playwright-runner-adapter'; * export default defineConfig({ * grep: tags('@oneTag and @anotherTag') - * }) + * }); */ export function tags(tagExpression: string): RegExp { return new TagExpression(tagExpression); } + +class Filter extends RegExp { + constructor(private predicate: (testName: string) => boolean) { + super(''); + this.predicate = predicate; + } + + test(testName: string) { + return this.predicate(testName); + } +} + +/** + * Filter test cases by name + * @param {(testName: string) => boolean} predicate + * import { filter } from '@qavajs/playwright-runner-adapter'; + * export default defineConfig({ + * grep: filter(name => name.includes('login test')) + * }); + */ +export function filter(predicate: (testName: string) => boolean): RegExp { + return new Filter(predicate); +} \ No newline at end of file diff --git a/src/index.ts b/src/index.ts index 6350f93..2b6eb03 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,5 +1,5 @@ export * from './PlaywrightWorld'; export * from './defineCucumber'; -export * from './tags'; +export * from './filter'; export * from './Template'; export * from '@cucumber/cucumber'; diff --git a/test/playwright.config.ts b/test/playwright.config.ts index c602aa1..d3b2ba9 100644 --- a/test/playwright.config.ts +++ b/test/playwright.config.ts @@ -1,6 +1,5 @@ import { defineConfig, devices } from '@playwright/test'; -import { defineCucumber } from '../src/defineCucumber'; -import { tags } from '../src/tags'; +import { defineCucumber, tags } from '../src'; /** * See https://playwright.dev/docs/test-configuration.