Skip to content

Commit 05fbfcc

Browse files
author
Perki
committed
More tests
1 parent 1cb776b commit 05fbfcc

File tree

9 files changed

+1136
-0
lines changed

9 files changed

+1136
-0
lines changed
Lines changed: 230 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,230 @@
1+
/**
2+
* @license
3+
* [BSD-3-Clause](https://github.com/pryv/lib-js/blob/master/LICENSE)
4+
*/
5+
/* global describe, it, before, beforeEach, afterEach, expect, pryv, conn, prepareAndCreateBaseStreams */
6+
7+
require('./load-helpers');
8+
const Changes = require('../src/lib/Changes');
9+
10+
describe('[MEDX] Monitor Edge Cases', function () {
11+
this.timeout(20000);
12+
13+
before(async function () {
14+
this.timeout(20000);
15+
await prepareAndCreateBaseStreams();
16+
});
17+
18+
describe('[MERX] Error handling', function () {
19+
it('[MERA] throws error when updateEvents called before start', async function () {
20+
const monitor = new pryv.Monitor(conn, { limit: 1 });
21+
let error = null;
22+
try {
23+
await monitor.updateEvents();
24+
} catch (e) {
25+
error = e;
26+
}
27+
expect(error).to.exist;
28+
expect(error.message).to.include('Start Monitor');
29+
});
30+
31+
it('[MERB] throws error when updateStreams called before start', async function () {
32+
const monitor = new pryv.Monitor(conn, { limit: 1 });
33+
let error = null;
34+
try {
35+
await monitor.updateStreams();
36+
} catch (e) {
37+
error = e;
38+
}
39+
expect(error).to.exist;
40+
expect(error.message).to.include('Start Monitor');
41+
});
42+
43+
it('[MERC] throws error when stop called during starting', async function () {
44+
const monitor = new pryv.Monitor(conn, { limit: 1 });
45+
// Both started and starting must be true for the error to be thrown
46+
monitor.states.started = true;
47+
monitor.states.starting = true;
48+
let error = null;
49+
try {
50+
monitor.stop();
51+
} catch (e) {
52+
error = e;
53+
}
54+
expect(error).to.exist;
55+
expect(error.message).to.include('starting');
56+
// Clean up
57+
monitor.states.starting = false;
58+
monitor.states.started = false;
59+
});
60+
});
61+
62+
describe('[MSSX] Start/Stop states', function () {
63+
let monitor;
64+
65+
beforeEach(() => {
66+
monitor = new pryv.Monitor(conn, { limit: 1 });
67+
});
68+
69+
afterEach(() => {
70+
if (monitor.started) monitor.stop();
71+
});
72+
73+
it('[MSSA] start() returns early if already started', async function () {
74+
await monitor.start();
75+
expect(monitor.started).to.be.true;
76+
// Second start should return immediately
77+
const result = await monitor.start();
78+
expect(result).to.equal(monitor);
79+
});
80+
81+
it('[MSSB] start() returns early if starting', async function () {
82+
monitor.states.starting = true;
83+
const result = await monitor.start();
84+
expect(result).to.equal(monitor);
85+
monitor.states.starting = false;
86+
});
87+
88+
it('[MSSC] stop() returns early if not started', function () {
89+
const result = monitor.stop();
90+
expect(result).to.equal(monitor);
91+
});
92+
93+
it('[MSSD] stop() emits STOP event', async function () {
94+
let stopEmitted = false;
95+
await monitor.start();
96+
monitor.on(Changes.STOP, () => { stopEmitted = true; });
97+
monitor.stop();
98+
expect(stopEmitted).to.be.true;
99+
expect(monitor.started).to.be.false;
100+
});
101+
102+
it('[MSSE] started property returns correct state', async function () {
103+
expect(monitor.started).to.be.false;
104+
await monitor.start();
105+
expect(monitor.started).to.be.true;
106+
monitor.stop();
107+
expect(monitor.started).to.be.false;
108+
});
109+
});
110+
111+
describe('[MSEM] Semaphore behavior', function () {
112+
let monitor;
113+
114+
beforeEach(async () => {
115+
monitor = new pryv.Monitor(conn, { limit: 1 });
116+
await monitor.start();
117+
});
118+
119+
afterEach(() => {
120+
if (monitor.started) monitor.stop();
121+
});
122+
123+
it('[MSEA] updateEvents uses semaphore correctly', async function () {
124+
// Simulate updating
125+
monitor.states.updatingEvents = true;
126+
await monitor.updateEvents();
127+
expect(monitor.states.updateEventRequired).to.be.true;
128+
monitor.states.updatingEvents = false;
129+
});
130+
131+
it('[MSEB] updateStreams uses semaphore correctly', async function () {
132+
// Simulate updating
133+
monitor.states.updatingStreams = true;
134+
await monitor.updateStreams();
135+
expect(monitor.states.updateStreamsRequired).to.be.true;
136+
monitor.states.updatingStreams = false;
137+
});
138+
});
139+
140+
describe('[MAUM] addUpdateMethod', function () {
141+
it('[MAUA] addUpdateMethod chains correctly', async function () {
142+
const monitor = new pryv.Monitor(conn, { limit: 1 });
143+
const mockUpdateMethod = {
144+
setMonitor: function (m) { this.monitor = m; }
145+
};
146+
const result = monitor.addUpdateMethod(mockUpdateMethod);
147+
expect(result).to.equal(monitor);
148+
expect(mockUpdateMethod.monitor).to.equal(monitor);
149+
});
150+
});
151+
152+
describe('[MDEV] Deleted Events', function () {
153+
let monitor;
154+
let createdEventId;
155+
156+
beforeEach(async () => {
157+
monitor = new pryv.Monitor(conn, { limit: 100 });
158+
});
159+
160+
afterEach(() => {
161+
if (monitor.started) monitor.stop();
162+
});
163+
164+
it('[MDEA] detects deleted events', async function () {
165+
this.timeout(15000);
166+
167+
// Create an event first
168+
const createRes = await conn.api([{
169+
method: 'events.create',
170+
params: {
171+
streamId: global.testStreamId,
172+
type: 'note/txt',
173+
content: 'to be deleted ' + Date.now()
174+
}
175+
}]);
176+
createdEventId = createRes[0].event.id;
177+
178+
// Start monitor - it will include deletions after start
179+
await monitor.start();
180+
181+
// Set up listener for deleted events
182+
let _deletedEventReceived = false;
183+
monitor.on(Changes.EVENT_DELETE, (event) => {
184+
if (event.id === createdEventId) {
185+
_deletedEventReceived = true;
186+
}
187+
});
188+
189+
// Delete the event
190+
await conn.api([{
191+
method: 'events.delete',
192+
params: { id: createdEventId }
193+
}]);
194+
195+
// Trigger update
196+
await monitor.updateEvents();
197+
await new Promise(resolve => setTimeout(resolve, 2000));
198+
199+
// The event may or may not be received depending on timing
200+
// but the code path should be exercised
201+
});
202+
});
203+
204+
describe('[MRDY] Ready emission', function () {
205+
let monitor;
206+
207+
beforeEach(async () => {
208+
monitor = new pryv.Monitor(conn, { limit: 1 });
209+
});
210+
211+
afterEach(() => {
212+
if (monitor.started) monitor.stop();
213+
});
214+
215+
it('[MRDA] emits READY after start', function (done) {
216+
monitor.on(Changes.READY, () => {
217+
expect(monitor.started).to.be.true;
218+
done();
219+
});
220+
monitor.start();
221+
});
222+
223+
it('[MRDB] ready() does nothing when not started', function () {
224+
let readyEmitted = false;
225+
monitor.on(Changes.READY, () => { readyEmitted = true; });
226+
monitor.ready();
227+
expect(readyEmitted).to.be.false;
228+
});
229+
});
230+
});

0 commit comments

Comments
 (0)