playwright-fluent
Version:
Fluent API around playwright
165 lines (164 loc) • 6.49 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.getOutdatedMocks = void 0;
const with_mocks_1 = require("./with-mocks");
const validate_mock_1 = require("./validate-mock");
const utils_1 = require("../../../utils");
function isJson(content) {
try {
JSON.parse(content);
return true;
}
catch (e) {
return false;
}
}
function shouldUpdateMock(mock) {
const lastUpdated = mock.lastUpdated();
const updatePolicy = mock.updatePolicy;
return (0, utils_1.shouldUpdate)(lastUpdated, updatePolicy);
}
/**
* Get outdated mocks from the given unintercepted requests.
* If a mock is found to be outdated and has provided a method to update its data source,
* then the update method will be called, so that the mock can update itself the data source of the mocked response.
* @export
* @param {Partial<FluentMock>[]} mocks
* @param {Request[]} requests
* @param {Partial<WithMocksOptions>} options
* @param {unknown} [sharedContext={}]
* @returns {Promise<OutdatedMock[]>}
*/
async function getOutdatedMocks(mocks, requests, options, sharedContext = {}) {
const mockOptions = {
...with_mocks_1.defaultMocksOptions,
...options,
};
const result = [];
if (!Array.isArray(mocks)) {
return [];
}
if (mocks.length === 0) {
return [];
}
if (requests.length === 0) {
throw new Error('No requests provided. Maybe you forgot to record requests.');
}
mocks.forEach(validate_mock_1.validateMock);
for (let index = 0; index < requests.length; index++) {
const request = requests[index];
const requestMethod = request.method();
const url = request.url();
const queryString = (0, utils_1.extractQueryStringObjectFromUrl)(url);
const postData = (0, with_mocks_1.getPostDataOf)(request);
const requestInfos = { request, queryString, postData, sharedContext };
const requestResponse = await request.response();
if (!requestResponse) {
continue;
}
const requestStatus = requestResponse.status();
if (requestStatus >= 300) {
continue;
}
const mock = mocks
.map(with_mocks_1.inferMockResponseTypeIfNeeded)
.map(with_mocks_1.spreadMissingProperties)
.filter((mock) => mock.urlMatcher(url))
.filter((mock) => mock.methodMatcher(requestMethod))
.filter((mock) => mock.queryStringMatcher(queryString))
.filter((mock) => mock.postDataMatcher(postData))
.filter((mock) => mock.contextMatcher(sharedContext))
.filter((mock) => mock.customMatcher(requestInfos))
.pop();
if (!mock) {
mockOptions.onMockNotFound({ request, queryString, postData, sharedContext });
continue;
}
if (mock.responseType === 'continue') {
continue;
}
const mockedStatus = (0, with_mocks_1.getMockStatus)(mock, { request, queryString, postData, sharedContext });
if (mockedStatus >= 300) {
continue;
}
if (mock.responseType === 'json') {
try {
const mockedResponse = mock.jsonResponse({ request, queryString, postData, sharedContext });
const actualResponse = await requestResponse.json();
mockOptions.onMockFound(mock, { request, queryString, postData, sharedContext });
const isOutdated = !(0, utils_1.areSameType)(mockedResponse, actualResponse);
if (isOutdated && shouldUpdateMock(mock)) {
result.push({
url,
mock,
actualResponse,
mockedResponse,
});
mock.updateData({ request, queryString, postData, sharedContext }, actualResponse);
}
}
catch (error) {
mockOptions.onInternalError(error, mock, {
request,
queryString,
postData,
sharedContext,
});
}
continue;
}
if (mock.responseType === 'string' || mock.responseType === 'empty') {
try {
const mockedBody = mock.rawResponse({ request, queryString, postData, sharedContext });
const actualBody = await requestResponse.text();
mockOptions.onMockFound(mock, { request, queryString, postData, sharedContext });
if (isJson(actualBody) && shouldUpdateMock(mock)) {
result.push({
url,
mock,
actualResponse: actualBody,
mockedResponse: mockedBody,
});
mock.updateData({ request, queryString, postData, sharedContext }, actualBody);
}
}
catch (error) {
mockOptions.onInternalError(error, mock, {
request,
queryString,
postData,
sharedContext,
});
}
continue;
}
if (mock.responseType === 'javascript') {
try {
const mockedBody = mock.rawResponse({ request, queryString, postData, sharedContext });
const actualBody = await requestResponse.text();
mockOptions.onMockFound(mock, { request, queryString, postData, sharedContext });
const isOutdated = mockedBody !== actualBody;
if (isOutdated && shouldUpdateMock(mock)) {
result.push({
url,
mock,
actualResponse: actualBody,
mockedResponse: mockedBody,
});
mock.updateData({ request, queryString, postData, sharedContext }, actualBody);
}
}
catch (error) {
mockOptions.onInternalError(error, mock, {
request,
queryString,
postData,
sharedContext,
});
}
continue;
}
}
return result;
}
exports.getOutdatedMocks = getOutdatedMocks;
;