@data-client/core 0.1.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/LICENSE +201 -0
- package/README.md +71 -0
- package/dist/index.js +1643 -0
- package/dist/index.umd.min.js +1 -0
- package/dist/next.js +461 -0
- package/dist/package.json +1 -0
- package/legacy/actionTypes.js +12 -0
- package/legacy/compatibleActions.js +2 -0
- package/legacy/controller/BaseController.js +289 -0
- package/legacy/controller/Controller.js +20 -0
- package/legacy/controller/createFetch.js +42 -0
- package/legacy/controller/createInvalidate.js +12 -0
- package/legacy/controller/createInvalidateAll.js +8 -0
- package/legacy/controller/createOptimistic.js +33 -0
- package/legacy/controller/createReceive.js +36 -0
- package/legacy/controller/createReset.js +8 -0
- package/legacy/controller/createSubscription.js +30 -0
- package/legacy/controller/types.js +2 -0
- package/legacy/endpoint/index.js +2 -0
- package/legacy/endpoint/shapes.js +2 -0
- package/legacy/endpoint/types.js +2 -0
- package/legacy/fsa.js +2 -0
- package/legacy/index.js +22 -0
- package/legacy/internal.js +4 -0
- package/legacy/legacyActions.js +2 -0
- package/legacy/manager/ConnectionListener.js +2 -0
- package/legacy/manager/DefaultConnectionListener.js +40 -0
- package/legacy/manager/DevtoolsManager.js +73 -0
- package/legacy/manager/LogoutManager.js +34 -0
- package/legacy/manager/NetworkManager.js +291 -0
- package/legacy/manager/PollingSubscription.js +159 -0
- package/legacy/manager/SubscriptionManager.js +117 -0
- package/legacy/manager/applyManager.js +23 -0
- package/legacy/manager/devtoolsTypes.js +2 -0
- package/legacy/manager/index.js +6 -0
- package/legacy/middlewareTypes.js +2 -0
- package/legacy/newActions.js +2 -0
- package/legacy/next/Controller.js +24 -0
- package/legacy/next/index.js +3 -0
- package/legacy/previousActions.js +2 -0
- package/legacy/state/RIC.js +3 -0
- package/legacy/state/applyUpdatersToResults.js +4 -0
- package/legacy/state/legacy-actions/createFetch.js +62 -0
- package/legacy/state/legacy-actions/createReceive.js +37 -0
- package/legacy/state/legacy-actions/createReceiveError.js +28 -0
- package/legacy/state/legacy-actions/index.js +4 -0
- package/legacy/state/reducer/createReducer.js +54 -0
- package/legacy/state/reducer/fetchReducer.js +32 -0
- package/legacy/state/reducer/invalidateReducer.js +28 -0
- package/legacy/state/reducer/setReducer.js +113 -0
- package/legacy/state/reducerInstance.js +9 -0
- package/legacy/state/selectMeta.js +4 -0
- package/legacy/types.js +8 -0
- package/lib/actionTypes.d.ts +11 -0
- package/lib/actionTypes.d.ts.map +1 -0
- package/lib/actionTypes.js +12 -0
- package/lib/compatibleActions.d.ts +47 -0
- package/lib/compatibleActions.d.ts.map +1 -0
- package/lib/compatibleActions.js +2 -0
- package/lib/controller/BaseController.d.ts +128 -0
- package/lib/controller/BaseController.d.ts.map +1 -0
- package/lib/controller/BaseController.js +289 -0
- package/lib/controller/Controller.d.ts +14 -0
- package/lib/controller/Controller.d.ts.map +1 -0
- package/lib/controller/Controller.js +20 -0
- package/lib/controller/createFetch.d.ts +12 -0
- package/lib/controller/createFetch.d.ts.map +1 -0
- package/lib/controller/createFetch.js +42 -0
- package/lib/controller/createInvalidate.d.ts +6 -0
- package/lib/controller/createInvalidate.d.ts.map +1 -0
- package/lib/controller/createInvalidate.js +12 -0
- package/lib/controller/createInvalidateAll.d.ts +3 -0
- package/lib/controller/createInvalidateAll.d.ts.map +1 -0
- package/lib/controller/createInvalidateAll.js +8 -0
- package/lib/controller/createOptimistic.d.ts +10 -0
- package/lib/controller/createOptimistic.d.ts.map +1 -0
- package/lib/controller/createOptimistic.js +33 -0
- package/lib/controller/createReceive.d.ts +20 -0
- package/lib/controller/createReceive.d.ts.map +1 -0
- package/lib/controller/createReceive.js +36 -0
- package/lib/controller/createReset.d.ts +3 -0
- package/lib/controller/createReset.d.ts.map +1 -0
- package/lib/controller/createReset.js +8 -0
- package/lib/controller/createSubscription.d.ts +9 -0
- package/lib/controller/createSubscription.d.ts.map +1 -0
- package/lib/controller/createSubscription.js +30 -0
- package/lib/controller/types.d.ts +6 -0
- package/lib/controller/types.d.ts.map +1 -0
- package/lib/controller/types.js +2 -0
- package/lib/endpoint/index.d.ts +3 -0
- package/lib/endpoint/index.d.ts.map +1 -0
- package/lib/endpoint/index.js +2 -0
- package/lib/endpoint/shapes.d.ts +25 -0
- package/lib/endpoint/shapes.d.ts.map +1 -0
- package/lib/endpoint/shapes.js +2 -0
- package/lib/endpoint/types.d.ts +45 -0
- package/lib/endpoint/types.d.ts.map +1 -0
- package/lib/endpoint/types.js +2 -0
- package/lib/fsa.d.ts +41 -0
- package/lib/fsa.d.ts.map +1 -0
- package/lib/fsa.js +2 -0
- package/lib/index.d.ts +19 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +22 -0
- package/lib/internal.d.ts +4 -0
- package/lib/internal.d.ts.map +1 -0
- package/lib/internal.js +4 -0
- package/lib/legacyActions.d.ts +92 -0
- package/lib/legacyActions.d.ts.map +1 -0
- package/lib/legacyActions.js +2 -0
- package/lib/manager/ConnectionListener.d.ts +8 -0
- package/lib/manager/ConnectionListener.d.ts.map +1 -0
- package/lib/manager/ConnectionListener.js +2 -0
- package/lib/manager/DefaultConnectionListener.d.ts +20 -0
- package/lib/manager/DefaultConnectionListener.d.ts.map +1 -0
- package/lib/manager/DefaultConnectionListener.js +40 -0
- package/lib/manager/DevtoolsManager.d.ts +24 -0
- package/lib/manager/DevtoolsManager.d.ts.map +1 -0
- package/lib/manager/DevtoolsManager.js +74 -0
- package/lib/manager/LogoutManager.d.ts +25 -0
- package/lib/manager/LogoutManager.d.ts.map +1 -0
- package/lib/manager/LogoutManager.js +34 -0
- package/lib/manager/NetworkManager.d.ts +82 -0
- package/lib/manager/NetworkManager.d.ts.map +1 -0
- package/lib/manager/NetworkManager.js +295 -0
- package/lib/manager/PollingSubscription.d.ts +45 -0
- package/lib/manager/PollingSubscription.d.ts.map +1 -0
- package/lib/manager/PollingSubscription.js +159 -0
- package/lib/manager/SubscriptionManager.d.ts +55 -0
- package/lib/manager/SubscriptionManager.d.ts.map +1 -0
- package/lib/manager/SubscriptionManager.js +117 -0
- package/lib/manager/applyManager.d.ts +10 -0
- package/lib/manager/applyManager.d.ts.map +1 -0
- package/lib/manager/applyManager.js +23 -0
- package/lib/manager/devtoolsTypes.d.ts +205 -0
- package/lib/manager/devtoolsTypes.d.ts.map +1 -0
- package/lib/manager/devtoolsTypes.js +2 -0
- package/lib/manager/index.d.ts +8 -0
- package/lib/manager/index.d.ts.map +1 -0
- package/lib/manager/index.js +6 -0
- package/lib/middlewareTypes.d.ts +18 -0
- package/lib/middlewareTypes.d.ts.map +1 -0
- package/lib/middlewareTypes.js +2 -0
- package/lib/newActions.d.ts +85 -0
- package/lib/newActions.d.ts.map +1 -0
- package/lib/newActions.js +2 -0
- package/lib/next/Controller.d.ts +14 -0
- package/lib/next/Controller.d.ts.map +1 -0
- package/lib/next/Controller.js +24 -0
- package/lib/next/index.d.ts +3 -0
- package/lib/next/index.d.ts.map +1 -0
- package/lib/next/index.js +3 -0
- package/lib/previousActions.d.ts +91 -0
- package/lib/previousActions.d.ts.map +1 -0
- package/lib/previousActions.js +2 -0
- package/lib/state/RIC.d.ts +2 -0
- package/lib/state/RIC.js +3 -0
- package/lib/state/applyUpdatersToResults.d.ts +13 -0
- package/lib/state/applyUpdatersToResults.d.ts.map +1 -0
- package/lib/state/applyUpdatersToResults.js +7 -0
- package/lib/state/legacy-actions/createFetch.d.ts +19 -0
- package/lib/state/legacy-actions/createFetch.d.ts.map +1 -0
- package/lib/state/legacy-actions/createFetch.js +62 -0
- package/lib/state/legacy-actions/createReceive.d.ts +14 -0
- package/lib/state/legacy-actions/createReceive.d.ts.map +1 -0
- package/lib/state/legacy-actions/createReceive.js +37 -0
- package/lib/state/legacy-actions/createReceiveError.d.ts +9 -0
- package/lib/state/legacy-actions/createReceiveError.d.ts.map +1 -0
- package/lib/state/legacy-actions/createReceiveError.js +28 -0
- package/lib/state/legacy-actions/index.d.ts +4 -0
- package/lib/state/legacy-actions/index.d.ts.map +1 -0
- package/lib/state/legacy-actions/index.js +4 -0
- package/lib/state/reducer/createReducer.d.ts +7 -0
- package/lib/state/reducer/createReducer.d.ts.map +1 -0
- package/lib/state/reducer/createReducer.js +55 -0
- package/lib/state/reducer/fetchReducer.d.ts +4 -0
- package/lib/state/reducer/fetchReducer.d.ts.map +1 -0
- package/lib/state/reducer/fetchReducer.js +34 -0
- package/lib/state/reducer/invalidateReducer.d.ts +37 -0
- package/lib/state/reducer/invalidateReducer.d.ts.map +1 -0
- package/lib/state/reducer/invalidateReducer.js +34 -0
- package/lib/state/reducer/setReducer.d.ts +40 -0
- package/lib/state/reducer/setReducer.d.ts.map +1 -0
- package/lib/state/reducer/setReducer.js +119 -0
- package/lib/state/reducerInstance.d.ts +7 -0
- package/lib/state/reducerInstance.d.ts.map +1 -0
- package/lib/state/reducerInstance.js +9 -0
- package/lib/state/selectMeta.d.ts +3 -0
- package/lib/state/selectMeta.d.ts.map +1 -0
- package/lib/state/selectMeta.js +4 -0
- package/lib/types.d.ts +71 -0
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +8 -0
- package/node.mjs +1 -0
- package/package.json +127 -0
- package/src/actionTypes.ts +11 -0
- package/src/compatibleActions.ts +96 -0
- package/src/controller/BaseController.ts +508 -0
- package/src/controller/Controller.ts +32 -0
- package/src/controller/__tests__/Controller.ts +29 -0
- package/src/controller/__tests__/__snapshots__/getResponse.ts.snap +35 -0
- package/src/controller/__tests__/getResponse.ts +182 -0
- package/src/controller/createFetch.ts +54 -0
- package/src/controller/createInvalidate.ts +16 -0
- package/src/controller/createInvalidateAll.ts +11 -0
- package/src/controller/createOptimistic.ts +47 -0
- package/src/controller/createReceive.ts +85 -0
- package/src/controller/createReset.ts +9 -0
- package/src/controller/createSubscription.ts +39 -0
- package/src/controller/types.ts +22 -0
- package/src/endpoint/index.ts +14 -0
- package/src/endpoint/shapes.ts +53 -0
- package/src/endpoint/types.ts +72 -0
- package/src/fsa.ts +99 -0
- package/src/index.ts +61 -0
- package/src/internal.ts +3 -0
- package/src/legacyActions.ts +163 -0
- package/src/manager/ConnectionListener.ts +7 -0
- package/src/manager/DefaultConnectionListener.ts +54 -0
- package/src/manager/DevtoolsManager.ts +99 -0
- package/src/manager/LogoutManager.ts +57 -0
- package/src/manager/NetworkManager.ts +346 -0
- package/src/manager/PollingSubscription.ts +190 -0
- package/src/manager/SubscriptionManager.ts +156 -0
- package/src/manager/__tests__/__snapshots__/pollingSubscription-endpoint.ts.snap +49 -0
- package/src/manager/__tests__/__snapshots__/pollingSubscription.ts.snap +43 -0
- package/src/manager/__tests__/logoutManager.ts +112 -0
- package/src/manager/__tests__/manager.ts +44 -0
- package/src/manager/__tests__/networkManager-legacy.ts +394 -0
- package/src/manager/__tests__/networkManager.ts +426 -0
- package/src/manager/__tests__/pollingSubscription-endpoint.ts +423 -0
- package/src/manager/__tests__/pollingSubscription.ts +313 -0
- package/src/manager/__tests__/subscriptionManager.ts +208 -0
- package/src/manager/applyManager.ts +33 -0
- package/src/manager/devtoolsTypes.ts +210 -0
- package/src/manager/index.ts +7 -0
- package/src/middlewareTypes.ts +49 -0
- package/src/newActions.ts +140 -0
- package/src/next/Controller.ts +39 -0
- package/src/next/index.ts +2 -0
- package/src/package.json +1 -0
- package/src/previousActions.ts +159 -0
- package/src/state/RIC.d.ts +2 -0
- package/src/state/RIC.js +5 -0
- package/src/state/__tests__/RIC.web.ts +16 -0
- package/src/state/__tests__/__snapshots__/reducer.ts.snap +56 -0
- package/src/state/__tests__/applyUpdatersToResults.ts +40 -0
- package/src/state/__tests__/reducer.ts +868 -0
- package/src/state/applyUpdatersToResults.ts +29 -0
- package/src/state/legacy-actions/createFetch.ts +95 -0
- package/src/state/legacy-actions/createReceive.ts +68 -0
- package/src/state/legacy-actions/createReceiveError.ts +43 -0
- package/src/state/legacy-actions/index.ts +3 -0
- package/src/state/reducer/createReducer.ts +80 -0
- package/src/state/reducer/fetchReducer.ts +48 -0
- package/src/state/reducer/invalidateReducer.ts +39 -0
- package/src/state/reducer/setReducer.ts +157 -0
- package/src/state/reducerInstance.ts +14 -0
- package/src/state/selectMeta.ts +8 -0
- package/src/types.ts +125 -0
- package/ts3.4/actionTypes.d.ts +11 -0
- package/ts3.4/compatibleActions.d.ts +47 -0
- package/ts3.4/controller/BaseController.d.ts +170 -0
- package/ts3.4/controller/Controller.d.ts +14 -0
- package/ts3.4/controller/createFetch.d.ts +14 -0
- package/ts3.4/controller/createInvalidate.d.ts +8 -0
- package/ts3.4/controller/createInvalidateAll.d.ts +3 -0
- package/ts3.4/controller/createOptimistic.d.ts +12 -0
- package/ts3.4/controller/createReceive.d.ts +24 -0
- package/ts3.4/controller/createReset.d.ts +3 -0
- package/ts3.4/controller/createSubscription.d.ts +13 -0
- package/ts3.4/controller/types.d.ts +6 -0
- package/ts3.4/endpoint/index.d.ts +3 -0
- package/ts3.4/endpoint/shapes.d.ts +25 -0
- package/ts3.4/endpoint/types.d.ts +45 -0
- package/ts3.4/fsa.d.ts +41 -0
- package/ts3.4/index.d.ts +22 -0
- package/ts3.4/internal.d.ts +4 -0
- package/ts3.4/legacyActions.d.ts +95 -0
- package/ts3.4/manager/ConnectionListener.d.ts +8 -0
- package/ts3.4/manager/DefaultConnectionListener.d.ts +20 -0
- package/ts3.4/manager/DevtoolsManager.d.ts +24 -0
- package/ts3.4/manager/LogoutManager.d.ts +25 -0
- package/ts3.4/manager/NetworkManager.d.ts +82 -0
- package/ts3.4/manager/PollingSubscription.d.ts +45 -0
- package/ts3.4/manager/SubscriptionManager.d.ts +55 -0
- package/ts3.4/manager/applyManager.d.ts +10 -0
- package/ts3.4/manager/devtoolsTypes.d.ts +205 -0
- package/ts3.4/manager/index.d.ts +8 -0
- package/ts3.4/middlewareTypes.d.ts +18 -0
- package/ts3.4/newActions.d.ts +88 -0
- package/ts3.4/next/Controller.d.ts +14 -0
- package/ts3.4/next/index.d.ts +3 -0
- package/ts3.4/previousActions.d.ts +94 -0
- package/ts3.4/state/RIC.d.ts +2 -0
- package/ts3.4/state/applyUpdatersToResults.d.ts +13 -0
- package/ts3.4/state/legacy-actions/createFetch.d.ts +19 -0
- package/ts3.4/state/legacy-actions/createReceive.d.ts +14 -0
- package/ts3.4/state/legacy-actions/createReceiveError.d.ts +9 -0
- package/ts3.4/state/legacy-actions/index.d.ts +4 -0
- package/ts3.4/state/reducer/createReducer.d.ts +7 -0
- package/ts3.4/state/reducer/fetchReducer.d.ts +4 -0
- package/ts3.4/state/reducer/invalidateReducer.d.ts +37 -0
- package/ts3.4/state/reducer/setReducer.d.ts +40 -0
- package/ts3.4/state/reducerInstance.d.ts +7 -0
- package/ts3.4/state/selectMeta.d.ts +3 -0
- package/ts3.4/types.d.ts +73 -0
- package/typescript.svg +8 -0
|
@@ -0,0 +1,426 @@
|
|
|
1
|
+
import { Endpoint } from '@data-client/endpoint';
|
|
2
|
+
import { Article, ArticleResource } from '__tests__/new';
|
|
3
|
+
|
|
4
|
+
import { RECEIVE_TYPE } from '../../actionTypes';
|
|
5
|
+
import Controller from '../../controller/Controller';
|
|
6
|
+
import createFetch from '../../controller/createFetch';
|
|
7
|
+
import NetworkManager from '../../manager/NetworkManager';
|
|
8
|
+
import { initialState } from '../../state/reducer/createReducer';
|
|
9
|
+
import { Middleware } from '../../types';
|
|
10
|
+
|
|
11
|
+
describe('NetworkManager', () => {
|
|
12
|
+
const manager = new NetworkManager();
|
|
13
|
+
const getState = () => initialState;
|
|
14
|
+
|
|
15
|
+
afterAll(() => {
|
|
16
|
+
manager.cleanup();
|
|
17
|
+
});
|
|
18
|
+
let errorspy: jest.SpyInstance;
|
|
19
|
+
beforeEach(() => {
|
|
20
|
+
errorspy = jest.spyOn(global.console, 'error');
|
|
21
|
+
});
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
errorspy.mockRestore();
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it('getState() should have initialState before middleware run', () => {
|
|
27
|
+
class Hacked extends NetworkManager {
|
|
28
|
+
getHacked() {
|
|
29
|
+
return this.getState();
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
const hacked = new Hacked();
|
|
33
|
+
expect(hacked.getHacked()).toEqual(initialState);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe('getMiddleware()', () => {
|
|
37
|
+
it('should return the same value every call', () => {
|
|
38
|
+
const a = manager.getMiddleware();
|
|
39
|
+
expect(a).toBe(manager.getMiddleware());
|
|
40
|
+
expect(a).toBe(manager.getMiddleware());
|
|
41
|
+
});
|
|
42
|
+
it('should return the different value for a different instance', () => {
|
|
43
|
+
const a = manager.getMiddleware();
|
|
44
|
+
const manager2 = new NetworkManager();
|
|
45
|
+
const a2 = manager2.getMiddleware();
|
|
46
|
+
expect(a).not.toBe(a2);
|
|
47
|
+
expect(a2).toBe(manager2.getMiddleware());
|
|
48
|
+
manager2.cleanup();
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
describe('middleware', () => {
|
|
53
|
+
const detailEndpoint = new Endpoint(
|
|
54
|
+
(v: { id: number }) => Promise.resolve({ id: 5, title: 'hi' }),
|
|
55
|
+
{
|
|
56
|
+
schema: Article,
|
|
57
|
+
},
|
|
58
|
+
);
|
|
59
|
+
const fetchResolveAction = createFetch(detailEndpoint, {
|
|
60
|
+
args: [{ id: 5 }],
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
const detailWithUpdaterEndpoint = detailEndpoint.extend({
|
|
64
|
+
update(id: string, v: { id: number }) {
|
|
65
|
+
const updates = {
|
|
66
|
+
[ArticleResource.getList.key({})]: (oldResults = []) => [
|
|
67
|
+
...(oldResults || []),
|
|
68
|
+
id,
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
return updates;
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
const fetchReceiveWithUpdatersAction = createFetch(
|
|
75
|
+
detailWithUpdaterEndpoint,
|
|
76
|
+
{
|
|
77
|
+
args: [{ id: 5 }],
|
|
78
|
+
},
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
const updateShape = new Endpoint(
|
|
82
|
+
(params: any, body: any) => Promise.resolve(body),
|
|
83
|
+
{
|
|
84
|
+
schema: Article,
|
|
85
|
+
sideEffect: true,
|
|
86
|
+
key: ArticleResource.update.key.bind(ArticleResource.partialUpdate),
|
|
87
|
+
update(id: string, params: any, body: any) {
|
|
88
|
+
const updates = {
|
|
89
|
+
[ArticleResource.getList.key({})]: (oldResults = []) => [
|
|
90
|
+
...(oldResults || []),
|
|
91
|
+
id,
|
|
92
|
+
],
|
|
93
|
+
};
|
|
94
|
+
return updates;
|
|
95
|
+
},
|
|
96
|
+
},
|
|
97
|
+
);
|
|
98
|
+
const fetchRpcWithUpdatersAction = createFetch(updateShape, {
|
|
99
|
+
args: [{ id: 5 }, { id: 5, title: 'hi' }],
|
|
100
|
+
});
|
|
101
|
+
const partialUpdateShape = new Endpoint(
|
|
102
|
+
(params, body) => Promise.resolve(body),
|
|
103
|
+
{
|
|
104
|
+
getOptimisticResponse:
|
|
105
|
+
ArticleResource.partialUpdate.getOptimisticResponse,
|
|
106
|
+
schema: Article,
|
|
107
|
+
key: ArticleResource.partialUpdate.key.bind(
|
|
108
|
+
ArticleResource.partialUpdate,
|
|
109
|
+
),
|
|
110
|
+
sideEffect: true,
|
|
111
|
+
update(id: string, params: any, body: any) {
|
|
112
|
+
const updates = {
|
|
113
|
+
[ArticleResource.getList.key({})]: (oldResults = []) => [
|
|
114
|
+
...(oldResults || []),
|
|
115
|
+
id,
|
|
116
|
+
],
|
|
117
|
+
};
|
|
118
|
+
return updates;
|
|
119
|
+
},
|
|
120
|
+
},
|
|
121
|
+
);
|
|
122
|
+
const fetchRpcWithUpdatersAndOptimisticAction = createFetch(
|
|
123
|
+
partialUpdateShape,
|
|
124
|
+
{
|
|
125
|
+
args: [{ id: 5 }, { id: 5, title: 'hi' }],
|
|
126
|
+
},
|
|
127
|
+
);
|
|
128
|
+
|
|
129
|
+
const errorUpdateShape = ArticleResource.update;
|
|
130
|
+
errorUpdateShape.fetch = () => Promise.reject(new Error('Failed'));
|
|
131
|
+
const fetchRejectAction = createFetch(errorUpdateShape, {
|
|
132
|
+
args: [{ id: 5 }, { id: 5, title: 'hi' }],
|
|
133
|
+
});
|
|
134
|
+
(fetchRejectAction.meta.promise as any).catch((e: unknown) => {});
|
|
135
|
+
|
|
136
|
+
let NM: NetworkManager;
|
|
137
|
+
let middleware: Middleware;
|
|
138
|
+
beforeEach(() => {
|
|
139
|
+
NM = new NetworkManager(42, 7);
|
|
140
|
+
middleware = NM.getMiddleware();
|
|
141
|
+
});
|
|
142
|
+
afterEach(() => {
|
|
143
|
+
NM.cleanup();
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it('should handle fetch actions and dispatch on success', async () => {
|
|
147
|
+
const next = jest.fn();
|
|
148
|
+
const dispatch = jest.fn();
|
|
149
|
+
const controller = new Controller({ dispatch, getState });
|
|
150
|
+
const API: Controller & { controller: Controller } = Object.create(
|
|
151
|
+
controller,
|
|
152
|
+
{
|
|
153
|
+
controller: { value: controller },
|
|
154
|
+
},
|
|
155
|
+
);
|
|
156
|
+
|
|
157
|
+
middleware(API)(next)(fetchResolveAction);
|
|
158
|
+
|
|
159
|
+
const data = await fetchResolveAction.payload();
|
|
160
|
+
|
|
161
|
+
// mutations resolve before dispatch, so we must wait for next tick to see receive
|
|
162
|
+
await new Promise(resolve => setTimeout(resolve, 0));
|
|
163
|
+
|
|
164
|
+
const action = {
|
|
165
|
+
type: RECEIVE_TYPE,
|
|
166
|
+
endpoint: fetchResolveAction.endpoint,
|
|
167
|
+
payload: data,
|
|
168
|
+
meta: {
|
|
169
|
+
schema: fetchResolveAction.meta.schema,
|
|
170
|
+
args: fetchResolveAction.meta.args,
|
|
171
|
+
update: fetchResolveAction.meta.update,
|
|
172
|
+
key: fetchResolveAction.meta.key,
|
|
173
|
+
date: expect.any(Number),
|
|
174
|
+
expiresAt: expect.any(Number),
|
|
175
|
+
fetchedAt: expect.any(Number),
|
|
176
|
+
},
|
|
177
|
+
};
|
|
178
|
+
expect(dispatch).toHaveBeenCalledWith(action);
|
|
179
|
+
expect(next).not.toHaveBeenCalledWith(action);
|
|
180
|
+
});
|
|
181
|
+
it('should handle fetch receive action and dispatch on success with updaters', async () => {
|
|
182
|
+
const next = jest.fn();
|
|
183
|
+
const dispatch = jest.fn();
|
|
184
|
+
const controller = new Controller({ dispatch, getState });
|
|
185
|
+
const API: Controller & { controller: Controller } = Object.create(
|
|
186
|
+
controller,
|
|
187
|
+
{
|
|
188
|
+
controller: { value: controller },
|
|
189
|
+
},
|
|
190
|
+
);
|
|
191
|
+
|
|
192
|
+
middleware(API)(next)(fetchReceiveWithUpdatersAction);
|
|
193
|
+
|
|
194
|
+
const data = await fetchReceiveWithUpdatersAction.payload();
|
|
195
|
+
|
|
196
|
+
// mutations resolve before dispatch, so we must wait for next tick to see receive
|
|
197
|
+
await new Promise(resolve => setTimeout(resolve, 0));
|
|
198
|
+
|
|
199
|
+
const action = {
|
|
200
|
+
type: RECEIVE_TYPE,
|
|
201
|
+
endpoint: fetchReceiveWithUpdatersAction.endpoint,
|
|
202
|
+
payload: data,
|
|
203
|
+
meta: {
|
|
204
|
+
update: expect.any(Function),
|
|
205
|
+
args: fetchReceiveWithUpdatersAction.meta.args,
|
|
206
|
+
schema: fetchReceiveWithUpdatersAction.meta.schema,
|
|
207
|
+
key: fetchReceiveWithUpdatersAction.meta.key,
|
|
208
|
+
date: expect.any(Number),
|
|
209
|
+
expiresAt: expect.any(Number),
|
|
210
|
+
fetchedAt: expect.any(Number),
|
|
211
|
+
},
|
|
212
|
+
};
|
|
213
|
+
expect(dispatch).toHaveBeenCalledWith(action);
|
|
214
|
+
expect(next).not.toHaveBeenCalledWith(action);
|
|
215
|
+
});
|
|
216
|
+
it('should handle fetch rpc action and dispatch on success with updaters', async () => {
|
|
217
|
+
const next = jest.fn();
|
|
218
|
+
const dispatch = jest.fn();
|
|
219
|
+
const controller = new Controller({ dispatch, getState });
|
|
220
|
+
const API: Controller & { controller: Controller } = Object.create(
|
|
221
|
+
controller,
|
|
222
|
+
{
|
|
223
|
+
controller: { value: controller },
|
|
224
|
+
},
|
|
225
|
+
);
|
|
226
|
+
|
|
227
|
+
middleware(API)(next)(fetchRpcWithUpdatersAction);
|
|
228
|
+
|
|
229
|
+
const data = await fetchRpcWithUpdatersAction.payload();
|
|
230
|
+
|
|
231
|
+
// mutations resolve before dispatch, so we must wait for next tick to see receive
|
|
232
|
+
await new Promise(resolve => setTimeout(resolve, 0));
|
|
233
|
+
|
|
234
|
+
const action = {
|
|
235
|
+
type: RECEIVE_TYPE,
|
|
236
|
+
endpoint: fetchRpcWithUpdatersAction.endpoint,
|
|
237
|
+
payload: data,
|
|
238
|
+
meta: {
|
|
239
|
+
args: fetchRpcWithUpdatersAction.meta.args,
|
|
240
|
+
update: expect.any(Function),
|
|
241
|
+
schema: fetchRpcWithUpdatersAction.meta.schema,
|
|
242
|
+
key: fetchRpcWithUpdatersAction.meta.key,
|
|
243
|
+
date: expect.any(Number),
|
|
244
|
+
expiresAt: expect.any(Number),
|
|
245
|
+
fetchedAt: expect.any(Number),
|
|
246
|
+
},
|
|
247
|
+
};
|
|
248
|
+
expect(dispatch).toHaveBeenCalledWith(action);
|
|
249
|
+
expect(next).not.toHaveBeenCalledWith(action);
|
|
250
|
+
});
|
|
251
|
+
it('should handle fetch rpc action with optimistic response and dispatch on success with updaters', async () => {
|
|
252
|
+
const next = jest.fn();
|
|
253
|
+
const dispatch = jest.fn();
|
|
254
|
+
const controller = new Controller({ dispatch, getState });
|
|
255
|
+
const API: Controller & { controller: Controller } = Object.create(
|
|
256
|
+
controller,
|
|
257
|
+
{
|
|
258
|
+
controller: { value: controller },
|
|
259
|
+
},
|
|
260
|
+
);
|
|
261
|
+
|
|
262
|
+
middleware(API)(next)(fetchRpcWithUpdatersAndOptimisticAction);
|
|
263
|
+
|
|
264
|
+
const data = await fetchRpcWithUpdatersAndOptimisticAction.payload();
|
|
265
|
+
|
|
266
|
+
expect(next).toHaveBeenCalled();
|
|
267
|
+
// mutations resolve before dispatch, so we must wait for next tick to see receive
|
|
268
|
+
await new Promise(resolve => setTimeout(resolve, 0));
|
|
269
|
+
expect(dispatch).toHaveBeenCalledWith({
|
|
270
|
+
type: RECEIVE_TYPE,
|
|
271
|
+
endpoint: fetchRpcWithUpdatersAndOptimisticAction.endpoint,
|
|
272
|
+
payload: data,
|
|
273
|
+
meta: {
|
|
274
|
+
args: fetchRpcWithUpdatersAndOptimisticAction.meta.args,
|
|
275
|
+
update: expect.any(Function),
|
|
276
|
+
schema: fetchRpcWithUpdatersAndOptimisticAction.meta.schema,
|
|
277
|
+
key: fetchRpcWithUpdatersAndOptimisticAction.meta.key,
|
|
278
|
+
date: expect.any(Number),
|
|
279
|
+
expiresAt: expect.any(Number),
|
|
280
|
+
fetchedAt: expect.any(Number),
|
|
281
|
+
},
|
|
282
|
+
});
|
|
283
|
+
});
|
|
284
|
+
it('should use dataExpireLength from action if specified', async () => {
|
|
285
|
+
const dispatch = jest.fn();
|
|
286
|
+
const controller = new Controller({ dispatch, getState });
|
|
287
|
+
const API: Controller & { controller: Controller } = Object.create(
|
|
288
|
+
controller,
|
|
289
|
+
{
|
|
290
|
+
controller: { value: controller },
|
|
291
|
+
},
|
|
292
|
+
);
|
|
293
|
+
|
|
294
|
+
middleware(API)(() => Promise.resolve())({
|
|
295
|
+
...fetchResolveAction,
|
|
296
|
+
endpoint: detailEndpoint.extend({ dataExpiryLength: 314 }),
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
await fetchResolveAction.payload();
|
|
300
|
+
|
|
301
|
+
expect(dispatch).toHaveBeenCalled();
|
|
302
|
+
const { meta } = dispatch.mock.calls[0][0];
|
|
303
|
+
expect(meta.expiresAt - meta.date).toBe(314);
|
|
304
|
+
});
|
|
305
|
+
it('should use dataExpireLength from NetworkManager if not specified in action', async () => {
|
|
306
|
+
const dispatch = jest.fn();
|
|
307
|
+
const controller = new Controller({ dispatch, getState });
|
|
308
|
+
const API: Controller & { controller: Controller } = Object.create(
|
|
309
|
+
controller,
|
|
310
|
+
{
|
|
311
|
+
controller: { value: controller },
|
|
312
|
+
},
|
|
313
|
+
);
|
|
314
|
+
|
|
315
|
+
middleware(API)(() => Promise.resolve())({
|
|
316
|
+
...fetchResolveAction,
|
|
317
|
+
endpoint: detailEndpoint.extend({ dataExpiryLength: undefined }),
|
|
318
|
+
});
|
|
319
|
+
|
|
320
|
+
await fetchResolveAction.payload();
|
|
321
|
+
|
|
322
|
+
expect(dispatch).toHaveBeenCalled();
|
|
323
|
+
const { meta } = dispatch.mock.calls[0][0];
|
|
324
|
+
expect(meta.expiresAt - meta.date).toBe(60000);
|
|
325
|
+
});
|
|
326
|
+
it('should handle fetch actions and dispatch on error', async () => {
|
|
327
|
+
const next = jest.fn();
|
|
328
|
+
const dispatch = jest.fn();
|
|
329
|
+
const controller = new Controller({ dispatch, getState });
|
|
330
|
+
const API: Controller & { controller: Controller } = Object.create(
|
|
331
|
+
controller,
|
|
332
|
+
{
|
|
333
|
+
controller: { value: controller },
|
|
334
|
+
},
|
|
335
|
+
);
|
|
336
|
+
|
|
337
|
+
try {
|
|
338
|
+
await middleware(API)(next)(fetchRejectAction);
|
|
339
|
+
} catch (error) {
|
|
340
|
+
expect(next).not.toHaveBeenCalled();
|
|
341
|
+
expect(dispatch).toHaveBeenCalledWith({
|
|
342
|
+
type: RECEIVE_TYPE,
|
|
343
|
+
payload: error,
|
|
344
|
+
meta: {
|
|
345
|
+
schema: fetchRejectAction.meta.schema,
|
|
346
|
+
key: fetchRejectAction.meta.key,
|
|
347
|
+
date: expect.any(Number),
|
|
348
|
+
expiresAt: expect.any(Number),
|
|
349
|
+
},
|
|
350
|
+
error: true,
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
});
|
|
354
|
+
it('should use errorExpireLength from action if specified', async () => {
|
|
355
|
+
const dispatch = jest.fn();
|
|
356
|
+
const controller = new Controller({ dispatch, getState });
|
|
357
|
+
const API: Controller & { controller: Controller } = Object.create(
|
|
358
|
+
controller,
|
|
359
|
+
{
|
|
360
|
+
controller: { value: controller },
|
|
361
|
+
},
|
|
362
|
+
);
|
|
363
|
+
|
|
364
|
+
try {
|
|
365
|
+
await middleware(API)(() => Promise.resolve())({
|
|
366
|
+
...fetchRejectAction,
|
|
367
|
+
meta: {
|
|
368
|
+
...fetchRejectAction.meta,
|
|
369
|
+
options: { errorExpiryLength: 1234 },
|
|
370
|
+
},
|
|
371
|
+
});
|
|
372
|
+
} catch (error) {
|
|
373
|
+
expect(dispatch).toHaveBeenCalled();
|
|
374
|
+
const { meta } = dispatch.mock.calls[0][0];
|
|
375
|
+
expect(meta.expiresAt - meta.date).toBe(1234);
|
|
376
|
+
}
|
|
377
|
+
});
|
|
378
|
+
it('should use errorExpireLength from NetworkManager if not specified in action', async () => {
|
|
379
|
+
const dispatch = jest.fn();
|
|
380
|
+
const controller = new Controller({ dispatch, getState });
|
|
381
|
+
const API: Controller & { controller: Controller } = Object.create(
|
|
382
|
+
controller,
|
|
383
|
+
{
|
|
384
|
+
controller: { value: controller },
|
|
385
|
+
},
|
|
386
|
+
);
|
|
387
|
+
|
|
388
|
+
try {
|
|
389
|
+
await middleware(API)(() => Promise.resolve())({
|
|
390
|
+
...fetchRejectAction,
|
|
391
|
+
meta: {
|
|
392
|
+
...fetchRejectAction.meta,
|
|
393
|
+
options: {
|
|
394
|
+
...fetchRejectAction.meta.options,
|
|
395
|
+
errorExpiryLength: undefined,
|
|
396
|
+
},
|
|
397
|
+
},
|
|
398
|
+
});
|
|
399
|
+
} catch (error) {
|
|
400
|
+
expect(dispatch).toHaveBeenCalled();
|
|
401
|
+
const { meta } = dispatch.mock.calls[0][0];
|
|
402
|
+
expect(meta.expiresAt - meta.date).toBe(7);
|
|
403
|
+
}
|
|
404
|
+
});
|
|
405
|
+
|
|
406
|
+
it('getLastReset() should handle Date object', async () => {
|
|
407
|
+
const mgr = new NetworkManager();
|
|
408
|
+
jest.spyOn(mgr, 'getState' as any).mockImplementation((): any => ({
|
|
409
|
+
...initialState,
|
|
410
|
+
lastReset: new Date(0),
|
|
411
|
+
}));
|
|
412
|
+
|
|
413
|
+
expect((mgr as any).getLastReset()).toBeLessThan(Date.now());
|
|
414
|
+
});
|
|
415
|
+
|
|
416
|
+
it('getLastReset() should handle null', async () => {
|
|
417
|
+
const mgr = new NetworkManager();
|
|
418
|
+
jest.spyOn(mgr, 'getState' as any).mockImplementation((): any => ({
|
|
419
|
+
...initialState,
|
|
420
|
+
lastReset: null,
|
|
421
|
+
}));
|
|
422
|
+
|
|
423
|
+
expect((mgr as any).getLastReset()).toBeLessThan(Date.now());
|
|
424
|
+
});
|
|
425
|
+
});
|
|
426
|
+
});
|