import { createLocalVue } from '@vue/test-utils' ; import Vuex from 'vuex' ; import { ipcMain , ipcRenderer } from '~/spec/mock/electron' ; import App from '@/store/App' ; import DisplayStyle from '~/src/constants/displayStyle' ; import { LightTheme , DarkTheme } from '~/src/constants/themeColor' ; import Theme from '~/src/constants/theme' ; import TimeFormat from '~/src/constants/timeFormat' ; import Language from '~/src/constants/language' ; import DefaultFonts from '@/utils/fonts' ; import { MyWindow } from '~/src/types/global' ; ( ( window as any ) as MyWindow ) . ipcRenderer = ipcRenderer ; const state = ( ) => { return { theme : LightTheme , fontSize : 14 , displayNameStyle : DisplayStyle . DisplayNameAndUsername . value , notify : { reply : true , reblog : true , favourite : true , follow : true } , timeFormat : TimeFormat . Absolute . value , language : Language . en . key , defaultFonts : DefaultFonts , ignoreCW : false , ignoreNSFW : false , hideAllAttachments : false } ; } ; const initStore = ( ) => { return { namespaced : true , state : state ( ) , actions : App . actions , mutations : App . mutations } ; } ; describe ( 'App' , ( ) => { let store ; let localVue ; beforeEach ( ( ) => { localVue = createLocalVue ( ) ; localVue . use ( Vuex ) ; store = new Vuex . Store ( { modules : { App : initStore ( ) } } ) ; } ) ; describe ( 'loadPreferences' , ( ) => { describe ( 'error' , ( ) => { it ( 'should not change' , async ( ) => { ipcMain . handle ( 'get-preferences' , async ( ) => { throw new Error ( ) ; } ) ; await store . dispatch ( 'App/loadPreferences' ) . catch ( err => { expect ( err instanceof Error ) . toEqual ( true ) ; expect ( store . state . App . theme ) . toEqual ( LightTheme ) ; } ) ; ipcMain . removeHandler ( 'get-preferences' ) ; } ) ; } ) ; describe ( 'success' , ( ) => { it ( 'should be changed' , async ( ) => { ipcMain . handle ( 'get-preferences' , ( ) => { return { general : { timeline : { cw : true , nsfw : true } } , language : { language : Language . en . key } , notification : { notify : { reply : true , reblog : true , favourite : true , follow : true } } , appearance : { theme : Theme . Dark . key , fontSize : 13 , displayNameStyle : DisplayStyle . DisplayNameAndUsername . value , timeFormat : TimeFormat . Absolute . value , customThemeColor : LightTheme , font : DefaultFonts [ 0 ] } } ; } ) ; await store . dispatch ( 'App/loadPreferences' ) ; expect ( store . state . App . fontSize ) . toEqual ( 13 ) ; expect ( store . state . App . theme ) . toEqual ( DarkTheme ) ; expect ( store . state . App . ignoreCW ) . toEqual ( true ) ; expect ( store . state . App . ignoreNSFW ) . toEqual ( true ) ; ipcMain . removeHandler ( 'get-preferences' ) ; } ) ; } ) ; } ) ; } ) ;