From fac9bd9de709f08e8da585011c66edc78900b755 Mon Sep 17 00:00:00 2001 From: AkiraFukushima Date: Sat, 29 Dec 2018 23:53:12 +0900 Subject: [PATCH] refs #209 Add Preferences/Appearance store tests --- .../unit/store/Preferences/Appearance.spec.js | 132 ++++++++++++++++++ src/renderer/store/Preferences/Appearance.js | 20 +-- 2 files changed, 144 insertions(+), 8 deletions(-) create mode 100644 spec/unit/store/Preferences/Appearance.spec.js diff --git a/spec/unit/store/Preferences/Appearance.spec.js b/spec/unit/store/Preferences/Appearance.spec.js new file mode 100644 index 00000000..edfed799 --- /dev/null +++ b/spec/unit/store/Preferences/Appearance.spec.js @@ -0,0 +1,132 @@ +import Theme from '~/src/constants/theme' +import DisplayStyle from '~/src/constants/displayStyle' +import TimeFormat from '~/src/constants/timeFormat' +import { LightTheme } from '~/src/renderer/utils/theme' +import DefaultFonts from '@/utils/fonts' +import Appearance from '@/store/Preferences/Appearance' +import { ipcMain } from '~/spec/mock/electron' + +describe('Preferences/Appearance', () => { + let state + beforeEach(() => { + state = { + appearance: { + theme: Theme.Light.key, + fontSize: 14, + displayNameStyle: DisplayStyle.DisplayNameAndUsername.value, + timeFormat: TimeFormat.Absolute.value, + customThemeColor: LightTheme, + font: DefaultFonts[0] + }, + fonts: [] + } + }) + describe('mutations', () => { + describe('updateAppearance', () => { + it('should be changed', () => { + Appearance.mutations.updateAppearance(state, { + theme: Theme.Dark.key + }) + expect(state.appearance.theme).toEqual(Theme.Dark.key) + }) + }) + describe('updateFonts', () => { + it('should be changed', () => { + Appearance.mutations.updateFonts(state, ['font']) + expect(state.fonts).toEqual(['font']) + }) + }) + }) + + describe('actions', () => { + describe('loadAppearance', () => { + it('error', async () => { + ipcMain.once('get-preferences', (event, _) => { + event.sender.send('error-get-preferences', new LoadAppearanceError()) + }) + const commitMock = jest.fn() + await Appearance.actions.loadAppearance({ commit: commitMock }) + .catch((err) => { + expect(err instanceof LoadAppearanceError).toEqual(true) + }) + }) + it('success', async () => { + const conf = { + appearance: { + theme: Theme.Dark.key + } + } + ipcMain.once('get-preferences', (event, _) => { + event.sender.send('response-get-preferences', conf) + }) + const commitMock = jest.fn() + const c = await Appearance.actions.loadAppearance({ commit: commitMock }) + expect(c).toEqual(conf) + expect(commitMock).toHaveBeenCalledWith('updateAppearance', conf.appearance) + }) + }) + describe('loadFonts', () => { + it('error', async () => { + ipcMain.once('list-fonts', (event, _) => { + event.sender.send('error-list-fonts', new ListFontsError()) + }) + const commitMock = jest.fn() + await Appearance.actions.loadFonts({ commit: commitMock }) + .catch((err) => { + expect(err instanceof ListFontsError).toEqual(true) + }) + }) + it('success', async () => { + ipcMain.once('list-fonts', (event, _) => { + event.sender.send('response-list-fonts', ['fonts']) + }) + const commitMock = jest.fn() + const fonts = await Appearance.actions.loadFonts({ commit: commitMock }) + expect(fonts).toEqual(['fonts']) + expect(commitMock).toHaveBeenCalledWith('updateFonts', [DefaultFonts[0]].concat(['fonts'])) + }) + }) + }) + describe('updateTheme', () => { + it('error', async () => { + ipcMain.once('update-preferences', (event, _) => { + event.sender.send('error-update-preferences', new UpdateThemeError()) + }) + const dispatchMock = jest.fn() + const commitMock = jest.fn() + await Appearance.actions.updateTheme({ dispatch: dispatchMock, commit: commitMock, state: state }, Theme.Dark.key) + .catch((err) => { + expect(err instanceof UpdateThemeError).toEqual(true) + }) + }) + it('success', async () => { + ipcMain.once('update-preferences', (event, config) => { + event.sender.send('response-update-preferences', config) + }) + const dispatchMock = jest.fn() + const commitMock = jest.fn() + const appearance = await Appearance.actions.updateTheme({ dispatch: dispatchMock, commit: commitMock, state: state }, Theme.Dark.key) + expect(appearance).toEqual({ + theme: Theme.Dark.key, + fontSize: 14, + displayNameStyle: DisplayStyle.DisplayNameAndUsername.value, + timeFormat: TimeFormat.Absolute.value, + customThemeColor: LightTheme, + font: DefaultFonts[0] + }) + expect(commitMock).toHaveBeenCalledWith('updateAppearance', { + theme: Theme.Dark.key, + fontSize: 14, + displayNameStyle: DisplayStyle.DisplayNameAndUsername.value, + timeFormat: TimeFormat.Absolute.value, + customThemeColor: LightTheme, + font: DefaultFonts[0] + }) + expect(dispatchMock).toHaveBeenCalledWith('App/loadPreferences', null, { root: true }) + }) + }) +}) + +class LoadAppearanceError extends Error {} +class ListFontsError extends Error {} +class UpdateThemeError extends Error {} diff --git a/src/renderer/store/Preferences/Appearance.js b/src/renderer/store/Preferences/Appearance.js index e19ecfd6..6788d4c5 100644 --- a/src/renderer/store/Preferences/Appearance.js +++ b/src/renderer/store/Preferences/Appearance.js @@ -62,14 +62,18 @@ export default { const config = { appearance: newAppearance } - ipcRenderer.send('update-preferences', config) - ipcRenderer.once('error-update-preferences', (event, err) => { - ipcRenderer.removeAllListeners('response-update-preferences') - }) - ipcRenderer.once('response-update-preferences', (event, conf) => { - ipcRenderer.removeAllListeners('error-update-preferences') - commit('updateAppearance', conf.appearance) - dispatch('App/loadPreferences', null, { root: true }) + return new Promise((resolve, reject) => { + ipcRenderer.send('update-preferences', config) + ipcRenderer.once('error-update-preferences', (event, err) => { + ipcRenderer.removeAllListeners('response-update-preferences', err) + reject(err) + }) + ipcRenderer.once('response-update-preferences', (event, conf) => { + ipcRenderer.removeAllListeners('error-update-preferences') + commit('updateAppearance', conf.appearance) + dispatch('App/loadPreferences', null, { root: true }) + resolve(conf.appearance) + }) }) }, updateFontSize ({ dispatch, commit, state }, fontSize) {