Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
ulixee
GitHub Repository: ulixee/secret-agent
Path: blob/main/client/test/events.test.ts
1029 views
1
import IResourceMeta from '@secret-agent/interfaces/IResourceMeta';
2
import ICoreRequestPayload from '@secret-agent/interfaces/ICoreRequestPayload';
3
import Resource from '../lib/Resource';
4
import { Handler } from '../index';
5
import ConnectionToCore from '../connections/ConnectionToCore';
6
7
const sessionMeta = {
8
tabId: 1,
9
sessionId: 'session-id',
10
sessionsDataLocation: '',
11
};
12
13
let testConnection: ConnectionToCore;
14
let spy: jest.SpyInstance;
15
beforeEach(() => {
16
class TestConnection extends ConnectionToCore {
17
async internalSendRequest({ command, messageId }: ICoreRequestPayload): Promise<void> {
18
if (command === 'Session.create') {
19
this.onMessage({ data: sessionMeta, responseId: messageId });
20
} else if (command === 'Session.addEventListener') {
21
this.onMessage({ data: { listenerId: 'listener-id' }, responseId: messageId });
22
} else {
23
this.onMessage({ data: {}, responseId: messageId });
24
}
25
}
26
27
protected createConnection = () => Promise.resolve(null);
28
protected destroyConnection = () => Promise.resolve(null);
29
}
30
testConnection = new TestConnection();
31
spy = jest.spyOn<any, any>(testConnection, 'internalSendRequest');
32
});
33
34
describe('events', () => {
35
it('receives close event', async () => {
36
const handler = new Handler(testConnection);
37
38
let isClosed = false;
39
const agent = await handler.createAgent();
40
await agent.on('close', () => {
41
isClosed = true;
42
});
43
44
testConnection.onMessage({
45
meta: { sessionId: 'session-id' },
46
listenerId: 'listener-id',
47
eventArgs: [],
48
});
49
await agent.close();
50
51
const outgoingCommands = spy.mock.calls;
52
expect(outgoingCommands.map(c => c[0].command)).toMatchObject([
53
'Core.connect',
54
'Session.create',
55
'Session.addEventListener', // automatic close tracker
56
'Session.addEventListener', // user added close listener
57
'Session.close',
58
]);
59
expect(isClosed).toBe(true);
60
});
61
62
it('adds and removes event listeners', async () => {
63
const handler = new Handler(testConnection);
64
65
let eventCount = 0;
66
const agent = await handler.createAgent();
67
68
const onResourceFn = (resource): void => {
69
expect(resource).toBeInstanceOf(Resource);
70
eventCount += 1;
71
};
72
73
await agent.activeTab.on('resource', onResourceFn);
74
75
testConnection.onMessage({
76
meta: sessionMeta,
77
listenerId: 'listener-id',
78
eventArgs: [
79
{
80
id: 1,
81
} as IResourceMeta,
82
],
83
});
84
testConnection.onMessage({
85
meta: sessionMeta,
86
listenerId: 'listener-id',
87
eventArgs: [
88
{
89
id: 2,
90
} as IResourceMeta,
91
],
92
});
93
94
// need to wait since events are handled on a promise resolution
95
await new Promise(setImmediate);
96
expect(eventCount).toBe(2);
97
98
await agent.activeTab.off('resource', onResourceFn);
99
testConnection.onMessage({
100
meta: sessionMeta,
101
listenerId: 'listener-id',
102
eventArgs: [
103
{
104
id: 3,
105
} as IResourceMeta,
106
],
107
});
108
expect(eventCount).toBe(2);
109
});
110
});
111
112