From 27712b0befd3ce0440a2d4bbfbc527b09d30e715 Mon Sep 17 00:00:00 2001 From: Johnny McQuade Date: Wed, 18 Sep 2024 15:17:35 +0100 Subject: [PATCH] test: extend skin service tests --- .../theme/services/theme.service.spec.ts | 32 +++++++++++- .../shared/services/skin/skin.service.spec.ts | 50 +++++++++++++++---- 2 files changed, 70 insertions(+), 12 deletions(-) diff --git a/src/app/feature/theme/services/theme.service.spec.ts b/src/app/feature/theme/services/theme.service.spec.ts index 45052e902b..b1322e66d5 100644 --- a/src/app/feature/theme/services/theme.service.spec.ts +++ b/src/app/feature/theme/services/theme.service.spec.ts @@ -1,12 +1,42 @@ import { TestBed } from "@angular/core/testing"; import { ThemeService } from "./theme.service"; +import { LocalStorageService } from "src/app/shared/services/local-storage/local-storage.service"; +import { MockLocalStorageService } from "src/app/shared/services/local-storage/local-storage.service.spec"; +import { AppConfigService } from "src/app/shared/services/app-config/app-config.service"; +import { MockAppConfigService } from "src/app/shared/services/app-config/app-config.service.spec"; +import { IAppConfig } from "packages/data-models"; + +export class MockThemeService implements Partial { + ready() { + return true; + } + setTheme() {} + getCurrentTheme() { + return "mock_theme"; + } +} + +const MOCK_APP_CONFIG: Partial = { + APP_THEMES: { + available: ["MOCK_THEME_1", "MOCK_THEME_2"], + defaultThemeName: "MOCK_THEME_1", + }, +}; describe("ThemeService", () => { let service: ThemeService; beforeEach(() => { - TestBed.configureTestingModule({}); + TestBed.configureTestingModule({ + providers: [ + { provide: LocalStorageService, useValue: new MockLocalStorageService() }, + { + provide: AppConfigService, + useValue: new MockAppConfigService(MOCK_APP_CONFIG), + }, + ], + }); service = TestBed.inject(ThemeService); }); diff --git a/src/app/shared/services/skin/skin.service.spec.ts b/src/app/shared/services/skin/skin.service.spec.ts index b836d336f1..6d908902a1 100644 --- a/src/app/shared/services/skin/skin.service.spec.ts +++ b/src/app/shared/services/skin/skin.service.spec.ts @@ -7,17 +7,10 @@ import { AppConfigService } from "../app-config/app-config.service"; import { MockAppConfigService } from "../app-config/app-config.service.spec"; import { TemplateService } from "../../components/template/services/template.service"; import { ThemeService } from "src/app/feature/theme/services/theme.service"; +import { MockThemeService } from "src/app/feature/theme/services/theme.service.spec"; import { IAppConfig, IAppSkin } from "packages/data-models"; - -class MockThemeService implements Partial { - ready() { - return true; - } - setTheme() {} - getCurrentTheme() { - return "mock_theme"; - } -} +import { deepMergeObjects } from "../../utils"; +import clone from "clone"; class MockTemplateService implements Partial { ready() { @@ -51,6 +44,10 @@ const MOCK_APP_CONFIG: Partial = { available: [MOCK_SKIN_1, MOCK_SKIN_2], defaultSkinName: "MOCK_SKIN_1", }, + APP_THEMES: { + available: ["MOCK_THEME_1", "MOCK_THEME_2"], + defaultThemeName: "MOCK_THEME_1", + }, }; /** @@ -85,6 +82,11 @@ describe("SkinService", () => { expect(service.getActiveSkinName()).toEqual("MOCK_SKIN_1"); }); + it("loads active skin from local storage on init if available", () => { + service["localStorageService"].setProtected("APP_SKIN", "MOCK_SKIN_2"); + expect(service.getActiveSkinName()).toEqual("MOCK_SKIN_2"); + }); + it("generates override and revert configs", () => { expect(service["revertOverride"]).toEqual({ APP_HEADER_DEFAULTS: { title: "default", colour: "none" }, @@ -116,5 +118,31 @@ describe("SkinService", () => { }); }); - // TODO - add tests for setSkin method and side-effects + it("sets skin: sets active skin name", () => { + service["setSkin"](MOCK_SKIN_2.name); + expect(service.getActiveSkinName()).toEqual("MOCK_SKIN_2"); + service["setSkin"](MOCK_SKIN_1.name); + expect(service.getActiveSkinName()).toEqual("MOCK_SKIN_1"); + }); + + it("sets skin: sets revertOverride correctly", () => { + // MOCK_SKIN_1 will already be applied on load + service["setSkin"](MOCK_SKIN_2.name); + expect(service["revertOverride"]).toEqual({ + APP_HEADER_DEFAULTS: { + title: "default", + variant: "default", + }, + }); + }); + + it("sets skin: updates AppConfigService.appConfig values", () => { + // MOCK_SKIN_1 will already be applied on load + service["setSkin"](MOCK_SKIN_2.name); + expect(service["appConfigService"].appConfig() as Partial).toEqual( + deepMergeObjects(clone(MOCK_APP_CONFIG), clone(MOCK_SKIN_2).appConfig) + ); + }); + + // TODO - add further tests for setSkin method and side-effects });