Skip to content

Commit 22fd55f

Browse files
committed
Refactor and cleanup api test
1 parent 638f890 commit 22fd55f

File tree

1 file changed

+55
-67
lines changed

1 file changed

+55
-67
lines changed

packages/telemetry/src/api.test.ts

Lines changed: 55 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ import { _FirebaseInstallationsInternal } from '@firebase/installations';
4646
const PROJECT_ID = 'my-project';
4747
const APP_ID = 'my-appid';
4848
const API_KEY = 'my-api-key';
49+
const MOCK_SESSION_ID = '00000000-0000-0000-0000-000000000000';
4950

5051
const emittedLogs: LogRecord[] = [];
5152

@@ -78,15 +79,51 @@ const fakeTelemetry: Telemetry = {
7879

7980
describe('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

Comments
 (0)