Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/full-client/test/basic.test.ts
1028 views
1
import { Helpers } from '@secret-agent/testing';
2
import Resource from '@secret-agent/client/lib/Resource';
3
import { Handler } from '../index';
4
5
let koaServer;
6
let handler: Handler;
7
beforeAll(async () => {
8
handler = new Handler({ maxConcurrency: 1 });
9
Helpers.onClose(() => handler.close(), true);
10
koaServer = await Helpers.runKoaServer();
11
});
12
afterAll(Helpers.afterAll);
13
afterEach(Helpers.afterEach);
14
15
describe('basic Full Client tests', () => {
16
it('runs goto', async () => {
17
const exampleUrl = `${koaServer.baseUrl}/`;
18
const agent = await handler.createAgent();
19
Helpers.needsClosing.push(agent);
20
21
await agent.goto(exampleUrl);
22
const url = await agent.document.location.host;
23
expect(url).toBe(koaServer.baseHost);
24
});
25
26
it('allows you to block resources', async () => {
27
koaServer.get('/block', ctx => {
28
ctx.body = `<html>
29
<head>
30
<link rel="stylesheet" href="/test.css" />
31
</head>
32
<body>
33
<img src="/img.png" alt="Image"/>
34
</body>
35
</html>`;
36
});
37
38
koaServer.get('/img.png', ctx => {
39
ctx.statusCode = 500;
40
});
41
koaServer.get('/test.css', ctx => {
42
ctx.statusCode = 500;
43
});
44
45
const agent = await handler.createAgent({
46
blockedResourceTypes: ['BlockAssets'],
47
});
48
Helpers.needsClosing.push(agent);
49
50
const resources: Resource[] = [];
51
await agent.activeTab.on('resource', event => resources.push(event));
52
await agent.goto(`${koaServer.baseUrl}/block`);
53
await agent.waitForPaintingStable();
54
await new Promise(setImmediate);
55
expect(resources).toHaveLength(1);
56
expect(await resources[0].response.statusCode).toBe(200);
57
expect(resources[0].type).toBe('Document');
58
});
59
60
it('should get unreachable proxy errors in the client', async () => {
61
const agent = await handler.createAgent({
62
upstreamProxyUrl: koaServer.baseUrl,
63
upstreamProxyIpMask: {
64
proxyIp: '127.0.0.1',
65
publicIp: '127.0.0.1',
66
},
67
});
68
Helpers.needsClosing.push(agent);
69
await expect(agent.goto(`${koaServer.baseUrl}/`)).rejects.toThrow();
70
});
71
72
it('should get errors in dispatch', async () => {
73
handler.dispatchAgent(
74
async agent => {
75
await agent.goto(`${koaServer.baseUrl}/`);
76
},
77
{
78
upstreamProxyUrl: koaServer.baseUrl,
79
},
80
);
81
82
await expect(handler.waitForAllDispatches()).rejects.toThrow();
83
});
84
85
it('runs goto with no document loaded', async () => {
86
const agent = await handler.createAgent();
87
Helpers.needsClosing.push(agent);
88
const url = await agent.document.location.host;
89
expect(url).toBe(null);
90
});
91
92
it('gets the resource back from a goto', async () => {
93
const exampleUrl = `${koaServer.baseUrl}/`;
94
const agent = await handler.createAgent({
95
locale: 'en-US,en',
96
});
97
Helpers.needsClosing.push(agent);
98
99
const resource = await agent.goto(exampleUrl);
100
101
const { request, response } = resource;
102
expect(await request.headers).toMatchObject({
103
Host: koaServer.baseHost,
104
Connection: 'keep-alive',
105
'Upgrade-Insecure-Requests': '1',
106
'User-Agent': expect.any(String),
107
Accept: expect.any(String),
108
'Accept-Encoding': 'gzip, deflate',
109
'Accept-Language': 'en-US,en;q=0.9',
110
});
111
expect(await request.url).toBe(exampleUrl);
112
expect(await request.timestamp).toBeTruthy();
113
expect(await request.method).toBe('GET');
114
expect(await request.postData).toBe('');
115
116
expect(await response.headers).toMatchObject({
117
'Content-Type': 'text/html; charset=utf-8',
118
'Content-Length': expect.any(String),
119
Date: expect.any(String),
120
Connection: 'keep-alive',
121
});
122
expect(await response.url).toBe(exampleUrl);
123
expect(await response.timestamp).toBeTruthy();
124
expect(await response.remoteAddress).toBeTruthy();
125
expect(await response.statusCode).toBe(200);
126
expect(await response.statusMessage).toBe('OK');
127
expect(await response.text()).toMatch('<h1>Example Domain</h1>');
128
});
129
130
it('can get and set cookies', async () => {
131
const agent = await handler.createAgent();
132
Helpers.needsClosing.push(agent);
133
134
koaServer.get('/cookies', ctx => {
135
ctx.cookies.set('Cookie1', 'This is a test', {
136
httpOnly: true,
137
});
138
ctx.body = '';
139
});
140
141
await agent.goto(`${koaServer.baseUrl}/cookies`);
142
const cookieStorage = agent.activeTab.cookieStorage;
143
{
144
expect(await cookieStorage.length).toBe(1);
145
const cookie = await cookieStorage.getItem('Cookie1');
146
expect(cookie.expires).toBe('-1');
147
expect(cookie.httpOnly).toBe(true);
148
// httponly not in doc
149
const documentCookies = await agent.getJsValue('document.cookie');
150
expect(documentCookies).toBe('');
151
}
152
{
153
const expires = new Date();
154
expires.setTime(new Date().getTime() + 10e3);
155
await cookieStorage.setItem('Cookie2', 'test2', { expires });
156
expect(await cookieStorage.length).toBe(2);
157
const cookie = await cookieStorage.getItem('Cookie2');
158
expect(Math.round(Number(cookie.expires))).toBe(expires.getTime());
159
expect(cookie.httpOnly).toBe(false);
160
161
const documentCookies = await agent.getJsValue('document.cookie');
162
expect(documentCookies).toBe('Cookie2=test2');
163
}
164
// test deleting
165
{
166
await cookieStorage.removeItem('Cookie2');
167
expect(await cookieStorage.length).toBe(1);
168
const documentCookies = await agent.getJsValue('document.cookie');
169
expect(documentCookies).toBe('');
170
}
171
});
172
173
it('should send a friendly message if trying to set cookies before a url is loaded', async () => {
174
const agent = await handler.createAgent();
175
Helpers.needsClosing.push(agent);
176
177
await expect(agent.activeTab.cookieStorage.setItem('test', 'test')).rejects.toThrowError(
178
"Chrome won't allow you to set cookies on a blank tab.",
179
);
180
});
181
182
it('can get and set localStorage', async () => {
183
const agent = await handler.createAgent();
184
Helpers.needsClosing.push(agent);
185
186
await agent.goto(`${koaServer.baseUrl}/`);
187
const localStorage = agent.activeTab.localStorage;
188
expect(await localStorage.length).toBe(0);
189
await localStorage.setItem('Test1', 'here');
190
expect(await localStorage.length).toBe(1);
191
192
await expect(agent.getJsValue('localStorage.getItem("Test1")')).resolves.toBe('here');
193
194
expect(await localStorage.key(0)).toBe('Test1');
195
await localStorage.removeItem('Test1');
196
expect(await localStorage.length).toBe(0);
197
});
198
});
199
200