@gooddata/sdk-e2e-utils 11.60.0-alpha.3 → 11.60.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.
Files changed (89) hide show
  1. package/esm/create-test/feature-hub/mock.d.ts +5 -0
  2. package/esm/create-test/feature-hub/mock.d.ts.map +1 -0
  3. package/esm/create-test/feature-hub/mock.js +15 -0
  4. package/esm/create-test/feature-hub/types.d.ts +21 -0
  5. package/esm/create-test/feature-hub/types.d.ts.map +1 -0
  6. package/esm/create-test/feature-hub/types.js +2 -0
  7. package/esm/create-test/goodmock/admin.d.ts +34 -0
  8. package/esm/create-test/goodmock/admin.d.ts.map +1 -0
  9. package/esm/create-test/goodmock/admin.js +99 -0
  10. package/esm/create-test/goodmock/mode.d.ts +14 -0
  11. package/esm/create-test/goodmock/mode.d.ts.map +1 -0
  12. package/esm/create-test/goodmock/mode.js +17 -0
  13. package/esm/create-test/goodmock/playwright.d.ts +5 -0
  14. package/esm/create-test/goodmock/playwright.d.ts.map +1 -0
  15. package/esm/create-test/goodmock/playwright.js +37 -0
  16. package/esm/create-test/goodmock/snapshot/assert-no-leak-patterns.d.ts +9 -0
  17. package/esm/create-test/goodmock/snapshot/assert-no-leak-patterns.d.ts.map +1 -0
  18. package/esm/create-test/goodmock/snapshot/assert-no-leak-patterns.js +20 -0
  19. package/esm/create-test/goodmock/snapshot/assert-no-secret-leaks.d.ts +4 -0
  20. package/esm/create-test/goodmock/snapshot/assert-no-secret-leaks.d.ts.map +1 -0
  21. package/esm/create-test/goodmock/snapshot/assert-no-secret-leaks.js +14 -0
  22. package/esm/create-test/goodmock/snapshot/build-masked-form-pattern.d.ts +2 -0
  23. package/esm/create-test/goodmock/snapshot/build-masked-form-pattern.d.ts.map +1 -0
  24. package/esm/create-test/goodmock/snapshot/build-masked-form-pattern.js +17 -0
  25. package/esm/create-test/goodmock/snapshot/get-effective-secret-mappings.d.ts +3 -0
  26. package/esm/create-test/goodmock/snapshot/get-effective-secret-mappings.d.ts.map +1 -0
  27. package/esm/create-test/goodmock/snapshot/get-effective-secret-mappings.js +2 -0
  28. package/esm/create-test/goodmock/snapshot/replace-secrets.d.ts +10 -0
  29. package/esm/create-test/goodmock/snapshot/replace-secrets.d.ts.map +1 -0
  30. package/esm/create-test/goodmock/snapshot/replace-secrets.js +23 -0
  31. package/esm/create-test/goodmock/snapshot/sanitize-credentials.d.ts +4 -0
  32. package/esm/create-test/goodmock/snapshot/sanitize-credentials.d.ts.map +1 -0
  33. package/esm/create-test/goodmock/snapshot/sanitize-credentials.js +41 -0
  34. package/esm/create-test/goodmock/snapshot/sanitize-workspace-ids.d.ts +4 -0
  35. package/esm/create-test/goodmock/snapshot/sanitize-workspace-ids.d.ts.map +1 -0
  36. package/esm/create-test/goodmock/snapshot/sanitize-workspace-ids.js +21 -0
  37. package/esm/create-test/goodmock/snapshot/snapshot-and-save-recording.d.ts +50 -0
  38. package/esm/create-test/goodmock/snapshot/snapshot-and-save-recording.d.ts.map +1 -0
  39. package/esm/create-test/goodmock/snapshot/snapshot-and-save-recording.js +64 -0
  40. package/esm/create-test/goodmock/snapshot/snapshot-param.d.ts +11 -0
  41. package/esm/create-test/goodmock/snapshot/snapshot-param.d.ts.map +1 -0
  42. package/esm/create-test/goodmock/snapshot/snapshot-param.js +9 -0
  43. package/esm/create-test/goodmock/types.d.ts +60 -0
  44. package/esm/create-test/goodmock/types.d.ts.map +1 -0
  45. package/esm/create-test/goodmock/types.js +2 -0
  46. package/esm/create-test/playwright/call-original-fn.d.ts +17 -0
  47. package/esm/create-test/playwright/call-original-fn.d.ts.map +1 -0
  48. package/esm/create-test/playwright/call-original-fn.js +25 -0
  49. package/esm/create-test/playwright/describe/factory.d.ts +27 -0
  50. package/esm/create-test/playwright/describe/factory.d.ts.map +1 -0
  51. package/esm/create-test/playwright/describe/factory.js +18 -0
  52. package/esm/create-test/playwright/fixtures.d.ts +7 -0
  53. package/esm/create-test/playwright/fixtures.d.ts.map +1 -0
  54. package/esm/create-test/playwright/fixtures.js +2 -0
  55. package/esm/create-test/playwright/playwright-types.d.ts +42 -0
  56. package/esm/create-test/playwright/playwright-types.d.ts.map +1 -0
  57. package/esm/create-test/playwright/playwright-types.js +2 -0
  58. package/esm/create-test/playwright/test/factory.d.ts +7 -0
  59. package/esm/create-test/playwright/test/factory.d.ts.map +1 -0
  60. package/esm/create-test/playwright/test/factory.js +42 -0
  61. package/esm/create-test/playwright/test/types.d.ts +27 -0
  62. package/esm/create-test/playwright/test/types.d.ts.map +1 -0
  63. package/esm/create-test/playwright/test/types.js +2 -0
  64. package/esm/create-test/playwright/top-level-describe/build-suite-callback.d.ts +9 -0
  65. package/esm/create-test/playwright/top-level-describe/build-suite-callback.d.ts.map +1 -0
  66. package/esm/create-test/playwright/top-level-describe/build-suite-callback.js +17 -0
  67. package/esm/create-test/playwright/top-level-describe/factory.d.ts +8 -0
  68. package/esm/create-test/playwright/top-level-describe/factory.d.ts.map +1 -0
  69. package/esm/create-test/playwright/top-level-describe/factory.js +12 -0
  70. package/esm/create-test/playwright/top-level-describe/types.d.ts +17 -0
  71. package/esm/create-test/playwright/top-level-describe/types.d.ts.map +1 -0
  72. package/esm/create-test/playwright/top-level-describe/types.js +2 -0
  73. package/esm/create-test/playwright/types.d.ts +17 -0
  74. package/esm/create-test/playwright/types.d.ts.map +1 -0
  75. package/esm/create-test/playwright/types.js +2 -0
  76. package/esm/create-test/playwright/with-describe-details.d.ts +6 -0
  77. package/esm/create-test/playwright/with-describe-details.d.ts.map +1 -0
  78. package/esm/create-test/playwright/with-describe-details.js +39 -0
  79. package/esm/index.d.ts +14 -3
  80. package/esm/index.d.ts.map +1 -1
  81. package/esm/index.js +8 -3
  82. package/esm/sdk-e2e-utils.d.ts +112 -38
  83. package/package.json +3 -3
  84. package/esm/goodmock.d.ts +0 -138
  85. package/esm/goodmock.d.ts.map +0 -1
  86. package/esm/goodmock.js +0 -284
  87. package/esm/playwright.d.ts +0 -97
  88. package/esm/playwright.d.ts.map +0 -1
  89. package/esm/playwright.js +0 -189
@@ -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
@@ -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
- }