@serenity-js/playwright-test 3.18.0 → 3.19.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -3,6 +3,32 @@
3
3
  All notable changes to this project will be documented in this file.
4
4
  See [Conventional Commits](https://conventionalcommits.org) for commit guidelines.
5
5
 
6
+ # [3.19.0](https://github.com/serenity-js/serenity-js/compare/v3.18.1...v3.19.0) (2024-03-01)
7
+
8
+
9
+ ### Bug Fixes
10
+
11
+ * **console-reporter:** fix comments ([e8b21dd](https://github.com/serenity-js/serenity-js/commit/e8b21ddb40c5addc53bdcfb212770f199f026e11))
12
+
13
+
14
+ ### Features
15
+
16
+ * **console-reporter:** global exception handling v1 ([cf117f1](https://github.com/serenity-js/serenity-js/commit/cf117f16ba6623e45b3bcf0d357a91539700f55b))
17
+ * **console-reporter:** revert to only global error handling ([a375788](https://github.com/serenity-js/serenity-js/commit/a3757886275c854c8cc6d55aedbc0d26916cde9f))
18
+ * **console-reporter:** test with reporter developement ([85e2bf1](https://github.com/serenity-js/serenity-js/commit/85e2bf1ad06b00aa7d917e762ce0c2e0cb964533))
19
+
20
+
21
+
22
+
23
+
24
+ ## [3.18.1](https://github.com/serenity-js/serenity-js/compare/v3.18.0...v3.18.1) (2024-02-23)
25
+
26
+ **Note:** Version bump only for package @serenity-js/playwright-test
27
+
28
+
29
+
30
+
31
+
6
32
  # [3.18.0](https://github.com/serenity-js/serenity-js/compare/v3.17.0...v3.18.0) (2024-02-17)
7
33
 
8
34
  **Note:** Version bump only for package @serenity-js/playwright-test
@@ -1,5 +1,5 @@
1
1
  import type { FullConfig } from '@playwright/test';
2
- import type { Reporter, Suite, TestCase, TestResult } from '@playwright/test/reporter';
2
+ import type { Reporter, Suite, TestCase, TestError, TestResult } from '@playwright/test/reporter';
3
3
  import type { ClassDescription, Serenity, StageCrewMember, StageCrewMemberBuilder } from '@serenity-js/core';
4
4
  import type { OutputStream } from '@serenity-js/core/lib/adapter';
5
5
  import { RequirementsHierarchy } from '@serenity-js/core/lib/io';
@@ -39,6 +39,7 @@ export declare class SerenityReporterForPlaywrightTest implements Reporter {
39
39
  private requirementsHierarchy;
40
40
  private errorParser;
41
41
  private sceneIds;
42
+ private unhandledError?;
42
43
  /**
43
44
  * @param config
44
45
  * @param serenity
@@ -51,6 +52,7 @@ export declare class SerenityReporterForPlaywrightTest implements Reporter {
51
52
  onBegin(config: FullConfig, suite: Suite): void;
52
53
  onTestBegin(test: TestCase): void;
53
54
  onTestEnd(test: TestCase, result: TestResult): void;
55
+ onError(error: TestError): void;
54
56
  private determineScenarioOutcome;
55
57
  private outcomeFrom;
56
58
  private scenarioDetailsFrom;
@@ -1 +1 @@
1
- {"version":3,"file":"SerenityReporterForPlaywrightTest.d.ts","sourceRoot":"","sources":["../../src/reporter/SerenityReporterForPlaywrightTest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAa,UAAU,EAAE,MAAM,2BAA2B,CAAC;AAClG,OAAO,KAAK,EAAE,gBAAgB,EAAE,QAAQ,EAAE,eAAe,EAAE,sBAAsB,EAAa,MAAM,mBAAmB,CAAC;AAExH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAclE,OAAO,EAAwC,qBAAqB,EAAE,MAAM,0BAA0B,CAAC;AAkBvG;;;;GAIG;AACH,MAAM,WAAW,uCAAuC;IAEpD;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,eAAe,GAAG,sBAAsB,GAAG,gBAAgB,CAAC,CAAC;IAE1E;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC/B;AAED;;;;GAIG;AACH,qBAAa,iCAAkC,YAAW,QAAQ;IAe1D,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,qBAAqB;IAdjC,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,QAAQ,CAAyC;IAEzD;;;;;;;OAOG;gBAEC,MAAM,EAAE,uCAAuC,EAC9B,QAAQ,GAAE,QAAmC,EACtD,qBAAqB,GAAE,qBAA2F;IAK9H,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAM/C,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IA6BjC,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IA0CnD,OAAO,CAAC,wBAAwB;IAUhC,OAAO,CAAC,WAAW;IAwBnB,OAAO,CAAC,mBAAmB;IAqBrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAiB5B,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,qBAAqB;IA8B7B,OAAO,CAAC,GAAG;IAIX,aAAa,IAAI,OAAO;CAG3B"}
1
+ {"version":3,"file":"SerenityReporterForPlaywrightTest.d.ts","sourceRoot":"","sources":["../../src/reporter/SerenityReporterForPlaywrightTest.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,UAAU,EAAG,MAAM,2BAA2B,CAAC;AACnG,OAAO,KAAK,EACR,gBAAgB,EAChB,QAAQ,EACR,eAAe,EACf,sBAAsB,EAEzB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAclE,OAAO,EAAwC,qBAAqB,EAAG,MAAM,0BAA0B,CAAC;AAkBxG;;;;GAIG;AACH,MAAM,WAAW,uCAAuC;IACpD;;;;;;;;OAQG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,eAAe,GAAG,sBAAsB,GAAG,gBAAgB,CAAC,CAAC;IAE1E;;;;;;;OAOG;IACH,YAAY,CAAC,EAAE,YAAY,CAAC;CAC/B;AAED;;;;GAIG;AACH,qBAAa,iCAAkC,YAAW,QAAQ;IAe1D,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,qBAAqB;IAfjC,OAAO,CAAC,WAAW,CAA+B;IAClD,OAAO,CAAC,QAAQ,CAAyC;IACzD,OAAO,CAAC,cAAc,CAAC,CAAQ;IAE/B;;;;;;;OAOG;gBAEC,MAAM,EAAE,uCAAuC,EAC9B,QAAQ,GAAE,QAAmC,EACtD,qBAAqB,GAAE,qBAE9B;IAKL,OAAO,CAAC,MAAM,EAAE,UAAU,EAAE,KAAK,EAAE,KAAK,GAAG,IAAI;IAQ/C,WAAW,CAAC,IAAI,EAAE,QAAQ,GAAG,IAAI;IAqCjC,SAAS,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,GAAG,IAAI;IAyCnD,OAAO,CAAC,KAAK,EAAE,SAAS,GAAG,IAAI;IAM/B,OAAO,CAAC,wBAAwB;IAahC,OAAO,CAAC,WAAW;IA0BnB,OAAO,CAAC,mBAAmB;IAqBrB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B5B,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,qBAAqB;IA2B7B,OAAO,CAAC,GAAG;IAIX,aAAa,IAAI,OAAO;CAG3B"}
@@ -40,6 +40,7 @@ class SerenityReporterForPlaywrightTest {
40
40
  requirementsHierarchy;
41
41
  errorParser = new PlaywrightErrorParser();
42
42
  sceneIds = new Map();
43
+ unhandledError;
43
44
  /**
44
45
  * @param config
45
46
  * @param serenity
@@ -62,7 +63,8 @@ class SerenityReporterForPlaywrightTest {
62
63
  this.sceneIds.set(test.id, currentSceneId);
63
64
  const scenario = this.scenarioDetailsFrom(test);
64
65
  const tags = model_1.Tags.from(`${scenario.category.toString()} ${scenario.name.toString().replace(')', '')}`);
65
- this.emit(new events_1.SceneStarts(currentSceneId, scenario, this.serenity.currentTime()), ...this.requirementsHierarchy.requirementTagsFor(scenario.location.path, scenario.category.value)
66
+ this.emit(new events_1.SceneStarts(currentSceneId, scenario, this.serenity.currentTime()), ...this.requirementsHierarchy
67
+ .requirementTagsFor(scenario.location.path, scenario.category.value)
66
68
  .map(tag => new events_1.SceneTagged(currentSceneId, tag, this.serenity.currentTime())), new events_1.TestRunnerDetected(currentSceneId, new model_1.Name('Playwright'), this.serenity.currentTime()), ...tags.map(tag => new events_1.SceneTagged(currentSceneId, tag, this.serenity.currentTime())));
67
69
  }
68
70
  // TODO might be nice to support that by emitting TestStepStarted / Finished
@@ -95,6 +97,11 @@ class SerenityReporterForPlaywrightTest {
95
97
  const scenarioOutcome = this.outcomeFrom(test, result);
96
98
  this.serenity.announce(new events_1.SceneFinished(currentSceneId, this.scenarioDetailsFrom(test), this.determineScenarioOutcome(worstInteractionOutcome, scenarioOutcome), this.now()));
97
99
  }
100
+ onError(error) {
101
+ if (!this.unhandledError) {
102
+ this.unhandledError = this.errorParser.errorFrom(error);
103
+ }
104
+ }
98
105
  determineScenarioOutcome(worstInteractionOutcome, scenarioOutcome) {
99
106
  if (worstInteractionOutcome instanceof model_1.ExecutionFailedWithAssertionError) {
100
107
  return worstInteractionOutcome;
@@ -123,16 +130,17 @@ class SerenityReporterForPlaywrightTest {
123
130
  const [root_, browserName_, fileName, describeOrItBlockTitle, ...nestedTitles] = test.titlePath();
124
131
  const path = new io_1.Path(test.location.file);
125
132
  const scenarioName = nestedTitles.join(' ').trim();
126
- const featureName = scenarioName
127
- ? describeOrItBlockTitle
128
- : fileName;
133
+ const featureName = scenarioName ? describeOrItBlockTitle : fileName;
129
134
  return new model_1.ScenarioDetails(new model_1.Name(scenarioName || describeOrItBlockTitle), new model_1.Category(featureName), new io_1.FileSystemLocation(path, test.location.line, test.location.column));
130
135
  }
131
136
  async onEnd() {
132
137
  this.serenity.announce(new events_1.TestRunFinishes(this.serenity.currentTime()));
133
138
  try {
134
139
  await this.serenity.waitForNextCue();
135
- this.serenity.announce(new events_1.TestRunFinished(new model_1.ExecutionSuccessful(), this.serenity.currentTime()));
140
+ const outcome = this.unhandledError ?
141
+ new model_1.ExecutionFailedWithError(this.unhandledError)
142
+ : new model_1.ExecutionSuccessful();
143
+ this.serenity.announce(new events_1.TestRunFinished(outcome, this.serenity.currentTime()));
136
144
  }
137
145
  catch (error) {
138
146
  this.serenity.announce(new events_1.TestRunFinished(new model_1.ExecutionFailedWithError(error), this.serenity.currentTime()));
@@ -143,7 +151,7 @@ class SerenityReporterForPlaywrightTest {
143
151
  // reporter.onStdErr(chunk, test, result)
144
152
  // reporter.onStdOut(chunk, test, result)
145
153
  emit(...events) {
146
- events.forEach(event => {
154
+ events.forEach((event) => {
147
155
  this.serenity.announce(event);
148
156
  });
149
157
  }
@@ -1 +1 @@
1
- {"version":3,"file":"SerenityReporterForPlaywrightTest.js","sourceRoot":"","sources":["../../src/reporter/SerenityReporterForPlaywrightTest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"SerenityReporterForPlaywrightTest.js","sourceRoot":"","sources":["../../src/reporter/SerenityReporterForPlaywrightTest.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@serenity-js/playwright-test",
3
- "version": "3.18.0",
3
+ "version": "3.19.0",
4
4
  "description": "Serenity/JS reporter and test APIs for Playwright Test",
5
5
  "author": {
6
6
  "name": "Jan Molak",
@@ -46,16 +46,16 @@
46
46
  },
47
47
  "dependencies": {
48
48
  "@playwright/test": "1.41.2",
49
- "@serenity-js/core": "3.18.0",
50
- "@serenity-js/playwright": "3.18.0",
51
- "@serenity-js/rest": "3.18.0",
52
- "@serenity-js/web": "3.18.0",
49
+ "@serenity-js/core": "3.19.0",
50
+ "@serenity-js/playwright": "3.19.0",
51
+ "@serenity-js/rest": "3.19.0",
52
+ "@serenity-js/web": "3.19.0",
53
53
  "deepmerge": "4.3.1",
54
54
  "tiny-types": "1.21.0"
55
55
  },
56
56
  "devDependencies": {
57
57
  "@integration/testing-tools": "3.0.0",
58
- "@types/chai": "4.3.11",
58
+ "@types/chai": "4.3.12",
59
59
  "@types/mocha": "10.0.6",
60
60
  "c8": "9.1.0",
61
61
  "mocha": "10.3.0",
@@ -63,5 +63,5 @@
63
63
  "ts-node": "10.9.2",
64
64
  "typescript": "5.2.2"
65
65
  },
66
- "gitHead": "c4f12cc2dd366788b88fd06b4452084a6b36b5fe"
66
+ "gitHead": "6bc255b85d3e74d000b1584a64e460cc5adc1e23"
67
67
  }
@@ -1,7 +1,13 @@
1
1
  import type { FullConfig } from '@playwright/test';
2
- import type { Reporter, Suite, TestCase, TestError, TestResult } from '@playwright/test/reporter';
3
- import type { ClassDescription, Serenity, StageCrewMember, StageCrewMemberBuilder, Timestamp } from '@serenity-js/core';
4
- import { LogicError, serenity as reporterSerenityInstance } from '@serenity-js/core';
2
+ import type { Reporter, Suite, TestCase, TestError, TestResult, } from '@playwright/test/reporter';
3
+ import type {
4
+ ClassDescription,
5
+ Serenity,
6
+ StageCrewMember,
7
+ StageCrewMemberBuilder,
8
+ Timestamp,
9
+ } from '@serenity-js/core';
10
+ import { LogicError, serenity as reporterSerenityInstance, } from '@serenity-js/core';
5
11
  import type { OutputStream } from '@serenity-js/core/lib/adapter';
6
12
  import type { DomainEvent } from '@serenity-js/core/lib/events';
7
13
  import * as events from '@serenity-js/core/lib/events';
@@ -16,7 +22,7 @@ import {
16
22
  TestRunnerDetected,
17
23
  TestRunStarts
18
24
  } from '@serenity-js/core/lib/events';
19
- import { FileSystem, FileSystemLocation, Path, RequirementsHierarchy } from '@serenity-js/core/lib/io';
25
+ import { FileSystem, FileSystemLocation, Path, RequirementsHierarchy, } from '@serenity-js/core/lib/io';
20
26
  import type { CorrelationId, Outcome, Tag } from '@serenity-js/core/lib/model';
21
27
  import {
22
28
  ArbitraryTag,
@@ -40,7 +46,6 @@ import { SERENITY_JS_DOMAIN_EVENTS_ATTACHMENT_CONTENT_TYPE } from './PlaywrightA
40
46
  * See {@apilink SerenityOptions} for usage examples.
41
47
  */
42
48
  export interface SerenityReporterForPlaywrightTestConfig {
43
-
44
49
  /**
45
50
  * A list of {@apilink StageCrewMemberBuilder|StageCrewMemberBuilders} or {@apilink StageCrewMember|StageCrewMembers}
46
51
  * to be instantiated in Playwright Test reporter process and notified of {@apilink DomainEvent|DomainEvents} that occur during the scenario execution.
@@ -69,9 +74,9 @@ export interface SerenityReporterForPlaywrightTestConfig {
69
74
  * Serenity/JS {@apilink StageCrewMember|stage crew members}.
70
75
  */
71
76
  export class SerenityReporterForPlaywrightTest implements Reporter {
72
-
73
77
  private errorParser = new PlaywrightErrorParser();
74
78
  private sceneIds: Map<string, CorrelationId> = new Map();
79
+ private unhandledError?: Error;
75
80
 
76
81
  /**
77
82
  * @param config
@@ -84,33 +89,45 @@ export class SerenityReporterForPlaywrightTest implements Reporter {
84
89
  constructor(
85
90
  config: SerenityReporterForPlaywrightTestConfig,
86
91
  private readonly serenity: Serenity = reporterSerenityInstance,
87
- private requirementsHierarchy: RequirementsHierarchy = new RequirementsHierarchy(new FileSystem(Path.from(process.cwd()))),
92
+ private requirementsHierarchy: RequirementsHierarchy = new RequirementsHierarchy(
93
+ new FileSystem(Path.from(process.cwd())),
94
+ ),
88
95
  ) {
89
96
  this.serenity.configure(config);
90
97
  }
91
98
 
92
99
  onBegin(config: FullConfig, suite: Suite): void {
93
- this.requirementsHierarchy = new RequirementsHierarchy(new FileSystem(Path.from(config.rootDir)));
100
+ this.requirementsHierarchy = new RequirementsHierarchy(
101
+ new FileSystem(Path.from(config.rootDir)),
102
+ );
94
103
 
95
104
  this.serenity.announce(new TestRunStarts(this.now()));
96
105
  }
97
106
 
98
107
  onTestBegin(test: TestCase): void {
99
-
100
108
  const currentSceneId = this.serenity.assignNewSceneId();
101
109
 
102
110
  this.sceneIds.set(test.id, currentSceneId);
103
111
 
104
112
  const scenario = this.scenarioDetailsFrom(test);
105
-
106
- const tags: Tag[] = Tags.from(`${scenario.category.toString()} ${scenario.name.toString().replace(')', '')}`);
113
+
114
+ const tags: Tag[] = Tags.from(
115
+ `${ scenario.category.toString() } ${ scenario.name.toString().replace(')', '') }`,
116
+ );
107
117
 
108
118
  this.emit(
109
119
  new SceneStarts(currentSceneId, scenario, this.serenity.currentTime()),
110
120
 
111
- ...this.requirementsHierarchy.requirementTagsFor(scenario.location.path, scenario.category.value)
121
+ ...this.requirementsHierarchy
122
+ .requirementTagsFor(scenario.location.path, scenario.category.value)
112
123
  .map(tag => new SceneTagged(currentSceneId, tag, this.serenity.currentTime())),
113
- new TestRunnerDetected(currentSceneId, new Name('Playwright'), this.serenity.currentTime()),
124
+
125
+ new TestRunnerDetected(
126
+ currentSceneId,
127
+ new Name('Playwright'),
128
+ this.serenity.currentTime(),
129
+ ),
130
+
114
131
  ...tags.map(tag => new SceneTagged(currentSceneId, tag, this.serenity.currentTime())),
115
132
  );
116
133
  }
@@ -125,7 +142,6 @@ export class SerenityReporterForPlaywrightTest implements Reporter {
125
142
  // }
126
143
 
127
144
  onTestEnd(test: TestCase, result: TestResult): void {
128
-
129
145
  this.announceRetryIfNeeded(test, result);
130
146
 
131
147
  const currentSceneId = this.sceneIds.get(test.id);
@@ -162,11 +178,20 @@ export class SerenityReporterForPlaywrightTest implements Reporter {
162
178
  this.scenarioDetailsFrom(test),
163
179
  this.determineScenarioOutcome(worstInteractionOutcome, scenarioOutcome),
164
180
  this.now(),
165
- )
181
+ ),
166
182
  );
167
183
  }
168
184
 
169
- private determineScenarioOutcome(worstInteractionOutcome: Outcome, scenarioOutcome: Outcome): Outcome {
185
+ onError(error: TestError): void {
186
+ if (!this.unhandledError) {
187
+ this.unhandledError = this.errorParser.errorFrom(error);
188
+ }
189
+ }
190
+
191
+ private determineScenarioOutcome(
192
+ worstInteractionOutcome: Outcome,
193
+ scenarioOutcome: Outcome,
194
+ ): Outcome {
170
195
  if (worstInteractionOutcome instanceof ExecutionFailedWithAssertionError) {
171
196
  return worstInteractionOutcome;
172
197
  }
@@ -177,7 +202,6 @@ export class SerenityReporterForPlaywrightTest implements Reporter {
177
202
  }
178
203
 
179
204
  private outcomeFrom(test: TestCase, result: TestResult): Outcome {
180
-
181
205
  const outcome = test.outcome();
182
206
 
183
207
  if (outcome === 'skipped') {
@@ -185,39 +209,42 @@ export class SerenityReporterForPlaywrightTest implements Reporter {
185
209
  }
186
210
 
187
211
  if (outcome === 'unexpected' && result.status === 'passed') {
188
- return new ExecutionFailedWithError(new LogicError(`Scenario expected to fail, but ${ result.status }`));
212
+ return new ExecutionFailedWithError(
213
+ new LogicError(`Scenario expected to fail, but ${ result.status }`),
214
+ );
189
215
  }
190
216
 
191
- if (['failed', 'interrupted', 'timedOut'].includes(result.status)) {
192
-
217
+ if ([ 'failed', 'interrupted', 'timedOut' ].includes(result.status)) {
193
218
  if (test.retries > result.retry) {
194
219
  return new ExecutionIgnored(this.errorParser.errorFrom(result.error));
195
220
  }
196
221
 
197
- return new ExecutionFailedWithError(this.errorParser.errorFrom(result.error));
222
+ return new ExecutionFailedWithError(
223
+ this.errorParser.errorFrom(result.error),
224
+ );
198
225
  }
199
226
 
200
227
  return new ExecutionSuccessful();
201
228
  }
202
229
 
203
230
  private scenarioDetailsFrom(test: TestCase) {
204
- const [ root_, browserName_, fileName, describeOrItBlockTitle, ...nestedTitles] = test.titlePath();
231
+ const [
232
+ root_,
233
+ browserName_,
234
+ fileName,
235
+ describeOrItBlockTitle,
236
+ ...nestedTitles
237
+ ] = test.titlePath();
205
238
 
206
239
  const path = new Path(test.location.file);
207
240
  const scenarioName = nestedTitles.join(' ').trim();
208
241
 
209
- const featureName = scenarioName
210
- ? describeOrItBlockTitle
211
- : fileName;
242
+ const featureName = scenarioName ? describeOrItBlockTitle : fileName;
212
243
 
213
244
  return new ScenarioDetails(
214
245
  new Name(scenarioName || describeOrItBlockTitle),
215
246
  new Category(featureName),
216
- new FileSystemLocation(
217
- path,
218
- test.location.line,
219
- test.location.column,
220
- ),
247
+ new FileSystemLocation(path, test.location.line, test.location.column),
221
248
  );
222
249
  }
223
250
 
@@ -226,10 +253,24 @@ export class SerenityReporterForPlaywrightTest implements Reporter {
226
253
 
227
254
  try {
228
255
  await this.serenity.waitForNextCue();
229
- this.serenity.announce(new TestRunFinished(new ExecutionSuccessful(), this.serenity.currentTime()));
230
- }
231
- catch (error) {
232
- this.serenity.announce(new TestRunFinished(new ExecutionFailedWithError(error), this.serenity.currentTime()));
256
+
257
+ const outcome = this.unhandledError ?
258
+ new ExecutionFailedWithError(this.unhandledError)
259
+ : new ExecutionSuccessful();
260
+
261
+ this.serenity.announce(
262
+ new TestRunFinished(
263
+ outcome,
264
+ this.serenity.currentTime(),
265
+ ),
266
+ );
267
+ } catch (error) {
268
+ this.serenity.announce(
269
+ new TestRunFinished(
270
+ new ExecutionFailedWithError(error),
271
+ this.serenity.currentTime(),
272
+ ),
273
+ );
233
274
  throw error;
234
275
  }
235
276
  }
@@ -239,8 +280,8 @@ export class SerenityReporterForPlaywrightTest implements Reporter {
239
280
  // reporter.onStdOut(chunk, test, result)
240
281
 
241
282
  private emit(...events: DomainEvent[]): void {
242
- events.forEach(event => {
243
- this.serenity.announce(event)
283
+ events.forEach((event) => {
284
+ this.serenity.announce(event);
244
285
  });
245
286
  }
246
287
 
@@ -252,13 +293,10 @@ export class SerenityReporterForPlaywrightTest implements Reporter {
252
293
  const currentSceneId = this.sceneIds.get(test.id);
253
294
 
254
295
  this.emit(
255
- new RetryableSceneDetected(
256
- currentSceneId,
257
- this.now(),
258
- ),
296
+ new RetryableSceneDetected(currentSceneId, this.now()),
259
297
  new SceneTagged(
260
298
  currentSceneId,
261
- new ArbitraryTag('retried'), // todo: replace with a dedicated tag
299
+ new ArbitraryTag('retried'), // todo: replace with a dedicated tag
262
300
  this.now(),
263
301
  ),
264
302
  );
@@ -290,14 +328,14 @@ class PlaywrightErrorParser {
290
328
  );
291
329
 
292
330
  public errorFrom(testError: TestError): Error {
293
-
294
331
  const message = testError.message && PlaywrightErrorParser.stripAsciiFrom(testError.message);
332
+
295
333
  let stack = testError.stack && PlaywrightErrorParser.stripAsciiFrom(testError.stack);
296
334
 
297
335
  // TODO: Do I need to process it?
298
336
  // const value = testError.value;
299
337
 
300
- const prologue = `Error: ${message}`;
338
+ const prologue = `Error: ${ message }`;
301
339
  if (stack && message && stack.startsWith(prologue)) {
302
340
  stack = stack.slice(prologue.length);
303
341
  }