From 61231ee321d3502387102dbb5466e937d8612e0d Mon Sep 17 00:00:00 2001 From: Kerry Date: Fri, 25 Mar 2022 17:50:17 +0100 Subject: [PATCH] Unit test settings controllers pt 1 (#8155) * test FontSizeController Signed-off-by: Kerry Archibald * test IncompatibleController Signed-off-by: Kerry Archibald * test SystemFontController * test ThemeController Signed-off-by: Kerry Archibald * test UseSystemFontController Signed-off-by: Kerry Archibald * fix themecontroller Signed-off-by: Kerry Archibald --- .../controllers/FontSizeController-test.ts | 35 +++++++ .../IncompatibleController-test.ts | 91 +++++++++++++++++++ .../controllers/SystemFontController-test.ts | 40 ++++++++ .../controllers/ThemeController-test.ts | 75 +++++++++++++++ .../UseSystemFontController-test.ts | 40 ++++++++ 5 files changed, 281 insertions(+) create mode 100644 test/settings/controllers/FontSizeController-test.ts create mode 100644 test/settings/controllers/IncompatibleController-test.ts create mode 100644 test/settings/controllers/SystemFontController-test.ts create mode 100644 test/settings/controllers/ThemeController-test.ts create mode 100644 test/settings/controllers/UseSystemFontController-test.ts diff --git a/test/settings/controllers/FontSizeController-test.ts b/test/settings/controllers/FontSizeController-test.ts new file mode 100644 index 0000000000..d42ec487ed --- /dev/null +++ b/test/settings/controllers/FontSizeController-test.ts @@ -0,0 +1,35 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { Action } from "../../../src/dispatcher/actions"; +import dis from "../../../src/dispatcher/dispatcher"; +import FontSizeController from "../../../src/settings/controllers/FontSizeController"; +import { SettingLevel } from "../../../src/settings/SettingLevel"; + +const dispatchSpy = jest.spyOn(dis, 'dispatch'); + +describe('FontSizeController', () => { + it('dispatches a font size action on change', () => { + const controller = new FontSizeController(); + + controller.onChange(SettingLevel.ACCOUNT, '$room:server', 12); + + expect(dispatchSpy).toHaveBeenCalledWith({ + action: Action.UpdateFontSize, + size: 12, + }); + }); +}); diff --git a/test/settings/controllers/IncompatibleController-test.ts b/test/settings/controllers/IncompatibleController-test.ts new file mode 100644 index 0000000000..8003f4e7a3 --- /dev/null +++ b/test/settings/controllers/IncompatibleController-test.ts @@ -0,0 +1,91 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import IncompatibleController from "../../../src/settings/controllers/IncompatibleController"; +import { SettingLevel } from "../../../src/settings/SettingLevel"; +import SettingsStore from "../../../src/settings/SettingsStore"; + +describe('IncompatibleController', () => { + const settingsGetValueSpy = jest.spyOn(SettingsStore, 'getValue'); + beforeEach(() => { + settingsGetValueSpy.mockClear(); + }); + + describe('incompatibleSetting', () => { + describe('when incompatibleValue is not set', () => { + it('returns true when setting value is true', () => { + // no incompatible value set, defaulted to true + const controller = new IncompatibleController("feature_spotlight", { key: null }); + settingsGetValueSpy.mockReturnValue(true); + // true === true + expect(controller.incompatibleSetting).toBe(true); + expect(controller.settingDisabled).toEqual(true); + expect(settingsGetValueSpy).toHaveBeenCalledWith("feature_spotlight"); + }); + + it('returns false when setting value is not true', () => { + // no incompatible value set, defaulted to true + const controller = new IncompatibleController("feature_spotlight", { key: null }); + settingsGetValueSpy.mockReturnValue('test'); + expect(controller.incompatibleSetting).toBe(false); + }); + }); + + describe('when incompatibleValue is set to a value', () => { + it('returns true when setting value matches incompatible value', () => { + const controller = new IncompatibleController("feature_spotlight", { key: null }, 'test'); + settingsGetValueSpy.mockReturnValue('test'); + expect(controller.incompatibleSetting).toBe(true); + }); + + it('returns false when setting value is not true', () => { + const controller = new IncompatibleController("feature_spotlight", { key: null }, 'test'); + settingsGetValueSpy.mockReturnValue('not test'); + expect(controller.incompatibleSetting).toBe(false); + }); + }); + + describe('when incompatibleValue is set to a function', () => { + it('returns result from incompatibleValue function', () => { + const incompatibleValueFn = jest.fn().mockReturnValue(false); + const controller = new IncompatibleController("feature_spotlight", { key: null }, incompatibleValueFn); + settingsGetValueSpy.mockReturnValue('test'); + expect(controller.incompatibleSetting).toBe(false); + expect(incompatibleValueFn).toHaveBeenCalledWith('test'); + }); + }); + }); + + describe('getValueOverride()', () => { + it('returns forced value when setting is incompatible', () => { + settingsGetValueSpy.mockReturnValue(true); + const forcedValue = { key: null }; + const controller = new IncompatibleController("feature_spotlight", forcedValue); + expect(controller.getValueOverride( + SettingLevel.ACCOUNT, '$room:server', true, SettingLevel.ACCOUNT, + )).toEqual(forcedValue); + }); + + it('returns null when setting is not incompatible', () => { + settingsGetValueSpy.mockReturnValue(false); + const forcedValue = { key: null }; + const controller = new IncompatibleController("feature_spotlight", forcedValue); + expect(controller.getValueOverride( + SettingLevel.ACCOUNT, '$room:server', true, SettingLevel.ACCOUNT, + )).toEqual(null); + }); + }); +}); diff --git a/test/settings/controllers/SystemFontController-test.ts b/test/settings/controllers/SystemFontController-test.ts new file mode 100644 index 0000000000..a330661231 --- /dev/null +++ b/test/settings/controllers/SystemFontController-test.ts @@ -0,0 +1,40 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { Action } from "../../../src/dispatcher/actions"; +import dis from "../../../src/dispatcher/dispatcher"; +import SystemFontController from "../../../src/settings/controllers/SystemFontController"; +import { SettingLevel } from "../../../src/settings/SettingLevel"; +import SettingsStore from "../../../src/settings/SettingsStore"; + +const dispatchSpy = jest.spyOn(dis, 'dispatch'); + +describe('SystemFontController', () => { + it('dispatches a font size action on change', () => { + const getValueSpy = jest.spyOn(SettingsStore, 'getValue').mockReturnValue(true); + const controller = new SystemFontController(); + + controller.onChange(SettingLevel.ACCOUNT, '$room:server', 12); + + expect(dispatchSpy).toHaveBeenCalledWith({ + action: Action.UpdateSystemFont, + useSystemFont: true, + font: 12, + }); + + expect(getValueSpy).toHaveBeenCalledWith("useSystemFont"); + }); +}); diff --git a/test/settings/controllers/ThemeController-test.ts b/test/settings/controllers/ThemeController-test.ts new file mode 100644 index 0000000000..a90531b6b8 --- /dev/null +++ b/test/settings/controllers/ThemeController-test.ts @@ -0,0 +1,75 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import ThemeController from "../../../src/settings/controllers/ThemeController"; +import { SettingLevel } from "../../../src/settings/SettingLevel"; +import SettingsStore from "../../../src/settings/SettingsStore"; +import { DEFAULT_THEME } from "../../../src/theme"; + +describe('ThemeController', () => { + jest.spyOn(SettingsStore, 'getValue').mockReturnValue([]); + + afterEach(() => { + // reset + ThemeController.isLogin = false; + }); + + it('returns null when calculatedValue is falsy', () => { + const controller = new ThemeController(); + + expect(controller.getValueOverride( + SettingLevel.ACCOUNT, + '$room:server', + undefined, /* calculatedValue */ + SettingLevel.ACCOUNT, + )).toEqual(null); + }); + + it('returns light when login flag is set', () => { + const controller = new ThemeController(); + + ThemeController.isLogin = true; + + expect(controller.getValueOverride( + SettingLevel.ACCOUNT, + '$room:server', + 'dark', + SettingLevel.ACCOUNT, + )).toEqual('light'); + }); + + it('returns default theme when value is not a valid theme', () => { + const controller = new ThemeController(); + + expect(controller.getValueOverride( + SettingLevel.ACCOUNT, + '$room:server', + 'my-test-theme', + SettingLevel.ACCOUNT, + )).toEqual(DEFAULT_THEME); + }); + + it('returns null when value is a valid theme', () => { + const controller = new ThemeController(); + + expect(controller.getValueOverride( + SettingLevel.ACCOUNT, + '$room:server', + 'dark', + SettingLevel.ACCOUNT, + )).toEqual(null); + }); +}); diff --git a/test/settings/controllers/UseSystemFontController-test.ts b/test/settings/controllers/UseSystemFontController-test.ts new file mode 100644 index 0000000000..725bd1a442 --- /dev/null +++ b/test/settings/controllers/UseSystemFontController-test.ts @@ -0,0 +1,40 @@ +/* +Copyright 2022 The Matrix.org Foundation C.I.C. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +import { Action } from "../../../src/dispatcher/actions"; +import dis from "../../../src/dispatcher/dispatcher"; +import UseSystemFontController from "../../../src/settings/controllers/UseSystemFontController"; +import { SettingLevel } from "../../../src/settings/SettingLevel"; +import SettingsStore from "../../../src/settings/SettingsStore"; + +const dispatchSpy = jest.spyOn(dis, 'dispatch'); + +describe('UseSystemFontController', () => { + it('dispatches a font size action on change', () => { + const getValueSpy = jest.spyOn(SettingsStore, 'getValue').mockReturnValue(12); + const controller = new UseSystemFontController(); + + controller.onChange(SettingLevel.ACCOUNT, '$room:server', true); + + expect(dispatchSpy).toHaveBeenCalledWith({ + action: Action.UpdateSystemFont, + useSystemFont: true, + font: 12, + }); + + expect(getValueSpy).toHaveBeenCalledWith("systemFont"); + }); +});