@dhis2/app-service-offline 3.7.0 → 3.9.0
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 +37 -24
- package/build/cjs/index.js +18 -10
- package/build/cjs/lib/__tests__/clear-sensitive-caches.test.js +5 -1
- package/build/cjs/lib/__tests__/{online-status.test.js → network-status.test.js} +41 -20
- package/build/cjs/lib/__tests__/offline-provider.test.js +5 -1
- package/build/cjs/lib/__tests__/use-cacheable-section.test.js +77 -35
- package/build/cjs/lib/__tests__/{use-online-staus-message.test.js → use-online-status-message.test.js} +8 -5
- package/build/cjs/lib/cacheable-section-state.js +17 -13
- package/build/cjs/lib/cacheable-section.js +14 -12
- package/build/cjs/lib/clear-sensitive-caches.js +9 -5
- package/build/cjs/lib/dhis2-connection-status/dev-debug-log.js +26 -0
- package/build/cjs/lib/dhis2-connection-status/dhis2-connection-status.js +224 -0
- package/build/cjs/lib/dhis2-connection-status/dhis2-connection-status.test.js +841 -0
- package/build/cjs/lib/dhis2-connection-status/index.js +19 -0
- package/build/cjs/lib/dhis2-connection-status/is-ping-available.js +43 -0
- package/build/cjs/lib/dhis2-connection-status/is-ping-available.test.js +76 -0
- package/build/cjs/lib/dhis2-connection-status/smart-interval.js +211 -0
- package/build/cjs/lib/dhis2-connection-status/use-ping-query.js +21 -0
- package/build/cjs/lib/global-state-service.js +16 -11
- package/build/cjs/lib/{online-status.js → network-status.js} +8 -5
- package/build/cjs/lib/offline-interface.js +7 -4
- package/build/cjs/lib/offline-provider.js +9 -5
- package/build/cjs/lib/online-status-message.js +5 -4
- package/build/cjs/utils/render-counter.js +6 -4
- package/build/cjs/utils/test-mocks.js +17 -10
- package/build/es/__tests__/integration.test.js +37 -24
- package/build/es/index.js +5 -3
- package/build/es/lib/__tests__/clear-sensitive-caches.test.js +5 -1
- package/build/es/lib/__tests__/{online-status.test.js → network-status.test.js} +35 -14
- package/build/es/lib/__tests__/offline-provider.test.js +5 -1
- package/build/es/lib/__tests__/use-cacheable-section.test.js +77 -34
- package/build/es/lib/__tests__/{use-online-staus-message.test.js → use-online-status-message.test.js} +8 -5
- package/build/es/lib/cacheable-section-state.js +14 -10
- package/build/es/lib/cacheable-section.js +13 -11
- package/build/es/lib/clear-sensitive-caches.js +8 -4
- package/build/es/lib/dhis2-connection-status/dev-debug-log.js +20 -0
- package/build/es/lib/dhis2-connection-status/dhis2-connection-status.js +194 -0
- package/build/es/lib/dhis2-connection-status/dhis2-connection-status.test.js +831 -0
- package/build/es/lib/dhis2-connection-status/index.js +1 -0
- package/build/es/lib/dhis2-connection-status/is-ping-available.js +36 -0
- package/build/es/lib/dhis2-connection-status/is-ping-available.test.js +73 -0
- package/build/es/lib/dhis2-connection-status/smart-interval.js +199 -0
- package/build/es/lib/dhis2-connection-status/use-ping-query.js +12 -0
- package/build/es/lib/global-state-service.js +15 -10
- package/build/es/lib/{online-status.js → network-status.js} +7 -4
- package/build/es/lib/offline-interface.js +7 -4
- package/build/es/lib/offline-provider.js +8 -5
- package/build/es/lib/online-status-message.js +4 -3
- package/build/es/utils/render-counter.js +6 -4
- package/build/es/utils/test-mocks.js +16 -9
- package/build/types/index.d.ts +2 -1
- package/build/types/lib/dhis2-connection-status/dev-debug-log.d.ts +9 -0
- package/build/types/lib/dhis2-connection-status/dhis2-connection-status.d.ts +28 -0
- package/build/types/lib/dhis2-connection-status/index.d.ts +1 -0
- package/build/types/lib/dhis2-connection-status/is-ping-available.d.ts +14 -0
- package/build/types/lib/dhis2-connection-status/smart-interval.d.ts +18 -0
- package/build/types/lib/dhis2-connection-status/use-ping-query.d.ts +1 -0
- package/build/types/lib/{online-status.d.ts → network-status.d.ts} +3 -3
- package/build/types/types.d.ts +6 -0
- package/build/types/utils/test-mocks.d.ts +2 -0
- package/package.json +2 -2
|
@@ -22,10 +22,11 @@ const renderCounts = {};
|
|
|
22
22
|
|
|
23
23
|
const identity = arg => arg;
|
|
24
24
|
|
|
25
|
-
const TestControls = ({
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
25
|
+
const TestControls = (_ref) => {
|
|
26
|
+
let {
|
|
27
|
+
id,
|
|
28
|
+
makeRecordingHandler = identity
|
|
29
|
+
} = _ref;
|
|
29
30
|
const {
|
|
30
31
|
startRecording,
|
|
31
32
|
remove,
|
|
@@ -34,37 +35,40 @@ const TestControls = ({
|
|
|
34
35
|
recordingState
|
|
35
36
|
} = (0, _cacheableSection.useCacheableSection)(id);
|
|
36
37
|
return /*#__PURE__*/_react2.default.createElement(_react2.default.Fragment, null, /*#__PURE__*/_react2.default.createElement(_renderCounter.RenderCounter, {
|
|
37
|
-
id:
|
|
38
|
+
id: `controls-rc-${id}`,
|
|
38
39
|
countsObj: renderCounts
|
|
39
40
|
}), /*#__PURE__*/_react2.default.createElement("button", {
|
|
40
|
-
"data-testid":
|
|
41
|
+
"data-testid": `start-recording-${id}`,
|
|
41
42
|
onClick: makeRecordingHandler(startRecording)
|
|
42
43
|
}), /*#__PURE__*/_react2.default.createElement("button", {
|
|
43
|
-
"data-testid":
|
|
44
|
+
"data-testid": `remove-${id}`,
|
|
44
45
|
onClick: () => {
|
|
45
46
|
remove();
|
|
46
47
|
}
|
|
47
48
|
}), /*#__PURE__*/_react2.default.createElement("div", {
|
|
48
|
-
"data-testid":
|
|
49
|
+
"data-testid": `is-cached-${id}`
|
|
49
50
|
}, isCached ? 'yes' : 'no'), /*#__PURE__*/_react2.default.createElement("div", {
|
|
50
|
-
"data-testid":
|
|
51
|
+
"data-testid": `last-updated-${id}`
|
|
51
52
|
}, lastUpdated || 'never'), /*#__PURE__*/_react2.default.createElement("div", {
|
|
52
|
-
"data-testid":
|
|
53
|
+
"data-testid": `recording-state-${id}`
|
|
53
54
|
}, recordingState));
|
|
54
55
|
};
|
|
55
56
|
|
|
56
|
-
const TestSection = ({
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
}
|
|
57
|
+
const TestSection = (_ref2) => {
|
|
58
|
+
let {
|
|
59
|
+
id,
|
|
60
|
+
children
|
|
61
|
+
} = _ref2;
|
|
62
|
+
return /*#__PURE__*/_react2.default.createElement(_cacheableSection.CacheableSection, {
|
|
63
|
+
id: id,
|
|
64
|
+
loadingMask: /*#__PURE__*/_react2.default.createElement("div", {
|
|
65
|
+
"data-testid": `loading-mask-${id}`
|
|
66
|
+
})
|
|
67
|
+
}, /*#__PURE__*/_react2.default.createElement(_renderCounter.RenderCounter, {
|
|
68
|
+
id: `section-rc-${id}`,
|
|
69
|
+
countsObj: renderCounts
|
|
70
|
+
}), children);
|
|
71
|
+
};
|
|
68
72
|
|
|
69
73
|
const TestSingleSection = props => {
|
|
70
74
|
// Props are spread so they can be overwritten
|
|
@@ -82,9 +86,13 @@ const originalError = console.error;
|
|
|
82
86
|
beforeEach(() => {
|
|
83
87
|
// This is done before each because the 'recording error' test uses its own
|
|
84
88
|
// spy on console.error
|
|
85
|
-
jest.spyOn(console, 'error').mockImplementation((
|
|
89
|
+
jest.spyOn(console, 'error').mockImplementation(function () {
|
|
86
90
|
const pattern = /Warning: An update to .* inside a test was not wrapped in act/;
|
|
87
91
|
|
|
92
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
93
|
+
args[_key] = arguments[_key];
|
|
94
|
+
}
|
|
95
|
+
|
|
88
96
|
if (typeof args[0] === 'string' && pattern.test(args[0])) {
|
|
89
97
|
return;
|
|
90
98
|
}
|
|
@@ -150,9 +158,14 @@ describe('Coordination between useCacheableSection and CacheableSection', () =>
|
|
|
150
158
|
});
|
|
151
159
|
it('handles a recording that encounters an error', async done => {
|
|
152
160
|
// Suppress the expected error from console (in addition to 'act' warning)
|
|
153
|
-
jest.spyOn(console, 'error').mockImplementation((
|
|
161
|
+
jest.spyOn(console, 'error').mockImplementation(function () {
|
|
154
162
|
const actPattern = /Warning: An update to .* inside a test was not wrapped in act/;
|
|
155
163
|
const errPattern = /Error during recording/;
|
|
164
|
+
|
|
165
|
+
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
166
|
+
args[_key2] = arguments[_key2];
|
|
167
|
+
}
|
|
168
|
+
|
|
156
169
|
const matchesPattern = actPattern.test(args[0]) || errPattern.test(args[0]);
|
|
157
170
|
|
|
158
171
|
if (typeof args[0] === 'string' && matchesPattern) {
|
package/build/cjs/index.js
CHANGED
|
@@ -3,16 +3,22 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
+
Object.defineProperty(exports, "CacheableSection", {
|
|
7
|
+
enumerable: true,
|
|
8
|
+
get: function () {
|
|
9
|
+
return _cacheableSection.CacheableSection;
|
|
10
|
+
}
|
|
11
|
+
});
|
|
6
12
|
Object.defineProperty(exports, "OfflineProvider", {
|
|
7
13
|
enumerable: true,
|
|
8
14
|
get: function () {
|
|
9
15
|
return _offlineProvider.OfflineProvider;
|
|
10
16
|
}
|
|
11
17
|
});
|
|
12
|
-
Object.defineProperty(exports, "
|
|
18
|
+
Object.defineProperty(exports, "clearSensitiveCaches", {
|
|
13
19
|
enumerable: true,
|
|
14
20
|
get: function () {
|
|
15
|
-
return
|
|
21
|
+
return _clearSensitiveCaches.clearSensitiveCaches;
|
|
16
22
|
}
|
|
17
23
|
});
|
|
18
24
|
Object.defineProperty(exports, "useCacheableSection", {
|
|
@@ -27,22 +33,22 @@ Object.defineProperty(exports, "useCachedSections", {
|
|
|
27
33
|
return _cacheableSectionState.useCachedSections;
|
|
28
34
|
}
|
|
29
35
|
});
|
|
30
|
-
Object.defineProperty(exports, "
|
|
36
|
+
Object.defineProperty(exports, "useDhis2ConnectionStatus", {
|
|
31
37
|
enumerable: true,
|
|
32
38
|
get: function () {
|
|
33
|
-
return
|
|
39
|
+
return _dhis2ConnectionStatus.useDhis2ConnectionStatus;
|
|
34
40
|
}
|
|
35
41
|
});
|
|
36
|
-
Object.defineProperty(exports, "
|
|
42
|
+
Object.defineProperty(exports, "useOnlineStatus", {
|
|
37
43
|
enumerable: true,
|
|
38
44
|
get: function () {
|
|
39
|
-
return
|
|
45
|
+
return _networkStatus.useNetworkStatus;
|
|
40
46
|
}
|
|
41
47
|
});
|
|
42
|
-
Object.defineProperty(exports, "
|
|
48
|
+
Object.defineProperty(exports, "useOnlineStatusMessage", {
|
|
43
49
|
enumerable: true,
|
|
44
50
|
get: function () {
|
|
45
|
-
return
|
|
51
|
+
return _onlineStatusMessage.useOnlineStatusMessage;
|
|
46
52
|
}
|
|
47
53
|
});
|
|
48
54
|
|
|
@@ -52,8 +58,10 @@ var _cacheableSection = require("./lib/cacheable-section");
|
|
|
52
58
|
|
|
53
59
|
var _cacheableSectionState = require("./lib/cacheable-section-state");
|
|
54
60
|
|
|
55
|
-
var
|
|
61
|
+
var _networkStatus = require("./lib/network-status");
|
|
56
62
|
|
|
57
63
|
var _onlineStatusMessage = require("./lib/online-status-message");
|
|
58
64
|
|
|
59
|
-
var _clearSensitiveCaches = require("./lib/clear-sensitive-caches");
|
|
65
|
+
var _clearSensitiveCaches = require("./lib/clear-sensitive-caches");
|
|
66
|
+
|
|
67
|
+
var _dhis2ConnectionStatus = require("./lib/dhis2-connection-status");
|
|
@@ -34,9 +34,13 @@ afterEach(() => {
|
|
|
34
34
|
|
|
35
35
|
const originalDebug = console.debug;
|
|
36
36
|
beforeAll(() => {
|
|
37
|
-
jest.spyOn(console, 'debug').mockImplementation((
|
|
37
|
+
jest.spyOn(console, 'debug').mockImplementation(function () {
|
|
38
38
|
const pattern = /Clearing sensitive caches/;
|
|
39
39
|
|
|
40
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
41
|
+
args[_key] = arguments[_key];
|
|
42
|
+
}
|
|
43
|
+
|
|
40
44
|
if (typeof args[0] === 'string' && pattern.test(args[0])) {
|
|
41
45
|
return;
|
|
42
46
|
}
|
|
@@ -6,7 +6,7 @@ var _reactHooks = require("@testing-library/react-hooks");
|
|
|
6
6
|
|
|
7
7
|
var _react2 = _interopRequireDefault(require("react"));
|
|
8
8
|
|
|
9
|
-
var
|
|
9
|
+
var _networkStatus = require("../network-status");
|
|
10
10
|
|
|
11
11
|
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
12
|
|
|
@@ -27,7 +27,7 @@ describe('initalizes to navigator.onLine value', () => {
|
|
|
27
27
|
jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(true);
|
|
28
28
|
const {
|
|
29
29
|
result
|
|
30
|
-
} = (0, _reactHooks.renderHook)(() => (0,
|
|
30
|
+
} = (0, _reactHooks.renderHook)(() => (0, _networkStatus.useNetworkStatus)());
|
|
31
31
|
expect(result.current.online).toBe(true);
|
|
32
32
|
expect(result.current.offline).toBe(false);
|
|
33
33
|
});
|
|
@@ -35,7 +35,7 @@ describe('initalizes to navigator.onLine value', () => {
|
|
|
35
35
|
jest.spyOn(navigator, 'onLine', 'get').mockReturnValueOnce(false);
|
|
36
36
|
const {
|
|
37
37
|
result
|
|
38
|
-
} = (0, _reactHooks.renderHook)(() => (0,
|
|
38
|
+
} = (0, _reactHooks.renderHook)(() => (0, _networkStatus.useNetworkStatus)());
|
|
39
39
|
expect(result.current.online).toBe(false);
|
|
40
40
|
expect(result.current.offline).toBe(true);
|
|
41
41
|
});
|
|
@@ -49,7 +49,9 @@ describe('state changes in response to browser "online" and "offline" events', (
|
|
|
49
49
|
const {
|
|
50
50
|
result,
|
|
51
51
|
waitForNextUpdate
|
|
52
|
-
} = (0, _reactHooks.renderHook)(
|
|
52
|
+
} = (0, _reactHooks.renderHook)(function () {
|
|
53
|
+
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
54
|
+
}, {
|
|
53
55
|
initialProps: {
|
|
54
56
|
debounceDelay: 50
|
|
55
57
|
}
|
|
@@ -72,7 +74,9 @@ describe('state changes in response to browser "online" and "offline" events', (
|
|
|
72
74
|
const {
|
|
73
75
|
result,
|
|
74
76
|
waitForNextUpdate
|
|
75
|
-
} = (0, _reactHooks.renderHook)(
|
|
77
|
+
} = (0, _reactHooks.renderHook)(function () {
|
|
78
|
+
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
79
|
+
}, {
|
|
76
80
|
initialProps: {
|
|
77
81
|
debounceDelay: 50
|
|
78
82
|
}
|
|
@@ -97,7 +101,7 @@ describe('debouncing state changes', () => {
|
|
|
97
101
|
const {
|
|
98
102
|
result,
|
|
99
103
|
waitForNextUpdate
|
|
100
|
-
} = (0, _reactHooks.renderHook)(() => (0,
|
|
104
|
+
} = (0, _reactHooks.renderHook)(() => (0, _networkStatus.useNetworkStatus)());
|
|
101
105
|
await (0, _reactHooks.act)(async () => {
|
|
102
106
|
// Multiple events in succession
|
|
103
107
|
events.offline(new Event('offline'));
|
|
@@ -120,7 +124,9 @@ describe('debouncing state changes', () => {
|
|
|
120
124
|
const {
|
|
121
125
|
result,
|
|
122
126
|
waitForNextUpdate
|
|
123
|
-
} = (0, _reactHooks.renderHook)(
|
|
127
|
+
} = (0, _reactHooks.renderHook)(function () {
|
|
128
|
+
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
129
|
+
}, {
|
|
124
130
|
initialProps: {
|
|
125
131
|
debounceDelay: 50
|
|
126
132
|
}
|
|
@@ -146,7 +152,9 @@ describe('debouncing state changes', () => {
|
|
|
146
152
|
const {
|
|
147
153
|
result,
|
|
148
154
|
waitForNextUpdate
|
|
149
|
-
} = (0, _reactHooks.renderHook)(
|
|
155
|
+
} = (0, _reactHooks.renderHook)(function () {
|
|
156
|
+
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
157
|
+
}, {
|
|
150
158
|
initialProps: {
|
|
151
159
|
debounceDelay: 0
|
|
152
160
|
}
|
|
@@ -173,7 +181,9 @@ describe('debouncing state changes', () => {
|
|
|
173
181
|
result,
|
|
174
182
|
waitForNextUpdate,
|
|
175
183
|
rerender
|
|
176
|
-
} = (0, _reactHooks.renderHook)(
|
|
184
|
+
} = (0, _reactHooks.renderHook)(function () {
|
|
185
|
+
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
186
|
+
}, {
|
|
177
187
|
initialProps: {
|
|
178
188
|
debounceDelay: 150
|
|
179
189
|
}
|
|
@@ -217,7 +227,7 @@ describe('debouncing state changes', () => {
|
|
|
217
227
|
const TestComponent = () => {
|
|
218
228
|
const {
|
|
219
229
|
online
|
|
220
|
-
} = (0,
|
|
230
|
+
} = (0, _networkStatus.useNetworkStatus)({
|
|
221
231
|
debounceDelay: 50
|
|
222
232
|
});
|
|
223
233
|
return /*#__PURE__*/_react2.default.createElement("div", {
|
|
@@ -250,12 +260,13 @@ describe('debouncing state changes', () => {
|
|
|
250
260
|
const events = {};
|
|
251
261
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
252
262
|
|
|
253
|
-
const TestComponent = ({
|
|
254
|
-
|
|
255
|
-
|
|
263
|
+
const TestComponent = (_ref) => {
|
|
264
|
+
let {
|
|
265
|
+
options
|
|
266
|
+
} = _ref;
|
|
256
267
|
const {
|
|
257
268
|
online
|
|
258
|
-
} = (0,
|
|
269
|
+
} = (0, _networkStatus.useNetworkStatus)(options);
|
|
259
270
|
return /*#__PURE__*/_react2.default.createElement("div", {
|
|
260
271
|
"data-testid": "status"
|
|
261
272
|
}, online ? 'on' : 'off');
|
|
@@ -297,7 +308,7 @@ describe('debouncing state changes', () => {
|
|
|
297
308
|
const TestComponent = () => {
|
|
298
309
|
const {
|
|
299
310
|
online
|
|
300
|
-
} = (0,
|
|
311
|
+
} = (0, _networkStatus.useNetworkStatus)({
|
|
301
312
|
debounceDelay: 100
|
|
302
313
|
});
|
|
303
314
|
return /*#__PURE__*/_react2.default.createElement("div", {
|
|
@@ -348,7 +359,9 @@ describe('it updates the lastOnline value in local storage', () => {
|
|
|
348
359
|
const {
|
|
349
360
|
result,
|
|
350
361
|
waitForNextUpdate
|
|
351
|
-
} = (0, _reactHooks.renderHook)(
|
|
362
|
+
} = (0, _reactHooks.renderHook)(function () {
|
|
363
|
+
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
364
|
+
}, {
|
|
352
365
|
initialProps: {
|
|
353
366
|
debounceDelay: 0
|
|
354
367
|
}
|
|
@@ -381,7 +394,9 @@ describe('it updates the lastOnline value in local storage', () => {
|
|
|
381
394
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
382
395
|
const {
|
|
383
396
|
result
|
|
384
|
-
} = (0, _reactHooks.renderHook)(
|
|
397
|
+
} = (0, _reactHooks.renderHook)(function () {
|
|
398
|
+
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
399
|
+
}, {
|
|
385
400
|
initialProps: {
|
|
386
401
|
debounceDelay: 0
|
|
387
402
|
}
|
|
@@ -399,7 +414,9 @@ describe('it updates the lastOnline value in local storage', () => {
|
|
|
399
414
|
window.addEventListener = jest.fn((event, cb) => events[event] = cb);
|
|
400
415
|
const {
|
|
401
416
|
result
|
|
402
|
-
} = (0, _reactHooks.renderHook)(
|
|
417
|
+
} = (0, _reactHooks.renderHook)(function () {
|
|
418
|
+
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
419
|
+
}, {
|
|
403
420
|
initialProps: {
|
|
404
421
|
debounceDelay: 0
|
|
405
422
|
}
|
|
@@ -424,7 +441,9 @@ describe('it updates the lastOnline value in local storage', () => {
|
|
|
424
441
|
const {
|
|
425
442
|
result,
|
|
426
443
|
waitForNextUpdate
|
|
427
|
-
} = (0, _reactHooks.renderHook)(
|
|
444
|
+
} = (0, _reactHooks.renderHook)(function () {
|
|
445
|
+
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
446
|
+
}, {
|
|
428
447
|
initialProps: {
|
|
429
448
|
debounceDelay: 0
|
|
430
449
|
}
|
|
@@ -452,7 +471,9 @@ describe('it updates the lastOnline value in local storage', () => {
|
|
|
452
471
|
const {
|
|
453
472
|
result,
|
|
454
473
|
waitForNextUpdate
|
|
455
|
-
} = (0, _reactHooks.renderHook)(
|
|
474
|
+
} = (0, _reactHooks.renderHook)(function () {
|
|
475
|
+
return (0, _networkStatus.useNetworkStatus)(...arguments);
|
|
476
|
+
}, {
|
|
456
477
|
initialProps: {
|
|
457
478
|
debounceDelay: 0
|
|
458
479
|
}
|
|
@@ -17,9 +17,13 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
17
17
|
// Suppress 'act' warning for these tests
|
|
18
18
|
const originalError = console.error;
|
|
19
19
|
beforeEach(() => {
|
|
20
|
-
jest.spyOn(console, 'error').mockImplementation((
|
|
20
|
+
jest.spyOn(console, 'error').mockImplementation(function () {
|
|
21
21
|
const pattern = /Warning: An update to .* inside a test was not wrapped in act/;
|
|
22
22
|
|
|
23
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
24
|
+
args[_key] = arguments[_key];
|
|
25
|
+
}
|
|
26
|
+
|
|
23
27
|
if (typeof args[0] === 'string' && pattern.test(args[0])) {
|
|
24
28
|
return;
|
|
25
29
|
}
|
|
@@ -1,7 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
var _appServiceAlerts = require("@dhis2/app-service-alerts");
|
|
4
|
-
|
|
5
3
|
var _reactHooks = require("@testing-library/react-hooks");
|
|
6
4
|
|
|
7
5
|
var _react = _interopRequireDefault(require("react"));
|
|
@@ -17,9 +15,13 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
17
15
|
// Suppress 'act' warning for these tests
|
|
18
16
|
const originalError = console.error;
|
|
19
17
|
beforeEach(() => {
|
|
20
|
-
jest.spyOn(console, 'error').mockImplementation((
|
|
18
|
+
jest.spyOn(console, 'error').mockImplementation(function () {
|
|
21
19
|
const pattern = /Warning: An update to .* inside a test was not wrapped in act/;
|
|
22
20
|
|
|
21
|
+
for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
22
|
+
args[_key] = arguments[_key];
|
|
23
|
+
}
|
|
24
|
+
|
|
23
25
|
if (typeof args[0] === 'string' && pattern.test(args[0])) {
|
|
24
26
|
return;
|
|
25
27
|
}
|
|
@@ -33,14 +35,19 @@ afterEach(() => {
|
|
|
33
35
|
console.error.mockRestore();
|
|
34
36
|
});
|
|
35
37
|
it('renders in the default state initially', () => {
|
|
38
|
+
const wrapper = (_ref) => {
|
|
39
|
+
let {
|
|
40
|
+
children
|
|
41
|
+
} = _ref;
|
|
42
|
+
return /*#__PURE__*/_react.default.createElement(_offlineProvider.OfflineProvider, {
|
|
43
|
+
offlineInterface: _testMocks.mockOfflineInterface
|
|
44
|
+
}, children);
|
|
45
|
+
};
|
|
46
|
+
|
|
36
47
|
const {
|
|
37
48
|
result
|
|
38
49
|
} = (0, _reactHooks.renderHook)(() => (0, _cacheableSection.useCacheableSection)('one'), {
|
|
39
|
-
wrapper
|
|
40
|
-
children
|
|
41
|
-
}) => /*#__PURE__*/_react.default.createElement(_appServiceAlerts.AlertsProvider, null, /*#__PURE__*/_react.default.createElement(_offlineProvider.OfflineProvider, {
|
|
42
|
-
offlineInterface: _testMocks.mockOfflineInterface
|
|
43
|
-
}, children))
|
|
50
|
+
wrapper
|
|
44
51
|
});
|
|
45
52
|
expect(result.current.recordingState).toBe('default');
|
|
46
53
|
expect(result.current.isCached).toBe(false);
|
|
@@ -54,15 +61,21 @@ it('handles a successful recording', async done => {
|
|
|
54
61
|
lastUpdated: new Date()
|
|
55
62
|
}])
|
|
56
63
|
};
|
|
64
|
+
|
|
65
|
+
const wrapper = (_ref2) => {
|
|
66
|
+
let {
|
|
67
|
+
children
|
|
68
|
+
} = _ref2;
|
|
69
|
+
return /*#__PURE__*/_react.default.createElement(_offlineProvider.OfflineProvider, {
|
|
70
|
+
offlineInterface: testOfflineInterface
|
|
71
|
+
}, children);
|
|
72
|
+
};
|
|
73
|
+
|
|
57
74
|
const {
|
|
58
75
|
result,
|
|
59
76
|
waitFor
|
|
60
77
|
} = (0, _reactHooks.renderHook)(() => (0, _cacheableSection.useCacheableSection)(sectionId), {
|
|
61
|
-
wrapper
|
|
62
|
-
children
|
|
63
|
-
}) => /*#__PURE__*/_react.default.createElement(_appServiceAlerts.AlertsProvider, null, /*#__PURE__*/_react.default.createElement(_offlineProvider.OfflineProvider, {
|
|
64
|
-
offlineInterface: testOfflineInterface
|
|
65
|
-
}, children))
|
|
78
|
+
wrapper
|
|
66
79
|
});
|
|
67
80
|
|
|
68
81
|
const assertRecordingStarted = () => {
|
|
@@ -101,9 +114,14 @@ it('handles a successful recording', async done => {
|
|
|
101
114
|
});
|
|
102
115
|
it('handles a recording that encounters an error', async done => {
|
|
103
116
|
// Suppress the expected error from console (in addition to 'act' warning)
|
|
104
|
-
jest.spyOn(console, 'error').mockImplementation((
|
|
117
|
+
jest.spyOn(console, 'error').mockImplementation(function () {
|
|
105
118
|
const actPattern = /Warning: An update to .* inside a test was not wrapped in act/;
|
|
106
119
|
const errPattern = /Error during recording/;
|
|
120
|
+
|
|
121
|
+
for (var _len2 = arguments.length, args = new Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
|
122
|
+
args[_key2] = arguments[_key2];
|
|
123
|
+
}
|
|
124
|
+
|
|
107
125
|
const matchesPattern = actPattern.test(args[0]) || errPattern.test(args[0]);
|
|
108
126
|
|
|
109
127
|
if (typeof args[0] === 'string' && matchesPattern) {
|
|
@@ -115,14 +133,20 @@ it('handles a recording that encounters an error', async done => {
|
|
|
115
133
|
const testOfflineInterface = { ..._testMocks.mockOfflineInterface,
|
|
116
134
|
startRecording: _testMocks.errorRecordingMock
|
|
117
135
|
};
|
|
136
|
+
|
|
137
|
+
const wrapper = (_ref3) => {
|
|
138
|
+
let {
|
|
139
|
+
children
|
|
140
|
+
} = _ref3;
|
|
141
|
+
return /*#__PURE__*/_react.default.createElement(_offlineProvider.OfflineProvider, {
|
|
142
|
+
offlineInterface: testOfflineInterface
|
|
143
|
+
}, children);
|
|
144
|
+
};
|
|
145
|
+
|
|
118
146
|
const {
|
|
119
147
|
result
|
|
120
148
|
} = (0, _reactHooks.renderHook)(() => (0, _cacheableSection.useCacheableSection)('one'), {
|
|
121
|
-
wrapper
|
|
122
|
-
children
|
|
123
|
-
}) => /*#__PURE__*/_react.default.createElement(_appServiceAlerts.AlertsProvider, null, /*#__PURE__*/_react.default.createElement(_offlineProvider.OfflineProvider, {
|
|
124
|
-
offlineInterface: testOfflineInterface
|
|
125
|
-
}, children))
|
|
149
|
+
wrapper
|
|
126
150
|
});
|
|
127
151
|
|
|
128
152
|
const assertRecordingStarted = () => {
|
|
@@ -155,14 +179,20 @@ it('handles an error starting the recording', async () => {
|
|
|
155
179
|
const testOfflineInterface = { ..._testMocks.mockOfflineInterface,
|
|
156
180
|
startRecording: _testMocks.failedMessageRecordingMock
|
|
157
181
|
};
|
|
182
|
+
|
|
183
|
+
const wrapper = (_ref4) => {
|
|
184
|
+
let {
|
|
185
|
+
children
|
|
186
|
+
} = _ref4;
|
|
187
|
+
return /*#__PURE__*/_react.default.createElement(_offlineProvider.OfflineProvider, {
|
|
188
|
+
offlineInterface: testOfflineInterface
|
|
189
|
+
}, children);
|
|
190
|
+
};
|
|
191
|
+
|
|
158
192
|
const {
|
|
159
193
|
result
|
|
160
194
|
} = (0, _reactHooks.renderHook)(() => (0, _cacheableSection.useCacheableSection)('err'), {
|
|
161
|
-
wrapper
|
|
162
|
-
children
|
|
163
|
-
}) => /*#__PURE__*/_react.default.createElement(_appServiceAlerts.AlertsProvider, null, /*#__PURE__*/_react.default.createElement(_offlineProvider.OfflineProvider, {
|
|
164
|
-
offlineInterface: testOfflineInterface
|
|
165
|
-
}, children))
|
|
195
|
+
wrapper
|
|
166
196
|
});
|
|
167
197
|
await expect(result.current.startRecording()).rejects.toThrow('Failed message' // from failedMessageRecordingMock
|
|
168
198
|
);
|
|
@@ -175,15 +205,21 @@ it('handles remove and updates sections', async () => {
|
|
|
175
205
|
lastUpdated: new Date()
|
|
176
206
|
}]).mockResolvedValueOnce([])
|
|
177
207
|
};
|
|
208
|
+
|
|
209
|
+
const wrapper = (_ref5) => {
|
|
210
|
+
let {
|
|
211
|
+
children
|
|
212
|
+
} = _ref5;
|
|
213
|
+
return /*#__PURE__*/_react.default.createElement(_offlineProvider.OfflineProvider, {
|
|
214
|
+
offlineInterface: testOfflineInterface
|
|
215
|
+
}, children);
|
|
216
|
+
};
|
|
217
|
+
|
|
178
218
|
const {
|
|
179
219
|
result,
|
|
180
220
|
waitFor
|
|
181
221
|
} = (0, _reactHooks.renderHook)(() => (0, _cacheableSection.useCacheableSection)(sectionId), {
|
|
182
|
-
wrapper
|
|
183
|
-
children
|
|
184
|
-
}) => /*#__PURE__*/_react.default.createElement(_appServiceAlerts.AlertsProvider, null, /*#__PURE__*/_react.default.createElement(_offlineProvider.OfflineProvider, {
|
|
185
|
-
offlineInterface: testOfflineInterface
|
|
186
|
-
}, children))
|
|
222
|
+
wrapper
|
|
187
223
|
}); // Wait for state to sync with indexedDB
|
|
188
224
|
|
|
189
225
|
await waitFor(() => result.current.isCached === true);
|
|
@@ -205,16 +241,22 @@ it('handles a change in ID', async () => {
|
|
|
205
241
|
lastUpdated: new Date()
|
|
206
242
|
}])
|
|
207
243
|
};
|
|
244
|
+
|
|
245
|
+
const wrapper = (_ref6) => {
|
|
246
|
+
let {
|
|
247
|
+
children
|
|
248
|
+
} = _ref6;
|
|
249
|
+
return /*#__PURE__*/_react.default.createElement(_offlineProvider.OfflineProvider, {
|
|
250
|
+
offlineInterface: testOfflineInterface
|
|
251
|
+
}, children);
|
|
252
|
+
};
|
|
253
|
+
|
|
208
254
|
const {
|
|
209
255
|
result,
|
|
210
256
|
waitFor,
|
|
211
257
|
rerender
|
|
212
|
-
} = (0, _reactHooks.renderHook)(
|
|
213
|
-
wrapper
|
|
214
|
-
children
|
|
215
|
-
}) => /*#__PURE__*/_react.default.createElement(_appServiceAlerts.AlertsProvider, null, /*#__PURE__*/_react.default.createElement(_offlineProvider.OfflineProvider, {
|
|
216
|
-
offlineInterface: testOfflineInterface
|
|
217
|
-
}, children)),
|
|
258
|
+
} = (0, _reactHooks.renderHook)(id => (0, _cacheableSection.useCacheableSection)(id), {
|
|
259
|
+
wrapper,
|
|
218
260
|
initialProps: 'id-one'
|
|
219
261
|
}); // Wait for state to sync with indexedDB
|
|
220
262
|
|
|
@@ -14,11 +14,14 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
14
14
|
|
|
15
15
|
describe('useOnlineStatusMessage', () => {
|
|
16
16
|
it('should allow the online status to be updated ', () => {
|
|
17
|
-
const wrapper = ({
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
17
|
+
const wrapper = (_ref) => {
|
|
18
|
+
let {
|
|
19
|
+
children
|
|
20
|
+
} = _ref;
|
|
21
|
+
return /*#__PURE__*/_react.default.createElement(_offlineProvider.OfflineProvider, {
|
|
22
|
+
offlineInterface: _testMocks.mockOfflineInterface
|
|
23
|
+
}, children);
|
|
24
|
+
};
|
|
22
25
|
|
|
23
26
|
const {
|
|
24
27
|
result
|
|
@@ -3,11 +3,11 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.createCacheableSectionStore = createCacheableSectionStore;
|
|
7
6
|
exports.CacheableSectionProvider = CacheableSectionProvider;
|
|
8
|
-
exports.
|
|
9
|
-
exports.useCachedSections = useCachedSections;
|
|
7
|
+
exports.createCacheableSectionStore = createCacheableSectionStore;
|
|
10
8
|
exports.useCachedSection = useCachedSection;
|
|
9
|
+
exports.useCachedSections = useCachedSections;
|
|
10
|
+
exports.useRecordingState = useRecordingState;
|
|
11
11
|
|
|
12
12
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
13
13
|
|
|
@@ -27,14 +27,17 @@ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { de
|
|
|
27
27
|
* @returns {Object} An object of sections, keyed by ID
|
|
28
28
|
*/
|
|
29
29
|
function getSectionsById(sectionsArray) {
|
|
30
|
-
return sectionsArray.reduce((result, {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
}) => ({ ...result,
|
|
34
|
-
[sectionId]: {
|
|
30
|
+
return sectionsArray.reduce((result, _ref) => {
|
|
31
|
+
let {
|
|
32
|
+
sectionId,
|
|
35
33
|
lastUpdated
|
|
36
|
-
}
|
|
37
|
-
|
|
34
|
+
} = _ref;
|
|
35
|
+
return { ...result,
|
|
36
|
+
[sectionId]: {
|
|
37
|
+
lastUpdated
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
}, {});
|
|
38
41
|
}
|
|
39
42
|
/**
|
|
40
43
|
* Create a store for Cacheable Section state.
|
|
@@ -73,9 +76,10 @@ function useConst(factory) {
|
|
|
73
76
|
*/
|
|
74
77
|
|
|
75
78
|
|
|
76
|
-
function CacheableSectionProvider({
|
|
77
|
-
|
|
78
|
-
|
|
79
|
+
function CacheableSectionProvider(_ref2) {
|
|
80
|
+
let {
|
|
81
|
+
children
|
|
82
|
+
} = _ref2;
|
|
79
83
|
const offlineInterface = (0, _offlineInterface.useOfflineInterface)();
|
|
80
84
|
const store = useConst(createCacheableSectionStore); // On load, get sections and add to store
|
|
81
85
|
|