Skip to content

Commit

Permalink
fix(reduxHelpers,middleware): issues/260 expose error data
Browse files Browse the repository at this point in the history
* reduxHelpers, expose error data correctly, expand test checks
* statusMiddleware, payload restructure, add data to dispatch
* userReducer, reduxHelper http status check
  • Loading branch information
cdcabrera committed May 19, 2020
1 parent 0775154 commit 063beb9
Show file tree
Hide file tree
Showing 5 changed files with 90 additions and 14 deletions.
13 changes: 13 additions & 0 deletions src/redux/common/__tests__/__snapshots__/reduxHelpers.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,14 @@ exports[`ReduxHelpers should get a date from a service call response: ARRAY date

exports[`ReduxHelpers should get a date from a service call response: date 1`] = `"Fri, 07 Feb 2020 10:46:53 GMT"`;

exports[`ReduxHelpers should get a date from a service call response: error response date 1`] = `"Tue, 11 Feb 2020 15:27:16 GMT"`;

exports[`ReduxHelpers should get a http status from a service call response: ARRAY mismatched status 1`] = `400`;

exports[`ReduxHelpers should get a http status from a service call response: ARRAY status 1`] = `200`;

exports[`ReduxHelpers should get a http status from a service call response: error response status 1`] = `403`;

exports[`ReduxHelpers should get a http status from a service call response: fallback status 1`] = `200`;

exports[`ReduxHelpers should get a http status from a service call response: missing status 1`] = `0`;
Expand All @@ -155,6 +159,8 @@ exports[`ReduxHelpers should get a message from a service call response: respons

exports[`ReduxHelpers should get a message from a service call response: response for 4XX 1`] = `"Request failed with status code 400"`;

exports[`ReduxHelpers should get a message from a service call response: response payload for 4XX 1`] = `"Request failed with status code 403"`;

exports[`ReduxHelpers should get data from a service call response: ARRAY data 1`] = `
Array [
Object {
Expand Down Expand Up @@ -185,6 +191,13 @@ Array [
]
`;

exports[`ReduxHelpers should get data from a service call response: error response data 1`] = `
Object {
"dolor": "sit",
"lorem": "ipsum",
}
`;

exports[`ReduxHelpers should have specific functions: reduxHelpers 1`] = `
Object {
"FULFILLED_ACTION": [Function],
Expand Down
50 changes: 50 additions & 0 deletions src/redux/common/__tests__/reduxHelpers.test.js
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,19 @@ describe('ReduxHelpers', () => {
})
).toMatchSnapshot('response for 4XX');

expect(
reduxHelpers.getMessageFromResults({
payload: {
response: {
status: 403,
statusText: 'Forbidden',
data: { lorem: 'ipsum', dolor: 'sit' }
},
message: 'Request failed with status code 403'
}
})
).toMatchSnapshot('response payload for 4XX');

expect(
reduxHelpers.getMessageFromResults([
{
Expand Down Expand Up @@ -129,6 +142,16 @@ describe('ReduxHelpers', () => {
})
).toMatchSnapshot('status');

expect(
reduxHelpers.getStatusFromResults({
payload: {
response: {
status: 403
}
}
})
).toMatchSnapshot('error response status');

expect(
reduxHelpers.getStatusFromResults([
{
Expand Down Expand Up @@ -169,6 +192,18 @@ describe('ReduxHelpers', () => {
})
).toMatchSnapshot('date');

expect(
reduxHelpers.getDateFromResults({
payload: {
response: {
headers: {
date: 'Tue, 11 Feb 2020 15:27:16 GMT'
}
}
}
})
).toMatchSnapshot('error response date');

expect(
reduxHelpers.getDateFromResults([
{
Expand Down Expand Up @@ -201,6 +236,21 @@ describe('ReduxHelpers', () => {
})
).toMatchSnapshot('data');

expect(
reduxHelpers.getDataFromResults({
payload: {
response: {
headers: {
date: 'Tue, 11 Feb 2020 15:27:16 GMT'
},
status: 403,
statusText: 'Forbidden',
data: { lorem: 'ipsum', dolor: 'sit' }
}
}
})
).toMatchSnapshot('error response data');

expect(
reduxHelpers.getDataFromResults({
payload: {
Expand Down
26 changes: 17 additions & 9 deletions src/redux/common/reduxHelpers.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,16 +63,23 @@ const setResponseSchemas = (schemas = [], initialValue) =>
* @returns {object}
*/
const getSingleResponseFromResultArray = results => {
const updatedResults = results.payload || results;
const updatedResults =
(results.payload && results.payload.response) || results.payload || results.response || results;
const updatedResultsMessage =
(results.payload && results.payload.message && { message: results.payload.message }) ||
(results.message && { message: results.message });

if (Array.isArray(updatedResults)) {
const firstErrorResponse = updatedResults.find(value => _get(value, 'response.status', value.status) >= 300);
const firstSuccessResponse = updatedResults.find(value => _get(value, 'response.status', value.status) < 300);

return firstErrorResponse || firstSuccessResponse;
return (
(firstErrorResponse && { ...firstErrorResponse, ...updatedResultsMessage }) ||
(firstSuccessResponse && { ...firstSuccessResponse, ...updatedResultsMessage })
);
}

return updatedResults;
return { ...updatedResults, ...updatedResultsMessage };
};

/**
Expand All @@ -88,10 +95,10 @@ const getMessageFromResults = results => {
return null;
}

const status = _get(updatedResults, 'response.status', updatedResults.status);
const statusResponse = _get(updatedResults, 'response.statusText', updatedResults.statusText);
const messageResponse = _get(updatedResults, 'response.message', updatedResults.message);
const dataResponse = _get(updatedResults, 'response.data', updatedResults.data);
const status = updatedResults.status || 0;
const statusResponse = updatedResults.statusText || '';
const messageResponse = updatedResults.message;
const dataResponse = updatedResults.data || null;
const formattedStatus = (status && `${status} `) || '';

if (messageResponse && typeof messageResponse === 'string') {
Expand Down Expand Up @@ -138,7 +145,7 @@ const getStatusFromResults = results => {
return 0;
}

return _get(updatedResults, 'response.status', updatedResults.status) || 0;
return updatedResults.status || 0;
};

/**
Expand Down Expand Up @@ -198,7 +205,8 @@ const setStateProp = (prop, data, options) => {
* @returns {Array|object}
*/
const singlePromiseDataResponseFromArray = results => {
const updatedResults = results.payload || results;
const updatedResults =
(results.payload && results.payload.response) || results.payload || results.response || results;

if (Array.isArray(updatedResults)) {
return updatedResults.map(value => value.data || {});
Expand Down
11 changes: 7 additions & 4 deletions src/redux/middleware/statusMiddleware.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,26 +29,29 @@ const statusMiddleware = (config = {}) => {

if (httpStatus > 99) {
const message = reduxHelpers.getMessageFromResults({ ...action });
const data = reduxHelpers.getDataFromResults({ ...action });
const payloadConfig = { ...(action.payload.config || {}) };
const range = `${Math.floor(httpStatus / 100)}${rangeFiller}`;

if (dispatchRange) {
dispatch({
type: `${range}${statusDelimiter}${rangeSuffix}`,
status: httpStatus,
config: payloadConfig,
data,
message,
range,
message
status: httpStatus
});
}

if (dispatchStatus) {
dispatch({
type: `${httpStatus}${statusDelimiter}${statusSuffix}`,
status: httpStatus,
config: payloadConfig,
data,
message,
range,
message
status: httpStatus
});
}
}
Expand Down
4 changes: 3 additions & 1 deletion src/redux/reducers/userReducer.js
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,9 @@ const userReducer = (state = initialState, action) => {
);

case reduxHelpers.HTTP_STATUS_RANGE(appTypes.STATUS_4XX):
if (action.status === 401 || action.status === 403) {
const actionStatus = reduxHelpers.getStatusFromResults(action);

if (actionStatus === 401 || actionStatus === 403) {
return reduxHelpers.setStateProp(
'session',
{
Expand Down

0 comments on commit 063beb9

Please sign in to comment.