Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/core/test/GlobalPool.test.ts
1029 views
1
import { Helpers } from '@secret-agent/testing/index';
2
import Resolvable from '@secret-agent/commons/Resolvable';
3
import * as http from 'http';
4
import { ITestHttpServer } from '@secret-agent/testing/helpers';
5
import Core, { GlobalPool } from '../index';
6
import Session from '../lib/Session';
7
8
let httpServer: ITestHttpServer<http.Server>;
9
10
beforeAll(async () => {
11
httpServer = await Helpers.runHttpServer({ onlyCloseOnFinal: true });
12
});
13
beforeEach(() => {
14
GlobalPool.maxConcurrentAgentsCount = 10;
15
});
16
afterEach(Helpers.afterEach);
17
afterAll(Helpers.afterAll);
18
19
describe('GlobalPool tests', () => {
20
it('should be able to get multiple entries out of the pool', async () => {
21
const connection = Core.addConnection();
22
Helpers.onClose(() => connection.disconnect());
23
GlobalPool.maxConcurrentAgentsCount = 3;
24
await connection.connect({ maxConcurrentAgentsCount: 3 });
25
expect(GlobalPool.maxConcurrentAgentsCount).toBe(3);
26
expect(GlobalPool.activeSessionCount).toBe(0);
27
28
const tab1 = Session.getTab(await connection.createSession());
29
Helpers.needsClosing.push(tab1.session);
30
// #1
31
await tab1.goto(`${httpServer.baseUrl}/pool1`);
32
expect(GlobalPool.activeSessionCount).toBe(1);
33
34
const tab2 = Session.getTab(await connection.createSession());
35
Helpers.needsClosing.push(tab2.session);
36
37
// #2
38
await tab2.goto(`${httpServer.baseUrl}/pool2`);
39
expect(GlobalPool.activeSessionCount).toBe(2);
40
41
const tab3 = Session.getTab(await connection.createSession());
42
Helpers.needsClosing.push(tab3.session);
43
44
// #3
45
await tab3.goto(`${httpServer.baseUrl}/pool3`);
46
expect(GlobalPool.activeSessionCount).toBe(3);
47
48
// #4
49
const tab4Promise = connection.createSession();
50
expect(GlobalPool.activeSessionCount).toBe(3);
51
await tab1.session.close();
52
const tab4Meta = await tab4Promise;
53
const tab4 = Session.getTab(tab4Meta);
54
Helpers.needsClosing.push(tab4.session);
55
56
// should give straight to this waiting promise
57
expect(GlobalPool.activeSessionCount).toBe(3);
58
await tab4.goto(`${httpServer.baseUrl}/pool4`);
59
await tab4.session.close();
60
expect(GlobalPool.activeSessionCount).toBe(2);
61
62
await Promise.all([tab1.session.close(), tab2.session.close(), tab3.session.close()]);
63
expect(GlobalPool.activeSessionCount).toBe(0);
64
}, 15e3);
65
66
it('should emit events when all session tabs are closed', async () => {
67
const connection = Core.addConnection();
68
Helpers.onClose(() => connection.disconnect());
69
await connection.connect();
70
71
const tab = Session.getTab(await connection.createSession());
72
Helpers.needsClosing.push(tab.session);
73
await tab.goto(`${httpServer.baseUrl}/session-events`);
74
const allTabsClosed = jest.fn();
75
tab.session.on('all-tabs-closed', allTabsClosed);
76
77
await tab.close();
78
79
expect(allTabsClosed).toBeCalledTimes(1);
80
await Core.shutdown();
81
});
82
83
it('should emit an event when a browser has no open windows', async () => {
84
const connection = Core.addConnection();
85
Helpers.onClose(() => connection.disconnect());
86
await connection.connect();
87
88
const tab = Session.getTab(await connection.createSession());
89
Helpers.needsClosing.push(tab.session);
90
await tab.goto(`${httpServer.baseUrl}/no-windows`);
91
92
const tab2 = Session.getTab(await connection.createSession());
93
Helpers.needsClosing.push(tab2.session);
94
await tab2.goto(`${httpServer.baseUrl}/no-windows2`);
95
96
const browserWindowsClosed = jest.fn();
97
const didCallPromise = new Resolvable<void>();
98
99
GlobalPool.events.on('browser-has-no-open-windows', () => {
100
browserWindowsClosed();
101
didCallPromise.resolve();
102
});
103
104
await tab.close();
105
106
expect(browserWindowsClosed).toBeCalledTimes(0);
107
await tab2.close();
108
await didCallPromise.promise;
109
expect(browserWindowsClosed).toBeCalledTimes(1);
110
await Core.shutdown();
111
});
112
113
it('should emit all browsers closed event', async () => {
114
const connection = Core.addConnection();
115
Helpers.onClose(() => connection.disconnect());
116
await connection.connect();
117
118
const tab = Session.getTab(await connection.createSession());
119
Helpers.needsClosing.push(tab.session);
120
121
const allBrowsersTriggered = new Resolvable<void>();
122
const allBrowsersClosedEvent = jest.fn();
123
GlobalPool.events.on('all-browsers-closed', () => {
124
allBrowsersTriggered.resolve();
125
allBrowsersClosedEvent();
126
});
127
128
// @ts-ignore
129
const puppets = GlobalPool.puppets;
130
expect(puppets).toHaveLength(1);
131
132
const puppet1 = puppets[0];
133
expect(allBrowsersClosedEvent).toBeCalledTimes(0);
134
135
// @ts-ignore
136
const puppet2 = await GlobalPool.getPuppet({
137
...puppet1.browserEngine,
138
launchArguments: puppet1.browserEngine.launchArguments.slice(0, -1),
139
});
140
141
expect(puppets).toHaveLength(2);
142
expect(allBrowsersClosedEvent).toBeCalledTimes(0);
143
144
await tab.close();
145
await puppet1.close();
146
expect(allBrowsersClosedEvent).toBeCalledTimes(0);
147
148
await puppet2.close();
149
await allBrowsersTriggered.promise;
150
expect(allBrowsersClosedEvent).toBeCalledTimes(1);
151
await Core.shutdown();
152
});
153
});
154
155