From e5580873de443b47b3bec3e20196f47717d7a1e4 Mon Sep 17 00:00:00 2001 From: Katie Byers Date: Tue, 22 Mar 2022 14:36:49 -0700 Subject: [PATCH 1/6] add `length` method to `LocalForage` type --- packages/integrations/src/offline.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/integrations/src/offline.ts b/packages/integrations/src/offline.ts index d0cc5fbb2548..ebc97ed6744b 100644 --- a/packages/integrations/src/offline.ts +++ b/packages/integrations/src/offline.ts @@ -11,6 +11,7 @@ type LocalForage = { callback?: (err: any, result: U) => void, ): Promise; removeItem(key: string, callback?: (err: any) => void): Promise; + length(): Promise; }; /** From 7c898a3189b6d19887c0c269f50762a5532fe011 Mon Sep 17 00:00:00 2001 From: Katie Byers Date: Tue, 22 Mar 2022 14:43:40 -0700 Subject: [PATCH 2/6] add `Item` type and fix types in mock localforage instance --- packages/integrations/src/offline.ts | 2 ++ packages/integrations/test/offline.test.ts | 6 +++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/integrations/src/offline.ts b/packages/integrations/src/offline.ts index ebc97ed6744b..383e4901e5c9 100644 --- a/packages/integrations/src/offline.ts +++ b/packages/integrations/src/offline.ts @@ -14,6 +14,8 @@ type LocalForage = { length(): Promise; }; +export type Item = { key: string; value: Event }; + /** * cache offline errors and send when connected */ diff --git a/packages/integrations/test/offline.test.ts b/packages/integrations/test/offline.test.ts index b88f24f5b339..ce6b8dd09581 100644 --- a/packages/integrations/test/offline.test.ts +++ b/packages/integrations/test/offline.test.ts @@ -1,15 +1,15 @@ import { Event, EventProcessor, Hub, Integration } from '@sentry/types'; import * as utils from '@sentry/utils'; -import { Offline } from '../src/offline'; +import { Item, Offline } from '../src/offline'; // mock localforage methods jest.mock('localforage', () => ({ createInstance(_options: { name: string }): any { - let items: { key: string; value: Event }[] = []; + let items: Item[] = []; return { - async getItem(key: string): Event { + async getItem(key: string): Promise { return items.find(item => item.key === key); }, async iterate(callback: () => void): void { From 7a2e496d4b715cb933154231762741f529d64897 Mon Sep 17 00:00:00 2001 From: Katie Byers Date: Tue, 22 Mar 2022 14:45:23 -0700 Subject: [PATCH 3/6] fix various type errors --- packages/integrations/test/offline.test.ts | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/packages/integrations/test/offline.test.ts b/packages/integrations/test/offline.test.ts index ce6b8dd09581..1850ba256109 100644 --- a/packages/integrations/test/offline.test.ts +++ b/packages/integrations/test/offline.test.ts @@ -1,4 +1,4 @@ -import { Event, EventProcessor, Hub, Integration } from '@sentry/types'; +import { Event, EventProcessor, Hub, Integration, IntegrationClass } from '@sentry/types'; import * as utils from '@sentry/utils'; import { Item, Offline } from '../src/offline'; @@ -12,18 +12,18 @@ jest.mock('localforage', () => ({ async getItem(key: string): Promise { return items.find(item => item.key === key); }, - async iterate(callback: () => void): void { + async iterate(callback: (event: Event, key: string, index: number) => void): Promise { items.forEach((item, index) => { callback(item.value, item.key, index); }); }, - async length(): number { + async length(): Promise { return items.length; }, - async removeItem(key: string): void { + async removeItem(key: string): Promise { items = items.filter(item => item.key !== key); }, - async setItem(key: string, value: Event): void { + async setItem(key: string, value: Event): Promise { items.push({ key, value, @@ -33,7 +33,7 @@ jest.mock('localforage', () => ({ }, })); -let integration: Integration; +let integration: Offline; let online: boolean; describe('Offline', () => { @@ -150,7 +150,7 @@ let eventProcessors: EventProcessor[]; let events: Event[]; /** JSDoc */ -function addGlobalEventProcessor(callback: () => void): void { +function addGlobalEventProcessor(callback: EventProcessor): void { eventProcessors.push(callback); } @@ -160,11 +160,11 @@ function getCurrentHub(): Hub { captureEvent(_event: Event): string { return 'an-event-id'; }, - getIntegration(_integration: Integration): any { + getIntegration(_integration: IntegrationClass): T | null { // pretend integration is enabled return true; }, - }; + } as Hub; } /** JSDoc */ From 0e647f2dc4607c594e10dc32c2e9115b10d60970 Mon Sep 17 00:00:00 2001 From: Katie Byers Date: Tue, 22 Mar 2022 14:46:25 -0700 Subject: [PATCH 4/6] fix return value of `getIntegration` to match type --- packages/integrations/test/offline.test.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/integrations/test/offline.test.ts b/packages/integrations/test/offline.test.ts index 1850ba256109..e21e25db42aa 100644 --- a/packages/integrations/test/offline.test.ts +++ b/packages/integrations/test/offline.test.ts @@ -162,7 +162,7 @@ function getCurrentHub(): Hub { }, getIntegration(_integration: IntegrationClass): T | null { // pretend integration is enabled - return true; + return {} as T; }, } as Hub; } From b2d4c3d0c9adcce6600a15deb1a5fe1b0cc698be Mon Sep 17 00:00:00 2001 From: Katie Byers Date: Tue, 22 Mar 2022 14:47:02 -0700 Subject: [PATCH 5/6] clean up use of `done` --- packages/integrations/test/offline.test.ts | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/packages/integrations/test/offline.test.ts b/packages/integrations/test/offline.test.ts index e21e25db42aa..b26f65a3abf1 100644 --- a/packages/integrations/test/offline.test.ts +++ b/packages/integrations/test/offline.test.ts @@ -52,15 +52,10 @@ describe('Offline', () => { }); describe('when there are already events in the cache from a previous offline session', () => { - beforeEach(done => { + beforeEach(async () => { const event = { message: 'previous event' }; - integration.offlineEventStore - .setItem('previous', event) - .then(() => { - done(); - }) - .catch(error => error); + await integration.offlineEventStore.setItem('previous', event); }); it('sends stored events', async () => { @@ -130,7 +125,7 @@ describe('Offline', () => { }); describe('when connectivity is restored', () => { - it('sends stored events', async done => { + it('sends stored events', async () => { initIntegration(); setupOnce(); prepopulateEvents(1); @@ -138,8 +133,6 @@ describe('Offline', () => { processEventListeners(); expect(await integration.offlineEventStore.length()).toEqual(0); - - setImmediate(done); }); }); }); From b109bd76793c98af5d99fb417e6362ccad1cda02 Mon Sep 17 00:00:00 2001 From: Katie Byers Date: Tue, 22 Mar 2022 14:47:30 -0700 Subject: [PATCH 6/6] use `spyOn` to mock `getGlobalObject` --- packages/integrations/test/offline.test.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/packages/integrations/test/offline.test.ts b/packages/integrations/test/offline.test.ts index b26f65a3abf1..1f728d835abd 100644 --- a/packages/integrations/test/offline.test.ts +++ b/packages/integrations/test/offline.test.ts @@ -166,14 +166,17 @@ function initIntegration(options: { maxStoredEvents?: number } = {}): void { eventProcessors = []; events = []; - utils.getGlobalObject = jest.fn(() => ({ - addEventListener: (_windowEvent, callback) => { - eventListeners.push(callback); - }, - navigator: { - onLine: online, - }, - })); + jest.spyOn(utils, 'getGlobalObject').mockImplementation( + () => + ({ + addEventListener: (_windowEvent, callback) => { + eventListeners.push(callback); + }, + navigator: { + onLine: online, + }, + } as any), + ); integration = new Offline(options); }