@@ -3,7 +3,9 @@ import { beforeEach, describe, expect, it, vi } from 'vitest';
33
44import { cache } from 'storybook/internal/common' ;
55
6+ import type { CacheEntry } from './event-cache' ;
67import { getLastEvents , getPrecedingUpgrade , set } from './event-cache' ;
8+ import type { TelemetryEvent } from './types' ;
79
810vi . 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+
1531describe ( '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