playwright-automation-core 1.0.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/LICENSE +21 -0
- package/README.md +225 -0
- package/dist/api/api.assertions.d.ts +196 -0
- package/dist/api/api.assertions.d.ts.map +1 -0
- package/dist/api/api.assertions.js +462 -0
- package/dist/api/api.assertions.js.map +1 -0
- package/dist/api/api.builder.d.ts +134 -0
- package/dist/api/api.builder.d.ts.map +1 -0
- package/dist/api/api.builder.js +273 -0
- package/dist/api/api.builder.js.map +1 -0
- package/dist/api/api.client.d.ts +157 -0
- package/dist/api/api.client.d.ts.map +1 -0
- package/dist/api/api.client.js +493 -0
- package/dist/api/api.client.js.map +1 -0
- package/dist/api/index.d.ts +8 -0
- package/dist/api/index.d.ts.map +1 -0
- package/dist/api/index.js +17 -0
- package/dist/api/index.js.map +1 -0
- package/dist/core/base.driver.d.ts +130 -0
- package/dist/core/base.driver.d.ts.map +1 -0
- package/dist/core/base.driver.js +264 -0
- package/dist/core/base.driver.js.map +1 -0
- package/dist/core/driver.factory.d.ts +120 -0
- package/dist/core/driver.factory.d.ts.map +1 -0
- package/dist/core/driver.factory.js +222 -0
- package/dist/core/driver.factory.js.map +1 -0
- package/dist/core/element.actions.d.ts +119 -0
- package/dist/core/element.actions.d.ts.map +1 -0
- package/dist/core/element.actions.js +379 -0
- package/dist/core/element.actions.js.map +1 -0
- package/dist/core/hook.manager.d.ts +186 -0
- package/dist/core/hook.manager.d.ts.map +1 -0
- package/dist/core/hook.manager.js +297 -0
- package/dist/core/hook.manager.js.map +1 -0
- package/dist/core/index.d.ts +8 -0
- package/dist/core/index.d.ts.map +1 -0
- package/dist/core/index.js +22 -0
- package/dist/core/index.js.map +1 -0
- package/dist/index.d.ts +17 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +128 -0
- package/dist/index.js.map +1 -0
- package/dist/mobile/index.d.ts +7 -0
- package/dist/mobile/index.d.ts.map +1 -0
- package/dist/mobile/index.js +14 -0
- package/dist/mobile/index.js.map +1 -0
- package/dist/mobile/mobile.assertions.d.ts +146 -0
- package/dist/mobile/mobile.assertions.d.ts.map +1 -0
- package/dist/mobile/mobile.assertions.js +333 -0
- package/dist/mobile/mobile.assertions.js.map +1 -0
- package/dist/mobile/mobile.driver.d.ts +297 -0
- package/dist/mobile/mobile.driver.d.ts.map +1 -0
- package/dist/mobile/mobile.driver.js +808 -0
- package/dist/mobile/mobile.driver.js.map +1 -0
- package/dist/types/common.types.d.ts +200 -0
- package/dist/types/common.types.d.ts.map +1 -0
- package/dist/types/common.types.js +3 -0
- package/dist/types/common.types.js.map +1 -0
- package/dist/types/config.types.d.ts +192 -0
- package/dist/types/config.types.d.ts.map +1 -0
- package/dist/types/config.types.js +3 -0
- package/dist/types/config.types.js.map +1 -0
- package/dist/types/driver.types.d.ts +500 -0
- package/dist/types/driver.types.d.ts.map +1 -0
- package/dist/types/driver.types.js +3 -0
- package/dist/types/driver.types.js.map +1 -0
- package/dist/types/enums.d.ts +53 -0
- package/dist/types/enums.d.ts.map +1 -0
- package/dist/types/enums.js +62 -0
- package/dist/types/enums.js.map +1 -0
- package/dist/types/index.d.ts +8 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +15 -0
- package/dist/types/index.js.map +1 -0
- package/dist/utils/config.manager.d.ts +144 -0
- package/dist/utils/config.manager.d.ts.map +1 -0
- package/dist/utils/config.manager.js +473 -0
- package/dist/utils/config.manager.js.map +1 -0
- package/dist/utils/errors.d.ts +149 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +290 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/helpers.d.ts +124 -0
- package/dist/utils/helpers.d.ts.map +1 -0
- package/dist/utils/helpers.js +421 -0
- package/dist/utils/helpers.js.map +1 -0
- package/dist/utils/index.d.ts +9 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +78 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +145 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +235 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/wait.utils.d.ts +95 -0
- package/dist/utils/wait.utils.d.ts.map +1 -0
- package/dist/utils/wait.utils.js +306 -0
- package/dist/utils/wait.utils.js.map +1 -0
- package/dist/web/index.d.ts +8 -0
- package/dist/web/index.d.ts.map +1 -0
- package/dist/web/index.js +16 -0
- package/dist/web/index.js.map +1 -0
- package/dist/web/web.assertions.d.ts +164 -0
- package/dist/web/web.assertions.d.ts.map +1 -0
- package/dist/web/web.assertions.js +427 -0
- package/dist/web/web.assertions.js.map +1 -0
- package/dist/web/web.driver.d.ts +174 -0
- package/dist/web/web.driver.d.ts.map +1 -0
- package/dist/web/web.driver.js +571 -0
- package/dist/web/web.driver.js.map +1 -0
- package/dist/web/web.page.d.ts +286 -0
- package/dist/web/web.page.d.ts.map +1 -0
- package/dist/web/web.page.js +570 -0
- package/dist/web/web.page.js.map +1 -0
- package/package.json +115 -0
|
@@ -0,0 +1,493 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ApiClient = void 0;
|
|
4
|
+
const test_1 = require("@playwright/test");
|
|
5
|
+
const types_1 = require("../types");
|
|
6
|
+
const base_driver_1 = require("../core/base.driver");
|
|
7
|
+
const hook_manager_1 = require("../core/hook.manager");
|
|
8
|
+
const utils_1 = require("../utils");
|
|
9
|
+
/**
|
|
10
|
+
* API Client implementation using Playwright's request context.
|
|
11
|
+
* Provides a clean interface for REST API testing.
|
|
12
|
+
*/
|
|
13
|
+
class ApiClient extends base_driver_1.BaseDriver {
|
|
14
|
+
/** Playwright API request context */
|
|
15
|
+
requestContext = null;
|
|
16
|
+
/** API-specific configuration */
|
|
17
|
+
config;
|
|
18
|
+
/** Default headers for all requests */
|
|
19
|
+
defaultHeaders = {};
|
|
20
|
+
/** Hook manager */
|
|
21
|
+
hooks;
|
|
22
|
+
/** Wait utilities for retry logic */
|
|
23
|
+
waitUtils;
|
|
24
|
+
/**
|
|
25
|
+
* Create a new ApiClient instance
|
|
26
|
+
*/
|
|
27
|
+
constructor(config, logger) {
|
|
28
|
+
super(types_1.Platform.API, config, logger);
|
|
29
|
+
this.config = config;
|
|
30
|
+
this.hooks = (0, hook_manager_1.getHookManager)();
|
|
31
|
+
this.waitUtils = new utils_1.WaitUtils(this.logger);
|
|
32
|
+
// Set default headers from config
|
|
33
|
+
if (config.headers) {
|
|
34
|
+
this.defaultHeaders = { ...config.headers };
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
/**
|
|
38
|
+
* Initialize the API client
|
|
39
|
+
*/
|
|
40
|
+
async initialize() {
|
|
41
|
+
if (this.initialized) {
|
|
42
|
+
this.logger.warn("ApiClient already initialized");
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
// Execute before init hooks
|
|
46
|
+
await this.hooks.execute(hook_manager_1.HookEvent.BEFORE_DRIVER_INIT, {
|
|
47
|
+
platform: this.platform,
|
|
48
|
+
data: { config: this.getSafeConfig() },
|
|
49
|
+
});
|
|
50
|
+
try {
|
|
51
|
+
this.logger.info("Initializing ApiClient", {
|
|
52
|
+
baseURL: this.config.baseURL,
|
|
53
|
+
});
|
|
54
|
+
// Create Playwright request context
|
|
55
|
+
this.requestContext = await test_1.request.newContext({
|
|
56
|
+
baseURL: this.config.baseURL,
|
|
57
|
+
extraHTTPHeaders: this.defaultHeaders,
|
|
58
|
+
ignoreHTTPSErrors: this.config.ignoreHTTPSErrors,
|
|
59
|
+
httpCredentials: this.config.httpCredentials,
|
|
60
|
+
proxy: this.config.proxy,
|
|
61
|
+
});
|
|
62
|
+
// Generate session ID and mark initialized
|
|
63
|
+
this.generateSessionId();
|
|
64
|
+
this.markInitialized();
|
|
65
|
+
// Execute after init hooks
|
|
66
|
+
await this.hooks.execute(hook_manager_1.HookEvent.AFTER_DRIVER_INIT, {
|
|
67
|
+
platform: this.platform,
|
|
68
|
+
driverStatus: this.getStatus(),
|
|
69
|
+
data: { baseURL: this.config.baseURL },
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
catch (error) {
|
|
73
|
+
const err = error;
|
|
74
|
+
this.logger.error("Failed to initialize ApiClient", {
|
|
75
|
+
error: err.message,
|
|
76
|
+
});
|
|
77
|
+
throw new utils_1.DriverInitializationError(this.platform, `Failed to initialize API client: ${err.message}`, { baseURL: this.config.baseURL });
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Get the underlying Playwright request context
|
|
82
|
+
*/
|
|
83
|
+
getDriver() {
|
|
84
|
+
this.ensureInitialized("getDriver");
|
|
85
|
+
return this.requestContext;
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Get the request context (alias for getDriver)
|
|
89
|
+
*/
|
|
90
|
+
getRequestContext() {
|
|
91
|
+
return this.getDriver();
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Perform GET request
|
|
95
|
+
*/
|
|
96
|
+
async get(endpoint, options = {}) {
|
|
97
|
+
return this.request({
|
|
98
|
+
method: types_1.HttpMethod.GET,
|
|
99
|
+
endpoint,
|
|
100
|
+
options,
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Perform POST request
|
|
105
|
+
*/
|
|
106
|
+
async post(endpoint, data, options = {}) {
|
|
107
|
+
return this.request({
|
|
108
|
+
method: types_1.HttpMethod.POST,
|
|
109
|
+
endpoint,
|
|
110
|
+
data,
|
|
111
|
+
options,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Perform PUT request
|
|
116
|
+
*/
|
|
117
|
+
async put(endpoint, data, options = {}) {
|
|
118
|
+
return this.request({
|
|
119
|
+
method: types_1.HttpMethod.PUT,
|
|
120
|
+
endpoint,
|
|
121
|
+
data,
|
|
122
|
+
options,
|
|
123
|
+
});
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Perform PATCH request
|
|
127
|
+
*/
|
|
128
|
+
async patch(endpoint, data, options = {}) {
|
|
129
|
+
return this.request({
|
|
130
|
+
method: types_1.HttpMethod.PATCH,
|
|
131
|
+
endpoint,
|
|
132
|
+
data,
|
|
133
|
+
options,
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Perform DELETE request
|
|
138
|
+
*/
|
|
139
|
+
async delete(endpoint, options = {}) {
|
|
140
|
+
return this.request({
|
|
141
|
+
method: types_1.HttpMethod.DELETE,
|
|
142
|
+
endpoint,
|
|
143
|
+
options,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Perform HEAD request
|
|
148
|
+
*/
|
|
149
|
+
async head(endpoint, options = {}) {
|
|
150
|
+
return this.request({
|
|
151
|
+
method: types_1.HttpMethod.HEAD,
|
|
152
|
+
endpoint,
|
|
153
|
+
options,
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* Perform OPTIONS request
|
|
158
|
+
*/
|
|
159
|
+
async options(endpoint, options = {}) {
|
|
160
|
+
return this.request({
|
|
161
|
+
method: types_1.HttpMethod.OPTIONS,
|
|
162
|
+
endpoint,
|
|
163
|
+
options,
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
/**
|
|
167
|
+
* Internal request method
|
|
168
|
+
*/
|
|
169
|
+
async request(config) {
|
|
170
|
+
this.ensureInitialized("request");
|
|
171
|
+
const { method, endpoint, data, options } = config;
|
|
172
|
+
const url = this.buildUrl(endpoint, options.params);
|
|
173
|
+
const headers = this.buildHeaders(options.headers);
|
|
174
|
+
const timeout = options.timeout ?? this.config.timeout ?? 30000;
|
|
175
|
+
// Execute before request hooks
|
|
176
|
+
await this.hooks.execute(hook_manager_1.HookEvent.BEFORE_REQUEST, {
|
|
177
|
+
platform: this.platform,
|
|
178
|
+
data: { method, url, headers: this.sanitizeHeaders(headers) },
|
|
179
|
+
});
|
|
180
|
+
// Log request
|
|
181
|
+
if (this.config.enableLogging) {
|
|
182
|
+
this.logger.apiRequest(method, url, {
|
|
183
|
+
headers: this.sanitizeHeaders(headers),
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
const startTime = Date.now();
|
|
187
|
+
try {
|
|
188
|
+
// Execute request with retry logic
|
|
189
|
+
const response = await this.executeWithRetry(async () => this.executeRequest(method, url, headers, data, timeout, options), options);
|
|
190
|
+
const responseTime = Date.now() - startTime;
|
|
191
|
+
// Parse response
|
|
192
|
+
const apiResponse = await this.parseResponse(response, url, responseTime);
|
|
193
|
+
// Log response
|
|
194
|
+
if (this.config.enableLogging) {
|
|
195
|
+
this.logger.apiResponse(method, url, apiResponse.status, responseTime, {
|
|
196
|
+
ok: apiResponse.ok,
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
// Execute after request hooks
|
|
200
|
+
await this.hooks.execute(hook_manager_1.HookEvent.AFTER_REQUEST, {
|
|
201
|
+
platform: this.platform,
|
|
202
|
+
data: {
|
|
203
|
+
method,
|
|
204
|
+
url,
|
|
205
|
+
status: apiResponse.status,
|
|
206
|
+
responseTime,
|
|
207
|
+
ok: apiResponse.ok,
|
|
208
|
+
},
|
|
209
|
+
});
|
|
210
|
+
// Check for failure if failOnStatusCode is true
|
|
211
|
+
if (options.failOnStatusCode !== false && !apiResponse.ok) {
|
|
212
|
+
throw new utils_1.ApiRequestError(method, url, `Request failed with status ${apiResponse.status}`, apiResponse.status, apiResponse.data);
|
|
213
|
+
}
|
|
214
|
+
return apiResponse;
|
|
215
|
+
}
|
|
216
|
+
catch (error) {
|
|
217
|
+
const responseTime = Date.now() - startTime;
|
|
218
|
+
if (error instanceof utils_1.ApiRequestError) {
|
|
219
|
+
throw error;
|
|
220
|
+
}
|
|
221
|
+
const err = error;
|
|
222
|
+
this.logger.error(`API request failed: ${method} ${url}`, {
|
|
223
|
+
error: err.message,
|
|
224
|
+
responseTime,
|
|
225
|
+
});
|
|
226
|
+
throw new utils_1.ApiRequestError(method, url, err.message);
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Execute the actual HTTP request
|
|
231
|
+
*/
|
|
232
|
+
async executeRequest(method, url, headers, data, timeout, options) {
|
|
233
|
+
const requestOptions = {
|
|
234
|
+
method,
|
|
235
|
+
headers,
|
|
236
|
+
timeout,
|
|
237
|
+
ignoreHTTPSErrors: options.ignoreHTTPSErrors ?? this.config.ignoreHTTPSErrors,
|
|
238
|
+
};
|
|
239
|
+
// Add body for methods that support it
|
|
240
|
+
if (data !== undefined && ["POST", "PUT", "PATCH"].includes(method)) {
|
|
241
|
+
if (options.form) {
|
|
242
|
+
requestOptions.form = options.form;
|
|
243
|
+
}
|
|
244
|
+
else if (options.multipart) {
|
|
245
|
+
// Type assertion for multipart data
|
|
246
|
+
requestOptions.multipart =
|
|
247
|
+
options.multipart;
|
|
248
|
+
}
|
|
249
|
+
else {
|
|
250
|
+
requestOptions.data = data;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
return await this.requestContext.fetch(url, requestOptions);
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Execute request with retry logic
|
|
257
|
+
*/
|
|
258
|
+
async executeWithRetry(fn, options) {
|
|
259
|
+
const retryCount = options.failOnStatusCode === false ? 0 : this.config.retryCount ?? 0;
|
|
260
|
+
if (retryCount === 0) {
|
|
261
|
+
return await fn();
|
|
262
|
+
}
|
|
263
|
+
return await this.waitUtils.retry(fn, {
|
|
264
|
+
maxRetries: retryCount,
|
|
265
|
+
retryDelay: this.config.retryDelay ?? 1000,
|
|
266
|
+
backoffMultiplier: 1.5,
|
|
267
|
+
});
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* Parse API response
|
|
271
|
+
*/
|
|
272
|
+
async parseResponse(response, url, responseTime) {
|
|
273
|
+
const headers = {};
|
|
274
|
+
const responseHeaders = response.headers();
|
|
275
|
+
for (const [key, value] of Object.entries(responseHeaders)) {
|
|
276
|
+
headers[key] = value;
|
|
277
|
+
}
|
|
278
|
+
let data;
|
|
279
|
+
const contentType = headers["content-type"] || "";
|
|
280
|
+
try {
|
|
281
|
+
if (contentType.includes("application/json")) {
|
|
282
|
+
data = (await response.json());
|
|
283
|
+
}
|
|
284
|
+
else if (contentType.includes("text/")) {
|
|
285
|
+
data = (await response.text());
|
|
286
|
+
}
|
|
287
|
+
else {
|
|
288
|
+
// For binary or unknown content types
|
|
289
|
+
const buffer = await response.body();
|
|
290
|
+
data = buffer;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
catch {
|
|
294
|
+
// If parsing fails, try to get text
|
|
295
|
+
try {
|
|
296
|
+
data = (await response.text());
|
|
297
|
+
}
|
|
298
|
+
catch {
|
|
299
|
+
data = undefined;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
return {
|
|
303
|
+
status: response.status(),
|
|
304
|
+
statusText: response.statusText(),
|
|
305
|
+
headers,
|
|
306
|
+
data,
|
|
307
|
+
responseTime,
|
|
308
|
+
url,
|
|
309
|
+
ok: response.ok(),
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
/**
|
|
313
|
+
* Build URL with query parameters
|
|
314
|
+
*/
|
|
315
|
+
buildUrl(endpoint, params) {
|
|
316
|
+
const mergedParams = { ...this.config.params, ...params };
|
|
317
|
+
if (Object.keys(mergedParams).length === 0) {
|
|
318
|
+
return endpoint;
|
|
319
|
+
}
|
|
320
|
+
const queryString = new URLSearchParams(mergedParams).toString();
|
|
321
|
+
const separator = endpoint.includes("?") ? "&" : "?";
|
|
322
|
+
return `${endpoint}${separator}${queryString}`;
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Build headers for request
|
|
326
|
+
*/
|
|
327
|
+
buildHeaders(additionalHeaders) {
|
|
328
|
+
return {
|
|
329
|
+
...this.defaultHeaders,
|
|
330
|
+
...additionalHeaders,
|
|
331
|
+
};
|
|
332
|
+
}
|
|
333
|
+
/**
|
|
334
|
+
* Sanitize headers for logging (hide sensitive values)
|
|
335
|
+
*/
|
|
336
|
+
sanitizeHeaders(headers) {
|
|
337
|
+
const sensitiveKeys = [
|
|
338
|
+
"authorization",
|
|
339
|
+
"x-api-key",
|
|
340
|
+
"api-key",
|
|
341
|
+
"token",
|
|
342
|
+
"cookie",
|
|
343
|
+
];
|
|
344
|
+
const sanitized = { ...headers };
|
|
345
|
+
for (const key of Object.keys(sanitized)) {
|
|
346
|
+
if (sensitiveKeys.includes(key.toLowerCase())) {
|
|
347
|
+
sanitized[key] = "***REDACTED***";
|
|
348
|
+
}
|
|
349
|
+
}
|
|
350
|
+
return sanitized;
|
|
351
|
+
}
|
|
352
|
+
/**
|
|
353
|
+
* Set a default header for all requests
|
|
354
|
+
*/
|
|
355
|
+
setHeader(key, value) {
|
|
356
|
+
this.defaultHeaders[key] = value;
|
|
357
|
+
this.logger.debug(`Set header: ${key}`);
|
|
358
|
+
}
|
|
359
|
+
/**
|
|
360
|
+
* Remove a default header
|
|
361
|
+
*/
|
|
362
|
+
removeHeader(key) {
|
|
363
|
+
delete this.defaultHeaders[key];
|
|
364
|
+
this.logger.debug(`Removed header: ${key}`);
|
|
365
|
+
}
|
|
366
|
+
/**
|
|
367
|
+
* Get all default headers
|
|
368
|
+
*/
|
|
369
|
+
getHeaders() {
|
|
370
|
+
return { ...this.defaultHeaders };
|
|
371
|
+
}
|
|
372
|
+
/**
|
|
373
|
+
* Set bearer token for authentication
|
|
374
|
+
*/
|
|
375
|
+
setBearerToken(token) {
|
|
376
|
+
this.setHeader("Authorization", `Bearer ${token}`);
|
|
377
|
+
this.logger.debug("Set bearer token");
|
|
378
|
+
}
|
|
379
|
+
/**
|
|
380
|
+
* Clear bearer token
|
|
381
|
+
*/
|
|
382
|
+
clearBearerToken() {
|
|
383
|
+
this.removeHeader("Authorization");
|
|
384
|
+
this.logger.debug("Cleared bearer token");
|
|
385
|
+
}
|
|
386
|
+
/**
|
|
387
|
+
* Set basic auth credentials
|
|
388
|
+
*/
|
|
389
|
+
setBasicAuth(username, password) {
|
|
390
|
+
const credentials = Buffer.from(`${username}:${password}`).toString("base64");
|
|
391
|
+
this.setHeader("Authorization", `Basic ${credentials}`);
|
|
392
|
+
this.logger.debug("Set basic auth");
|
|
393
|
+
}
|
|
394
|
+
/**
|
|
395
|
+
* Set API key header
|
|
396
|
+
*/
|
|
397
|
+
setApiKey(key, headerName = "X-API-Key") {
|
|
398
|
+
this.setHeader(headerName, key);
|
|
399
|
+
this.logger.debug(`Set API key header: ${headerName}`);
|
|
400
|
+
}
|
|
401
|
+
/**
|
|
402
|
+
* Set content type header
|
|
403
|
+
*/
|
|
404
|
+
setContentType(contentType) {
|
|
405
|
+
this.setHeader("Content-Type", contentType);
|
|
406
|
+
}
|
|
407
|
+
/**
|
|
408
|
+
* Set accept header
|
|
409
|
+
*/
|
|
410
|
+
setAccept(accept) {
|
|
411
|
+
this.setHeader("Accept", accept);
|
|
412
|
+
}
|
|
413
|
+
/**
|
|
414
|
+
* Take screenshot - not applicable for API, returns empty buffer
|
|
415
|
+
*/
|
|
416
|
+
async takeScreenshot(_options) {
|
|
417
|
+
this.logger.warn("Screenshots are not supported for API testing");
|
|
418
|
+
return Buffer.from("");
|
|
419
|
+
}
|
|
420
|
+
/**
|
|
421
|
+
* Execute script - not applicable for API
|
|
422
|
+
*/
|
|
423
|
+
async executeScript(_script) {
|
|
424
|
+
throw new Error("executeScript is not supported for API testing");
|
|
425
|
+
}
|
|
426
|
+
/**
|
|
427
|
+
* Dispose/quit the API client
|
|
428
|
+
*/
|
|
429
|
+
async quit() {
|
|
430
|
+
if (!this.initialized) {
|
|
431
|
+
return;
|
|
432
|
+
}
|
|
433
|
+
// Execute before quit hooks
|
|
434
|
+
await this.hooks.execute(hook_manager_1.HookEvent.BEFORE_DRIVER_QUIT, {
|
|
435
|
+
platform: this.platform,
|
|
436
|
+
driverStatus: this.getStatus(),
|
|
437
|
+
});
|
|
438
|
+
try {
|
|
439
|
+
if (this.requestContext) {
|
|
440
|
+
await this.requestContext.dispose();
|
|
441
|
+
this.requestContext = null;
|
|
442
|
+
}
|
|
443
|
+
await super.quit();
|
|
444
|
+
// Execute after quit hooks
|
|
445
|
+
await this.hooks.execute(hook_manager_1.HookEvent.AFTER_DRIVER_QUIT, {
|
|
446
|
+
platform: this.platform,
|
|
447
|
+
});
|
|
448
|
+
}
|
|
449
|
+
catch (error) {
|
|
450
|
+
this.logger.error("Error during ApiClient quit", {
|
|
451
|
+
error: error.message,
|
|
452
|
+
});
|
|
453
|
+
}
|
|
454
|
+
}
|
|
455
|
+
/**
|
|
456
|
+
* Alias for quit
|
|
457
|
+
*/
|
|
458
|
+
async dispose() {
|
|
459
|
+
return this.quit();
|
|
460
|
+
}
|
|
461
|
+
/**
|
|
462
|
+
* Health check - perform a simple GET request
|
|
463
|
+
*/
|
|
464
|
+
async healthCheck(endpoint = "/") {
|
|
465
|
+
try {
|
|
466
|
+
const response = await this.get(endpoint, {
|
|
467
|
+
timeout: 5000,
|
|
468
|
+
failOnStatusCode: false,
|
|
469
|
+
});
|
|
470
|
+
return response.ok;
|
|
471
|
+
}
|
|
472
|
+
catch {
|
|
473
|
+
return false;
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Get base URL
|
|
478
|
+
*/
|
|
479
|
+
getBaseUrl() {
|
|
480
|
+
return this.config.baseURL;
|
|
481
|
+
}
|
|
482
|
+
/**
|
|
483
|
+
* Create a new instance with different base URL
|
|
484
|
+
*/
|
|
485
|
+
async withBaseUrl(baseURL) {
|
|
486
|
+
const newConfig = { ...this.config, baseURL };
|
|
487
|
+
const client = new ApiClient(newConfig, this.logger);
|
|
488
|
+
await client.initialize();
|
|
489
|
+
return client;
|
|
490
|
+
}
|
|
491
|
+
}
|
|
492
|
+
exports.ApiClient = ApiClient;
|
|
493
|
+
//# sourceMappingURL=api.client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api.client.js","sourceRoot":"","sources":["../../src/api/api.client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API Module - Playwright-based API testing
|
|
3
|
+
*/
|
|
4
|
+
export { ApiClient } from "./api.client";
|
|
5
|
+
export { ApiAssertions, ApiSoftAssertionResult, JsonSchema, } from "./api.assertions";
|
|
6
|
+
export { ApiRequestBuilder, createRequest } from "./api.builder";
|
|
7
|
+
export type { APIRequestContext, APIResponse } from "@playwright/test";
|
|
8
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EACL,aAAa,EACb,sBAAsB,EACtB,UAAU,GACX,MAAM,kBAAkB,CAAC;AAG1B,OAAO,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAGjE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* API Module - Playwright-based API testing
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.createRequest = exports.ApiRequestBuilder = exports.ApiAssertions = exports.ApiClient = void 0;
|
|
7
|
+
// API Client
|
|
8
|
+
var api_client_1 = require("./api.client");
|
|
9
|
+
Object.defineProperty(exports, "ApiClient", { enumerable: true, get: function () { return api_client_1.ApiClient; } });
|
|
10
|
+
// API Assertions
|
|
11
|
+
var api_assertions_1 = require("./api.assertions");
|
|
12
|
+
Object.defineProperty(exports, "ApiAssertions", { enumerable: true, get: function () { return api_assertions_1.ApiAssertions; } });
|
|
13
|
+
// API Request Builder
|
|
14
|
+
var api_builder_1 = require("./api.builder");
|
|
15
|
+
Object.defineProperty(exports, "ApiRequestBuilder", { enumerable: true, get: function () { return api_builder_1.ApiRequestBuilder; } });
|
|
16
|
+
Object.defineProperty(exports, "createRequest", { enumerable: true, get: function () { return api_builder_1.createRequest; } });
|
|
17
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH,aAAa;AACb,2CAAyC;AAAhC,uGAAA,SAAS,OAAA;AAElB,iBAAiB;AACjB,mDAI0B;AAHxB,+GAAA,aAAa,OAAA;AAKf,sBAAsB;AACtB,6CAAiE;AAAxD,gHAAA,iBAAiB,OAAA;AAAE,4GAAA,aAAa,OAAA"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { Platform, DriverStatus, ScreenshotOptions, BaseConfig, IDriver } from "../types";
|
|
2
|
+
import { Logger } from "../utils";
|
|
3
|
+
/**
|
|
4
|
+
* Abstract base driver class that all platform drivers must extend.
|
|
5
|
+
* Provides common functionality and enforces consistent API across platforms.
|
|
6
|
+
*/
|
|
7
|
+
export declare abstract class BaseDriver implements IDriver {
|
|
8
|
+
/** Platform type */
|
|
9
|
+
protected readonly platform: Platform;
|
|
10
|
+
/** Driver configuration */
|
|
11
|
+
protected config: BaseConfig;
|
|
12
|
+
/** Logger instance */
|
|
13
|
+
protected logger: Logger;
|
|
14
|
+
/** Session ID */
|
|
15
|
+
protected sessionId: string | undefined;
|
|
16
|
+
/** Initialization state */
|
|
17
|
+
protected initialized: boolean;
|
|
18
|
+
/** Session start time */
|
|
19
|
+
protected startTime: Date | undefined;
|
|
20
|
+
/** Implicit wait timeout */
|
|
21
|
+
protected implicitWaitTimeout: number;
|
|
22
|
+
/**
|
|
23
|
+
* Create a new BaseDriver instance
|
|
24
|
+
* @param platform - The platform type (web, api, mobile)
|
|
25
|
+
* @param config - Driver configuration
|
|
26
|
+
* @param logger - Optional logger instance
|
|
27
|
+
*/
|
|
28
|
+
constructor(platform: Platform, config: BaseConfig, logger?: Logger);
|
|
29
|
+
/**
|
|
30
|
+
* Initialize the driver - must be implemented by subclasses
|
|
31
|
+
*/
|
|
32
|
+
abstract initialize(): Promise<void>;
|
|
33
|
+
/**
|
|
34
|
+
* Get the underlying driver instance - must be implemented by subclasses
|
|
35
|
+
*/
|
|
36
|
+
abstract getDriver(): unknown;
|
|
37
|
+
/**
|
|
38
|
+
* Take a screenshot - must be implemented by subclasses
|
|
39
|
+
*/
|
|
40
|
+
abstract takeScreenshot(options?: ScreenshotOptions): Promise<Buffer>;
|
|
41
|
+
/**
|
|
42
|
+
* Execute custom script - must be implemented by subclasses
|
|
43
|
+
*/
|
|
44
|
+
abstract executeScript<T>(script: string | ((...args: unknown[]) => T), ...args: unknown[]): Promise<T>;
|
|
45
|
+
/**
|
|
46
|
+
* Quit the driver and cleanup - can be overridden by subclasses
|
|
47
|
+
*/
|
|
48
|
+
quit(): Promise<void>;
|
|
49
|
+
/**
|
|
50
|
+
* Check if driver is initialized
|
|
51
|
+
*/
|
|
52
|
+
isInitialized(): boolean;
|
|
53
|
+
/**
|
|
54
|
+
* Get current platform
|
|
55
|
+
*/
|
|
56
|
+
getPlatform(): Platform;
|
|
57
|
+
/**
|
|
58
|
+
* Get session ID
|
|
59
|
+
*/
|
|
60
|
+
getSessionId(): string | undefined;
|
|
61
|
+
/**
|
|
62
|
+
* Get driver status
|
|
63
|
+
*/
|
|
64
|
+
getStatus(): DriverStatus;
|
|
65
|
+
/**
|
|
66
|
+
* Set implicit wait timeout
|
|
67
|
+
*/
|
|
68
|
+
setImplicitWait(timeout: number): Promise<void>;
|
|
69
|
+
/**
|
|
70
|
+
* Get implicit wait timeout
|
|
71
|
+
*/
|
|
72
|
+
getImplicitWait(): number;
|
|
73
|
+
/**
|
|
74
|
+
* Get the configuration
|
|
75
|
+
*/
|
|
76
|
+
getConfig(): BaseConfig;
|
|
77
|
+
/**
|
|
78
|
+
* Get the logger instance
|
|
79
|
+
*/
|
|
80
|
+
getLogger(): Logger;
|
|
81
|
+
/**
|
|
82
|
+
* Ensure driver is initialized, throw error if not
|
|
83
|
+
*/
|
|
84
|
+
protected ensureInitialized(operation: string): void;
|
|
85
|
+
/**
|
|
86
|
+
* Generate a new session ID
|
|
87
|
+
*/
|
|
88
|
+
protected generateSessionId(): string;
|
|
89
|
+
/**
|
|
90
|
+
* Mark driver as initialized
|
|
91
|
+
*/
|
|
92
|
+
protected markInitialized(): void;
|
|
93
|
+
/**
|
|
94
|
+
* Save screenshot to file
|
|
95
|
+
*/
|
|
96
|
+
protected saveScreenshot(buffer: Buffer, options?: ScreenshotOptions): Promise<string>;
|
|
97
|
+
/**
|
|
98
|
+
* Generate a unique screenshot filename
|
|
99
|
+
*/
|
|
100
|
+
protected generateScreenshotFilename(extension?: string): string;
|
|
101
|
+
/**
|
|
102
|
+
* Get safe config (without sensitive data) for logging
|
|
103
|
+
*/
|
|
104
|
+
protected getSafeConfig(): Record<string, unknown>;
|
|
105
|
+
/**
|
|
106
|
+
* Log action start
|
|
107
|
+
*/
|
|
108
|
+
protected logActionStart(action: string, details?: Record<string, unknown>): number;
|
|
109
|
+
/**
|
|
110
|
+
* Log action end
|
|
111
|
+
*/
|
|
112
|
+
protected logActionEnd(action: string, startTime: number, details?: Record<string, unknown>): void;
|
|
113
|
+
/**
|
|
114
|
+
* Log action failure
|
|
115
|
+
*/
|
|
116
|
+
protected logActionFailed(action: string, error: Error, details?: Record<string, unknown>): void;
|
|
117
|
+
/**
|
|
118
|
+
* Execute an action with logging
|
|
119
|
+
*/
|
|
120
|
+
protected executeAction<T>(actionName: string, action: () => Promise<T>, details?: Record<string, unknown>): Promise<T>;
|
|
121
|
+
/**
|
|
122
|
+
* Get session duration in milliseconds
|
|
123
|
+
*/
|
|
124
|
+
getSessionDuration(): number | undefined;
|
|
125
|
+
/**
|
|
126
|
+
* Get timeout value (config or default)
|
|
127
|
+
*/
|
|
128
|
+
protected getTimeout(overrideTimeout?: number): number;
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=base.driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"base.driver.d.ts","sourceRoot":"","sources":["../../src/core/base.driver.ts"],"names":[],"mappings":"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"}
|