Skip to content

Commit bb01d69

Browse files
Fix types and tests
1 parent 4f10df6 commit bb01d69

File tree

1 file changed

+89
-41
lines changed

1 file changed

+89
-41
lines changed

code/core/src/telemetry/event-cache.test.ts

Lines changed: 89 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@ import { beforeEach, describe, expect, it, vi } from 'vitest';
33

44
import { cache } from 'storybook/internal/common';
55

6+
import type { CacheEntry } from './event-cache';
67
import { getLastEvents, getPrecedingUpgrade, set } from './event-cache';
8+
import type { TelemetryEvent } from './types';
79

810
vi.mock('storybook/internal/common', { spy: true });
911

@@ -12,54 +14,94 @@ expect.addSnapshotSerializer({
1214
test: (val) => typeof val !== 'string',
1315
});
1416

17+
// Helper to create valid TelemetryEvent objects
18+
const createTelemetryEvent = (
19+
eventType: TelemetryEvent['eventType'],
20+
eventId: string,
21+
overrides?: Partial<TelemetryEvent>
22+
): TelemetryEvent => ({
23+
eventType,
24+
eventId,
25+
sessionId: 'test-session',
26+
context: {},
27+
payload: {},
28+
...overrides,
29+
});
30+
1531
describe('event-cache', () => {
16-
const init = { body: { eventType: 'init', eventId: 'init' }, timestamp: 1 };
17-
const upgrade = { body: { eventType: 'upgrade', eventId: 'upgrade' }, timestamp: 2 };
18-
const dev = { body: { eventType: 'dev', eventId: 'dev' }, timestamp: 3 };
19-
const build = { body: { eventType: 'build', eventId: 'build' }, timestamp: 3 };
20-
const error = { body: { eventType: 'build', eventId: 'error' }, timestamp: 4 };
21-
const versionUpdate = {
22-
body: { eventType: 'version-update', eventId: 'version-update' },
32+
const init: CacheEntry = {
33+
body: createTelemetryEvent('init', 'init'),
34+
timestamp: 1,
35+
};
36+
const upgrade: CacheEntry = {
37+
body: createTelemetryEvent('upgrade', 'upgrade'),
38+
timestamp: 2,
39+
};
40+
const dev: CacheEntry = {
41+
body: createTelemetryEvent('dev', 'dev'),
42+
timestamp: 3,
43+
};
44+
const build: CacheEntry = {
45+
body: createTelemetryEvent('build', 'build'),
46+
timestamp: 3,
47+
};
48+
const error: CacheEntry = {
49+
body: createTelemetryEvent('build', 'error'),
50+
timestamp: 4,
51+
};
52+
const versionUpdate: CacheEntry = {
53+
body: createTelemetryEvent('version-update', 'version-update'),
2354
timestamp: 5,
2455
};
2556

2657
describe('data handling', () => {
2758
it('errors', async () => {
2859
const preceding = await getPrecedingUpgrade({
29-
init: { timestamp: 1, body: { ...init.body, error: {} } },
60+
init: {
61+
timestamp: 1,
62+
body: { ...init.body, error: {} } as TelemetryEvent & { error: unknown },
63+
},
3064
});
3165
expect(preceding).toMatchInlineSnapshot(`
3266
{
3367
"timestamp": 1,
3468
"eventType": "init",
35-
"eventId": "init"
69+
"eventId": "init",
70+
"sessionId": "test-session"
3671
}
3772
`);
3873
});
3974

4075
it('session IDs', async () => {
4176
const preceding = await getPrecedingUpgrade({
42-
init: { timestamp: 1, body: { ...init.body, sessionId: 100 } },
77+
init: {
78+
timestamp: 1,
79+
body: { ...init.body, sessionId: '100' },
80+
},
4381
});
4482
expect(preceding).toMatchInlineSnapshot(`
4583
{
4684
"timestamp": 1,
4785
"eventType": "init",
4886
"eventId": "init",
49-
"sessionId": 100
87+
"sessionId": "100"
5088
}
5189
`);
5290
});
5391

5492
it('extra fields', async () => {
5593
const preceding = await getPrecedingUpgrade({
56-
init: { timestamp: 1, body: { ...init.body, foobar: 'baz' } },
94+
init: {
95+
timestamp: 1,
96+
body: { ...init.body, foobar: 'baz' } as TelemetryEvent & { foobar: string },
97+
},
5798
});
5899
expect(preceding).toMatchInlineSnapshot(`
59100
{
60101
"timestamp": 1,
61102
"eventType": "init",
62-
"eventId": "init"
103+
"eventId": "init",
104+
"sessionId": "test-session"
63105
}
64106
`);
65107
});
@@ -77,7 +119,8 @@ describe('event-cache', () => {
77119
{
78120
"timestamp": 1,
79121
"eventType": "init",
80-
"eventId": "init"
122+
"eventId": "init",
123+
"sessionId": "test-session"
81124
}
82125
`);
83126
});
@@ -88,7 +131,8 @@ describe('event-cache', () => {
88131
{
89132
"timestamp": 2,
90133
"eventType": "upgrade",
91-
"eventId": "upgrade"
134+
"eventId": "upgrade",
135+
"sessionId": "test-session"
92136
}
93137
`);
94138
});
@@ -99,7 +143,8 @@ describe('event-cache', () => {
99143
{
100144
"timestamp": 2,
101145
"eventType": "upgrade",
102-
"eventId": "upgrade"
146+
"eventId": "upgrade",
147+
"sessionId": "test-session"
103148
}
104149
`);
105150
});
@@ -127,31 +172,33 @@ describe('event-cache', () => {
127172
});
128173

129174
it('both init and upgrade with intervening dev', async () => {
130-
const secondUpgrade = {
131-
body: { eventType: 'upgrade', eventId: 'secondUpgrade' },
175+
const secondUpgrade: CacheEntry = {
176+
body: createTelemetryEvent('upgrade', 'secondUpgrade'),
132177
timestamp: 4,
133178
};
134179
const preceding = await getPrecedingUpgrade({ init, dev, upgrade: secondUpgrade });
135180
expect(preceding).toMatchInlineSnapshot(`
136181
{
137182
"timestamp": 4,
138183
"eventType": "upgrade",
139-
"eventId": "secondUpgrade"
184+
"eventId": "secondUpgrade",
185+
"sessionId": "test-session"
140186
}
141187
`);
142188
});
143189

144190
it('both init and upgrade with non-intervening dev', async () => {
145-
const earlyDev = {
146-
body: { eventType: 'dev', eventId: 'earlyDev' },
191+
const earlyDev: CacheEntry = {
192+
body: createTelemetryEvent('dev', 'earlyDev'),
147193
timestamp: -1,
148194
};
149195
const preceding = await getPrecedingUpgrade({ dev: earlyDev, init, upgrade });
150196
expect(preceding).toMatchInlineSnapshot(`
151197
{
152198
"timestamp": 2,
153199
"eventType": "upgrade",
154-
"eventId": "upgrade"
200+
"eventId": "upgrade",
201+
"sessionId": "test-session"
155202
}
156203
`);
157204
});
@@ -174,7 +221,8 @@ describe('event-cache', () => {
174221
{
175222
"timestamp": 2,
176223
"eventType": "upgrade",
177-
"eventId": "upgrade"
224+
"eventId": "upgrade",
225+
"sessionId": "test-session"
178226
}
179227
`);
180228
});
@@ -192,11 +240,11 @@ describe('event-cache', () => {
192240

193241
it('getLastEvents waits for pending set operations to complete', async () => {
194242
const initialData = {
195-
init: { timestamp: 1, body: { eventType: 'init', eventId: 'init-1' } },
243+
init: { timestamp: 1, body: createTelemetryEvent('init', 'init-1') },
196244
};
197245
const updatedData = {
198-
init: { timestamp: 1, body: { eventType: 'init', eventId: 'init-1' } },
199-
upgrade: { timestamp: 2, body: { eventType: 'upgrade', eventId: 'upgrade-1' } },
246+
init: { timestamp: 1, body: createTelemetryEvent('init', 'init-1') },
247+
upgrade: { timestamp: 2, body: createTelemetryEvent('upgrade', 'upgrade-1') },
200248
};
201249

202250
// Mock cache.get to return initial data first, then updated data
@@ -208,7 +256,7 @@ describe('event-cache', () => {
208256
cacheSetMock.mockResolvedValue(undefined);
209257

210258
// Start a set operation (this will be queued and processed)
211-
const setPromiseResult = set('upgrade', { eventType: 'upgrade', eventId: 'upgrade-1' });
259+
const setPromiseResult = set('upgrade', createTelemetryEvent('upgrade', 'upgrade-1'));
212260

213261
// Immediately call getLastEvents() - it should wait for set() to complete
214262
const getPromise = getLastEvents();
@@ -228,16 +276,16 @@ describe('event-cache', () => {
228276
it('queues multiple set operations sequentially', async () => {
229277
const initialData = {};
230278
const afterFirst = {
231-
init: { timestamp: 1, body: { eventType: 'init', eventId: 'init-1' } },
279+
init: { timestamp: 1, body: createTelemetryEvent('init', 'init-1') },
232280
};
233281
const afterSecond = {
234-
init: { timestamp: 1, body: { eventType: 'init', eventId: 'init-1' } },
235-
upgrade: { timestamp: 2, body: { eventType: 'upgrade', eventId: 'upgrade-1' } },
282+
init: { timestamp: 1, body: createTelemetryEvent('init', 'init-1') },
283+
upgrade: { timestamp: 2, body: createTelemetryEvent('upgrade', 'upgrade-1') },
236284
};
237285
const afterThird = {
238-
init: { timestamp: 1, body: { eventType: 'init', eventId: 'init-1' } },
239-
upgrade: { timestamp: 2, body: { eventType: 'upgrade', eventId: 'upgrade-1' } },
240-
dev: { timestamp: 3, body: { eventType: 'dev', eventId: 'dev-1' } },
286+
init: { timestamp: 1, body: createTelemetryEvent('init', 'init-1') },
287+
upgrade: { timestamp: 2, body: createTelemetryEvent('upgrade', 'upgrade-1') },
288+
dev: { timestamp: 3, body: createTelemetryEvent('dev', 'dev-1') },
241289
};
242290

243291
// Mock cache.get to return data in sequence
@@ -251,9 +299,9 @@ describe('event-cache', () => {
251299
cacheSetMock.mockResolvedValue(undefined);
252300

253301
// Queue multiple set operations
254-
const set1 = set('init', { eventType: 'init', eventId: 'init-1' });
255-
const set2 = set('upgrade', { eventType: 'upgrade', eventId: 'upgrade-1' });
256-
const set3 = set('dev', { eventType: 'dev', eventId: 'dev-1' });
302+
const set1 = set('init', createTelemetryEvent('init', 'init-1'));
303+
const set2 = set('upgrade', createTelemetryEvent('upgrade', 'upgrade-1'));
304+
const set3 = set('dev', createTelemetryEvent('dev', 'dev-1'));
257305

258306
// Wait for all operations to complete
259307
await Promise.all([set1, set2, set3]);
@@ -269,19 +317,19 @@ describe('event-cache', () => {
269317

270318
it('handles errors in queued operations', async () => {
271319
const initialData = {
272-
init: { timestamp: 1, body: { eventType: 'init', eventId: 'init-1' } },
320+
init: { timestamp: 1, body: createTelemetryEvent('init', 'init-1') },
273321
};
274322
const afterDev = {
275-
init: { timestamp: 1, body: { eventType: 'init', eventId: 'init-1' } },
276-
dev: { timestamp: 3, body: { eventType: 'dev', eventId: 'dev-1' } },
323+
init: { timestamp: 1, body: createTelemetryEvent('init', 'init-1') },
324+
dev: { timestamp: 3, body: createTelemetryEvent('dev', 'dev-1') },
277325
};
278326

279327
// First operation will fail
280328
cacheGetMock.mockResolvedValueOnce(initialData);
281329
cacheSetMock.mockRejectedValueOnce(new Error('Cache write failed'));
282330

283331
// Queue an operation that will fail
284-
const failedOperation = set('upgrade', { eventType: 'upgrade', eventId: 'upgrade-1' });
332+
const failedOperation = set('upgrade', createTelemetryEvent('upgrade', 'upgrade-1'));
285333
await expect(failedOperation).rejects.toThrow('Cache write failed');
286334

287335
// Wait a bit to ensure queue processing completes
@@ -292,7 +340,7 @@ describe('event-cache', () => {
292340
cacheSetMock.mockResolvedValueOnce(undefined);
293341
cacheGetMock.mockResolvedValueOnce(afterDev);
294342

295-
await expect(set('dev', { eventType: 'dev', eventId: 'dev-1' })).resolves.toBeUndefined();
343+
await expect(set('dev', createTelemetryEvent('dev', 'dev-1'))).resolves.toBeUndefined();
296344

297345
// Verify the successful operation was processed
298346
const result = await getLastEvents();

0 commit comments

Comments
 (0)