@haibun/web-playwright 1.43.0 → 1.44.1

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 (46) hide show
  1. package/build/BrowserFactory.d.ts +15 -27
  2. package/build/BrowserFactory.d.ts.map +1 -1
  3. package/build/BrowserFactory.js +71 -50
  4. package/build/BrowserFactory.js.map +1 -1
  5. package/build/PlaywrightEvents.d.ts +3 -3
  6. package/build/PlaywrightEvents.d.ts.map +1 -1
  7. package/build/PlaywrightEvents.js +17 -13
  8. package/build/PlaywrightEvents.js.map +1 -1
  9. package/build/monitor/XXlogToMonitor.d.ts +8 -0
  10. package/build/monitor/XXlogToMonitor.d.ts.map +1 -0
  11. package/build/monitor/XXlogToMonitor.js +151 -0
  12. package/build/monitor/XXlogToMonitor.js.map +1 -0
  13. package/build/monitor/controls.d.ts +3 -0
  14. package/build/monitor/controls.d.ts.map +1 -0
  15. package/build/monitor/controls.js +318 -0
  16. package/build/monitor/controls.js.map +1 -0
  17. package/build/monitor/disclosureJson.d.ts +3 -0
  18. package/build/monitor/disclosureJson.d.ts.map +1 -0
  19. package/build/monitor/disclosureJson.js +121 -0
  20. package/build/monitor/disclosureJson.js.map +1 -0
  21. package/build/monitor/mermaidDiagram.d.ts +22 -0
  22. package/build/monitor/mermaidDiagram.d.ts.map +1 -0
  23. package/build/monitor/mermaidDiagram.js +199 -0
  24. package/build/monitor/mermaidDiagram.js.map +1 -0
  25. package/build/monitor/messages.d.ts +18 -0
  26. package/build/monitor/messages.d.ts.map +1 -0
  27. package/build/monitor/messages.js +303 -0
  28. package/build/monitor/messages.js.map +1 -0
  29. package/build/monitor/monitor.d.ts +16 -0
  30. package/build/monitor/monitor.d.ts.map +1 -0
  31. package/build/monitor/monitor.js +61 -0
  32. package/build/monitor/monitor.js.map +1 -0
  33. package/build/monitor/monitorHandler.d.ts +12 -0
  34. package/build/monitor/monitorHandler.d.ts.map +1 -0
  35. package/build/monitor/monitorHandler.js +89 -0
  36. package/build/monitor/monitorHandler.js.map +1 -0
  37. package/build/rest-playwright.d.ts +60 -2
  38. package/build/rest-playwright.d.ts.map +1 -1
  39. package/build/rest-playwright.js +170 -51
  40. package/build/rest-playwright.js.map +1 -1
  41. package/build/web-playwright.d.ts +142 -54
  42. package/build/web-playwright.d.ts.map +1 -1
  43. package/build/web-playwright.js +327 -110
  44. package/build/web-playwright.js.map +1 -1
  45. package/package.json +5 -4
  46. package/web/monitor.html +2925 -0
@@ -0,0 +1,12 @@
1
+ import { Page } from 'playwright';
2
+ import { TWorld } from '@haibun/core/build/lib/defs.js';
3
+ import { TLogLevel, TLogArgs, TMessageContext } from '@haibun/core/build/lib/interfaces/logger.js';
4
+ import { AStorage } from '@haibun/domain-storage/build/AStorage.js';
5
+ export declare const createMonitorPageAndSubscriber: () => () => Promise<{
6
+ monitorPage: Page;
7
+ subscriber: {
8
+ out: (level: TLogLevel, message: TLogArgs, messageContext?: TMessageContext) => Promise<void>;
9
+ };
10
+ }>;
11
+ export declare function writeMonitor(world: TWorld, storage: AStorage, page: Page): Promise<void>;
12
+ //# sourceMappingURL=monitorHandler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitorHandler.d.ts","sourceRoot":"","sources":["../../src/monitor/monitorHandler.ts"],"names":[],"mappings":"AAGA,OAAO,EAAY,IAAI,EAAE,MAAM,YAAY,CAAC;AAE5C,OAAO,EAAE,MAAM,EAAE,MAAM,gCAAgC,CAAC;AACxD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,6CAA6C,CAAC;AAEnG,OAAO,EAAE,QAAQ,EAAE,MAAM,0CAA0C,CAAC;AAMpE,eAAO,MAAM,8BAA8B;;;qBAetB,SAAS,WAAW,QAAQ,mBAAmB,eAAe;;EA6ClF,CAAC;AAGF,wBAAsB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,iBAkB9E"}
@@ -0,0 +1,89 @@
1
+ import { join, resolve } from 'path';
2
+ import { existsSync } from 'fs';
3
+ import { pathToFileURL } from 'url';
4
+ import { chromium } from 'playwright';
5
+ import { sleep } from '@haibun/core/build/lib/util/index.js';
6
+ import { EMediaTypes } from '@haibun/domain-storage/build/media-types.js';
7
+ import { getPackageLocation } from '@haibun/core/build/lib/util/workspace-lib.js';
8
+ const monitorLocation = join(getPackageLocation(import.meta), '..', '..', 'web', 'monitor.html');
9
+ export const createMonitorPageAndSubscriber = () => async () => {
10
+ console.log(`Creating new monitor page`);
11
+ const browser = await chromium.launch({ headless: false });
12
+ const context = await browser.newContext();
13
+ const monitorPage = await context.newPage();
14
+ await waitForMonitorPage();
15
+ await monitorPage.goto(pathToFileURL(monitorLocation).toString(), { waitUntil: 'networkidle' });
16
+ await monitorPage.evaluate(() => {
17
+ document.body.dataset.haibunRuntime = 'true';
18
+ });
19
+ const subscriber = {
20
+ out: async (level, message, messageContext) => {
21
+ if (!monitorPage || monitorPage.isClosed()) {
22
+ console.error("Monitor page closed, cannot send logs.");
23
+ return;
24
+ }
25
+ try {
26
+ await monitorPage.evaluate((entry) => {
27
+ // This code runs in the browser context (monitor.html)
28
+ if (window.receiveLogData) {
29
+ // Parse the context string back into an object inside the browser.
30
+ const contextObject = entry.messageContextString ? JSON.parse(entry.messageContextString) : undefined;
31
+ window.receiveLogData({
32
+ level: entry.level,
33
+ message: entry.message,
34
+ messageContext: contextObject,
35
+ timestamp: entry.timestamp
36
+ });
37
+ }
38
+ else {
39
+ throw Error('window.receiveLogData not defined in monitor page');
40
+ }
41
+ }, {
42
+ // Data being sent from Node.js to the browser
43
+ level,
44
+ message,
45
+ messageContextString: messageContext ? JSON.stringify(messageContext) : undefined,
46
+ timestamp: Date.now()
47
+ });
48
+ }
49
+ catch (e) { // Use 'any' or a more specific error type
50
+ // Specific check for the serialization error
51
+ if (e instanceof Error && e.message.includes('Unexpected value')) {
52
+ console.error('Error sending log to monitor via evaluate: Serialization failed. Check the structure of messageContext.', e.message);
53
+ console.log('Problematic messageContext object before stringify:', messageContext);
54
+ }
55
+ // Handle page closure or other evaluate errors
56
+ else if (e instanceof Error && !e.message.includes('Target page, context or browser has been closed')) {
57
+ console.error('Error sending log to monitor via evaluate:', e.message);
58
+ }
59
+ throw (e);
60
+ }
61
+ },
62
+ };
63
+ return { monitorPage, subscriber };
64
+ };
65
+ // Function to write the final monitor HTML (adapted)
66
+ export async function writeMonitor(world, storage, page) {
67
+ if (!page || page.isClosed()) {
68
+ world.logger.error('Monitor page is closed, cannot write monitor file.');
69
+ return;
70
+ }
71
+ await sleep(500); // Allow final rendering
72
+ await page.evaluate(() => {
73
+ delete document.body.dataset.haibunRuntime;
74
+ });
75
+ const content = await page.content();
76
+ const monitorLoc = await storage.getCaptureLocation({ ...world, mediaType: EMediaTypes.html });
77
+ const outHtml = join(monitorLoc, 'monitor.html');
78
+ await storage.writeFile(outHtml, content, EMediaTypes.html);
79
+ world.logger.info(`Wrote monitor HTML instance to ${pathToFileURL(resolve(outHtml))}`);
80
+ }
81
+ async function waitForMonitorPage() {
82
+ let waitForMonitor = 0;
83
+ while (!existsSync(monitorLocation) && waitForMonitor < 20) {
84
+ if (waitForMonitor++ === 1)
85
+ console.info(`Waiting up to ${20 * .5} seconds for monitor.html`);
86
+ await sleep(500);
87
+ }
88
+ }
89
+ //# sourceMappingURL=monitorHandler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"monitorHandler.js","sourceRoot":"","sources":["../../src/monitor/monitorHandler.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,64 @@
1
- import { TNamed } from '@haibun/core/build/lib/defs.js';
2
1
  import WebPlaywright from './web-playwright.js';
2
+ import { TNamed, TAnyFixme } from '@haibun/core/build/lib/defs.js';
3
+ export declare const AUTHORIZATION = "Authorization";
4
+ export declare const ACCESS_TOKEN = "access_token";
5
+ export declare const base64Encode: ({ username, password }: {
6
+ username: string;
7
+ password: string;
8
+ }) => string;
3
9
  export declare const restSteps: (webPlaywright: WebPlaywright) => {
10
+ setApiUserAgent: {
11
+ gwta: string;
12
+ action: ({ agent }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult>;
13
+ };
14
+ addBasicAuthCredentials: {
15
+ gwta: string;
16
+ action: ({ username, password }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult>;
17
+ };
4
18
  addAuthBearerToken: {
5
19
  gwta: string;
6
20
  action: ({ token }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult>;
7
21
  };
22
+ restTokenRequest: {
23
+ gwta: string;
24
+ action: ({ endpoint }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult>;
25
+ };
26
+ restTokenLogout: {
27
+ gwta: string;
28
+ action: ({ endpoint }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult>;
29
+ };
30
+ acceptEndpointRequest: {
31
+ gwta: string;
32
+ action: ({ accept, method, endpoint }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult | import("@haibun/core/build/lib/defs.js").TNotOKActionResult>;
33
+ };
8
34
  restEndpointRequest: {
9
35
  gwta: string;
10
36
  action: ({ method, endpoint }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult | import("@haibun/core/build/lib/defs.js").TNotOKActionResult>;
11
37
  };
38
+ filterResponseJson: {
39
+ gwta: string;
40
+ action: ({ property, match }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult | import("@haibun/core/build/lib/defs.js").TNotOKActionResult>;
41
+ };
42
+ filteredResponseLengthIs: {
43
+ gwta: string;
44
+ action: ({ length }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult | import("@haibun/core/build/lib/defs.js").TNotOKActionResult>;
45
+ };
46
+ showResponseLength: {
47
+ gwta: string;
48
+ action: () => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult | import("@haibun/core/build/lib/defs.js").TNotOKActionResult>;
49
+ };
50
+ showFilteredLength: {
51
+ gwta: string;
52
+ action: () => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult | import("@haibun/core/build/lib/defs.js").TNotOKActionResult>;
53
+ };
54
+ responseJsonLengthIs: {
55
+ gwta: string;
56
+ action: ({ length }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult | import("@haibun/core/build/lib/defs.js").TNotOKActionResult>;
57
+ };
58
+ restEndpointFilteredPropertyRequest: {
59
+ gwta: string;
60
+ action: ({ property, method, endpoint, status }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult | import("@haibun/core/build/lib/defs.js").TNotOKActionResult>;
61
+ };
12
62
  restEndpointRequestWithPayload: {
13
63
  gwta: string;
14
64
  action: ({ method, endpoint, payload }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult | import("@haibun/core/build/lib/defs.js").TNotOKActionResult>;
@@ -23,7 +73,15 @@ export declare const restSteps: (webPlaywright: WebPlaywright) => {
23
73
  };
24
74
  restResponseIs: {
25
75
  gwta: string;
26
- action: ({ property, value }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult | import("@haibun/core/build/lib/defs.js").TNotOKActionResult>;
76
+ action: ({ value }: TNamed) => Promise<import("@haibun/core/build/lib/defs.js").TOKActionResult | import("@haibun/core/build/lib/defs.js").TNotOKActionResult>;
27
77
  };
28
78
  };
79
+ export type TCapturedResponse = {
80
+ status: number;
81
+ statusText: string;
82
+ headers: TAnyFixme;
83
+ url: string;
84
+ json: TAnyFixme;
85
+ text: string;
86
+ };
29
87
  //# sourceMappingURL=rest-playwright.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"rest-playwright.d.ts","sourceRoot":"","sources":["../src/rest-playwright.ts"],"names":[],"mappings":"AAEA,OAAO,EAAM,MAAM,EAAE,MAAM,gCAAgC,CAAC;AAE5D,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAMhD,eAAO,MAAM,SAAS,kBAAmB,aAAa;;;4BAG1B,MAAM;;;;uCASK,MAAM;;;;gDAkBG,MAAM;;;;6BAuBzB,MAAM;;;;sCAUG,MAAM;;;;sCAUN,MAAM;;CAQ1C,CAAC"}
1
+ {"version":3,"file":"rest-playwright.d.ts","sourceRoot":"","sources":["../src/rest-playwright.ts"],"names":[],"mappings":"AACA,OAAO,aAAa,MAAM,qBAAqB,CAAC;AAChD,OAAO,EAAE,MAAM,EAAM,SAAS,EAAE,MAAM,gCAAgC,CAAC;AAOvE,eAAO,MAAM,aAAa,kBAAkB,CAAC;AAC7C,eAAO,MAAM,YAAY,iBAAiB,CAAC;AAI3C,eAAO,MAAM,YAAY,GAAI,wBAAwB;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,WACjC,CAAC;AAE3D,eAAO,MAAM,SAAS,GAAI,eAAe,aAAa;;;4BAG1B,MAAM;;;;yCAOO,MAAM;;;;4BAOnB,MAAM;;;;+BAOH,MAAM;;;;+BAcN,MAAM;;;;+CAYU,MAAM;;;;uCAad,MAAM;;;;sCAaP,MAAM;;;;6BAgBf,MAAM;;;;;;;;;;;;6BAkCN,MAAM;;;;yDAUsB,MAAM;;;;gDA+Bf,MAAM;;;;6BA2BzB,MAAM;;;;sCAUG,MAAM;;;;4BAUhB,MAAM;;CAQhC,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE,SAAS,CAAC;IACnB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,SAAS,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;CACb,CAAC"}
@@ -1,100 +1,219 @@
1
+ import { actionNotOK, actionOK } from '@haibun/core/build/lib/util/index.js';
1
2
  import { OK } from '@haibun/core/build/lib/defs.js';
2
- import { actionNotOK } from '@haibun/core/build/lib/util/index.js';
3
+ import { EExecutionMessageType } from '@haibun/core/build/lib/interfaces/logger.js';
3
4
  const LAST_REST_RESPONSE = 'LAST_REST_RESPONSE';
4
5
  const PAYLOAD_METHODS = ['post', 'put', 'patch'];
5
6
  const NO_PAYLOAD_METHODS = ['get', 'delete', 'head'];
7
+ export const AUTHORIZATION = 'Authorization';
8
+ export const ACCESS_TOKEN = 'access_token';
9
+ const HTTP = 'HTTP';
10
+ export const base64Encode = ({ username, password }) => Buffer.from(`${username}:${password}`).toString('base64');
6
11
  export const restSteps = (webPlaywright) => ({
12
+ setApiUserAgent: {
13
+ gwta: `API user agent is {agent}`,
14
+ action: async ({ agent }) => {
15
+ webPlaywright.apiUserAgent = agent;
16
+ return Promise.resolve(OK);
17
+ }
18
+ },
19
+ addBasicAuthCredentials: {
20
+ gwta: `use Authorization Basic header with {username}, {password}`,
21
+ action: async ({ username, password }) => {
22
+ await webPlaywright.setExtraHTTPHeaders({ [AUTHORIZATION]: `Basic ${base64Encode({ username, password })}` });
23
+ return Promise.resolve(OK);
24
+ },
25
+ },
7
26
  addAuthBearerToken: {
8
- gwta: 'add auth bearer token {token}',
27
+ gwta: `use Authorization Bearer header with {token}`,
9
28
  action: async ({ token }) => {
10
- await webPlaywright.withPage(async (page) => {
11
- await page.setExtraHTTPHeaders({ Authorization: `Bearer ${token}` });
12
- });
13
- return OK;
29
+ await webPlaywright.setExtraHTTPHeaders({ [AUTHORIZATION]: `Bearer ${token}` });
30
+ return Promise.resolve(OK);
31
+ },
32
+ },
33
+ restTokenRequest: {
34
+ gwta: `request OAuth 2.0 access token from {endpoint}`,
35
+ action: async ({ endpoint }) => {
36
+ const serialized = await webPlaywright.withPageFetch(endpoint);
37
+ const accessToken = serialized.json[ACCESS_TOKEN];
38
+ await webPlaywright.setExtraHTTPHeaders({ [AUTHORIZATION]: `Bearer ${accessToken}` });
39
+ webPlaywright.getWorld().shared.set(LAST_REST_RESPONSE, serialized);
40
+ return Promise.resolve(OK);
41
+ },
42
+ },
43
+ restTokenLogout: {
44
+ gwta: `perform OAuth 2.0 logout from {endpoint}`,
45
+ action: async ({ endpoint }) => {
46
+ await webPlaywright.setExtraHTTPHeaders({});
47
+ const serialized = await webPlaywright.withPageFetch(endpoint);
48
+ webPlaywright.getWorld().shared.set(LAST_REST_RESPONSE, serialized);
49
+ return Promise.resolve(OK);
50
+ },
51
+ },
52
+ acceptEndpointRequest: {
53
+ gwta: `accept {accept} using ${HTTP} {method} to {endpoint}`,
54
+ action: async ({ accept, method, endpoint }) => {
55
+ method = method.toLowerCase();
56
+ if (!NO_PAYLOAD_METHODS.includes(method)) {
57
+ return actionNotOK(`Method ${method} not supported`);
58
+ }
59
+ const serialized = await webPlaywright.withPageFetch(endpoint, method, { headers: { accept } });
60
+ webPlaywright.getWorld().shared.set(LAST_REST_RESPONSE, serialized);
61
+ return Promise.resolve(OK);
14
62
  },
15
63
  },
16
64
  restEndpointRequest: {
17
- gwta: 'make an http {method} to {endpoint}',
65
+ gwta: `make an ${HTTP} {method} to {endpoint}`,
18
66
  action: async ({ method, endpoint }) => {
19
67
  method = method.toLowerCase();
20
68
  if (!NO_PAYLOAD_METHODS.includes(method)) {
21
69
  return actionNotOK(`Method ${method} not supported`);
22
70
  }
23
- try {
24
- const response = await webPlaywright.withPage(async (page) => await page[method](endpoint));
25
- webPlaywright.getWorld().shared.set(LAST_REST_RESPONSE, capturedResponse(response));
26
- return OK;
71
+ const serialized = await webPlaywright.withPageFetch(endpoint, method);
72
+ webPlaywright.getWorld().shared.set(LAST_REST_RESPONSE, serialized);
73
+ return Promise.resolve(OK);
74
+ },
75
+ },
76
+ filterResponseJson: {
77
+ gwta: `filter JSON response by {property} matching {match}`,
78
+ action: async ({ property, match }) => {
79
+ const lastResponse = webPlaywright.getWorld().shared.get(LAST_REST_RESPONSE);
80
+ if (!lastResponse?.json || !Array.isArray(lastResponse.json)) {
81
+ return actionNotOK(`No JSON or array from ${JSON.stringify(lastResponse)}`);
82
+ }
83
+ const filtered = lastResponse.json.filter((item) => item[property].match(match));
84
+ webPlaywright.getWorld().shared.set(LAST_REST_RESPONSE, {
85
+ ...lastResponse,
86
+ filtered,
87
+ });
88
+ return Promise.resolve(OK);
89
+ },
90
+ },
91
+ filteredResponseLengthIs: {
92
+ gwta: `filtered response length is {length}`,
93
+ action: async ({ length }) => {
94
+ const lastResponse = webPlaywright.getWorld().shared.get(LAST_REST_RESPONSE);
95
+ if (!lastResponse?.filtered || lastResponse.filtered.length !== parseInt(length)) {
96
+ return actionNotOK(`Expected ${length}, got ${lastResponse?.filtered?.length}`);
97
+ }
98
+ return Promise.resolve(OK);
99
+ },
100
+ },
101
+ showResponseLength: {
102
+ gwta: `show JSON response count`,
103
+ action: async () => {
104
+ const lastResponse = webPlaywright.getWorld().shared.get(LAST_REST_RESPONSE);
105
+ if (!lastResponse?.json || typeof lastResponse.json.length !== 'number') {
106
+ console.debug(lastResponse);
107
+ return Promise.resolve(actionNotOK(`No last response to count`));
108
+ }
109
+ webPlaywright.getWorld().logger.info(`lastResponse JSON count is ${lastResponse.json.length}`);
110
+ return Promise.resolve(actionOK({ incident: EExecutionMessageType.ACTION, incidentDetails: { summary: 'options', details: { count: lastResponse.json.length } } }));
111
+ },
112
+ },
113
+ showFilteredLength: {
114
+ gwta: `show filtered response count`,
115
+ action: async () => {
116
+ const lastResponse = webPlaywright.getWorld().shared.get(LAST_REST_RESPONSE);
117
+ if (!lastResponse?.filtered || typeof lastResponse.filtered.length !== 'number') {
118
+ console.debug(lastResponse);
119
+ return Promise.resolve(actionNotOK(`No filtered response to count`));
120
+ }
121
+ webPlaywright.getWorld().logger.info(`lastResponse filtered count is ${lastResponse.filtered.length}`);
122
+ return Promise.resolve(actionOK({ incident: EExecutionMessageType.ACTION, incidentDetails: { summary: 'options', count: lastResponse.filtered.length } }));
123
+ },
124
+ },
125
+ responseJsonLengthIs: {
126
+ gwta: `JSON response length is {length}`,
127
+ action: async ({ length }) => {
128
+ const lastResponse = webPlaywright.getWorld().shared.get(LAST_REST_RESPONSE);
129
+ if (!lastResponse?.json || lastResponse.json.length !== parseInt(length)) {
130
+ return actionNotOK(`Expected ${length}, got ${lastResponse?.json?.length}`);
131
+ }
132
+ return Promise.resolve(OK);
133
+ },
134
+ },
135
+ restEndpointFilteredPropertyRequest: {
136
+ gwta: `for each filtered {property}, make REST {method} to {endpoint} yielding status {status}`,
137
+ action: async ({ property, method, endpoint, status }) => {
138
+ method = method.toLowerCase();
139
+ if (!NO_PAYLOAD_METHODS.includes(method)) {
140
+ return actionNotOK(`Method ${method} not supported`);
141
+ }
142
+ const lastResponse = webPlaywright.getWorld().shared.get(LAST_REST_RESPONSE);
143
+ const { filtered } = lastResponse;
144
+ if (!filtered) {
145
+ return actionNotOK(`No filtered response in ${lastResponse}`);
27
146
  }
28
- catch (error) {
29
- return actionNotOK(`REST request failed: ${error.message}`);
147
+ if (!filtered.every((item) => item[property] !== undefined)) {
148
+ return actionNotOK(`Property ${property} not found in all items`);
30
149
  }
150
+ const responses = [];
151
+ for (const item of filtered) {
152
+ const requestPath = `${endpoint}/${item[property]}`;
153
+ const serialized = await webPlaywright.withPageFetch(requestPath, method);
154
+ if (serialized.status !== parseInt(status, 10)) {
155
+ return actionNotOK(`Expected status ${status} to ${requestPath}, got ${serialized.status}`);
156
+ }
157
+ responses.push(serialized);
158
+ }
159
+ webPlaywright.getWorld().shared.set(LAST_REST_RESPONSE, responses);
160
+ return Promise.resolve(OK);
31
161
  },
32
162
  },
33
163
  restEndpointRequestWithPayload: {
34
- gwta: 'make an http {method} to {endpoint} with {payload}',
164
+ gwta: `make an ${'HTTP'} {method} to {endpoint} with {payload}`,
35
165
  action: async ({ method, endpoint, payload }) => {
36
166
  method = method.toLowerCase();
37
167
  if (!PAYLOAD_METHODS.includes(method)) {
38
- return actionNotOK(`Method ${method} does not support payload`);
168
+ return actionNotOK(`Method ${method} (${method}) does not support payload`);
39
169
  }
40
- try {
41
- const data = typeof payload === 'object' ? payload : JSON.parse(payload);
42
- const requestOptions = { data };
43
- const response = await webPlaywright.withPage(async (page) => await page[method](endpoint, requestOptions));
44
- webPlaywright.getWorld().shared.set(LAST_REST_RESPONSE, capturedResponse(response));
45
- return OK;
170
+ let postData;
171
+ if (typeof payload === 'object') {
172
+ postData = JSON.stringify(payload);
46
173
  }
47
- catch (error) {
48
- return actionNotOK(`REST request failed: ${error.message}`);
174
+ else {
175
+ postData = payload;
49
176
  }
177
+ const requestOptions = {
178
+ postData,
179
+ headers: {
180
+ 'Content-Type': 'application/json',
181
+ },
182
+ };
183
+ const serialized = await webPlaywright.withPageFetch(endpoint, method, requestOptions);
184
+ webPlaywright.getWorld().shared.set(LAST_REST_RESPONSE, serialized);
185
+ return Promise.resolve(OK);
50
186
  },
51
187
  },
52
188
  restLastStatusIs: {
53
- gwta: 'http status is {status}',
189
+ gwta: `${HTTP} status is {status}`,
54
190
  action: async ({ status }) => {
55
191
  const response = webPlaywright.getWorld().shared.get(LAST_REST_RESPONSE);
56
192
  if (response && response.status === parseInt(status)) {
57
- return OK;
193
+ return Promise.resolve(OK);
58
194
  }
59
195
  return actionNotOK(`Expected status ${status}, got ${response?.status || 'no response'}`);
60
196
  },
61
197
  },
62
198
  restResponsePropertyIs: {
63
- gwta: 'http response property {property} is {value}',
199
+ gwta: `${HTTP} response property {property} is {value}`,
64
200
  action: async ({ property, value }) => {
65
201
  const response = webPlaywright.getWorld().shared.get(LAST_REST_RESPONSE);
66
- if (response && response.body && response.body[property]?.toString() === value) {
67
- return OK;
202
+ if (response && response.json && response.json[property] === value) {
203
+ return Promise.resolve(OK);
68
204
  }
69
- return actionNotOK(`Expected response.${property} to be ${value}, got ${response?.body[property] || 'no response'}`);
205
+ return actionNotOK(`Expected response.json.${property} to be ${value}, got ${JSON.stringify(response?.json[property])}`);
70
206
  },
71
207
  },
72
208
  restResponseIs: {
73
- gwta: 'http response is {value}',
74
- action: async ({ property, value }) => {
209
+ gwta: `${HTTP} text response is {value}`,
210
+ action: async ({ value }) => {
75
211
  const response = webPlaywright.getWorld().shared.get(LAST_REST_RESPONSE);
76
- if (response && response.body && response.body.toString() === value) {
77
- return OK;
212
+ if (response && response.text === value) {
213
+ return Promise.resolve(OK);
78
214
  }
79
- return actionNotOK(`Expected response to be ${value}, got ${response?.body[property] || 'no response'}`);
215
+ return actionNotOK(`Expected response to be ${value}, got ${response?.text}`);
80
216
  },
81
217
  },
82
218
  });
83
- async function capturedResponse(response) {
84
- const capturedResponse = {
85
- status: response.status,
86
- statusText: response.statusText,
87
- headers: response.headers,
88
- url: response.url,
89
- json: null,
90
- text: null,
91
- };
92
- try {
93
- capturedResponse.json = await response.json();
94
- }
95
- catch (error) {
96
- capturedResponse.text = await response.text();
97
- }
98
- return capturedResponse;
99
- }
100
219
  //# sourceMappingURL=rest-playwright.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"rest-playwright.js","sourceRoot":"","sources":["../src/rest-playwright.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rest-playwright.js","sourceRoot":"","sources":["../src/rest-playwright.ts"],"names":[],"mappings":"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"}