Skip to content

Commit adc8233

Browse files
authored
Add global hooks (#10)
1 parent cc75f65 commit adc8233

File tree

6 files changed

+286
-48
lines changed

6 files changed

+286
-48
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/)
66
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
77

88
## [Unreleased]
9+
### Added
10+
- Add global hooks ([#10](https://github.com/cucumber/javascript-core/pull/10))
911

1012
## [0.3.0] - 2025-07-30
1113
### Added

cucumber-core.api.md

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -67,19 +67,6 @@ export class DataTable {
6767
transpose(): DataTable;
6868
}
6969

70-
// @public
71-
export type DefinedHook = {
72-
id: string;
73-
name?: string;
74-
tags?: {
75-
raw: string;
76-
compiled: ReturnType<typeof parse>;
77-
};
78-
fn: SupportCodeFunction;
79-
sourceReference: SourceReference;
80-
toMessage(): Hook;
81-
};
82-
8370
// @public
8471
export type DefinedParameterType = {
8572
id: string;
@@ -102,6 +89,28 @@ export type DefinedStep = {
10289
toMessage(): StepDefinition;
10390
};
10491

92+
// @public
93+
export type DefinedTestCaseHook = {
94+
id: string;
95+
name?: string;
96+
tags?: {
97+
raw: string;
98+
compiled: ReturnType<typeof parse>;
99+
};
100+
fn: SupportCodeFunction;
101+
sourceReference: SourceReference;
102+
toMessage(): Hook;
103+
};
104+
105+
// @public
106+
export type DefinedTestRunHook = {
107+
id: string;
108+
name?: string;
109+
fn: SupportCodeFunction;
110+
sourceReference: SourceReference;
111+
toMessage(): Hook;
112+
};
113+
105114
// @public
106115
export function makeTestPlan(ingredients: TestPlanIngredients, options?: TestPlanOptions): AssembledTestPlan;
107116

@@ -111,14 +120,6 @@ export type MatchedStep = {
111120
args: ReadonlyArray<Argument>;
112121
};
113122

114-
// @public
115-
export interface NewHook {
116-
fn: SupportCodeFunction;
117-
name?: string;
118-
sourceReference: SourceReference;
119-
tags?: string;
120-
}
121-
122123
// @public
123124
export interface NewParameterType {
124125
name: string;
@@ -136,6 +137,21 @@ export interface NewStep {
136137
sourceReference: SourceReference;
137138
}
138139

140+
// @public
141+
export interface NewTestCaseHook {
142+
fn: SupportCodeFunction;
143+
name?: string;
144+
sourceReference: SourceReference;
145+
tags?: string;
146+
}
147+
148+
// @public
149+
export interface NewTestRunHook {
150+
fn: SupportCodeFunction;
151+
name?: string;
152+
sourceReference: SourceReference;
153+
}
154+
139155
// @public
140156
export type PreparedFunction = {
141157
fn: SupportCodeFunction;
@@ -144,8 +160,10 @@ export type PreparedFunction = {
144160

145161
// @public
146162
export interface SupportCodeBuilder {
147-
afterHook(options: NewHook): SupportCodeBuilder;
148-
beforeHook(options: NewHook): SupportCodeBuilder;
163+
afterAllHook(options: NewTestRunHook): SupportCodeBuilder;
164+
afterHook(options: NewTestCaseHook): SupportCodeBuilder;
165+
beforeAllHook(options: NewTestRunHook): SupportCodeBuilder;
166+
beforeHook(options: NewTestCaseHook): SupportCodeBuilder;
149167
build(): SupportCodeLibrary;
150168
parameterType(options: NewParameterType): SupportCodeBuilder;
151169
step(options: NewStep): SupportCodeBuilder;
@@ -156,9 +174,11 @@ export type SupportCodeFunction = (...args: any[]) => any | Promise<any>;
156174

157175
// @public
158176
export interface SupportCodeLibrary {
159-
findAllAfterHooksBy(tags: ReadonlyArray<string>): ReadonlyArray<DefinedHook>;
160-
findAllBeforeHooksBy(tags: ReadonlyArray<string>): ReadonlyArray<DefinedHook>;
177+
findAllAfterHooksBy(tags: ReadonlyArray<string>): ReadonlyArray<DefinedTestCaseHook>;
178+
findAllBeforeHooksBy(tags: ReadonlyArray<string>): ReadonlyArray<DefinedTestCaseHook>;
161179
findAllStepsBy(text: string): ReadonlyArray<MatchedStep>;
180+
getAllAfterAllHooks(): ReadonlyArray<DefinedTestRunHook>;
181+
getAllBeforeAllHooks(): ReadonlyArray<DefinedTestRunHook>;
162182
toEnvelopes(): ReadonlyArray<Envelope>;
163183
}
164184

src/SupportCodeBuilderImpl.ts

Lines changed: 69 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,14 @@ import parse from '@cucumber/tag-expressions'
99

1010
import { SupportCodeLibraryImpl } from './SupportCodeLibraryImpl'
1111
import {
12-
DefinedHook,
1312
DefinedParameterType,
1413
DefinedStep,
15-
NewHook,
14+
DefinedTestCaseHook,
15+
DefinedTestRunHook,
1616
NewParameterType,
1717
NewStep,
18+
NewTestCaseHook,
19+
NewTestRunHook,
1820
SupportCodeBuilder,
1921
UndefinedParameterType,
2022
} from './types'
@@ -29,8 +31,10 @@ export class SupportCodeBuilderImpl implements SupportCodeBuilder {
2931
private readonly undefinedParameterTypes: Map<string, Set<string>> = new Map()
3032
private readonly parameterTypes: Array<WithId<NewParameterType>> = []
3133
private readonly steps: Array<WithId<NewStep>> = []
32-
private readonly beforeHooks: Array<WithId<NewHook>> = []
33-
private readonly afterHooks: Array<WithId<NewHook>> = []
34+
private readonly beforeHooks: Array<WithId<NewTestCaseHook>> = []
35+
private readonly afterHooks: Array<WithId<NewTestCaseHook>> = []
36+
private readonly beforeAllHooks: Array<WithId<NewTestRunHook>> = []
37+
private readonly afterAllHooks: Array<WithId<NewTestRunHook>> = []
3438

3539
constructor(private readonly newId: () => string) {}
3640

@@ -42,15 +46,15 @@ export class SupportCodeBuilderImpl implements SupportCodeBuilder {
4246
return this
4347
}
4448

45-
beforeHook(options: NewHook) {
49+
beforeHook(options: NewTestCaseHook) {
4650
this.beforeHooks.push({
4751
id: this.newId(),
4852
...options,
4953
})
5054
return this
5155
}
5256

53-
afterHook(options: NewHook) {
57+
afterHook(options: NewTestCaseHook) {
5458
this.afterHooks.push({
5559
id: this.newId(),
5660
...options,
@@ -66,6 +70,22 @@ export class SupportCodeBuilderImpl implements SupportCodeBuilder {
6670
return this
6771
}
6872

73+
beforeAllHook(options: NewTestRunHook) {
74+
this.beforeAllHooks.push({
75+
id: this.newId(),
76+
...options,
77+
})
78+
return this
79+
}
80+
81+
afterAllHook(options: NewTestRunHook) {
82+
this.afterAllHooks.push({
83+
id: this.newId(),
84+
...options,
85+
})
86+
return this
87+
}
88+
6989
private buildParameterTypes(): ReadonlyArray<DefinedParameterType> {
7090
return this.parameterTypes.map((registered) => {
7191
const parameterType = new ParameterType(
@@ -155,7 +175,7 @@ export class SupportCodeBuilderImpl implements SupportCodeBuilder {
155175
.flat()
156176
}
157177

158-
private buildBeforeHooks(): ReadonlyArray<DefinedHook> {
178+
private buildBeforeHooks(): ReadonlyArray<DefinedTestCaseHook> {
159179
return this.beforeHooks.map(({ id, name, tags, fn, sourceReference }) => {
160180
return {
161181
id,
@@ -181,7 +201,7 @@ export class SupportCodeBuilderImpl implements SupportCodeBuilder {
181201
})
182202
}
183203

184-
private buildAfterHooks(): ReadonlyArray<DefinedHook> {
204+
private buildAfterHooks(): ReadonlyArray<DefinedTestCaseHook> {
185205
return this.afterHooks.map(({ id, name, tags, fn, sourceReference }) => {
186206
return {
187207
id,
@@ -207,13 +227,53 @@ export class SupportCodeBuilderImpl implements SupportCodeBuilder {
207227
})
208228
}
209229

230+
private buildBeforeAllHooks(): ReadonlyArray<DefinedTestRunHook> {
231+
return this.beforeAllHooks.map(({ id, name, fn, sourceReference }) => {
232+
return {
233+
id,
234+
name,
235+
fn,
236+
sourceReference,
237+
toMessage() {
238+
return {
239+
id,
240+
type: HookType.BEFORE_TEST_RUN,
241+
name,
242+
sourceReference,
243+
}
244+
},
245+
}
246+
})
247+
}
248+
249+
private buildAfterAllHooks(): ReadonlyArray<DefinedTestRunHook> {
250+
return this.afterAllHooks.map(({ id, name, fn, sourceReference }) => {
251+
return {
252+
id,
253+
name,
254+
fn,
255+
sourceReference,
256+
toMessage() {
257+
return {
258+
id,
259+
type: HookType.AFTER_TEST_RUN,
260+
name,
261+
sourceReference,
262+
}
263+
},
264+
}
265+
})
266+
}
267+
210268
build() {
211269
return new SupportCodeLibraryImpl(
212270
this.buildParameterTypes(),
213271
this.buildSteps(),
214272
this.buildUndefinedParameterTypes(),
215273
this.buildBeforeHooks(),
216-
this.buildAfterHooks()
274+
this.buildAfterHooks(),
275+
this.buildBeforeAllHooks(),
276+
this.buildAfterAllHooks()
217277
)
218278
}
219279
}

src/SupportCodeLibraryImpl.ts

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import {
2-
DefinedHook,
32
DefinedParameterType,
43
DefinedStep,
4+
DefinedTestCaseHook,
5+
DefinedTestRunHook,
56
MatchedStep,
67
SupportCodeLibrary,
78
UndefinedParameterType,
@@ -15,8 +16,10 @@ export class SupportCodeLibraryImpl implements SupportCodeLibrary {
1516
private readonly parameterTypes: ReadonlyArray<DefinedParameterType> = [],
1617
private readonly steps: ReadonlyArray<DefinedStep> = [],
1718
private readonly undefinedParameterTypes: ReadonlyArray<UndefinedParameterType> = [],
18-
private readonly beforeHooks: ReadonlyArray<DefinedHook> = [],
19-
private readonly afterHooks: ReadonlyArray<DefinedHook> = []
19+
private readonly beforeHooks: ReadonlyArray<DefinedTestCaseHook> = [],
20+
private readonly afterHooks: ReadonlyArray<DefinedTestCaseHook> = [],
21+
private readonly beforeAllHooks: ReadonlyArray<DefinedTestRunHook> = [],
22+
private readonly afterAllHooks: ReadonlyArray<DefinedTestRunHook> = []
2023
) {}
2124

2225
findAllStepsBy(text: string) {
@@ -51,6 +54,14 @@ export class SupportCodeLibraryImpl implements SupportCodeLibrary {
5154
})
5255
}
5356

57+
getAllBeforeAllHooks(): ReadonlyArray<DefinedTestRunHook> {
58+
return [...this.beforeAllHooks]
59+
}
60+
61+
getAllAfterAllHooks(): ReadonlyArray<DefinedTestRunHook> {
62+
return [...this.afterAllHooks]
63+
}
64+
5465
toEnvelopes() {
5566
return [
5667
...this.parameterTypes.map((parameterType) => ({ parameterType })),
@@ -60,6 +71,10 @@ export class SupportCodeLibraryImpl implements SupportCodeLibrary {
6071
...this.undefinedParameterTypes.map((undefinedParameterType) => ({ undefinedParameterType })),
6172
...this.beforeHooks.map((definedHook) => definedHook.toMessage()).map((hook) => ({ hook })),
6273
...this.afterHooks.map((definedHook) => definedHook.toMessage()).map((hook) => ({ hook })),
74+
...this.beforeAllHooks
75+
.map((definedHook) => definedHook.toMessage())
76+
.map((hook) => ({ hook })),
77+
...this.afterAllHooks.map((definedHook) => definedHook.toMessage()).map((hook) => ({ hook })),
6378
]
6479
}
6580
}

0 commit comments

Comments
 (0)