feat(FN-1116): add Capacitor plugin managers for dashboard

- Add shared plugin types and manager modules for splash screen, status bar, and network handling
- Export plugin initialization from the dashboard entrypoint and configure Capacitor splash/status-bar defaults
- Add unit tests covering plugin initialization and each manager's behavior across supported scenarios
- Document the plugin manager architecture and add required Capacitor plugin dependencies
This commit is contained in:
gsxdsm
2026-04-08 00:01:09 -07:00
parent ce017cca98
commit a48232c91c
14 changed files with 1058 additions and 1 deletions

View File

@@ -0,0 +1,92 @@
import { beforeEach, afterEach, describe, expect, it, vi } from "vitest";
import { SplashScreen } from "@capacitor/splash-screen";
import { SplashScreenManager } from "../plugins/splash-screen.js";
vi.mock("@capacitor/splash-screen", () => ({
SplashScreen: {
hide: vi.fn(),
show: vi.fn(),
},
}));
describe("SplashScreenManager", () => {
beforeEach(() => {
vi.clearAllMocks();
vi.mocked(SplashScreen.hide).mockResolvedValue(undefined);
vi.mocked(SplashScreen.show).mockResolvedValue(undefined);
});
afterEach(() => {
vi.useRealTimers();
});
it("initialize() with autoHide=true triggers hide after delay", async () => {
vi.useFakeTimers();
const manager = new SplashScreenManager({ autoHide: true, hideDelay: 100 });
await manager.initialize();
expect(SplashScreen.hide).not.toHaveBeenCalled();
await vi.advanceTimersByTimeAsync(100);
expect(SplashScreen.hide).toHaveBeenCalledTimes(1);
expect(SplashScreen.hide).toHaveBeenCalledWith({ fadeOutDuration: 300 });
});
it("initialize() with autoHide=false does not auto-hide", async () => {
vi.useFakeTimers();
const manager = new SplashScreenManager({ autoHide: false, hideDelay: 100 });
await manager.initialize();
await vi.advanceTimersByTimeAsync(500);
expect(SplashScreen.hide).not.toHaveBeenCalled();
});
it("hide() delegates to SplashScreen.hide()", async () => {
const manager = new SplashScreenManager();
await manager.hide();
expect(SplashScreen.hide).toHaveBeenCalledTimes(1);
expect(SplashScreen.hide).toHaveBeenCalledWith({ fadeOutDuration: 300 });
});
it("show() delegates to SplashScreen.show()", async () => {
const manager = new SplashScreenManager();
await manager.show();
expect(SplashScreen.show).toHaveBeenCalledTimes(1);
expect(SplashScreen.show).toHaveBeenCalledWith({ autoHide: false });
});
it("initialize() is idempotent", async () => {
vi.useFakeTimers();
const manager = new SplashScreenManager({ autoHide: true, hideDelay: 50 });
await manager.initialize();
await manager.initialize();
await vi.advanceTimersByTimeAsync(50);
expect(SplashScreen.hide).toHaveBeenCalledTimes(1);
});
it("hide() swallows errors gracefully", async () => {
vi.mocked(SplashScreen.hide).mockRejectedValue(new Error("unavailable"));
const manager = new SplashScreenManager();
await expect(manager.hide()).resolves.toBeUndefined();
});
it("destroy() resets initialized state", async () => {
const manager = new SplashScreenManager({ autoHide: false });
await manager.initialize();
expect(manager.isInitialized).toBe(true);
await manager.destroy();
expect(manager.isInitialized).toBe(false);
});
});