UNPKG

playwright-fluent

Version:
165 lines (164 loc) 6.49 kB
"use strict"; 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;