From 292f2d83d239bfb0f8ca4c35c7d2adb39ddfff66 Mon Sep 17 00:00:00 2001 From: David Lechner Date: Wed, 10 Jun 2020 17:34:35 -0500 Subject: [PATCH] convert error log from service to saga --- src/sagas/error-log.test.ts | 45 +++++++++++++++++++++++++++++++++++++ src/sagas/error-log.ts | 38 +++++++++++++++++++++++++++++++ src/sagas/index.ts | 3 ++- src/services/error-log.ts | 34 ---------------------------- src/services/index.ts | 3 +-- 5 files changed, 86 insertions(+), 37 deletions(-) create mode 100644 src/sagas/error-log.test.ts create mode 100644 src/sagas/error-log.ts delete mode 100644 src/services/error-log.ts diff --git a/src/sagas/error-log.test.ts b/src/sagas/error-log.test.ts new file mode 100644 index 00000000..adca5d99 --- /dev/null +++ b/src/sagas/error-log.test.ts @@ -0,0 +1,45 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2020 The Pybricks Authors + +import { AsyncSaga } from '../../test'; +import { didFailToWrite } from '../actions/ble'; +import { + BootloaderConnectionFailureReason, + didError, + didFailToConnect, +} from '../actions/lwp3-bootloader'; +import errorLog from './error-log'; + +test('bleDataDidFailToWrite', async () => { + const saga = new AsyncSaga(errorLog); + + console.error = jest.fn(); + saga.put(didFailToWrite(0, new Error('test error'))); + expect(console.error).toHaveBeenCalledTimes(1); + + await saga.end(); +}); + +test('bootloaderDidFailToConnect', async () => { + const saga = new AsyncSaga(errorLog); + + console.debug = jest.fn(); + saga.put(didFailToConnect(BootloaderConnectionFailureReason.Canceled)); + expect(console.debug).toHaveBeenCalledTimes(1); + + console.error = jest.fn(); + saga.put(didFailToConnect(BootloaderConnectionFailureReason.Unknown)); + expect(console.error).toHaveBeenCalledTimes(1); + + await saga.end(); +}); + +test('bootloaderDidError', async () => { + const saga = new AsyncSaga(errorLog); + + console.error = jest.fn(); + saga.put(didError(new Error('test error'))); + expect(console.error).toHaveBeenCalledTimes(1); + + await saga.end(); +}); diff --git a/src/sagas/error-log.ts b/src/sagas/error-log.ts new file mode 100644 index 00000000..108b62d3 --- /dev/null +++ b/src/sagas/error-log.ts @@ -0,0 +1,38 @@ +// SPDX-License-Identifier: MIT +// Copyright (c) 2020 The Pybricks Authors + +import { takeEvery } from 'redux-saga/effects'; +import { BLEDataActionType, BLEDataDidFailToWriteAction } from '../actions/ble'; +import { + BootloaderConnectionActionType, + BootloaderConnectionDidErrorAction, + BootloaderConnectionDidFailToConnectAction, + BootloaderConnectionFailureReason, +} from '../actions/lwp3-bootloader'; + +function bleDataDidFailToWrite(action: BLEDataDidFailToWriteAction): void { + console.error(action.err); +} + +function bootloaderDidFailToConnect( + action: BootloaderConnectionDidFailToConnectAction, +): void { + if (action.reason === BootloaderConnectionFailureReason.Unknown) { + console.error(action.err); + } else { + console.debug(action.err); + } +} + +function bootloaderDidError(action: BootloaderConnectionDidErrorAction): void { + console.error(action.err); +} + +export default function* (): Generator { + yield takeEvery(BLEDataActionType.DidFailToWrite, bleDataDidFailToWrite); + yield takeEvery( + BootloaderConnectionActionType.DidFailToConnect, + bootloaderDidFailToConnect, + ); + yield takeEvery(BootloaderConnectionActionType.DidError, bootloaderDidError); +} diff --git a/src/sagas/index.ts b/src/sagas/index.ts index 89c7628c..7c11a143 100644 --- a/src/sagas/index.ts +++ b/src/sagas/index.ts @@ -3,6 +3,7 @@ import { all } from 'redux-saga/effects'; import editor from './editor'; +import errorLog from './error-log'; import flashFirmware from './flash-firmare'; import bootloader from './lwp3-bootloader'; import mpy from './mpy'; @@ -10,5 +11,5 @@ import terminal from './terminal'; /* istanbul ignore next */ export default function* (): Generator { - yield all([bootloader(), editor(), flashFirmware(), mpy(), terminal()]); + yield all([bootloader(), editor(), errorLog(), flashFirmware(), mpy(), terminal()]); } diff --git a/src/services/error-log.ts b/src/services/error-log.ts deleted file mode 100644 index 16a16cd6..00000000 --- a/src/services/error-log.ts +++ /dev/null @@ -1,34 +0,0 @@ -// SPDX-License-Identifier: MIT -// Copyright (c) 2020 The Pybricks Authors - -import { Action } from '../actions'; -import { BLEDataActionType } from '../actions/ble'; -import { - BootloaderConnectionActionType, - BootloaderConnectionFailureReason, -} from '../actions/lwp3-bootloader'; -import { combineServices } from '.'; - -/** - * Logs unexpected errors to console.error and expected errors to console.debug. - * @param action An action - */ -function consoleLog(action: Action): void { - switch (action.type) { - case BLEDataActionType.DidFailToWrite: - console.error(action.err); - break; - case BootloaderConnectionActionType.DidFailToConnect: - if (action.reason === BootloaderConnectionFailureReason.Unknown) { - console.error(action.err); - } else { - console.debug(action.err); - } - break; - case BootloaderConnectionActionType.DidError: - console.error(action.err); - break; - } -} - -export default combineServices(consoleLog); diff --git a/src/services/index.ts b/src/services/index.ts index 45f33444..8477656b 100644 --- a/src/services/index.ts +++ b/src/services/index.ts @@ -5,7 +5,6 @@ import { Middleware } from 'redux'; import { Action, Dispatch } from '../actions'; import { RootState } from '../reducers'; import ble from './ble'; -import errorLog from './error-log'; import hub from './hub'; import bootloader from './lwp3-bootloader'; @@ -38,7 +37,7 @@ export function combineServices(...services: Service[]): Service { }; } -const rootService = combineServices(ble, bootloader, errorLog, hub); +const rootService = combineServices(ble, bootloader, hub); const serviceMiddleware: Middleware = (store) => (next) => (action): unknown => { runService(rootService, action, store.dispatch, store.getState());