import { assert, describe, it } from "@effect/vitest"; import * as Effect from "effect/Effect"; import { beforeEach, vi } from "vitest"; const { appendSwitchMock, exitMock, getAppPathMock, getVersionMock, onMock, quitMock, relaunchMock, removeListenerMock, setAboutPanelOptionsMock, setAppUserModelIdMock, setDesktopNameMock, setDockIconMock, setNameMock, setPathMock, whenReadyMock, } = vi.hoisted(() => ({ appendSwitchMock: vi.fn(), exitMock: vi.fn(), getAppPathMock: vi.fn(() => "/app"), getVersionMock: vi.fn(() => "1.2.3"), onMock: vi.fn(), quitMock: vi.fn(), relaunchMock: vi.fn(), removeListenerMock: vi.fn(), setAboutPanelOptionsMock: vi.fn(), setAppUserModelIdMock: vi.fn(), setDesktopNameMock: vi.fn(), setDockIconMock: vi.fn(), setNameMock: vi.fn(), setPathMock: vi.fn(), whenReadyMock: vi.fn(() => Promise.resolve()), })); vi.mock("electron", () => ({ app: { commandLine: { appendSwitch: appendSwitchMock, }, dock: { setIcon: setDockIconMock, }, getAppPath: getAppPathMock, getVersion: getVersionMock, isPackaged: true, name: "T3 Code", on: onMock, quit: quitMock, relaunch: relaunchMock, removeListener: removeListenerMock, runningUnderARM64Translation: false, setAboutPanelOptions: setAboutPanelOptionsMock, setAppUserModelId: setAppUserModelIdMock, setDesktopName: setDesktopNameMock, setName: setNameMock, setPath: setPathMock, whenReady: whenReadyMock, exit: exitMock, }, })); import * as ElectronApp from "./ElectronApp.ts"; describe("ElectronApp", () => { beforeEach(() => { appendSwitchMock.mockClear(); exitMock.mockClear(); onMock.mockClear(); quitMock.mockClear(); relaunchMock.mockClear(); removeListenerMock.mockClear(); setPathMock.mockClear(); }); it.effect("reads app metadata through the service", () => Effect.gen(function* () { const electronApp = yield* ElectronApp.ElectronApp; const metadata = yield* electronApp.metadata; assert.deepEqual(metadata, { appVersion: "1.2.3", appPath: "/app", isPackaged: true, resourcesPath: process.resourcesPath, runningUnderArm64Translation: false, }); }).pipe(Effect.provide(ElectronApp.layer)), ); it.effect("scopes app event listeners", () => Effect.gen(function* () { const listener = vi.fn(); yield* Effect.scoped( Effect.gen(function* () { const electronApp = yield* ElectronApp.ElectronApp; yield* electronApp.on("activate", listener); }), ); assert.deepEqual(onMock.mock.calls, [["activate", listener]]); assert.deepEqual(removeListenerMock.mock.calls, [["activate", listener]]); }).pipe(Effect.provide(ElectronApp.layer)), ); });