playwright-fluent
Version:
Fluent API around playwright
115 lines (114 loc) • 4.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const tslib_1 = require("tslib");
const path = tslib_1.__importStar(require("path"));
const fs_1 = require("fs");
const playwright_1 = require("playwright");
const simple_fake_server_1 = require("simple-fake-server");
const SUT = tslib_1.__importStar(require("../index"));
const record_requests_to_1 = require("../../record-requests-to");
const utils_1 = require("../../../../utils");
describe('with mocks', () => {
let browser = undefined;
let fakeServer = undefined;
beforeAll(() => {
fakeServer = new simple_fake_server_1.FakeServer(1240);
fakeServer.start();
//The FakeServer now listens on http://localhost:1240
});
afterAll(() => {
if (fakeServer) {
fakeServer.stop();
}
});
// eslint-disable-next-line @typescript-eslint/no-empty-function
beforeEach(() => { });
afterEach(async () => {
if (browser) {
await browser.close();
}
});
test('should mock response for GET requests', async () => {
// Given
browser = await playwright_1.chromium.launch({
headless: true,
});
const context = await browser.newContext({ viewport: null });
const page = await context.newPage();
const responseBody = {
prop1: 'foobar',
};
const responseHeaders = {
'foo-header': 'bar',
};
const mockResponseBody = {
prop1: 'mock-foobar',
};
const mockResponseHeaders = {
'foo-header': 'mock-bar',
};
fakeServer &&
// prettier-ignore
fakeServer.http
.get()
.to('/foobar')
.willReturn(responseBody, 200, responseHeaders);
const mock = {
displayName: 'mock for GET /foobar?foo=bar',
urlMatcher: (url) => url.includes('/foobar'),
queryStringMatcher: (queryString) => queryString.foo === 'bar',
methodMatcher: (method) => method === 'GET',
enrichResponseHeaders: (headers) => {
return {
...headers,
...mockResponseHeaders,
};
},
jsonResponse: () => mockResponseBody,
status: 200,
};
const mockOptions = {
onMockFound: (foundMock) => {
expect(foundMock.displayName).toBe(mock.displayName);
},
onMockNotFound: (requestInfo) => {
// eslint-disable-next-line no-console
console.log(`mock not found for ${requestInfo.request.url()}`);
},
onInternalError: (error) => {
// eslint-disable-next-line no-console
console.log(`internal error: ${error}`);
},
};
const htmlContent = (0, fs_1.readFileSync)(`${path.join(__dirname, 'with-mocks.test.html')}`);
fakeServer &&
// prettier-ignore
fakeServer.http
.get()
.to('/app')
.willReturn(htmlContent.toString(), 200);
const requests = [];
const ignorePredicate = () => false;
const callback = (request) => requests.push(request);
await (0, record_requests_to_1.recordRequestsTo)('/foobar', ignorePredicate, page, callback);
const mocks = () => [mock];
const sharedContext = {};
// When
await SUT.withMocks(mocks, () => sharedContext, mockOptions, page);
await page.goto('http://localhost:1240/app');
await (0, utils_1.sleep)(3000);
// Then
expect(requests.length).toBe(2);
const stringifiedRequest = await (0, utils_1.stringifyRequest)(requests[0]);
const request = JSON.parse(stringifiedRequest);
expect(request.url).toContain('?foo=bar');
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
expect(request.response.status).toBe(200);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
expect(request.response.payload).not.toMatchObject(responseBody);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
expect(request.response.payload).toMatchObject(mockResponseBody);
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
expect(request.response.headers['foo-header']).toBe('mock-bar');
});
});