@gooddata/sdk-e2e-utils 11.60.0-alpha.3 → 11.60.0-alpha.4
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/esm/create-test/feature-hub/mock.d.ts +5 -0
- package/esm/create-test/feature-hub/mock.d.ts.map +1 -0
- package/esm/create-test/feature-hub/mock.js +15 -0
- package/esm/create-test/feature-hub/types.d.ts +21 -0
- package/esm/create-test/feature-hub/types.d.ts.map +1 -0
- package/esm/create-test/feature-hub/types.js +2 -0
- package/esm/create-test/goodmock/admin.d.ts +34 -0
- package/esm/create-test/goodmock/admin.d.ts.map +1 -0
- package/esm/create-test/goodmock/admin.js +99 -0
- package/esm/create-test/goodmock/mode.d.ts +14 -0
- package/esm/create-test/goodmock/mode.d.ts.map +1 -0
- package/esm/create-test/goodmock/mode.js +17 -0
- package/esm/create-test/goodmock/playwright.d.ts +5 -0
- package/esm/create-test/goodmock/playwright.d.ts.map +1 -0
- package/esm/create-test/goodmock/playwright.js +37 -0
- package/esm/create-test/goodmock/snapshot/assert-no-leak-patterns.d.ts +9 -0
- package/esm/create-test/goodmock/snapshot/assert-no-leak-patterns.d.ts.map +1 -0
- package/esm/create-test/goodmock/snapshot/assert-no-leak-patterns.js +20 -0
- package/esm/create-test/goodmock/snapshot/assert-no-secret-leaks.d.ts +4 -0
- package/esm/create-test/goodmock/snapshot/assert-no-secret-leaks.d.ts.map +1 -0
- package/esm/create-test/goodmock/snapshot/assert-no-secret-leaks.js +14 -0
- package/esm/create-test/goodmock/snapshot/build-masked-form-pattern.d.ts +2 -0
- package/esm/create-test/goodmock/snapshot/build-masked-form-pattern.d.ts.map +1 -0
- package/esm/create-test/goodmock/snapshot/build-masked-form-pattern.js +17 -0
- package/esm/create-test/goodmock/snapshot/get-effective-secret-mappings.d.ts +3 -0
- package/esm/create-test/goodmock/snapshot/get-effective-secret-mappings.d.ts.map +1 -0
- package/esm/create-test/goodmock/snapshot/get-effective-secret-mappings.js +2 -0
- package/esm/create-test/goodmock/snapshot/replace-secrets.d.ts +10 -0
- package/esm/create-test/goodmock/snapshot/replace-secrets.d.ts.map +1 -0
- package/esm/create-test/goodmock/snapshot/replace-secrets.js +23 -0
- package/esm/create-test/goodmock/snapshot/sanitize-credentials.d.ts +4 -0
- package/esm/create-test/goodmock/snapshot/sanitize-credentials.d.ts.map +1 -0
- package/esm/create-test/goodmock/snapshot/sanitize-credentials.js +41 -0
- package/esm/create-test/goodmock/snapshot/sanitize-workspace-ids.d.ts +4 -0
- package/esm/create-test/goodmock/snapshot/sanitize-workspace-ids.d.ts.map +1 -0
- package/esm/create-test/goodmock/snapshot/sanitize-workspace-ids.js +21 -0
- package/esm/create-test/goodmock/snapshot/snapshot-and-save-recording.d.ts +50 -0
- package/esm/create-test/goodmock/snapshot/snapshot-and-save-recording.d.ts.map +1 -0
- package/esm/create-test/goodmock/snapshot/snapshot-and-save-recording.js +64 -0
- package/esm/create-test/goodmock/snapshot/snapshot-param.d.ts +11 -0
- package/esm/create-test/goodmock/snapshot/snapshot-param.d.ts.map +1 -0
- package/esm/create-test/goodmock/snapshot/snapshot-param.js +9 -0
- package/esm/create-test/goodmock/types.d.ts +60 -0
- package/esm/create-test/goodmock/types.d.ts.map +1 -0
- package/esm/create-test/goodmock/types.js +2 -0
- package/esm/create-test/playwright/call-original-fn.d.ts +17 -0
- package/esm/create-test/playwright/call-original-fn.d.ts.map +1 -0
- package/esm/create-test/playwright/call-original-fn.js +25 -0
- package/esm/create-test/playwright/describe/factory.d.ts +27 -0
- package/esm/create-test/playwright/describe/factory.d.ts.map +1 -0
- package/esm/create-test/playwright/describe/factory.js +18 -0
- package/esm/create-test/playwright/fixtures.d.ts +7 -0
- package/esm/create-test/playwright/fixtures.d.ts.map +1 -0
- package/esm/create-test/playwright/fixtures.js +2 -0
- package/esm/create-test/playwright/playwright-types.d.ts +42 -0
- package/esm/create-test/playwright/playwright-types.d.ts.map +1 -0
- package/esm/create-test/playwright/playwright-types.js +2 -0
- package/esm/create-test/playwright/test/factory.d.ts +7 -0
- package/esm/create-test/playwright/test/factory.d.ts.map +1 -0
- package/esm/create-test/playwright/test/factory.js +42 -0
- package/esm/create-test/playwright/test/types.d.ts +27 -0
- package/esm/create-test/playwright/test/types.d.ts.map +1 -0
- package/esm/create-test/playwright/test/types.js +2 -0
- package/esm/create-test/playwright/top-level-describe/build-suite-callback.d.ts +9 -0
- package/esm/create-test/playwright/top-level-describe/build-suite-callback.d.ts.map +1 -0
- package/esm/create-test/playwright/top-level-describe/build-suite-callback.js +17 -0
- package/esm/create-test/playwright/top-level-describe/factory.d.ts +8 -0
- package/esm/create-test/playwright/top-level-describe/factory.d.ts.map +1 -0
- package/esm/create-test/playwright/top-level-describe/factory.js +12 -0
- package/esm/create-test/playwright/top-level-describe/types.d.ts +17 -0
- package/esm/create-test/playwright/top-level-describe/types.d.ts.map +1 -0
- package/esm/create-test/playwright/top-level-describe/types.js +2 -0
- package/esm/create-test/playwright/types.d.ts +17 -0
- package/esm/create-test/playwright/types.d.ts.map +1 -0
- package/esm/create-test/playwright/types.js +2 -0
- package/esm/create-test/playwright/with-describe-details.d.ts +6 -0
- package/esm/create-test/playwright/with-describe-details.d.ts.map +1 -0
- package/esm/create-test/playwright/with-describe-details.js +39 -0
- package/esm/index.d.ts +14 -3
- package/esm/index.d.ts.map +1 -1
- package/esm/index.js +8 -3
- package/esm/sdk-e2e-utils.d.ts +112 -38
- package/package.json +3 -3
- package/esm/goodmock.d.ts +0 -138
- package/esm/goodmock.d.ts.map +0 -1
- package/esm/goodmock.js +0 -284
- package/esm/playwright.d.ts +0 -97
- package/esm/playwright.d.ts.map +0 -1
- package/esm/playwright.js +0 -189
package/esm/playwright.d.ts
DELETED
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import { type Fixtures, type PlaywrightTestArgs, type PlaywrightTestOptions, type PlaywrightWorkerArgs, type PlaywrightWorkerOptions, type TestDetails, test } from "@playwright/test";
|
|
2
|
-
import { type IGoodmockMapping, type ILeakPattern, type ISecretMapping, type IWorkspaceIdMapping } from "./goodmock.js";
|
|
3
|
-
/**
|
|
4
|
-
* @internal
|
|
5
|
-
*/
|
|
6
|
-
export interface IGoodmockOptions {
|
|
7
|
-
host: string;
|
|
8
|
-
backendHost: string;
|
|
9
|
-
getMappingPath: (specFile: string) => string;
|
|
10
|
-
workspaceIdMappings?: IWorkspaceIdMapping | IWorkspaceIdMapping[];
|
|
11
|
-
baseUrl?: string;
|
|
12
|
-
/** Secret values replaced by placeholders in saved recordings (see {@link ISecretMapping}). */
|
|
13
|
-
secretMappings?: ISecretMapping[];
|
|
14
|
-
/** Credential-shaped patterns that must never appear in saved recordings (see {@link ILeakPattern}). */
|
|
15
|
-
leakPatterns?: ILeakPattern[];
|
|
16
|
-
/** Consumer-supplied redaction hook for domain-specific secrets (see snapshotAndSaveRecording). */
|
|
17
|
-
sanitizeMappings?: (mappings: IGoodmockMapping[]) => IGoodmockMapping[];
|
|
18
|
-
}
|
|
19
|
-
/**
|
|
20
|
-
* @internal
|
|
21
|
-
*/
|
|
22
|
-
export interface IE2eTestDetails extends TestDetails {
|
|
23
|
-
workspaceSettings?: Record<string, unknown>;
|
|
24
|
-
additionalWindowProperties?: Record<string, unknown>;
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* @internal
|
|
28
|
-
*/
|
|
29
|
-
export interface IFeatureHubFeature {
|
|
30
|
-
id: string;
|
|
31
|
-
key: string;
|
|
32
|
-
l: boolean;
|
|
33
|
-
version?: number;
|
|
34
|
-
type: string;
|
|
35
|
-
value?: boolean | string | number;
|
|
36
|
-
strategies?: unknown[];
|
|
37
|
-
v?: string;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* @internal
|
|
41
|
-
*/
|
|
42
|
-
export interface IFeatureHubEnvironment {
|
|
43
|
-
id: string;
|
|
44
|
-
features: IFeatureHubFeature[];
|
|
45
|
-
}
|
|
46
|
-
/**
|
|
47
|
-
* @internal
|
|
48
|
-
*/
|
|
49
|
-
export type BaseTestArgs = PlaywrightTestArgs & PlaywrightTestOptions;
|
|
50
|
-
/**
|
|
51
|
-
* @internal
|
|
52
|
-
*/
|
|
53
|
-
export type BaseWorkerArgs = PlaywrightWorkerArgs & PlaywrightWorkerOptions;
|
|
54
|
-
/**
|
|
55
|
-
* @internal
|
|
56
|
-
*/
|
|
57
|
-
export interface ICreateTestOptions<T extends Record<string, unknown> = {}, W extends Record<string, unknown> = {}> {
|
|
58
|
-
goodmock?: IGoodmockOptions;
|
|
59
|
-
fixtures?: Fixtures<T, W, BaseTestArgs & T, BaseWorkerArgs & W>;
|
|
60
|
-
featureHubResponse?: IFeatureHubEnvironment[];
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* @internal
|
|
64
|
-
*/
|
|
65
|
-
export interface IDescribeFunction {
|
|
66
|
-
(suiteName: string, specName: string, fn: () => void): void;
|
|
67
|
-
(suiteName: string, specName: string, details: IE2eTestDetails, fn: () => void): void;
|
|
68
|
-
skip: {
|
|
69
|
-
(suiteName: string, specName: string, fn: () => void): void;
|
|
70
|
-
(suiteName: string, specName: string, details: IE2eTestDetails, fn: () => void): void;
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
/**
|
|
74
|
-
* @internal
|
|
75
|
-
*/
|
|
76
|
-
export type IE2eTest = typeof test & {
|
|
77
|
-
topLevelDescribe: IDescribeFunction;
|
|
78
|
-
describe: {
|
|
79
|
-
(title: string, callback: () => void): void;
|
|
80
|
-
(title: string, details: IE2eTestDetails, callback: () => void): void;
|
|
81
|
-
skip: {
|
|
82
|
-
(title: string, callback: () => void): void;
|
|
83
|
-
(title: string, details: IE2eTestDetails, callback: () => void): void;
|
|
84
|
-
};
|
|
85
|
-
only: (typeof test)["describe"]["only"];
|
|
86
|
-
configure: (typeof test)["describe"]["configure"];
|
|
87
|
-
fixme: (typeof test)["describe"]["fixme"];
|
|
88
|
-
serial: (typeof test)["describe"]["serial"];
|
|
89
|
-
parallel: (typeof test)["describe"]["parallel"];
|
|
90
|
-
};
|
|
91
|
-
};
|
|
92
|
-
/**
|
|
93
|
-
* @internal
|
|
94
|
-
* @param options -
|
|
95
|
-
*/
|
|
96
|
-
export declare function createTest<T extends Record<string, unknown> = {}, W extends Record<string, unknown> = {}>(options?: ICreateTestOptions<T, W>): IE2eTest;
|
|
97
|
-
//# sourceMappingURL=playwright.d.ts.map
|
package/esm/playwright.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"playwright.d.ts","sourceRoot":"","sources":["../src/playwright.ts"],"names":[],"mappings":"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"}
|
package/esm/playwright.js
DELETED
|
@@ -1,189 +0,0 @@
|
|
|
1
|
-
// (C) 2026 GoodData Corporation
|
|
2
|
-
// oxlint-disable typescript-eslint/no-empty-object-type
|
|
3
|
-
import { test, } from "@playwright/test";
|
|
4
|
-
import { GoodmockMode, goodmockMode as getGoodmockMode, loadMappings, resetMappings, snapshotAndSaveRecording, startRecording, } from "./goodmock.js";
|
|
5
|
-
// --- Internal helpers ---
|
|
6
|
-
function parseArgs(detailsOrFn, func) {
|
|
7
|
-
const hasDetails = typeof detailsOrFn !== "function";
|
|
8
|
-
return {
|
|
9
|
-
details: hasDetails ? detailsOrFn : undefined,
|
|
10
|
-
fn: hasDetails ? func : detailsOrFn,
|
|
11
|
-
};
|
|
12
|
-
}
|
|
13
|
-
/** Strip custom fields before passing details to Playwright. */
|
|
14
|
-
function toPlaywrightDetails(details) {
|
|
15
|
-
if (!details)
|
|
16
|
-
return undefined;
|
|
17
|
-
// oxlint-disable-next-line @typescript-eslint/no-unused-vars
|
|
18
|
-
const { workspaceSettings: _ws, additionalWindowProperties: _awp, ...rest } = details;
|
|
19
|
-
return Object.keys(rest).length > 0 ? rest : undefined;
|
|
20
|
-
}
|
|
21
|
-
/** Inject workspace settings and additional window properties via a single addInitScript. */
|
|
22
|
-
function injectWindowProperties(testInst, settings, awp) {
|
|
23
|
-
testInst.beforeEach(async ({ page }) => {
|
|
24
|
-
await page.addInitScript((args) => {
|
|
25
|
-
const w = window;
|
|
26
|
-
if (Object.keys(args.s).length > 0) {
|
|
27
|
-
w["customWorkspaceSettings"] = args.s;
|
|
28
|
-
}
|
|
29
|
-
for (const [key, value] of Object.entries(args.a)) {
|
|
30
|
-
w[key] = value;
|
|
31
|
-
}
|
|
32
|
-
}, { s: settings, a: awp });
|
|
33
|
-
});
|
|
34
|
-
}
|
|
35
|
-
// --- Factory ---
|
|
36
|
-
/**
|
|
37
|
-
* @internal
|
|
38
|
-
* @param options -
|
|
39
|
-
*/
|
|
40
|
-
export function createTest(options = {}) {
|
|
41
|
-
const testInstance = options.fixtures
|
|
42
|
-
? test.extend(options.fixtures)
|
|
43
|
-
: test;
|
|
44
|
-
// Tracks whether we're inside a topLevelDescribe during synchronous registration.
|
|
45
|
-
let insideTopLevelDescribe = false;
|
|
46
|
-
// Stacks track workspace settings / additionalWindowProperties hierarchy during
|
|
47
|
-
// synchronous describe registration. Each level merges on top of the parent's.
|
|
48
|
-
// The beforeEach at each level captures the fully-merged snapshot, so the
|
|
49
|
-
// innermost beforeEach (which runs last) wins.
|
|
50
|
-
const settingsStack = [];
|
|
51
|
-
const awpStack = [];
|
|
52
|
-
function currentSettings() {
|
|
53
|
-
return settingsStack.length > 0 ? settingsStack[settingsStack.length - 1] : {};
|
|
54
|
-
}
|
|
55
|
-
function currentAwp() {
|
|
56
|
-
return awpStack.length > 0 ? awpStack[awpStack.length - 1] : {};
|
|
57
|
-
}
|
|
58
|
-
/** Push merged settings/awp onto stacks, register a single beforeEach, call fn, pop. */
|
|
59
|
-
function withDescribeDetails(ws, awp, fn) {
|
|
60
|
-
if (!ws && !awp) {
|
|
61
|
-
fn();
|
|
62
|
-
return;
|
|
63
|
-
}
|
|
64
|
-
const mergedSettings = ws ? { ...currentSettings(), ...ws } : currentSettings();
|
|
65
|
-
const mergedAwp = awp ? { ...currentAwp(), ...awp } : currentAwp();
|
|
66
|
-
if (ws)
|
|
67
|
-
settingsStack.push(mergedSettings);
|
|
68
|
-
if (awp)
|
|
69
|
-
awpStack.push(mergedAwp);
|
|
70
|
-
injectWindowProperties(testInstance, mergedSettings, mergedAwp);
|
|
71
|
-
fn();
|
|
72
|
-
if (awp)
|
|
73
|
-
awpStack.pop();
|
|
74
|
-
if (ws)
|
|
75
|
-
settingsStack.pop();
|
|
76
|
-
}
|
|
77
|
-
function buildSuiteCallback(specName, details, fn) {
|
|
78
|
-
return () => {
|
|
79
|
-
// FeatureHub mock — each test gets a fresh page, so route dies with it.
|
|
80
|
-
if (options.featureHubResponse) {
|
|
81
|
-
const body = JSON.stringify(options.featureHubResponse);
|
|
82
|
-
testInstance.beforeEach(async ({ page }) => {
|
|
83
|
-
await page.route("**/features*", async (route) => {
|
|
84
|
-
await route.fulfill({
|
|
85
|
-
status: 200,
|
|
86
|
-
contentType: "application/json",
|
|
87
|
-
headers: { "access-control-allow-origin": "*" },
|
|
88
|
-
body,
|
|
89
|
-
});
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
|
-
}
|
|
93
|
-
// Goodmock lifecycle hooks
|
|
94
|
-
const gm = options.goodmock;
|
|
95
|
-
if (gm?.host) {
|
|
96
|
-
const goodmockMode = getGoodmockMode();
|
|
97
|
-
if (goodmockMode !== GoodmockMode.Proxy) {
|
|
98
|
-
testInstance.beforeAll(async () => {
|
|
99
|
-
await resetMappings(gm.host);
|
|
100
|
-
if (goodmockMode === GoodmockMode.Record) {
|
|
101
|
-
await startRecording(gm.host, gm.backendHost);
|
|
102
|
-
}
|
|
103
|
-
else if (goodmockMode === GoodmockMode.Replay) {
|
|
104
|
-
await loadMappings(gm.host, gm.getMappingPath(specName));
|
|
105
|
-
}
|
|
106
|
-
});
|
|
107
|
-
testInstance.afterAll(async () => {
|
|
108
|
-
if (goodmockMode === GoodmockMode.Record) {
|
|
109
|
-
await snapshotAndSaveRecording(gm.host, gm.getMappingPath(specName), {
|
|
110
|
-
workspaceIdMappings: gm.workspaceIdMappings,
|
|
111
|
-
backendHost: gm.backendHost,
|
|
112
|
-
baseUrl: gm.baseUrl,
|
|
113
|
-
secretMappings: gm.secretMappings,
|
|
114
|
-
leakPatterns: gm.leakPatterns,
|
|
115
|
-
sanitizeMappings: gm.sanitizeMappings,
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
await resetMappings(gm.host);
|
|
119
|
-
});
|
|
120
|
-
// TODO: When this is supported in goodmock, uncomment this block
|
|
121
|
-
// testInstance.beforeEach(async () => {
|
|
122
|
-
// await resetScenarios(gm.host);
|
|
123
|
-
// });
|
|
124
|
-
}
|
|
125
|
-
}
|
|
126
|
-
// Workspace settings + additional window properties — merge with parent
|
|
127
|
-
// stack and inject beforeEach. Wraps fn() so nested describes inherit.
|
|
128
|
-
insideTopLevelDescribe = true;
|
|
129
|
-
withDescribeDetails(details?.workspaceSettings, details?.additionalWindowProperties, fn);
|
|
130
|
-
insideTopLevelDescribe = false;
|
|
131
|
-
};
|
|
132
|
-
}
|
|
133
|
-
// --- Override test.describe to support workspaceSettings merging ---
|
|
134
|
-
const originalDescribe = testInstance.describe;
|
|
135
|
-
function wrappedDescribe(title, detailsOrCb, cb) {
|
|
136
|
-
if (!insideTopLevelDescribe) {
|
|
137
|
-
throw new Error(`test.describe("${title}") must be nested inside a test.topLevelDescribe() block.`);
|
|
138
|
-
}
|
|
139
|
-
const hasDetails = typeof detailsOrCb !== "function";
|
|
140
|
-
const details = hasDetails ? detailsOrCb : undefined;
|
|
141
|
-
const callback = hasDetails ? cb : detailsOrCb;
|
|
142
|
-
const pwDetails = toPlaywrightDetails(details);
|
|
143
|
-
const wrapped = () => withDescribeDetails(details?.workspaceSettings, details?.additionalWindowProperties, callback);
|
|
144
|
-
if (pwDetails) {
|
|
145
|
-
originalDescribe(title, pwDetails, wrapped);
|
|
146
|
-
}
|
|
147
|
-
else {
|
|
148
|
-
originalDescribe(title, wrapped);
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
// Wrap describe.skip with the same workspaceSettings merging logic.
|
|
152
|
-
const originalSkip = originalDescribe.skip;
|
|
153
|
-
function wrappedSkip(title, detailsOrCb, cb) {
|
|
154
|
-
const hasDetails = typeof detailsOrCb !== "function";
|
|
155
|
-
const details = hasDetails ? detailsOrCb : undefined;
|
|
156
|
-
const callback = hasDetails ? cb : detailsOrCb;
|
|
157
|
-
const wrapped = () => withDescribeDetails(details?.workspaceSettings, details?.additionalWindowProperties, callback);
|
|
158
|
-
originalSkip(title, wrapped);
|
|
159
|
-
}
|
|
160
|
-
// Preserve all sub-methods (.only, .serial, .parallel, .configure, .fixme)
|
|
161
|
-
Object.assign(wrappedDescribe, originalDescribe);
|
|
162
|
-
wrappedDescribe.skip = wrappedSkip;
|
|
163
|
-
// oxlint-disable-next-line @typescript-eslint/no-explicit-any
|
|
164
|
-
testInstance.describe = wrappedDescribe;
|
|
165
|
-
function topLevelDescribe(suiteName, specName, detailsOrFn, func) {
|
|
166
|
-
const { details, fn } = parseArgs(detailsOrFn, func);
|
|
167
|
-
const suite = buildSuiteCallback(specName, details, fn);
|
|
168
|
-
const pwDetails = toPlaywrightDetails(details);
|
|
169
|
-
if (pwDetails) {
|
|
170
|
-
// oxlint-disable-next-line playwright/valid-describe-callback
|
|
171
|
-
originalDescribe(suiteName, pwDetails, suite);
|
|
172
|
-
}
|
|
173
|
-
else {
|
|
174
|
-
// oxlint-disable-next-line playwright/valid-describe-callback
|
|
175
|
-
originalDescribe(suiteName, suite);
|
|
176
|
-
}
|
|
177
|
-
}
|
|
178
|
-
function skip(suiteName, specName, detailsOrFn, func) {
|
|
179
|
-
const { details, fn } = parseArgs(detailsOrFn, func);
|
|
180
|
-
const suite = buildSuiteCallback(specName, details, fn);
|
|
181
|
-
// oxlint-disable-next-line playwright/valid-describe-callback
|
|
182
|
-
originalSkip(suiteName, suite);
|
|
183
|
-
}
|
|
184
|
-
topLevelDescribe.skip = skip;
|
|
185
|
-
// Attach topLevelDescribe onto the test instance
|
|
186
|
-
const e2eTest = testInstance;
|
|
187
|
-
e2eTest.topLevelDescribe = topLevelDescribe;
|
|
188
|
-
return e2eTest;
|
|
189
|
-
}
|