From b909742a40a477136033ad90e52d815864b7902f Mon Sep 17 00:00:00 2001 From: Shahzad Date: Sun, 22 Mar 2020 18:17:03 +0100 Subject: [PATCH] [Uptime]Update fetch effect failed action handling (#60742) * update fetch effect * added test * update type --- .../effects/__tests__/fecth_effect.test.ts | 78 +++++++++++++++++++ .../public/state/effects/fetch_effect.ts | 24 +++--- 2 files changed, 92 insertions(+), 10 deletions(-) create mode 100644 x-pack/legacy/plugins/uptime/public/state/effects/__tests__/fecth_effect.test.ts diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/__tests__/fecth_effect.test.ts b/x-pack/legacy/plugins/uptime/public/state/effects/__tests__/fecth_effect.test.ts new file mode 100644 index 0000000000000..6520e1492bddc --- /dev/null +++ b/x-pack/legacy/plugins/uptime/public/state/effects/__tests__/fecth_effect.test.ts @@ -0,0 +1,78 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { call, put } from 'redux-saga/effects'; +import { fetchEffectFactory } from '../fetch_effect'; +import { indexStatusAction } from '../../actions'; + +describe('fetch saga effect factory', () => { + const asyncAction = indexStatusAction; + const calledAction = asyncAction.get(); + let fetchEffect; + + it('works with success workflow', () => { + const indexStatusResult = { indexExists: true, docCount: 2712532 }; + const fetchStatus = async () => { + return { indexExists: true, docCount: 2712532 }; + }; + fetchEffect = fetchEffectFactory( + fetchStatus, + asyncAction.success, + asyncAction.fail + )(calledAction); + let next = fetchEffect.next(); + + expect(next.value).toEqual(call(fetchStatus, calledAction.payload)); + + const successResult = put(asyncAction.success(indexStatusResult)); + + next = fetchEffect.next(indexStatusResult); + + expect(next.value).toEqual(successResult); + }); + + it('works with error workflow', () => { + const indexStatusResultError = new Error('no heartbeat index found'); + const fetchStatus = async () => { + return indexStatusResultError; + }; + fetchEffect = fetchEffectFactory( + fetchStatus, + asyncAction.success, + asyncAction.fail + )(calledAction); + let next = fetchEffect.next(); + + expect(next.value).toEqual(call(fetchStatus, calledAction.payload)); + + const errorResult = put(asyncAction.fail(indexStatusResultError)); + + next = fetchEffect.next(indexStatusResultError); + + expect(next.value).toEqual(errorResult); + }); + + it('works with throw error workflow', () => { + const unExpectedError = new Error('no url found, so throw error'); + const fetchStatus = async () => { + return await fetch('/some/url'); + }; + fetchEffect = fetchEffectFactory( + fetchStatus, + asyncAction.success, + asyncAction.fail + )(calledAction); + let next = fetchEffect.next(); + + expect(next.value).toEqual(call(fetchStatus, calledAction.payload)); + + const unexpectedErrorResult = put(asyncAction.fail(unExpectedError)); + + next = fetchEffect.next(unExpectedError); + + expect(next.value).toEqual(unexpectedErrorResult); + }); +}); diff --git a/x-pack/legacy/plugins/uptime/public/state/effects/fetch_effect.ts b/x-pack/legacy/plugins/uptime/public/state/effects/fetch_effect.ts index d1d7626b2eab3..943275d21e51e 100644 --- a/x-pack/legacy/plugins/uptime/public/state/effects/fetch_effect.ts +++ b/x-pack/legacy/plugins/uptime/public/state/effects/fetch_effect.ts @@ -24,17 +24,21 @@ export function fetchEffectFactory( fail: (error: Error) => Action ) { return function*(action: Action) { - const { - payload: { ...params }, - } = action; - const response = yield call(fetch, params); - if (response instanceof Error) { - // eslint-disable-next-line no-console - console.error(response); + try { + const response = yield call(fetch, action.payload); + + if (response instanceof Error) { + // eslint-disable-next-line no-console + console.error(response); - yield put(fail(response)); - } else { - yield put(success(response)); + yield put(fail(response)); + } else { + yield put(success(response)); + } + } catch (error) { + // eslint-disable-next-line no-console + console.error(error); + yield put(fail(error)); } }; }