Skip to content

Commit ad8a4ac

Browse files
committed
Added requestsPromiseMiddleware
1 parent 8621040 commit ad8a4ac

File tree

6 files changed

+129
-1
lines changed

6 files changed

+129
-1
lines changed

.gitignore

+1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
node_modules
22
yarn-error.log
3+
lerna-debug.log
34
dist
45
es
56
lib

packages/redux-saga-requests/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
"nodemon": "1.17.2",
5959
"npm-run-all": "4.1.2",
6060
"redux": "3.7.2",
61+
"redux-mock-store": "1.5.1",
6162
"redux-saga": "0.16.0",
6263
"rimraf": "2.6.2",
6364
"sinon": "4.4.5",

packages/redux-saga-requests/src/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
export { success, error, abort, getActionWithSuffix } from './actions';
22
export { createRequestsReducer, requestsReducer } from './reducers';
3-
3+
export { requestsPromiseMiddleware } from './middleware';
44
export {
55
createRequestInstance,
66
getRequestInstance,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
import { isRequestAction } from './helpers';
2+
import { success } from './actions';
3+
4+
export const requestsPromiseMiddleware = () => {
5+
const requestMap = new Map();
6+
7+
return next => action => {
8+
if (isRequestAction(action)) {
9+
return new Promise((resolve, reject) => {
10+
requestMap.set(
11+
action,
12+
(response, error) => (error ? reject(response) : resolve(response)),
13+
);
14+
15+
next(action);
16+
});
17+
}
18+
19+
if (action.meta && action.meta.requestAction) {
20+
const { requestAction } = action.meta;
21+
const requestActionPromise = requestMap.get(requestAction);
22+
requestActionPromise(action, action.type !== success(requestAction.type));
23+
requestMap.delete(requestAction);
24+
}
25+
26+
return next(action);
27+
};
28+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import configureStore from 'redux-mock-store';
2+
3+
import { success, error, abort } from './actions';
4+
import { requestsPromiseMiddleware } from './middleware';
5+
6+
const mockStore = configureStore([requestsPromiseMiddleware]);
7+
8+
describe('requestsPromiseMiddleware', () => {
9+
it('doesnt affect non request actions', () => {
10+
const action = { type: 'NOT_REQUEST' };
11+
const { dispatch, getActions } = mockStore({});
12+
const result = dispatch(action);
13+
assert.deepEqual(result, action);
14+
assert.deepEqual(getActions(), [action]);
15+
});
16+
17+
it('promisify dispatch result and passes action for request actions', () => {
18+
const action = { type: 'REQUEST', request: {} };
19+
const { dispatch, getActions } = mockStore({});
20+
const result = dispatch(action);
21+
assert.instanceOf(result, Promise);
22+
assert.deepEqual(getActions(), [action]);
23+
});
24+
25+
it('resolves request dispatch promise for successful response', async () => {
26+
const requestAction = { type: 'REQUEST', request: {} };
27+
const responseAction = {
28+
type: success('REQUEST'),
29+
meta: { requestAction },
30+
};
31+
const { dispatch, getActions } = mockStore({});
32+
const requestResultPromise = dispatch(requestAction);
33+
const responseResult = dispatch(responseAction);
34+
assert.instanceOf(requestResultPromise, Promise);
35+
assert.deepEqual(responseResult, responseAction);
36+
assert.deepEqual(getActions(), [requestAction, responseAction]);
37+
const requestResult = await requestResultPromise;
38+
assert.deepEqual(requestResult, responseAction);
39+
});
40+
41+
it('rejects request dispatch promise for error response', async () => {
42+
const requestAction = { type: 'REQUEST', request: {} };
43+
const errorAction = {
44+
type: error('REQUEST'),
45+
meta: { requestAction },
46+
};
47+
const { dispatch, getActions } = mockStore({});
48+
const requestResultPromise = dispatch(requestAction);
49+
const errorResult = dispatch(errorAction);
50+
assert.instanceOf(requestResultPromise, Promise);
51+
assert.deepEqual(errorResult, errorAction);
52+
assert.deepEqual(getActions(), [requestAction, errorAction]);
53+
54+
let requestResult;
55+
56+
try {
57+
await requestResultPromise;
58+
} catch (e) {
59+
requestResult = e;
60+
}
61+
62+
assert.deepEqual(requestResult, errorAction);
63+
});
64+
65+
it('rejects request dispatch promise for abort response', async () => {
66+
const requestAction = { type: 'REQUEST', request: {} };
67+
const abortAction = {
68+
type: abort('REQUEST'),
69+
meta: { requestAction },
70+
};
71+
const { dispatch, getActions } = mockStore({});
72+
const requestResultPromise = dispatch(requestAction);
73+
const abortResult = dispatch(abortAction);
74+
assert.instanceOf(requestResultPromise, Promise);
75+
assert.deepEqual(abortResult, abortAction);
76+
assert.deepEqual(getActions(), [requestAction, abortAction]);
77+
78+
let requestResult;
79+
80+
try {
81+
await requestResultPromise;
82+
} catch (e) {
83+
requestResult = e;
84+
}
85+
86+
assert.deepEqual(requestResult, abortAction);
87+
});
88+
});

yarn.lock

+10
Original file line numberDiff line numberDiff line change
@@ -3611,6 +3611,10 @@ lodash.isfunction@^3.0.8:
36113611
version "3.0.9"
36123612
resolved "https://registry.yarnpkg.com/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz#06de25df4db327ac931981d1bdb067e5af68d051"
36133613

3614+
lodash.isplainobject@^4.0.6:
3615+
version "4.0.6"
3616+
resolved "https://registry.yarnpkg.com/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz#7c526a52d89b45c45cc690b88163be0497f550cb"
3617+
36143618
lodash.isstring@^4.0.1:
36153619
version "4.0.1"
36163620
resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451"
@@ -4626,6 +4630,12 @@ redent@^1.0.0:
46264630
indent-string "^2.1.0"
46274631
strip-indent "^1.0.1"
46284632

4633+
4634+
version "1.5.1"
4635+
resolved "https://registry.yarnpkg.com/redux-mock-store/-/redux-mock-store-1.5.1.tgz#fca4335392e66605420b5559fe02fc5b8bb6d63c"
4636+
dependencies:
4637+
lodash.isplainobject "^4.0.6"
4638+
46294639
46304640
version "0.16.0"
46314641
resolved "https://registry.yarnpkg.com/redux-saga/-/redux-saga-0.16.0.tgz#0a231db0a1489301dd980f6f2f88d8ced418f724"

0 commit comments

Comments
 (0)