@dhis2/app-service-offline 3.11.3 → 3.12.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/cjs/__tests__/integration.test.js +51 -82
- package/build/cjs/index.js +0 -7
- package/build/cjs/lib/__tests__/cacheable-section-state.test.js +7 -14
- package/build/cjs/lib/__tests__/clear-sensitive-caches.test.js +17 -20
- package/build/cjs/lib/__tests__/network-status.test.js +135 -148
- package/build/cjs/lib/__tests__/offline-provider.test.js +12 -22
- package/build/cjs/lib/__tests__/use-cacheable-section.test.js +87 -98
- package/build/cjs/lib/__tests__/use-online-status-message.test.js +7 -14
- package/build/cjs/lib/cacheable-section-state.js +27 -38
- package/build/cjs/lib/cacheable-section.js +26 -27
- package/build/cjs/lib/clear-sensitive-caches.js +14 -24
- package/build/cjs/lib/dhis2-connection-status/dev-debug-log.js +1 -3
- package/build/cjs/lib/dhis2-connection-status/dhis2-connection-status.js +27 -58
- package/build/cjs/lib/dhis2-connection-status/dhis2-connection-status.test.js +287 -230
- package/build/cjs/lib/dhis2-connection-status/index.js +0 -1
- package/build/cjs/lib/dhis2-connection-status/is-ping-available.js +0 -6
- package/build/cjs/lib/dhis2-connection-status/is-ping-available.test.js +0 -1
- package/build/cjs/lib/dhis2-connection-status/smart-interval.js +35 -49
- package/build/cjs/lib/dhis2-connection-status/use-ping-query.js +4 -5
- package/build/cjs/lib/global-state-service.js +9 -27
- package/build/cjs/lib/network-status.js +10 -13
- package/build/cjs/lib/offline-interface.js +3 -14
- package/build/cjs/lib/offline-provider.js +1 -12
- package/build/cjs/lib/online-status-message.js +5 -17
- package/build/cjs/setupRTL.js +1 -1
- package/build/cjs/utils/__tests__/render-counter.test.js +3 -12
- package/build/cjs/utils/render-counter.js +2 -10
- package/build/cjs/utils/test-mocks.js +13 -18
- package/build/es/__tests__/integration.test.js +51 -74
- package/build/es/index.js +2 -2
- package/build/es/lib/__tests__/cacheable-section-state.test.js +2 -4
- package/build/es/lib/__tests__/clear-sensitive-caches.test.js +19 -16
- package/build/es/lib/__tests__/network-status.test.js +105 -114
- package/build/es/lib/__tests__/offline-provider.test.js +13 -15
- package/build/es/lib/__tests__/use-cacheable-section.test.js +69 -73
- package/build/es/lib/__tests__/use-online-status-message.test.js +2 -3
- package/build/es/lib/cacheable-section-state.js +25 -26
- package/build/es/lib/cacheable-section.js +23 -15
- package/build/es/lib/clear-sensitive-caches.js +13 -21
- package/build/es/lib/dhis2-connection-status/dev-debug-log.js +1 -3
- package/build/es/lib/dhis2-connection-status/dhis2-connection-status.js +26 -37
- package/build/es/lib/dhis2-connection-status/dhis2-connection-status.test.js +223 -159
- package/build/es/lib/dhis2-connection-status/is-ping-available.js +0 -5
- package/build/es/lib/dhis2-connection-status/smart-interval.js +34 -42
- package/build/es/lib/dhis2-connection-status/use-ping-query.js +6 -3
- package/build/es/lib/global-state-service.js +6 -12
- package/build/es/lib/network-status.js +10 -9
- package/build/es/lib/offline-interface.js +0 -3
- package/build/es/lib/offline-provider.js +0 -3
- package/build/es/lib/online-status-message.js +3 -2
- package/build/es/setupRTL.js +1 -1
- package/build/es/utils/__tests__/render-counter.test.js +2 -4
- package/build/es/utils/render-counter.js +1 -3
- package/build/es/utils/test-mocks.js +8 -9
- package/build/types/lib/cacheable-section.d.ts +1 -1
- package/build/types/lib/dhis2-connection-status/dhis2-connection-status.d.ts +1 -1
- package/build/types/lib/network-status.d.ts +1 -1
- package/build/types/lib/online-status-message.d.ts +1 -1
- package/build/types/types.d.ts +1 -1
- package/package.json +4 -4
|
@@ -1,21 +1,14 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _react = require("@testing-library/react");
|
|
4
|
-
|
|
5
|
-
var _reactHooks = require("@testing-library/react-hooks");
|
|
6
|
-
|
|
7
4
|
var _react2 = _interopRequireDefault(require("react"));
|
|
8
|
-
|
|
9
5
|
var _networkStatus = require("../network-status");
|
|
10
|
-
|
|
11
|
-
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
-
|
|
6
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
7
|
function wait(ms) {
|
|
14
8
|
return new Promise(resolve => {
|
|
15
9
|
setTimeout(() => resolve(), ms);
|
|
16
10
|
});
|
|
17
11
|
}
|
|
18
|
-
|
|
19
12
|
beforeEach(() => {
|
|
20
13
|
jest.restoreAllMocks();
|
|
21
14
|
});
|
|
@@ -27,7 +20,7 @@ describe('initalizes to navigator.onLine value', () => {
|
|
|
27
20
|
jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
|
|
28
21
|
const {
|
|
29
22
|
result
|
|
30
|
-
} = (0,
|
|
23
|
+
} = (0, _react.renderHook)(() => (0, _networkStatus.useNetworkStatus)());
|
|
31
24
|
expect(result.current.online).toBe(true);
|
|
32
25
|
expect(result.current.offline).toBe(false);
|
|
33
26
|
});
|
|
@@ -35,61 +28,59 @@ describe('initalizes to navigator.onLine value', () => {
|
|
|
35
28
|
jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(false);
|
|
36
29
|
const {
|
|
37
30
|
result
|
|
38
|
-
} = (0,
|
|
31
|
+
} = (0, _react.renderHook)(() => (0, _networkStatus.useNetworkStatus)());
|
|
39
32
|
expect(result.current.online).toBe(false);
|
|
40
33
|
expect(result.current.offline).toBe(true);
|
|
41
34
|
});
|
|
42
35
|
});
|
|
43
36
|
describe('state changes in response to browser "online" and "offline" events', () => {
|
|
44
37
|
it('switches from online to offline when the "offline" event triggers', async () => {
|
|
45
|
-
jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
|
|
46
|
-
|
|
38
|
+
jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
|
|
39
|
+
// Capture callback to trigger later using addEventListener mock
|
|
47
40
|
const events = {};
|
|
48
41
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
49
42
|
const {
|
|
50
|
-
result
|
|
51
|
-
|
|
52
|
-
} = (0, _reactHooks.renderHook)(function () {
|
|
43
|
+
result
|
|
44
|
+
} = (0, _react.renderHook)(function () {
|
|
53
45
|
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
54
46
|
}, {
|
|
55
47
|
initialProps: {
|
|
56
48
|
debounceDelay: 50
|
|
57
49
|
}
|
|
58
50
|
});
|
|
59
|
-
(0,
|
|
51
|
+
(0, _react.act)(() => {
|
|
60
52
|
// Trigger callback captured by addEventListener mock
|
|
61
53
|
events.offline(new Event('offline'));
|
|
62
|
-
});
|
|
54
|
+
});
|
|
63
55
|
|
|
64
|
-
|
|
65
|
-
|
|
56
|
+
// Wait for debounce
|
|
57
|
+
await (0, _react.waitFor)(() => {
|
|
58
|
+
expect(result.current.online).toBe(false);
|
|
59
|
+
expect(result.current.offline).toBe(true);
|
|
66
60
|
});
|
|
67
|
-
expect(result.current.online).toBe(false);
|
|
68
|
-
expect(result.current.offline).toBe(true);
|
|
69
61
|
});
|
|
70
62
|
it('switches from offline to online when the "online" event triggers', async () => {
|
|
71
63
|
jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(false);
|
|
72
64
|
const events = {};
|
|
73
65
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
74
66
|
const {
|
|
75
|
-
result
|
|
76
|
-
|
|
77
|
-
} = (0, _reactHooks.renderHook)(function () {
|
|
67
|
+
result
|
|
68
|
+
} = (0, _react.renderHook)(function () {
|
|
78
69
|
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
79
70
|
}, {
|
|
80
71
|
initialProps: {
|
|
81
72
|
debounceDelay: 50
|
|
82
73
|
}
|
|
83
74
|
});
|
|
84
|
-
(0,
|
|
75
|
+
(0, _react.act)(() => {
|
|
85
76
|
events.online(new Event('online'));
|
|
86
|
-
});
|
|
77
|
+
});
|
|
87
78
|
|
|
88
|
-
|
|
89
|
-
|
|
79
|
+
// Wait for debounce
|
|
80
|
+
await (0, _react.waitFor)(() => {
|
|
81
|
+
expect(result.current.online).toBe(true);
|
|
82
|
+
expect(result.current.offline).toBe(false);
|
|
90
83
|
});
|
|
91
|
-
expect(result.current.online).toBe(true);
|
|
92
|
-
expect(result.current.offline).toBe(false);
|
|
93
84
|
});
|
|
94
85
|
});
|
|
95
86
|
describe('debouncing state changes', () => {
|
|
@@ -99,22 +90,22 @@ describe('debouncing state changes', () => {
|
|
|
99
90
|
const events = {};
|
|
100
91
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
101
92
|
const {
|
|
102
|
-
result
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
await (0, _reactHooks.act)(async () => {
|
|
93
|
+
result
|
|
94
|
+
} = (0, _react.renderHook)(() => (0, _networkStatus.useNetworkStatus)());
|
|
95
|
+
await (0, _react.act)(async () => {
|
|
106
96
|
// Multiple events in succession
|
|
107
97
|
events.offline(new Event('offline'));
|
|
108
98
|
events.online(new Event('online'));
|
|
109
99
|
events.offline(new Event('offline'));
|
|
110
|
-
});
|
|
111
|
-
|
|
112
|
-
expect(result.current.online).toBe(true); // 1s later, final 'offline' event should resolve
|
|
100
|
+
});
|
|
113
101
|
|
|
114
|
-
|
|
115
|
-
|
|
102
|
+
// Immediately, nothing should happen
|
|
103
|
+
expect(result.current.online).toBe(true);
|
|
104
|
+
await wait(1000);
|
|
105
|
+
// 1s later, final 'offline' event should resolve
|
|
106
|
+
await (0, _react.waitFor)(() => {
|
|
107
|
+
expect(result.current.online).toBe(false);
|
|
116
108
|
});
|
|
117
|
-
expect(result.current.online).toBe(false);
|
|
118
109
|
});
|
|
119
110
|
it('can have debounce delay set to another number', async () => {
|
|
120
111
|
// Start online
|
|
@@ -122,55 +113,54 @@ describe('debouncing state changes', () => {
|
|
|
122
113
|
const events = {};
|
|
123
114
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
124
115
|
const {
|
|
125
|
-
result
|
|
126
|
-
|
|
127
|
-
} = (0, _reactHooks.renderHook)(function () {
|
|
116
|
+
result
|
|
117
|
+
} = (0, _react.renderHook)(function () {
|
|
128
118
|
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
129
119
|
}, {
|
|
130
120
|
initialProps: {
|
|
131
121
|
debounceDelay: 50
|
|
132
122
|
}
|
|
133
123
|
});
|
|
134
|
-
await (0,
|
|
124
|
+
await (0, _react.act)(async () => {
|
|
135
125
|
// Multiple events in succession
|
|
136
126
|
events.offline(new Event('offline'));
|
|
137
127
|
events.online(new Event('online'));
|
|
138
128
|
events.offline(new Event('offline'));
|
|
139
|
-
});
|
|
129
|
+
});
|
|
140
130
|
|
|
141
|
-
|
|
131
|
+
// Immediately, nothing should happen
|
|
132
|
+
expect(result.current.online).toBe(true);
|
|
142
133
|
|
|
143
|
-
|
|
144
|
-
|
|
134
|
+
// 50ms later, final "offline" event should finally resolve
|
|
135
|
+
await (0, _react.waitFor)(() => {
|
|
136
|
+
expect(result.current.online).toBe(false);
|
|
145
137
|
});
|
|
146
|
-
expect(result.current.online).toBe(false);
|
|
147
138
|
});
|
|
148
139
|
it('can use a debounceDelay of 0 to skip debouncing', async () => {
|
|
149
140
|
jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
|
|
150
141
|
const events = {};
|
|
151
142
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
152
143
|
const {
|
|
153
|
-
result
|
|
154
|
-
|
|
155
|
-
} = (0, _reactHooks.renderHook)(function () {
|
|
144
|
+
result
|
|
145
|
+
} = (0, _react.renderHook)(function () {
|
|
156
146
|
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
157
147
|
}, {
|
|
158
148
|
initialProps: {
|
|
159
149
|
debounceDelay: 0
|
|
160
150
|
}
|
|
161
151
|
});
|
|
162
|
-
await (0,
|
|
152
|
+
await (0, _react.act)(async () => {
|
|
163
153
|
events.offline(new Event('offline'));
|
|
164
154
|
events.online(new Event('online'));
|
|
165
155
|
events.offline(new Event('offline'));
|
|
166
|
-
});
|
|
167
|
-
|
|
168
|
-
await waitForNextUpdate({
|
|
169
|
-
timeout: 0
|
|
170
|
-
}); // There should be no delay before status is offline
|
|
156
|
+
});
|
|
171
157
|
|
|
172
|
-
|
|
173
|
-
|
|
158
|
+
// await wait(0) didn't work here
|
|
159
|
+
await (0, _react.waitFor)(() => {
|
|
160
|
+
// There should be no delay before status is offline
|
|
161
|
+
expect(result.current.online).toBe(false);
|
|
162
|
+
expect(result.current.offline).toBe(true);
|
|
163
|
+
});
|
|
174
164
|
});
|
|
175
165
|
it('can have the debounce delay changed during its lifecycle', async () => {
|
|
176
166
|
// Start with 150 ms debounce
|
|
@@ -179,51 +169,50 @@ describe('debouncing state changes', () => {
|
|
|
179
169
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
180
170
|
const {
|
|
181
171
|
result,
|
|
182
|
-
waitForNextUpdate,
|
|
183
172
|
rerender
|
|
184
|
-
} = (0,
|
|
173
|
+
} = (0, _react.renderHook)(function () {
|
|
185
174
|
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
186
175
|
}, {
|
|
187
176
|
initialProps: {
|
|
188
177
|
debounceDelay: 150
|
|
189
178
|
}
|
|
190
179
|
});
|
|
191
|
-
await (0,
|
|
180
|
+
await (0, _react.act)(async () => {
|
|
192
181
|
// Multiple events in succession
|
|
193
182
|
events.offline(new Event('offline'));
|
|
194
183
|
events.online(new Event('online'));
|
|
195
184
|
events.offline(new Event('offline'));
|
|
196
|
-
});
|
|
185
|
+
});
|
|
197
186
|
|
|
198
|
-
|
|
187
|
+
// Immediately, nothing should happen
|
|
188
|
+
expect(result.current.online).toBe(true);
|
|
199
189
|
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
expect(result.current.online).toBe(false); // Change to 50 ms debounce
|
|
190
|
+
// 150ms later, final "offline" event should finally resolve
|
|
191
|
+
await wait(160);
|
|
192
|
+
expect(result.current.online).toBe(false);
|
|
204
193
|
|
|
194
|
+
// Change to 50 ms debounce
|
|
205
195
|
rerender({
|
|
206
196
|
debounceDelay: 50
|
|
207
197
|
});
|
|
208
|
-
await (0,
|
|
198
|
+
await (0, _react.act)(async () => {
|
|
209
199
|
// Multiple events in succession
|
|
210
200
|
events.online(new Event('online'));
|
|
211
201
|
events.offline(new Event('offline'));
|
|
212
202
|
events.online(new Event('online'));
|
|
213
|
-
});
|
|
203
|
+
});
|
|
214
204
|
|
|
215
|
-
|
|
205
|
+
// Immediately, nothing should happen
|
|
206
|
+
expect(result.current.online).toBe(false);
|
|
216
207
|
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
});
|
|
208
|
+
// 50ms later, final "online" event should finally resolve
|
|
209
|
+
await wait(60);
|
|
220
210
|
expect(result.current.online).toBe(true);
|
|
221
211
|
});
|
|
222
212
|
it('handles debounced state change when parent component rerenders during a debounce delay', async () => {
|
|
223
213
|
jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
|
|
224
214
|
const events = {};
|
|
225
215
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
226
|
-
|
|
227
216
|
const TestComponent = () => {
|
|
228
217
|
const {
|
|
229
218
|
online
|
|
@@ -234,33 +223,34 @@ describe('debouncing state changes', () => {
|
|
|
234
223
|
"data-testid": "status"
|
|
235
224
|
}, online ? 'on' : 'off');
|
|
236
225
|
};
|
|
237
|
-
|
|
238
226
|
const {
|
|
239
227
|
rerender
|
|
240
|
-
} = (0, _react.render)(
|
|
228
|
+
} = (0, _react.render)(/*#__PURE__*/_react2.default.createElement(TestComponent, null));
|
|
241
229
|
const {
|
|
242
230
|
getByTestId
|
|
243
231
|
} = _react.screen;
|
|
244
232
|
expect(getByTestId('status')).toHaveTextContent('on');
|
|
245
|
-
await (0,
|
|
233
|
+
await (0, _react.act)(async () => {
|
|
246
234
|
// Multiple events in succession
|
|
247
235
|
events.offline(new Event('offline'));
|
|
248
236
|
events.online(new Event('online'));
|
|
249
237
|
events.offline(new Event('offline'));
|
|
250
|
-
});
|
|
238
|
+
});
|
|
251
239
|
|
|
252
|
-
|
|
240
|
+
// Immediately, nothing should happen
|
|
241
|
+
expect(getByTestId('status')).toHaveTextContent('on');
|
|
253
242
|
|
|
254
|
-
|
|
243
|
+
// Rerender parent component
|
|
244
|
+
rerender(/*#__PURE__*/_react2.default.createElement(TestComponent, null));
|
|
255
245
|
|
|
246
|
+
// Final "offline" event should still resolve
|
|
256
247
|
await (0, _react.waitFor)(() => expect(getByTestId('status')).toHaveTextContent('off'));
|
|
257
248
|
});
|
|
258
249
|
it('handles debounced state change when debounce delay is changed during a delay', async () => {
|
|
259
250
|
jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
|
|
260
251
|
const events = {};
|
|
261
252
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
262
|
-
|
|
263
|
-
const TestComponent = (_ref) => {
|
|
253
|
+
const TestComponent = _ref => {
|
|
264
254
|
let {
|
|
265
255
|
options
|
|
266
256
|
} = _ref;
|
|
@@ -271,10 +261,9 @@ describe('debouncing state changes', () => {
|
|
|
271
261
|
"data-testid": "status"
|
|
272
262
|
}, online ? 'on' : 'off');
|
|
273
263
|
};
|
|
274
|
-
|
|
275
264
|
const {
|
|
276
265
|
rerender
|
|
277
|
-
} = (0, _react.render)(
|
|
266
|
+
} = (0, _react.render)(/*#__PURE__*/_react2.default.createElement(TestComponent, {
|
|
278
267
|
options: {
|
|
279
268
|
debounceDelay: 100
|
|
280
269
|
}
|
|
@@ -283,28 +272,30 @@ describe('debouncing state changes', () => {
|
|
|
283
272
|
getByTestId
|
|
284
273
|
} = _react.screen;
|
|
285
274
|
expect(getByTestId('status')).toHaveTextContent('on');
|
|
286
|
-
await (0,
|
|
275
|
+
await (0, _react.act)(async () => {
|
|
287
276
|
// Multiple events in succession
|
|
288
277
|
events.offline(new Event('offline'));
|
|
289
278
|
events.online(new Event('online'));
|
|
290
279
|
events.offline(new Event('offline'));
|
|
291
|
-
});
|
|
280
|
+
});
|
|
292
281
|
|
|
293
|
-
|
|
282
|
+
// Immediately, nothing should happen
|
|
283
|
+
expect(getByTestId('status')).toHaveTextContent('on');
|
|
294
284
|
|
|
295
|
-
|
|
285
|
+
// Change debounce options
|
|
286
|
+
rerender(/*#__PURE__*/_react2.default.createElement(TestComponent, {
|
|
296
287
|
options: {
|
|
297
288
|
debounceDelay: 50
|
|
298
289
|
}
|
|
299
|
-
}));
|
|
290
|
+
}));
|
|
300
291
|
|
|
292
|
+
// Final "offline" event should still resolve
|
|
301
293
|
await (0, _react.waitFor)(() => expect(getByTestId('status')).toHaveTextContent('off'));
|
|
302
294
|
});
|
|
303
295
|
it('debounces consistently across rerenders', async () => {
|
|
304
296
|
jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
|
|
305
297
|
const events = {};
|
|
306
298
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
307
|
-
|
|
308
299
|
const TestComponent = () => {
|
|
309
300
|
const {
|
|
310
301
|
online
|
|
@@ -315,35 +306,39 @@ describe('debouncing state changes', () => {
|
|
|
315
306
|
"data-testid": "status"
|
|
316
307
|
}, online ? 'on' : 'off');
|
|
317
308
|
};
|
|
318
|
-
|
|
319
309
|
const {
|
|
320
310
|
rerender
|
|
321
|
-
} = (0, _react.render)(
|
|
311
|
+
} = (0, _react.render)(/*#__PURE__*/_react2.default.createElement(TestComponent, null));
|
|
322
312
|
const {
|
|
323
313
|
getByTestId
|
|
324
314
|
} = _react.screen;
|
|
325
315
|
expect(getByTestId('status')).toHaveTextContent('on');
|
|
326
|
-
await (0,
|
|
316
|
+
await (0, _react.act)(async () => {
|
|
327
317
|
// Multiple events in succession
|
|
328
318
|
events.offline(new Event('offline'));
|
|
329
319
|
events.online(new Event('online'));
|
|
330
320
|
events.offline(new Event('offline'));
|
|
331
|
-
});
|
|
321
|
+
});
|
|
332
322
|
|
|
323
|
+
// wait a little bit - not long enough for debounce to resolve
|
|
333
324
|
await wait(50);
|
|
334
|
-
expect(getByTestId('status')).toHaveTextContent('on');
|
|
325
|
+
expect(getByTestId('status')).toHaveTextContent('on');
|
|
335
326
|
|
|
336
|
-
|
|
327
|
+
// Rerender parent component
|
|
328
|
+
rerender(/*#__PURE__*/_react2.default.createElement(TestComponent, null));
|
|
337
329
|
|
|
338
|
-
|
|
330
|
+
// Trigger more events
|
|
331
|
+
await (0, _react.act)(async () => {
|
|
339
332
|
events.online(new Event('online'));
|
|
340
333
|
events.offline(new Event('offline'));
|
|
341
|
-
});
|
|
342
|
-
// _would_ have resolved if there weren't the second set of events
|
|
334
|
+
});
|
|
343
335
|
|
|
336
|
+
// wait a little more - long enough that the first debounced callbacks
|
|
337
|
+
// _would_ have resolved if there weren't the second set of events
|
|
344
338
|
await wait(60);
|
|
345
|
-
expect(getByTestId('status')).toHaveTextContent('on');
|
|
339
|
+
expect(getByTestId('status')).toHaveTextContent('on');
|
|
346
340
|
|
|
341
|
+
// wait long enough for second set of callbacks to resolve
|
|
347
342
|
await (0, _react.waitFor)(() => expect(getByTestId('status')).toHaveTextContent('off'));
|
|
348
343
|
});
|
|
349
344
|
});
|
|
@@ -352,49 +347,48 @@ describe('it updates the lastOnline value in local storage', () => {
|
|
|
352
347
|
const testDateString = 'Fri, 27 Aug 2021 19:53:06 GMT';
|
|
353
348
|
it('sets lastOnline in local storage when it goes offline', async () => {
|
|
354
349
|
var _result$current$lastO;
|
|
355
|
-
|
|
356
350
|
jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
|
|
357
351
|
const events = {};
|
|
358
352
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
359
353
|
const {
|
|
360
|
-
result
|
|
361
|
-
|
|
362
|
-
} = (0, _reactHooks.renderHook)(function () {
|
|
354
|
+
result
|
|
355
|
+
} = (0, _react.renderHook)(function () {
|
|
363
356
|
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
364
357
|
}, {
|
|
365
358
|
initialProps: {
|
|
366
359
|
debounceDelay: 0
|
|
367
360
|
}
|
|
368
|
-
});
|
|
361
|
+
});
|
|
369
362
|
|
|
363
|
+
// Correct initial state
|
|
370
364
|
expect(localStorage.getItem(lastOnlineKey)).toBe(null);
|
|
371
365
|
expect(result.current.lastOnline).toBe(null);
|
|
372
|
-
(0,
|
|
366
|
+
(0, _react.act)(() => {
|
|
373
367
|
events.offline(new Event('offline'));
|
|
374
|
-
}); // Wait for debounce
|
|
375
|
-
|
|
376
|
-
await waitForNextUpdate({
|
|
377
|
-
timeout: 0
|
|
378
368
|
});
|
|
369
|
+
|
|
370
|
+
// Wait for debounce
|
|
371
|
+
await wait(500);
|
|
379
372
|
expect(result.current.online).toBe(false);
|
|
380
|
-
expect(result.current.offline).toBe(true);
|
|
373
|
+
expect(result.current.offline).toBe(true);
|
|
381
374
|
|
|
375
|
+
// Check localStorage for a stored date
|
|
382
376
|
const parsedDate = new Date(localStorage.getItem(lastOnlineKey));
|
|
383
|
-
expect(parsedDate.toString()).not.toBe('Invalid Date');
|
|
384
|
-
|
|
377
|
+
expect(parsedDate.toString()).not.toBe('Invalid Date');
|
|
378
|
+
// Check hook return value
|
|
385
379
|
expect(result.current.lastOnline).toBeInstanceOf(Date);
|
|
386
380
|
expect((_result$current$lastO = result.current.lastOnline) === null || _result$current$lastO === void 0 ? void 0 : _result$current$lastO.toUTCString()).toBe(localStorage.getItem(lastOnlineKey));
|
|
387
|
-
});
|
|
381
|
+
});
|
|
388
382
|
|
|
383
|
+
// not necessary
|
|
389
384
|
it.skip("sets lastOnline on mount if it's not set", () => {
|
|
390
385
|
var _result$current$lastO2;
|
|
391
|
-
|
|
392
386
|
jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(false);
|
|
393
387
|
const events = {};
|
|
394
388
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
395
389
|
const {
|
|
396
390
|
result
|
|
397
|
-
} = (0,
|
|
391
|
+
} = (0, _react.renderHook)(function () {
|
|
398
392
|
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
399
393
|
}, {
|
|
400
394
|
initialProps: {
|
|
@@ -414,7 +408,7 @@ describe('it updates the lastOnline value in local storage', () => {
|
|
|
414
408
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
415
409
|
const {
|
|
416
410
|
result
|
|
417
|
-
} = (0,
|
|
411
|
+
} = (0, _react.renderHook)(function () {
|
|
418
412
|
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
419
413
|
}, {
|
|
420
414
|
initialProps: {
|
|
@@ -423,7 +417,7 @@ describe('it updates the lastOnline value in local storage', () => {
|
|
|
423
417
|
});
|
|
424
418
|
expect(localStorage.getItem(lastOnlineKey)).toBe(testDateString);
|
|
425
419
|
expect(result.current.lastOnline).toEqual(new Date(testDateString));
|
|
426
|
-
(0,
|
|
420
|
+
(0, _react.act)(() => {
|
|
427
421
|
events.offline(new Event('offline'));
|
|
428
422
|
});
|
|
429
423
|
await wait(0);
|
|
@@ -439,9 +433,8 @@ describe('it updates the lastOnline value in local storage', () => {
|
|
|
439
433
|
const events = {};
|
|
440
434
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
441
435
|
const {
|
|
442
|
-
result
|
|
443
|
-
|
|
444
|
-
} = (0, _reactHooks.renderHook)(function () {
|
|
436
|
+
result
|
|
437
|
+
} = (0, _react.renderHook)(function () {
|
|
445
438
|
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
446
439
|
}, {
|
|
447
440
|
initialProps: {
|
|
@@ -450,60 +443,54 @@ describe('it updates the lastOnline value in local storage', () => {
|
|
|
450
443
|
});
|
|
451
444
|
expect(localStorage.getItem(lastOnlineKey)).toBe(testDateString);
|
|
452
445
|
expect(result.current.lastOnline).toEqual(new Date(testDateString));
|
|
453
|
-
(0,
|
|
446
|
+
(0, _react.act)(() => {
|
|
454
447
|
events.offline(new Event('online'));
|
|
455
|
-
}); // Wait for debounce
|
|
456
|
-
|
|
457
|
-
await waitForNextUpdate({
|
|
458
|
-
timeout: 0
|
|
459
448
|
});
|
|
449
|
+
|
|
450
|
+
// Wait for debounce
|
|
451
|
+
await wait(500);
|
|
460
452
|
expect(result.current.online).toBe(true);
|
|
461
|
-
expect(result.current.offline).toBe(false);
|
|
453
|
+
expect(result.current.offline).toBe(false);
|
|
462
454
|
|
|
455
|
+
// expect(localStorage.getItem(lastOnlineKey)).toBe(null)
|
|
463
456
|
expect(result.current.lastOnline).toBe(null);
|
|
464
457
|
});
|
|
465
458
|
it('tracks correctly when going offline and online', async () => {
|
|
466
459
|
var _result$current$lastO3, _result$current$lastO4;
|
|
467
|
-
|
|
468
460
|
jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
|
|
469
461
|
const events = {};
|
|
470
462
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
471
463
|
const {
|
|
472
|
-
result
|
|
473
|
-
|
|
474
|
-
} = (0, _reactHooks.renderHook)(function () {
|
|
464
|
+
result
|
|
465
|
+
} = (0, _react.renderHook)(function () {
|
|
475
466
|
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
476
467
|
}, {
|
|
477
468
|
initialProps: {
|
|
478
469
|
debounceDelay: 0
|
|
479
470
|
}
|
|
480
|
-
});
|
|
471
|
+
});
|
|
481
472
|
|
|
473
|
+
// Correct initial state
|
|
482
474
|
expect(localStorage.getItem(lastOnlineKey)).toBe(null);
|
|
483
475
|
expect(result.current.lastOnline).toBe(null);
|
|
484
|
-
(0,
|
|
476
|
+
(0, _react.act)(() => {
|
|
485
477
|
events.offline(new Event('offline'));
|
|
486
478
|
});
|
|
487
|
-
await
|
|
488
|
-
timeout: 0
|
|
489
|
-
});
|
|
479
|
+
await (0, _react.waitFor)(() => undefined);
|
|
490
480
|
const firstDate = new Date(localStorage.getItem(lastOnlineKey));
|
|
491
481
|
const firstValue = (_result$current$lastO3 = result.current.lastOnline) === null || _result$current$lastO3 === void 0 ? void 0 : _result$current$lastO3.valueOf();
|
|
492
|
-
(0,
|
|
482
|
+
(0, _react.act)(() => {
|
|
493
483
|
events.offline(new Event('online'));
|
|
494
484
|
});
|
|
495
|
-
await
|
|
496
|
-
|
|
497
|
-
});
|
|
498
|
-
expect(result.current.lastOnline).toBe(null); // todo: this is an error from UTC strings' imprecision
|
|
485
|
+
await wait(500);
|
|
486
|
+
expect(result.current.lastOnline).toBe(null);
|
|
499
487
|
|
|
500
|
-
|
|
501
|
-
|
|
488
|
+
// todo: this is an error from UTC strings' imprecision
|
|
489
|
+
await wait(500);
|
|
490
|
+
(0, _react.act)(() => {
|
|
502
491
|
events.offline(new Event('offline'));
|
|
503
492
|
});
|
|
504
|
-
await
|
|
505
|
-
timeout: 0
|
|
506
|
-
});
|
|
493
|
+
await wait(500);
|
|
507
494
|
expect(new Date(localStorage.getItem(lastOnlineKey))).not.toEqual(firstDate);
|
|
508
495
|
expect((_result$current$lastO4 = result.current.lastOnline) === null || _result$current$lastO4 === void 0 ? void 0 : _result$current$lastO4.valueOf()).not.toEqual(firstValue);
|
|
509
496
|
});
|