From 1b7fe26f096f70564108ad17d66799eece0734b7 Mon Sep 17 00:00:00 2001 From: davidjgoss Date: Fri, 8 Nov 2024 11:40:06 +0000 Subject: [PATCH] Add support for new messages fields (#131) --- CHANGELOG.md | 6 + package-lock.json | 244 ++++++++++++++++++++++++++++----------- package.json | 10 +- src/Hook.ts | 3 + src/SupportCode.ts | 25 +++- src/TestCase.ts | 2 + src/TestPlan.ts | 3 + src/makeTestCase.ts | 3 +- src/makeTestPlan.ts | 4 +- src/types.ts | 1 + test/HookTest.ts | 59 ++++++++-- test/TestCaseTest.ts | 80 ++++++++----- test/TestPlanTest.ts | 3 +- test/TestStepTest.ts | 14 ++- test/makeTestCaseTest.ts | 19 ++- 15 files changed, 352 insertions(+), 124 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 85694739..47785794 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,12 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +### Added +- Populate `TestRunStarted.id`, `TestCase.testRunStartedId` and `TestRunFinished.testRunStartedId` on messages +- Populate `Hook.type` on messages + +### Changed +- Changed signatures of `makeTestCase` and `makeTestPlan` ## [17.0.0] - 2024-08-29 ### Removed diff --git a/package-lock.json b/package-lock.json index 4f084835..80c42e90 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,9 +9,9 @@ "version": "17.0.0", "license": "MIT", "dependencies": { - "@cucumber/ci-environment": "^10.0.0", + "@cucumber/ci-environment": "^10.0.1", "@cucumber/cucumber-expressions": "^18.0.0", - "@cucumber/tag-expressions": "^6.0.0", + "@cucumber/tag-expressions": "^6.1.0", "@types/stack-utils": "2.0.3", "commander": "12.1.0", "glob": "11.0.0", @@ -25,7 +25,7 @@ "@cucumber/gherkin-streams": "^5.0.1", "@cucumber/gherkin-utils": "^9.0.0", "@cucumber/message-streams": "^4.0.1", - "@cucumber/messages": "^24.0.0", + "@cucumber/messages": "^27.0.0", "@types/glob": "8.1.0", "@types/mocha": "10.0.9", "@types/node": "20.17.6", @@ -46,11 +46,11 @@ "typescript": "5.6.3" }, "peerDependencies": { - "@cucumber/gherkin": ">=24.0", + "@cucumber/gherkin": ">=30.0", "@cucumber/gherkin-streams": ">=5.0.1", "@cucumber/gherkin-utils": ">=8.0.0", "@cucumber/message-streams": ">=4.0.1", - "@cucumber/messages": ">=19.0" + "@cucumber/messages": ">=27.0" } }, "node_modules/@aashutoshrathi/word-wrap": { @@ -75,14 +75,16 @@ } }, "node_modules/@cucumber/ci-environment": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-10.0.0.tgz", - "integrity": "sha512-lRkiehckosIOdc7p1L44nZsttO5dVHFjpwKKWZ07x8SeoAdV/sPuGe1PISe0AmAowFGza62nMOgG4KaroGzwFQ==" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-10.0.1.tgz", + "integrity": "sha512-/+ooDMPtKSmvcPMDYnMZt4LuoipfFfHaYspStI4shqw8FyKcfQAmekz6G+QKWjQQrvM+7Hkljwx58MEwPCwwzg==", + "license": "MIT" }, "node_modules/@cucumber/cucumber-expressions": { "version": "18.0.1", "resolved": "https://registry.npmjs.org/@cucumber/cucumber-expressions/-/cucumber-expressions-18.0.1.tgz", "integrity": "sha512-NSid6bI+7UlgMywl5octojY5NXnxR9uq+JisjOrO52VbFsQM6gTWuQFE8syI10KnIBEdPzuEUSVEeZ0VFzRnZA==", + "license": "MIT", "dependencies": { "regexp-match-indices": "1.0.2" } @@ -92,6 +94,7 @@ "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-30.0.0.tgz", "integrity": "sha512-ng23BG8ASMUWNTbH1rL6I7d33CY9o3jgIpw3F0j7vL9Axm4mFngL0/6VPJ2HPZeBsFEzAcy7U9IdJNYIz4vFMQ==", "dev": true, + "license": "MIT", "dependencies": { "@cucumber/messages": ">=19.1.4 <=26" } @@ -144,10 +147,31 @@ "resolved": "https://registry.npmjs.org/@cucumber/gherkin/-/gherkin-28.0.0.tgz", "integrity": "sha512-Ee6zJQq0OmIUPdW0mSnsCsrWA2PZAELNDPICD2pLfs0Oz7RAPgj80UsD2UCtqyAhw2qAR62aqlktKUlai5zl/A==", "dev": true, + "license": "MIT", "dependencies": { "@cucumber/messages": ">=19.1.4 <=24" } }, + "node_modules/@cucumber/gherkin-utils/node_modules/@cucumber/messages": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-24.1.0.tgz", + "integrity": "sha512-hxVHiBurORcobhVk80I9+JkaKaNXkW6YwGOEFIh/2aO+apAN+5XJgUUWjng9NwqaQrW1sCFuawLB1AuzmBaNdQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/uuid": "9.0.8", + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.1", + "uuid": "9.0.1" + } + }, + "node_modules/@cucumber/gherkin-utils/node_modules/@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true, + "license": "MIT" + }, "node_modules/@cucumber/gherkin-utils/node_modules/commander": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", @@ -157,6 +181,41 @@ "node": ">=18" } }, + "node_modules/@cucumber/gherkin-utils/node_modules/reflect-metadata": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", + "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==", + "deprecated": "This version has a critical bug in fallback handling. Please upgrade to reflect-metadata@0.2.2 or newer.", + "dev": true, + "license": "Apache-2.0" + }, + "node_modules/@cucumber/gherkin-utils/node_modules/uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/@cucumber/gherkin/node_modules/@cucumber/messages": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-26.0.1.tgz", + "integrity": "sha512-DIxSg+ZGariumO+Lq6bn4kOUIUET83A4umrnWmidjGFl8XxkBieUZtsmNbLYgH/gnsmP07EfxxdTr0hOchV1Sg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/uuid": "10.0.0", + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.2", + "uuid": "10.0.0" + } + }, "node_modules/@cucumber/message-streams": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/@cucumber/message-streams/-/message-streams-4.0.1.tgz", @@ -167,40 +226,23 @@ } }, "node_modules/@cucumber/messages": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-24.0.0.tgz", - "integrity": "sha512-WQalT7z1j7QBZC3BiTpJjuy5i0ZyAY364gIwiqkkim0PmPHuII02TnXgYWl32ATf8tM9+RoojQVgcy5nP0vYgw==", + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-27.0.0.tgz", + "integrity": "sha512-w0Qfu+IibH/uAMcf8TZPvSXSrbf7BLIfIxMmYvwx31jH6wuBcf/3RQetutS7Ge98rydjmpRphs2HCbugySarCA==", "dev": true, + "license": "MIT", "dependencies": { - "@types/uuid": "9.0.7", + "@types/uuid": "10.0.0", "class-transformer": "0.5.1", - "reflect-metadata": "0.1.13", - "uuid": "9.0.1" - } - }, - "node_modules/@cucumber/messages/node_modules/@types/uuid": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.7.tgz", - "integrity": "sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==", - "dev": true - }, - "node_modules/@cucumber/messages/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true, - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "bin": { - "uuid": "dist/bin/uuid" + "reflect-metadata": "0.2.2", + "uuid": "10.0.0" } }, "node_modules/@cucumber/tag-expressions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-6.0.0.tgz", - "integrity": "sha512-JbNb/254Wn6b8cfrIJoqR0NekHXvoB/eMvSY4RK11H8k+YZfm7mZesu/3yVX67nkW+Y+PGjZFcgTMcfjwFRsRw==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-6.1.0.tgz", + "integrity": "sha512-+3DwRumrCJG27AtzCIL37A/X+A/gSfxOPLg8pZaruh5SLumsTmpvilwroVWBT2fPzmno/tGXypeK5a7NHU4RzA==", + "license": "MIT" }, "node_modules/@eslint-community/eslint-utils": { "version": "4.4.0", @@ -565,6 +607,13 @@ "@types/node": "*" } }, + "node_modules/@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true, + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", @@ -3397,10 +3446,11 @@ } }, "node_modules/reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", + "dev": true, + "license": "Apache-2.0" }, "node_modules/regexp-match-indices": { "version": "1.0.2", @@ -4113,6 +4163,20 @@ "punycode": "^2.1.0" } }, + "node_modules/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "dev": true, + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", @@ -4291,9 +4355,9 @@ } }, "@cucumber/ci-environment": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-10.0.0.tgz", - "integrity": "sha512-lRkiehckosIOdc7p1L44nZsttO5dVHFjpwKKWZ07x8SeoAdV/sPuGe1PISe0AmAowFGza62nMOgG4KaroGzwFQ==" + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/ci-environment/-/ci-environment-10.0.1.tgz", + "integrity": "sha512-/+ooDMPtKSmvcPMDYnMZt4LuoipfFfHaYspStI4shqw8FyKcfQAmekz6G+QKWjQQrvM+7Hkljwx58MEwPCwwzg==" }, "@cucumber/cucumber-expressions": { "version": "18.0.1", @@ -4310,6 +4374,20 @@ "dev": true, "requires": { "@cucumber/messages": ">=19.1.4 <=26" + }, + "dependencies": { + "@cucumber/messages": { + "version": "26.0.1", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-26.0.1.tgz", + "integrity": "sha512-DIxSg+ZGariumO+Lq6bn4kOUIUET83A4umrnWmidjGFl8XxkBieUZtsmNbLYgH/gnsmP07EfxxdTr0hOchV1Sg==", + "dev": true, + "requires": { + "@types/uuid": "10.0.0", + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.2", + "uuid": "10.0.0" + } + } } }, "@cucumber/gherkin-streams": { @@ -4352,11 +4430,41 @@ "@cucumber/messages": ">=19.1.4 <=24" } }, + "@cucumber/messages": { + "version": "24.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-24.1.0.tgz", + "integrity": "sha512-hxVHiBurORcobhVk80I9+JkaKaNXkW6YwGOEFIh/2aO+apAN+5XJgUUWjng9NwqaQrW1sCFuawLB1AuzmBaNdQ==", + "dev": true, + "requires": { + "@types/uuid": "9.0.8", + "class-transformer": "0.5.1", + "reflect-metadata": "0.2.1", + "uuid": "9.0.1" + } + }, + "@types/uuid": { + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true + }, "commander": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/commander/-/commander-12.0.0.tgz", "integrity": "sha512-MwVNWlYjDTtOjX5PiD7o5pK0UrFU/OYgcJfjjK4RaHZETNtjJqrZa9Y9ds88+A+f+d5lv+561eZ+yCKoS3gbAA==", "dev": true + }, + "reflect-metadata": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.1.tgz", + "integrity": "sha512-i5lLI6iw9AU3Uu4szRNPPEkomnkjRTaVt9hy/bn5g/oSzekBSMeLZblcjP74AW0vBabqERLLIrz+gR8QYR54Tw==", + "dev": true + }, + "uuid": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "dev": true } } }, @@ -4368,35 +4476,21 @@ "requires": {} }, "@cucumber/messages": { - "version": "24.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-24.0.0.tgz", - "integrity": "sha512-WQalT7z1j7QBZC3BiTpJjuy5i0ZyAY364gIwiqkkim0PmPHuII02TnXgYWl32ATf8tM9+RoojQVgcy5nP0vYgw==", + "version": "27.0.0", + "resolved": "https://registry.npmjs.org/@cucumber/messages/-/messages-27.0.0.tgz", + "integrity": "sha512-w0Qfu+IibH/uAMcf8TZPvSXSrbf7BLIfIxMmYvwx31jH6wuBcf/3RQetutS7Ge98rydjmpRphs2HCbugySarCA==", "dev": true, "requires": { - "@types/uuid": "9.0.7", + "@types/uuid": "10.0.0", "class-transformer": "0.5.1", - "reflect-metadata": "0.1.13", - "uuid": "9.0.1" - }, - "dependencies": { - "@types/uuid": { - "version": "9.0.7", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.7.tgz", - "integrity": "sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g==", - "dev": true - }, - "uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "dev": true - } + "reflect-metadata": "0.2.2", + "uuid": "10.0.0" } }, "@cucumber/tag-expressions": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-6.0.0.tgz", - "integrity": "sha512-JbNb/254Wn6b8cfrIJoqR0NekHXvoB/eMvSY4RK11H8k+YZfm7mZesu/3yVX67nkW+Y+PGjZFcgTMcfjwFRsRw==" + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@cucumber/tag-expressions/-/tag-expressions-6.1.0.tgz", + "integrity": "sha512-+3DwRumrCJG27AtzCIL37A/X+A/gSfxOPLg8pZaruh5SLumsTmpvilwroVWBT2fPzmno/tGXypeK5a7NHU4RzA==" }, "@eslint-community/eslint-utils": { "version": "4.4.0", @@ -4678,6 +4772,12 @@ "@types/node": "*" } }, + "@types/uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", + "dev": true + }, "@typescript-eslint/eslint-plugin": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.2.0.tgz", @@ -6652,9 +6752,9 @@ } }, "reflect-metadata": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", + "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", "dev": true }, "regexp-match-indices": { @@ -7134,6 +7234,12 @@ "punycode": "^2.1.0" } }, + "uuid": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-10.0.0.tgz", + "integrity": "sha512-8XkAphELsDnEGrDxUOHB3RGvXz6TeuYSGEZBOjtTtPm2lwhGBjLgOzLHB63IUWfBpNucQjND6d3AOudO+H3RWQ==", + "dev": true + }, "v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", diff --git a/package.json b/package.json index 961c6c12..546f1084 100644 --- a/package.json +++ b/package.json @@ -35,7 +35,7 @@ "@cucumber/gherkin-streams": "^5.0.1", "@cucumber/gherkin-utils": "^9.0.0", "@cucumber/message-streams": "^4.0.1", - "@cucumber/messages": "^24.0.0", + "@cucumber/messages": "^27.0.0", "@types/glob": "8.1.0", "@types/mocha": "10.0.9", "@types/node": "20.17.6", @@ -56,20 +56,20 @@ "typescript": "5.6.3" }, "dependencies": { - "@cucumber/ci-environment": "^10.0.0", + "@cucumber/ci-environment": "^10.0.1", "@cucumber/cucumber-expressions": "^18.0.0", - "@cucumber/tag-expressions": "^6.0.0", + "@cucumber/tag-expressions": "^6.1.0", "@types/stack-utils": "2.0.3", "commander": "12.1.0", "glob": "11.0.0", "stack-utils": "2.0.6" }, "peerDependencies": { - "@cucumber/gherkin": ">=24.0", + "@cucumber/gherkin": ">=30.0", "@cucumber/gherkin-streams": ">=5.0.1", "@cucumber/gherkin-utils": ">=8.0.0", "@cucumber/message-streams": ">=4.0.1", - "@cucumber/messages": ">=19.0" + "@cucumber/messages": ">=27.0" }, "directories": { "test": "test" diff --git a/src/Hook.ts b/src/Hook.ts index 6ee65afb..30261f99 100644 --- a/src/Hook.ts +++ b/src/Hook.ts @@ -1,4 +1,5 @@ import * as messages from '@cucumber/messages' +import { HookType } from '@cucumber/messages' import parseTagExpression from '@cucumber/tag-expressions' import SupportCodeExecutor from './SupportCodeExecutor' @@ -7,6 +8,7 @@ import { AnyBody, IHook, ISupportCodeExecutor } from './types' export default class Hook implements IHook { constructor( public readonly id: string, + private readonly type: HookType, private readonly tagExpression: string | null, private readonly sourceReference: messages.SourceReference, private readonly body: AnyBody, @@ -24,6 +26,7 @@ export default class Hook implements IHook { public toMessage(): messages.Envelope { const hook: messages.Hook = { id: this.id, + type: this.type, sourceReference: this.sourceReference, } diff --git a/src/SupportCode.ts b/src/SupportCode.ts index f7d78c92..f483e25f 100644 --- a/src/SupportCode.ts +++ b/src/SupportCode.ts @@ -4,6 +4,7 @@ import { ParameterTypeRegistry, } from '@cucumber/cucumber-expressions' import * as messages from '@cucumber/messages' +import { HookType } from '@cucumber/messages' import DateClock from './DateClock' import { MakeErrorMessage, withFullStackTrace } from './ErrorMessageGenerator' @@ -106,7 +107,12 @@ export default class SupportCode { body?: AnyBody ) { this.registerBeforeHook( - this.makeHook(sourceReference, tagExpressionOptionsOrBody, body) + this.makeHook( + HookType.BEFORE_TEST_CASE, + sourceReference, + tagExpressionOptionsOrBody, + body + ) ) } @@ -120,7 +126,12 @@ export default class SupportCode { body?: AnyBody ) { this.registerAfterHook( - this.makeHook(sourceReference, tagExpressionOptionsOrBody, body) + this.makeHook( + HookType.AFTER_TEST_CASE, + sourceReference, + tagExpressionOptionsOrBody, + body + ) ) } @@ -129,6 +140,7 @@ export default class SupportCode { } private makeHook( + type: HookType, sourceReference: messages.SourceReference, tagExpressionOptionsOrBody: string | HookOptions | AnyBody, body?: AnyBody @@ -147,6 +159,13 @@ export default class SupportCode { typeof tagExpressionOptionsOrBody === 'function' ? tagExpressionOptionsOrBody : body - return new Hook(this.newId(), tagExpression, sourceReference, body, name) + return new Hook( + this.newId(), + type, + tagExpression, + sourceReference, + body, + name + ) } } diff --git a/src/TestCase.ts b/src/TestCase.ts index 6d0f5ebd..14b6bf7e 100644 --- a/src/TestCase.ts +++ b/src/TestCase.ts @@ -9,6 +9,7 @@ const { millisecondsSinceEpochToTimestamp } = messages.TimeConversion export default class TestCase implements ITestCase { constructor( public readonly id: string, + private readonly runId: string, private readonly testSteps: ITestStep[], private readonly pickleId: string, private readonly clock: IClock @@ -18,6 +19,7 @@ export default class TestCase implements ITestCase { return { testCase: { id: this.id, + testRunStartedId: this.runId, pickleId: this.pickleId, testSteps: this.testSteps.map((step) => step.toMessage()), }, diff --git a/src/TestPlan.ts b/src/TestPlan.ts index dbd39a32..e28cb849 100644 --- a/src/TestPlan.ts +++ b/src/TestPlan.ts @@ -5,6 +5,7 @@ import { EnvelopeListener, ITestCase, ITestPlan, RunOptions } from './types' export default class TestPlan implements ITestPlan { constructor( + private readonly runId: string, private readonly testCases: ITestCase[], private readonly supportCode: SupportCode, private readonly runOptions: RunOptions @@ -30,6 +31,7 @@ export default class TestPlan implements ITestPlan { listener({ testRunStarted: { + id: this.runId, timestamp: messages.TimeConversion.millisecondsSinceEpochToTimestamp( this.supportCode.clock.clockNow() ), @@ -60,6 +62,7 @@ export default class TestPlan implements ITestPlan { } listener({ testRunFinished: { + testRunStartedId: this.runId, timestamp: messages.TimeConversion.millisecondsSinceEpochToTimestamp( this.supportCode.clock.clockNow() ), diff --git a/src/makeTestCase.ts b/src/makeTestCase.ts index d1fc46f5..16c2dacb 100644 --- a/src/makeTestCase.ts +++ b/src/makeTestCase.ts @@ -14,6 +14,7 @@ import { } from './types' export default function makeTestCase( + runId: string, pickle: messages.Pickle, stepDefinitions: readonly IStepDefinition[], beforeHooks: readonly IHook[], @@ -67,7 +68,7 @@ export default function makeTestCase( .concat(pickleTestSteps) .concat(afterHookSteps) - return new TestCase(newId(), testSteps, pickle.id, clock) + return new TestCase(newId(), runId, testSteps, pickle.id, clock) } function makeHookSteps( diff --git a/src/makeTestPlan.ts b/src/makeTestPlan.ts index bda0320b..03b98474 100644 --- a/src/makeTestPlan.ts +++ b/src/makeTestPlan.ts @@ -12,9 +12,11 @@ export default function makeTestPlan( runOptions: RunOptions, makeTestCase: MakeTestCase ): ITestPlan { + const runId = supportCode.newId() const pickles = gherkinQuery.getPickles() const testCases = pickles.map((pickle) => makeTestCase( + runId, pickle, supportCode.stepDefinitions, supportCode.beforeHooks, @@ -29,5 +31,5 @@ export default function makeTestPlan( ) ) - return new TestPlan(testCases, supportCode, runOptions) + return new TestPlan(runId, testCases, supportCode, runOptions) } diff --git a/src/types.ts b/src/types.ts index 18533311..1983ac8a 100644 --- a/src/types.ts +++ b/src/types.ts @@ -104,6 +104,7 @@ export type MakeHookTestStep = ( ) => ITestStep export type MakeTestCase = ( + runId: string, pickle: messages.Pickle, stepDefinitions: readonly IStepDefinition[], beforeHooks: readonly IHook[], diff --git a/test/HookTest.ts b/test/HookTest.ts index 21b8e171..c6c75538 100644 --- a/test/HookTest.ts +++ b/test/HookTest.ts @@ -1,4 +1,5 @@ import * as messages from '@cucumber/messages' +import { Envelope, HookType } from '@cucumber/messages' import assert from 'assert' import Hook from '../src/Hook' @@ -7,9 +8,15 @@ import TestWorld from './TestWorld' describe('Hook', () => { describe('#match', () => { it("does not return a SupportCodeExecutor if the hook's tag expression does not match", () => { - const hook = new Hook('hook-id', 'not @foo', null, () => { - throw new Error('unexpected') - }) + const hook = new Hook( + 'hook-id', + HookType.BEFORE_TEST_CASE, + 'not @foo', + null, + () => { + throw new Error('unexpected') + } + ) const pickle: messages.Pickle = { tags: [{ name: '@foo', astNodeId: '1' }], astNodeIds: [], @@ -25,9 +32,15 @@ describe('Hook', () => { }) it("returns a SupportCodeExecutor if the hook's tag expression matches", () => { - const hook = new Hook('hook-id', 'not @foo', null, () => { - return 'something' - }) + const hook = new Hook( + 'hook-id', + HookType.BEFORE_TEST_CASE, + 'not @foo', + null, + () => { + return 'something' + } + ) const pickle: messages.Pickle = { tags: [{ name: '@bar', astNodeId: '1' }], astNodeIds: [], @@ -43,9 +56,15 @@ describe('Hook', () => { }) it('returns a SupportCodeExecutor if the hook has no tag expression', () => { - const hook = new Hook('hook-id', null, null, () => { - return 'something' - }) + const hook = new Hook( + 'hook-id', + HookType.BEFORE_TEST_CASE, + null, + null, + () => { + return 'something' + } + ) const pickle: messages.Pickle = { tags: [{ name: '@bar', astNodeId: '1' }], astNodeIds: [], @@ -60,4 +79,26 @@ describe('Hook', () => { assert.strictEqual(executor.execute(new TestWorld()), 'something') }) }) + + describe('#toMessage', () => { + it('converts to hook message', () => { + const hook = new Hook( + 'hook-id', + HookType.BEFORE_TEST_CASE, + null, + { uri: '/some/file.ts' }, + () => { + return 'something' + } + ) + + assert.deepStrictEqual(hook.toMessage(), { + hook: { + id: 'hook-id', + type: HookType.BEFORE_TEST_CASE, + sourceReference: { uri: '/some/file.ts' }, + }, + }) + }) + }) }) diff --git a/test/TestCaseTest.ts b/test/TestCaseTest.ts index 3a3096a7..fcadc8ed 100644 --- a/test/TestCaseTest.ts +++ b/test/TestCaseTest.ts @@ -3,6 +3,7 @@ import { ParameterTypeRegistry, } from '@cucumber/cucumber-expressions' import * as messages from '@cucumber/messages' +import { Envelope } from '@cucumber/messages' import assert from 'assert' import { @@ -16,42 +17,40 @@ import ExpressionStepDefinition from '../src/ExpressionStepDefinition' import TestCase from '../src/TestCase' describe('TestCase', () => { - describe('#execute', () => { - let passedPickleTestStep: ITestStep - beforeEach(() => { - const stepDefinition = new ExpressionStepDefinition( - 'an-id', - new CucumberExpression( - 'an ambiguous step', - new ParameterTypeRegistry() - ), - null, - () => { - throw new Error('Should now be run') - } - ) + let passedPickleTestStep: ITestStep + beforeEach(() => { + const stepDefinition = new ExpressionStepDefinition( + 'an-id', + new CucumberExpression('an ambiguous step', new ParameterTypeRegistry()), + null, + () => { + throw new Error('Should now be run') + } + ) - passedPickleTestStep = makePickleTestStep( - 'some-test-step-id', - { - text: 'an ambiguous step', - type: messages.PickleStepType.UNKNOWN, - astNodeIds: [], - id: '1', - }, - [stepDefinition], - ['some.feature:234'], - new IncrementClock(), - new IncrementStopwatch(), - withSourceFramesOnlyStackTrace() - ) - }) + passedPickleTestStep = makePickleTestStep( + 'some-test-step-id', + { + text: 'an ambiguous step', + type: messages.PickleStepType.UNKNOWN, + astNodeIds: [], + id: '1', + }, + [stepDefinition], + ['some.feature:234'], + new IncrementClock(), + new IncrementStopwatch(), + withSourceFramesOnlyStackTrace() + ) + }) + describe('#execute', () => { it('emits TestCaseStarted and TestCaseFinished messages', async () => { const emitted: messages.Envelope[] = [] const testSteps: ITestStep[] = [passedPickleTestStep] const testCase = new TestCase( 'some-test-case-id', + 'run-id', testSteps, 'some-pickle-id', new IncrementClock() @@ -77,6 +76,7 @@ describe('TestCase', () => { const testSteps: ITestStep[] = [passedPickleTestStep] const testCase = new TestCase( 'some-test-case-id', + 'run-id', testSteps, 'some-pickle-id', new IncrementClock() @@ -95,4 +95,26 @@ describe('TestCase', () => { assert.strictEqual(testCaseFinished.willBeRetried, true) }) }) + + describe('#toMessage', () => { + it('converts to TestCase message', () => { + const testSteps: ITestStep[] = [passedPickleTestStep] + const testCase = new TestCase( + 'some-test-case-id', + 'run-id', + testSteps, + 'some-pickle-id', + new IncrementClock() + ) + + assert.deepStrictEqual(testCase.toMessage(), { + testCase: { + id: 'some-test-case-id', + testRunStartedId: 'run-id', + pickleId: 'some-pickle-id', + testSteps: testSteps.map((testStep) => testStep.toMessage()), + }, + }) + }) + }) }) diff --git a/test/TestPlanTest.ts b/test/TestPlanTest.ts index fccce131..9c4413ec 100644 --- a/test/TestPlanTest.ts +++ b/test/TestPlanTest.ts @@ -248,6 +248,7 @@ async function makeTestPlan( .getPickles() .map((pickle) => makeTestCase( + 'run-id', pickle, supportCode.stepDefinitions, supportCode.beforeHooks, @@ -262,7 +263,7 @@ async function makeTestPlan( ) ) - return new TestPlan(testCases, supportCode, runOptions) + return new TestPlan('run-id', testCases, supportCode, runOptions) } function extractEnvelopes( diff --git a/test/TestStepTest.ts b/test/TestStepTest.ts index 05f80d39..0df24220 100644 --- a/test/TestStepTest.ts +++ b/test/TestStepTest.ts @@ -4,7 +4,7 @@ import { } from '@cucumber/cucumber-expressions' import { Query } from '@cucumber/gherkin-utils' import * as messages from '@cucumber/messages' -import { TimeConversion } from '@cucumber/messages' +import { HookType, TimeConversion } from '@cucumber/messages' import assert from 'assert' import { @@ -153,9 +153,15 @@ describe('TestStep', () => { withSourceFramesOnlyStackTrace() ) - const hook = new Hook('hook-id', null, { uri: 'hook.ts' }, () => { - throw new Error() - }) + const hook = new Hook( + 'hook-id', + HookType.AFTER_TEST_CASE, + null, + { uri: 'hook.ts' }, + () => { + throw new Error() + } + ) failedHookTestStep = makeHookTestStep( { name: 'hello', diff --git a/test/makeTestCaseTest.ts b/test/makeTestCaseTest.ts index 1c3090c4..f249e780 100644 --- a/test/makeTestCaseTest.ts +++ b/test/makeTestCaseTest.ts @@ -4,6 +4,7 @@ import { } from '@cucumber/cucumber-expressions' import { Query as GherkinQuery } from '@cucumber/gherkin-utils' import * as messages from '@cucumber/messages' +import { HookType } from '@cucumber/messages' import assert from 'assert' import { withSourceFramesOnlyStackTrace } from '../src/ErrorMessageGenerator' @@ -21,6 +22,7 @@ describe('makeTestCase', () => { const pickle = makePickleWithTwoSteps() const stepDefinitions = makeStepDefinitions() const testCase = makeTestCase( + 'run-id', pickle, stepDefinitions, [], @@ -53,6 +55,7 @@ describe('makeTestCase', () => { uri: 'uri', } const testCase = makeTestCase( + 'run-id', pickle, [], [], @@ -83,10 +86,19 @@ describe('makeTestCase', () => { context('when hooks are defined', () => { context('when a before hook matches', () => { it('adds a step before the scenario ones', () => { - const beforeHooks = [new Hook('hook-id', null, null, () => null)] + const beforeHooks = [ + new Hook( + 'hook-id', + HookType.BEFORE_TEST_CASE, + null, + null, + () => null + ), + ] const pickle = makePickleWithTwoSteps() const stepDefinitions = makeStepDefinitions() const testCase = makeTestCase( + 'run-id', pickle, stepDefinitions, beforeHooks, @@ -114,10 +126,13 @@ describe('makeTestCase', () => { context('when an after hook matches', () => { it('adds a step after the scenario ones', () => { - const afterHooks = [new Hook('hook-id', null, null, () => null)] + const afterHooks = [ + new Hook('hook-id', HookType.BEFORE_TEST_CASE, null, null, () => null), + ] const pickle = makePickleWithTwoSteps() const stepDefinitions = makeStepDefinitions() const testCase = makeTestCase( + 'run-id', pickle, stepDefinitions, [],