@@ -46,6 +46,7 @@ import { _FirebaseInstallationsInternal } from '@firebase/installations';
4646const PROJECT_ID = 'my-project' ;
4747const APP_ID = 'my-appid' ;
4848const API_KEY = 'my-api-key' ;
49+ const MOCK_SESSION_ID = '00000000-0000-0000-0000-000000000000' ;
4950
5051const emittedLogs : LogRecord [ ] = [ ] ;
5152
@@ -78,15 +79,51 @@ const fakeTelemetry: Telemetry = {
7879
7980describe ( 'Top level API' , ( ) => {
8081 let app : FirebaseApp ;
82+ let originalSessionStorage : Storage | undefined ;
83+ let originalCrypto : Crypto | undefined ;
84+ let storage : Record < string , string > = { } ;
8185
8286 beforeEach ( ( ) => {
8387 // Clear the logs before each test.
8488 emittedLogs . length = 0 ;
8589 app = getFakeApp ( ) ;
90+ storage = { } ;
91+
92+ // @ts -ignore
93+ originalSessionStorage = global . sessionStorage ;
94+ // @ts -ignore
95+ originalCrypto = global . crypto ;
96+
97+ const sessionStorageMock : Partial < Storage > = {
98+ getItem : ( key : string ) => storage [ key ] || null ,
99+ setItem : ( key : string , value : string ) => {
100+ storage [ key ] = value ;
101+ }
102+ } ;
103+ const cryptoMock : Partial < Crypto > = {
104+ randomUUID : ( ) => MOCK_SESSION_ID
105+ } ;
106+
107+ Object . defineProperty ( global , 'sessionStorage' , {
108+ value : sessionStorageMock ,
109+ writable : true
110+ } ) ;
111+ Object . defineProperty ( global , 'crypto' , {
112+ value : cryptoMock ,
113+ writable : true
114+ } ) ;
86115 } ) ;
87116
88117 afterEach ( async ( ) => {
89118 await deleteApp ( app ) ;
119+ Object . defineProperty ( global , 'sessionStorage' , {
120+ value : originalSessionStorage ,
121+ writable : true
122+ } ) ;
123+ Object . defineProperty ( global , 'crypto' , {
124+ value : originalCrypto ,
125+ writable : true
126+ } ) ;
90127 } ) ;
91128
92129 describe ( 'getTelemetry()' , ( ) => {
@@ -131,7 +168,8 @@ describe('Top level API', () => {
131168 expect ( log . attributes ) . to . deep . equal ( {
132169 'error.type' : 'TestError' ,
133170 'error.stack' : '...stack trace...' ,
134- [ LOG_ENTRY_ATTRIBUTE_KEYS . APP_VERSION ] : 'unset'
171+ [ LOG_ENTRY_ATTRIBUTE_KEYS . APP_VERSION ] : 'unset' ,
172+ [ LOG_ENTRY_ATTRIBUTE_KEYS . SESSION_ID ] : MOCK_SESSION_ID
135173 } ) ;
136174 } ) ;
137175
@@ -148,7 +186,8 @@ describe('Top level API', () => {
148186 expect ( log . attributes ) . to . deep . equal ( {
149187 'error.type' : 'Error' ,
150188 'error.stack' : 'No stack trace available' ,
151- [ LOG_ENTRY_ATTRIBUTE_KEYS . APP_VERSION ] : 'unset'
189+ [ LOG_ENTRY_ATTRIBUTE_KEYS . APP_VERSION ] : 'unset' ,
190+ [ LOG_ENTRY_ATTRIBUTE_KEYS . SESSION_ID ] : MOCK_SESSION_ID
152191 } ) ;
153192 } ) ;
154193
@@ -160,7 +199,8 @@ describe('Top level API', () => {
160199 expect ( log . severityNumber ) . to . equal ( SeverityNumber . ERROR ) ;
161200 expect ( log . body ) . to . equal ( 'a string error' ) ;
162201 expect ( log . attributes ) . to . deep . equal ( {
163- [ LOG_ENTRY_ATTRIBUTE_KEYS . APP_VERSION ] : 'unset'
202+ [ LOG_ENTRY_ATTRIBUTE_KEYS . APP_VERSION ] : 'unset' ,
203+ [ LOG_ENTRY_ATTRIBUTE_KEYS . SESSION_ID ] : MOCK_SESSION_ID
164204 } ) ;
165205 } ) ;
166206
@@ -172,7 +212,8 @@ describe('Top level API', () => {
172212 expect ( log . severityNumber ) . to . equal ( SeverityNumber . ERROR ) ;
173213 expect ( log . body ) . to . equal ( 'Unknown error type: number' ) ;
174214 expect ( log . attributes ) . to . deep . equal ( {
175- [ LOG_ENTRY_ATTRIBUTE_KEYS . APP_VERSION ] : 'unset'
215+ [ LOG_ENTRY_ATTRIBUTE_KEYS . APP_VERSION ] : 'unset' ,
216+ [ LOG_ENTRY_ATTRIBUTE_KEYS . SESSION_ID ] : MOCK_SESSION_ID
176217 } ) ;
177218 } ) ;
178219
@@ -201,7 +242,8 @@ describe('Top level API', () => {
201242 'error.stack' : '...stack trace...' ,
202243 [ LOG_ENTRY_ATTRIBUTE_KEYS . APP_VERSION ] : 'unset' ,
203244 'logging.googleapis.com/trace' : `projects/${ PROJECT_ID } /traces/my-trace` ,
204- 'logging.googleapis.com/spanId' : `my-span`
245+ 'logging.googleapis.com/spanId' : `my-span` ,
246+ [ LOG_ENTRY_ATTRIBUTE_KEYS . SESSION_ID ] : MOCK_SESSION_ID
205247 } ) ;
206248 } ) ;
207249
@@ -230,7 +272,8 @@ describe('Top level API', () => {
230272 boolAttr : true ,
231273 numAttr : 2
232274 } ,
233- arrAttr : [ 1 , 2 , 3 ]
275+ arrAttr : [ 1 , 2 , 3 ] ,
276+ [ LOG_ENTRY_ATTRIBUTE_KEYS . SESSION_ID ] : MOCK_SESSION_ID
234277 } ) ;
235278 } ) ;
236279
@@ -248,80 +291,25 @@ describe('Top level API', () => {
248291 expect ( emittedLogs . length ) . to . equal ( 1 ) ;
249292 const log = emittedLogs [ 0 ] ;
250293 expect ( log . attributes ) . to . deep . equal ( {
251- [ LOG_ENTRY_ATTRIBUTE_KEYS . APP_VERSION ] : '1.0.0'
294+ [ LOG_ENTRY_ATTRIBUTE_KEYS . APP_VERSION ] : '1.0.0' ,
295+ [ LOG_ENTRY_ATTRIBUTE_KEYS . SESSION_ID ] : MOCK_SESSION_ID
252296 } ) ;
253297 } ) ;
254298
255299 describe ( 'Session Metadata' , ( ) => {
256- let originalSessionStorage : Storage | undefined ;
257- let originalCrypto : Crypto | undefined ;
258-
259- beforeEach ( ( ) => {
260- // @ts -ignore
261- originalSessionStorage = global . sessionStorage ;
262- // @ts -ignore
263- originalCrypto = global . crypto ;
264- } ) ;
265-
266- afterEach ( ( ) => {
267- Object . defineProperty ( global , 'sessionStorage' , {
268- value : originalSessionStorage ,
269- writable : true
270- } ) ;
271- Object . defineProperty ( global , 'crypto' , {
272- value : originalCrypto ,
273- writable : true
274- } ) ;
275- } ) ;
276-
277300 it ( 'should generate and store a new session ID if none exists' , ( ) => {
278- const storage : Record < string , string > = { } ;
279- const sessionStorageMock = {
280- getItem : ( key : string ) => storage [ key ] || null ,
281- setItem : ( key : string , value : string ) => {
282- storage [ key ] = value ;
283- }
284- } ;
285- const cryptoMock = {
286- randomUUID : ( ) => 'new-session-id'
287- } ;
288-
289- Object . defineProperty ( global , 'sessionStorage' , {
290- value : sessionStorageMock ,
291- writable : true
292- } ) ;
293- Object . defineProperty ( global , 'crypto' , {
294- value : cryptoMock ,
295- writable : true
296- } ) ;
297-
298301 captureError ( fakeTelemetry , 'error' ) ;
299302
300303 expect ( emittedLogs . length ) . to . equal ( 1 ) ;
301304 const log = emittedLogs [ 0 ] ;
302305 expect ( log . attributes ! [ LOG_ENTRY_ATTRIBUTE_KEYS . SESSION_ID ] ) . to . equal (
303- 'new-session-id'
306+ MOCK_SESSION_ID
304307 ) ;
305- expect ( storage [ TELEMETRY_SESSION_ID_KEY ] ) . to . equal ( 'new-session-id' ) ;
308+ expect ( storage [ TELEMETRY_SESSION_ID_KEY ] ) . to . equal ( MOCK_SESSION_ID ) ;
306309 } ) ;
307310
308311 it ( 'should retrieve existing session ID from sessionStorage' , ( ) => {
309- const sessionStorageMock = {
310- getItem : ( ) => 'existing-session-id' ,
311- setItem : ( ) => { }
312- } ;
313- const cryptoMock = {
314- randomUUID : ( ) => 'new-session-id'
315- } ;
316-
317- Object . defineProperty ( global , 'sessionStorage' , {
318- value : sessionStorageMock ,
319- writable : true
320- } ) ;
321- Object . defineProperty ( global , 'crypto' , {
322- value : cryptoMock ,
323- writable : true
324- } ) ;
312+ storage [ TELEMETRY_SESSION_ID_KEY ] = 'existing-session-id' ;
325313
326314 captureError ( fakeTelemetry , 'error' ) ;
327315
@@ -333,7 +321,7 @@ describe('Top level API', () => {
333321 } ) ;
334322
335323 it ( 'should handle errors when accessing sessionStorage' , ( ) => {
336- const sessionStorageMock = {
324+ const sessionStorageMock : Partial < Storage > = {
337325 getItem : ( ) => {
338326 throw new Error ( 'SecurityError' ) ;
339327 } ,
0 commit comments