request-mocking-protocol
Version:
A protocol for declarative mocking of HTTP requests
48 lines • 1.87 kB
JavaScript
;
/**
* Playwright interceptor.
* Used in Playwright tests to mock page requests with the same syntax as for server requests.
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.setupPlaywrightInterceptor = setupPlaywrightInterceptor;
const utils_1 = require("../request-matcher/utils");
const response_builder_1 = require("../response-builder");
async function setupPlaywrightInterceptor(page, mockClient) {
await page.route('**', async (route) => {
const request = buildFetchRequest(route.request());
const matchResult = await (0, utils_1.matchSchemas)(request, mockClient.schemas);
if (!matchResult)
return route.fallback();
const { body, headers, status } = await new response_builder_1.ResponseBuilder(matchResult, {
bypass: (req) => bypass(req, route),
}).build();
await route.fulfill({
status,
headers: Object.fromEntries(headers),
body: body instanceof ArrayBuffer ? Buffer.from(body) : (body ?? undefined),
// route.fulfill() doesn't accept statusText
});
});
}
function buildFetchRequest(pwRequest) {
return new Request(pwRequest.url(), {
method: pwRequest.method(),
headers: pwRequest.headers(),
body: pwRequest.postDataBuffer(),
});
}
async function bypass(req, route) {
const pwResponse = await route.fetch({
url: req.url,
headers: Object.fromEntries(req.headers),
postData: req.body ? Buffer.from(await req.arrayBuffer()) : undefined,
});
return {
status: pwResponse.status(),
statusText: pwResponse.statusText(),
headers: new Headers(pwResponse.headers()),
arrayBuffer: () => pwResponse.body(),
json: () => pwResponse.json(),
};
}
//# sourceMappingURL=playwright.js.map