// redteam r3-4 회귀: macOS Dock 아이콘 클릭('activate')이 트레이로 숨긴 메인 창을 다시 띄운다. // 예전엔 'activate' 리스너가 없어 closeToTray(기본 true)로 창을 닫은 뒤 Dock 으로 돌아올 수 없었다. import { describe, expect, it, vi } from 'vitest' type Listener = (...args: unknown[]) => void const state = vi.hoisted(() => ({ appListeners: new Map(), showMainWindow: vi.fn(() => null), })) vi.mock('electron', () => ({ app: { on: vi.fn((event: string, listener: Listener) => { state.appListeners.set(event, listener) }), // 부트스트랩은 이 테스트의 관심사가 아니다 — ready 를 오지 않게 둔다 whenReady: vi.fn(() => new Promise(() => undefined)), setAsDefaultProtocolClient: vi.fn(), requestSingleInstanceLock: vi.fn(() => true), disableHardwareAcceleration: vi.fn(), commandLine: { appendSwitch: vi.fn() }, exit: vi.fn(), getPath: vi.fn(() => '.'), }, })) vi.mock('../../src/main/app-identity', () => ({ applyAppIdentity: vi.fn() })) vi.mock('../../src/main/bootstrap', () => ({ bootstrap: vi.fn(async () => undefined) })) vi.mock('../../src/main/lifecycle', () => ({ setupLifecycle: vi.fn() })) vi.mock('../../src/main/windows/WindowManager', () => ({ showMainWindow: state.showMainWindow })) vi.mock('../../src/main/services/LoggerService', () => ({ getLogger: () => ({ info: vi.fn(), warn: vi.fn(), error: vi.fn(), debug: vi.fn() }), })) describe("app 'activate' (macOS Dock 클릭)", () => { it('메인 창을 다시 띄운다', async () => { await import('../../src/main/index') const activate = state.appListeners.get('activate') expect(activate).toBeTypeOf('function') activate?.() expect(state.showMainWindow).toHaveBeenCalledTimes(1) }) })