From 6a6c427b0ee268225120c4564b22dd9592c3c163 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Sat, 25 Apr 2020 10:22:17 +0200 Subject: [PATCH] Added unit tests for settings business logic elements --- src/settings/reducers/realTimeUpdates.js | 2 +- test/servers/reducers/server.test.js | 4 +- .../settings/reducers/realTimeUpdates.test.js | 47 +++++++++++++++++++ .../settings/services/SettingsService.test.js | 46 ++++++++++++++++++ 4 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 test/settings/reducers/realTimeUpdates.test.js create mode 100644 test/settings/services/SettingsService.test.js diff --git a/src/settings/reducers/realTimeUpdates.js b/src/settings/reducers/realTimeUpdates.js index 19fac094..c5cd726f 100644 --- a/src/settings/reducers/realTimeUpdates.js +++ b/src/settings/reducers/realTimeUpdates.js @@ -1,7 +1,7 @@ import { handleActions } from 'redux-actions'; import PropTypes from 'prop-types'; -const LOAD_REAL_TIME_UPDATES = 'shlink/realTimeUpdates/LOAD_REAL_TIME_UPDATES'; +export const LOAD_REAL_TIME_UPDATES = 'shlink/realTimeUpdates/LOAD_REAL_TIME_UPDATES'; export const RealTimeUpdatesType = PropTypes.shape({ enabled: PropTypes.bool.isRequired, diff --git a/test/servers/reducers/server.test.js b/test/servers/reducers/server.test.js index f6c55325..baa4e82f 100644 --- a/test/servers/reducers/server.test.js +++ b/test/servers/reducers/server.test.js @@ -4,7 +4,9 @@ import reducer, { deleteServer, listServers, createServers, - FETCH_SERVERS, FETCH_SERVERS_START, editServer, + editServer, + FETCH_SERVERS, + FETCH_SERVERS_START, } from '../../../src/servers/reducers/server'; describe('serverReducer', () => { diff --git a/test/settings/reducers/realTimeUpdates.test.js b/test/settings/reducers/realTimeUpdates.test.js new file mode 100644 index 00000000..cdd463e6 --- /dev/null +++ b/test/settings/reducers/realTimeUpdates.test.js @@ -0,0 +1,47 @@ +import reducer, { + LOAD_REAL_TIME_UPDATES, + loadRealTimeUpdates, + setRealTimeUpdates, +} from '../../../src/settings/reducers/realTimeUpdates'; + +describe('realTimeUpdatesReducer', () => { + const SettingsServiceMock = { + updateSettings: jest.fn(), + loadSettings: jest.fn(), + }; + + afterEach(jest.clearAllMocks); + + describe('reducer', () => { + it('returns realTimeUpdates when action is LOAD_REAL_TIME_UPDATES', () => { + expect(reducer({}, { type: LOAD_REAL_TIME_UPDATES, enabled: true })).toEqual({ enabled: true }); + }); + }); + + describe('loadRealTimeUpdates', () => { + it.each([ + [{}, true ], + [{ realTimeUpdates: {} }, true ], + [{ realTimeUpdates: { enabled: true } }, true ], + [{ realTimeUpdates: { enabled: false } }, false ], + ])('loads settings and returns LOAD_REAL_TIME_UPDATES action', (loadedSettings, expectedEnabled) => { + SettingsServiceMock.loadSettings.mockReturnValue(loadedSettings); + + const result = loadRealTimeUpdates(SettingsServiceMock)(); + + expect(result).toEqual({ type: LOAD_REAL_TIME_UPDATES, enabled: expectedEnabled }); + expect(SettingsServiceMock.loadSettings).toHaveBeenCalled(); + }); + }); + + describe('setRealTimeUpdates', () => { + it.each([[ true ], [ false ]])('updates settings with provided value and then loads updates again', (enabled) => { + const loadRealTimeUpdatesAction = jest.fn(); + + setRealTimeUpdates(SettingsServiceMock, loadRealTimeUpdatesAction)(enabled); + + expect(SettingsServiceMock.updateSettings).toHaveBeenCalledWith({ realTimeUpdates: { enabled } }); + expect(loadRealTimeUpdatesAction).toHaveBeenCalled(); + }); + }); +}); diff --git a/test/settings/services/SettingsService.test.js b/test/settings/services/SettingsService.test.js new file mode 100644 index 00000000..9e9419db --- /dev/null +++ b/test/settings/services/SettingsService.test.js @@ -0,0 +1,46 @@ +import SettingsService from '../../../src/settings/services/SettingsService'; + +describe('SettingsService', () => { + const settings = { foo: 'bar' }; + const createService = (withSettings = true) => { + const storageMock = { + set: jest.fn(), + get: jest.fn(() => withSettings ? settings : undefined), + }; + const service = new SettingsService(storageMock); + + return [ service, storageMock ]; + }; + + afterEach(jest.resetAllMocks); + + describe('loadSettings', () => { + it.each([ + [ false, {}], + [ true, settings ], + ])('returns result if found in storage', (withSettings, expectedResult) => { + const [ service, storageMock ] = createService(withSettings); + + const result = service.loadSettings(); + + expect(result).toEqual(expectedResult); + expect(storageMock.get).toHaveBeenCalledTimes(1); + expect(storageMock.set).not.toHaveBeenCalled(); + }); + }); + + describe('updateSettings', () => { + it.each([ + [ false, { hi: 'goodbye' }, { hi: 'goodbye' }], + [ true, { hi: 'goodbye' }, { foo: 'bar', hi: 'goodbye' }], + [ true, { foo: 'goodbye' }, { foo: 'goodbye' }], + ])('appends provided data to existing settings', (withSettings, settingsToUpdate, expectedResult) => { + const [ service, storageMock ] = createService(withSettings); + + service.updateSettings(settingsToUpdate); + + expect(storageMock.get).toHaveBeenCalledTimes(1); + expect(storageMock.set).toHaveBeenCalledWith(expect.anything(), expectedResult); + }); + }); +});