import { Helpers } from '@secret-agent/testing';
import Resource from '@secret-agent/client/lib/Resource';
import { Handler } from '../index';
let koaServer;
let handler: Handler;
beforeAll(async () => {
handler = new Handler({ maxConcurrency: 1 });
Helpers.onClose(() => handler.close(), true);
koaServer = await Helpers.runKoaServer();
});
afterAll(Helpers.afterAll);
afterEach(Helpers.afterEach);
describe('basic Full Client tests', () => {
it('runs goto', async () => {
const exampleUrl = `${koaServer.baseUrl}/`;
const agent = await handler.createAgent();
Helpers.needsClosing.push(agent);
await agent.goto(exampleUrl);
const url = await agent.document.location.host;
expect(url).toBe(koaServer.baseHost);
});
it('allows you to block resources', async () => {
koaServer.get('/block', ctx => {
ctx.body = `<html>
<head>
<link rel="stylesheet" href="/test.css" />
</head>
<body>
<img src="/img.png" alt="Image"/>
</body>
</html>`;
});
koaServer.get('/img.png', ctx => {
ctx.statusCode = 500;
});
koaServer.get('/test.css', ctx => {
ctx.statusCode = 500;
});
const agent = await handler.createAgent({
blockedResourceTypes: ['BlockAssets'],
});
Helpers.needsClosing.push(agent);
const resources: Resource[] = [];
await agent.activeTab.on('resource', event => resources.push(event));
await agent.goto(`${koaServer.baseUrl}/block`);
await agent.waitForPaintingStable();
await new Promise(setImmediate);
expect(resources).toHaveLength(1);
expect(await resources[0].response.statusCode).toBe(200);
expect(resources[0].type).toBe('Document');
});
it('should get unreachable proxy errors in the client', async () => {
const agent = await handler.createAgent({
upstreamProxyUrl: koaServer.baseUrl,
upstreamProxyIpMask: {
proxyIp: '127.0.0.1',
publicIp: '127.0.0.1',
},
});
Helpers.needsClosing.push(agent);
await expect(agent.goto(`${koaServer.baseUrl}/`)).rejects.toThrow();
});
it('should get errors in dispatch', async () => {
handler.dispatchAgent(
async agent => {
await agent.goto(`${koaServer.baseUrl}/`);
},
{
upstreamProxyUrl: koaServer.baseUrl,
},
);
await expect(handler.waitForAllDispatches()).rejects.toThrow();
});
it('runs goto with no document loaded', async () => {
const agent = await handler.createAgent();
Helpers.needsClosing.push(agent);
const url = await agent.document.location.host;
expect(url).toBe(null);
});
it('gets the resource back from a goto', async () => {
const exampleUrl = `${koaServer.baseUrl}/`;
const agent = await handler.createAgent({
locale: 'en-US,en',
});
Helpers.needsClosing.push(agent);
const resource = await agent.goto(exampleUrl);
const { request, response } = resource;
expect(await request.headers).toMatchObject({
Host: koaServer.baseHost,
Connection: 'keep-alive',
'Upgrade-Insecure-Requests': '1',
'User-Agent': expect.any(String),
Accept: expect.any(String),
'Accept-Encoding': 'gzip, deflate',
'Accept-Language': 'en-US,en;q=0.9',
});
expect(await request.url).toBe(exampleUrl);
expect(await request.timestamp).toBeTruthy();
expect(await request.method).toBe('GET');
expect(await request.postData).toBe('');
expect(await response.headers).toMatchObject({
'Content-Type': 'text/html; charset=utf-8',
'Content-Length': expect.any(String),
Date: expect.any(String),
Connection: 'keep-alive',
});
expect(await response.url).toBe(exampleUrl);
expect(await response.timestamp).toBeTruthy();
expect(await response.remoteAddress).toBeTruthy();
expect(await response.statusCode).toBe(200);
expect(await response.statusMessage).toBe('OK');
expect(await response.text()).toMatch('<h1>Example Domain</h1>');
});
it('can get and set cookies', async () => {
const agent = await handler.createAgent();
Helpers.needsClosing.push(agent);
koaServer.get('/cookies', ctx => {
ctx.cookies.set('Cookie1', 'This is a test', {
httpOnly: true,
});
ctx.body = '';
});
await agent.goto(`${koaServer.baseUrl}/cookies`);
const cookieStorage = agent.activeTab.cookieStorage;
{
expect(await cookieStorage.length).toBe(1);
const cookie = await cookieStorage.getItem('Cookie1');
expect(cookie.expires).toBe('-1');
expect(cookie.httpOnly).toBe(true);
const documentCookies = await agent.getJsValue('document.cookie');
expect(documentCookies).toBe('');
}
{
const expires = new Date();
expires.setTime(new Date().getTime() + 10e3);
await cookieStorage.setItem('Cookie2', 'test2', { expires });
expect(await cookieStorage.length).toBe(2);
const cookie = await cookieStorage.getItem('Cookie2');
expect(Math.round(Number(cookie.expires))).toBe(expires.getTime());
expect(cookie.httpOnly).toBe(false);
const documentCookies = await agent.getJsValue('document.cookie');
expect(documentCookies).toBe('Cookie2=test2');
}
{
await cookieStorage.removeItem('Cookie2');
expect(await cookieStorage.length).toBe(1);
const documentCookies = await agent.getJsValue('document.cookie');
expect(documentCookies).toBe('');
}
});
it('should send a friendly message if trying to set cookies before a url is loaded', async () => {
const agent = await handler.createAgent();
Helpers.needsClosing.push(agent);
await expect(agent.activeTab.cookieStorage.setItem('test', 'test')).rejects.toThrowError(
"Chrome won't allow you to set cookies on a blank tab.",
);
});
it('can get and set localStorage', async () => {
const agent = await handler.createAgent();
Helpers.needsClosing.push(agent);
await agent.goto(`${koaServer.baseUrl}/`);
const localStorage = agent.activeTab.localStorage;
expect(await localStorage.length).toBe(0);
await localStorage.setItem('Test1', 'here');
expect(await localStorage.length).toBe(1);
await expect(agent.getJsValue('localStorage.getItem("Test1")')).resolves.toBe('here');
expect(await localStorage.key(0)).toBe('Test1');
await localStorage.removeItem('Test1');
expect(await localStorage.length).toBe(0);
});
});