Skip to content

Commit 00d264a

Browse files
authored
Merge pull request #1240 from OneSignal/fg/process-deffered
Update page sdk init to handle delayed setting of window.OneSignalDeferred
2 parents 3efbf3c + 4a1de03 commit 00d264a

15 files changed

Lines changed: 167 additions & 146 deletions

File tree

__test__/support/environment/TestEnvironmentHelpers.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ export function resetDatabase() {
3030

3131
export function mockUserAgent(config: TestEnvironmentConfig = {}): void {
3232
const info = bowser._detect(config.userAgent ?? BrowserUserAgent.Default);
33-
3433
// Modify the mock implementation
3534
bowserCastleSpy.mockReturnValue({
3635
mobile: info.mobile,

index.html

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,13 @@
66
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
77
<title>OneSignal Dev</title>
88
<script>
9-
window.OneSignalDeferred = window.OneSignalDeferred || [];
10-
119
// set can a query param ?app_id=your_app_id OR
1210
// create an .env file and set VITE_APP_ID to your app id
1311
const appId =
1412
new URLSearchParams(window.location.search).get('app_id') ||
1513
'%VITE_APP_ID%';
1614

15+
window.OneSignalDeferred = window.OneSignalDeferred || [];
1716
OneSignalDeferred.push(async function (OneSignal) {
1817
await OneSignal.init({
1918
appId,
@@ -33,6 +32,16 @@ <h1>OneSignal Dev</h1>
3332
// OneSignalDeferred.push(async function (OneSignal) {
3433
// await OneSignal.logout();
3534
// });
35+
36+
// to check against delayed OneSignalDeferred call, comment out the one in the head
37+
// setTimeout(async () => {
38+
// window.OneSignalDeferred = window.OneSignalDeferred || [];
39+
// OneSignalDeferred.push(async function (OneSignal) {
40+
// await OneSignal.init({
41+
// appId,
42+
// });
43+
// });
44+
// }, 5000);
3645
</script>
3746
</body>
3847
</html>

package-lock.json

Lines changed: 56 additions & 56 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
"@types/node": "^18.18.0",
4242
"@typescript-eslint/eslint-plugin": "^5.36.1",
4343
"@typescript-eslint/parser": "^5.36.1",
44-
"@vitest/coverage-v8": "3.0.7",
44+
"@vitest/coverage-v8": "3.0.9",
4545
"deepmerge": "^4.2.2",
4646
"eslint": "^8.23.0",
4747
"eslint-config-prettier": "9.0.0",
@@ -56,7 +56,7 @@
5656
"vite-bundle-analyzer": "^0.17.1",
5757
"vite-plugin-mkcert": "^1.17.6",
5858
"vite-tsconfig-paths": "^5.1.4",
59-
"vitest": "3.0.7"
59+
"vitest": "3.0.9"
6060
},
6161
"size-limit": [
6262
{

src/entries/pageSdkInit.test.ts

Lines changed: 36 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,25 @@ import TestContext from '__test__/support/environment/TestContext';
33
import { TestEnvironment } from '__test__/support/environment/TestEnvironment';
44
import { server } from '__test__/support/mocks/server';
55
import { http, HttpResponse } from 'msw';
6-
import { OneSignalDeferredLoadedCallback } from 'src/page/models/OneSignalDeferredLoadedCallback';
6+
import InitHelper from 'src/shared/helpers/InitHelper';
77
import { ConfigIntegrationKind } from 'src/shared/models/AppConfig';
88

9-
vi.useFakeTimers();
10-
11-
declare global {
12-
interface Window {
13-
OneSignalDeferred: OneSignalDeferredLoadedCallback[];
14-
}
15-
}
16-
179
const serverConfig = TestContext.getFakeServerAppConfig(
1810
ConfigIntegrationKind.Custom,
1911
);
2012

13+
vi.useFakeTimers();
14+
vi.mock('src/shared/utils/bowserCastle');
15+
16+
// skip over creating dom elements
17+
vi.spyOn(InitHelper, 'sessionInit').mockImplementation(() => {
18+
return Promise.resolve();
19+
});
20+
2121
describe('pageSdkInit', () => {
2222
beforeEach(async () => {
23-
window.OneSignalDeferred = [];
23+
const cssURL =
24+
'https://onesignal.com/sdks/web/v16/OneSignalSDK.page.styles.css';
2425

2526
server.use(
2627
http.get('**/sync/*/web', ({ request }) => {
@@ -35,12 +36,20 @@ describe('pageSdkInit', () => {
3536
},
3637
);
3738
}),
39+
http.get(cssURL, () => HttpResponse.text('')),
3840
);
41+
3942
await TestEnvironment.initialize();
4043
});
4144

45+
afterEach(() => {
46+
vi.resetModules();
47+
localStorage.clear();
48+
OneSignal._initCalled = false;
49+
});
50+
4251
test('can handle init followed by logout', async () => {
43-
window.OneSignalDeferred = [];
52+
window.OneSignalDeferred = window.OneSignalDeferred || [];
4453
window.OneSignalDeferred.push(async function (OneSignal) {
4554
await OneSignal.init({
4655
appId: APP_ID,
@@ -52,6 +61,21 @@ describe('pageSdkInit', () => {
5261

5362
await import('./pageSdkInit');
5463
await vi.runOnlyPendingTimersAsync();
55-
expect(OneSignal.coreDirector).toBeDefined();
64+
expect(window.OneSignal.coreDirector).toBeDefined();
65+
});
66+
67+
test('can process deferred items long after page init', async () => {
68+
await import('./pageSdkInit');
69+
const initSpy = vi.spyOn(window.OneSignal, 'init');
70+
71+
window.OneSignalDeferred = window.OneSignalDeferred || [];
72+
window.OneSignalDeferred.push(async function (OneSignal) {
73+
await OneSignal.init({
74+
appId: APP_ID,
75+
});
76+
});
77+
78+
await vi.runOnlyPendingTimersAsync();
79+
expect(initSpy).toHaveBeenCalled();
5680
});
5781
});

0 commit comments

Comments
 (0)