Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/core/test/resources.test.ts
1029 views
1
import { Helpers } from '@secret-agent/testing';
2
import Core, { Session } from '@secret-agent/core';
3
import Resolvable from '@secret-agent/commons/Resolvable';
4
import ConnectionToClient from '../server/ConnectionToClient';
5
6
let connection: ConnectionToClient;
7
beforeAll(() => {
8
connection = Core.addConnection();
9
Helpers.onClose(() => connection.disconnect(), true);
10
});
11
afterAll(Helpers.afterAll);
12
afterEach(Helpers.afterEach);
13
14
test('loads http2 resources', async () => {
15
const server = await Helpers.runHttp2Server((req, res) => {
16
res.stream.respond({
17
':status': 200,
18
'content-type': 'text/html',
19
});
20
res.stream.pushStream({ ':path': '/img.png' }, (err, pushStream) => {
21
pushStream.respond({
22
':status': 200,
23
'content-type': 'image/png',
24
});
25
pushStream.end(Helpers.getLogo());
26
});
27
res.end(`<html><body><img src="/img.png"/></body></html>`);
28
});
29
30
const meta = await connection.createSession();
31
const tab = Session.getTab(meta);
32
const session = Session.get(meta.sessionId);
33
Helpers.needsClosing.push(session);
34
await tab.goto(server.url);
35
await tab.waitForLoad('DomContentLoaded');
36
37
const resources = await tab.waitForResource({ url: /.*\/img.png/ });
38
expect(resources).toHaveLength(1);
39
expect(resources[0].type).toBe('Image');
40
await session.close();
41
});
42
43
test('records a single resource for failed mitm requests', async () => {
44
const meta = await connection.createSession();
45
const session = Session.get(meta.sessionId);
46
Helpers.needsClosing.push(session);
47
const tab = Session.getTab(meta);
48
49
const resolvable = new Resolvable<void>();
50
const originalEmit = tab.puppetPage.emit.bind(tab.puppetPage);
51
// @ts-ignore
52
jest.spyOn(tab.puppetPage.networkManager, 'emit').mockImplementation((evt, args) => {
53
// eslint-disable-next-line promise/always-return,promise/catch-or-return
54
resolvable.promise.then(() => {
55
originalEmit(evt, args);
56
});
57
return true;
58
});
59
const goToPromise = tab.goto(`http://localhost:2344/not-there`);
60
61
await expect(goToPromise).rejects.toThrowError();
62
expect(session.mitmErrorsByUrl.get(`http://localhost:2344/not-there`)).toHaveLength(1);
63
expect(session.sessionState.getResources(meta.tabId)).toHaveLength(1);
64
// @ts-ignore
65
expect(Object.keys(session.sessionState.browserRequestIdToResources)).toHaveLength(0);
66
resolvable.resolve();
67
await new Promise(resolve => setTimeout(resolve, 100));
68
expect(session.sessionState.getResources(meta.tabId)).toHaveLength(1);
69
// @ts-ignore
70
expect(Object.keys(session.sessionState.browserRequestIdToResources)).toHaveLength(1);
71
await session.close();
72
});
73
74