feat(FN-3053): consolidate mock helpers across CLI, dashboard, and engine p

The merge consolidates mock helpers across packages by creating a new shared `mockCoreEngine.ts` in the CLI package and strengthening the core/engine helpers, then migrating both CLI command tests and the dashboard's `AgentsView` tests to use the canonical helpers. It also publishes SSE architecture

Fusion-Task-Id: FN-3053
This commit is contained in:
Fusion
2026-05-01 05:02:16 -07:00
committed by gsxdsm
parent 5e51542a1d
commit eaf9d6adf9
10 changed files with 226 additions and 47 deletions

View File

@@ -452,7 +452,9 @@ const mocks = vi.hoisted(() => {
};
});
vi.mock("@fusion/core", () => ({
vi.mock("@fusion/core", async (importOriginal) => {
const { createCliCoreMock } = await import("../../test/mockCoreEngine");
return createCliCoreMock(() => importOriginal<typeof import("@fusion/core")>(), {
TaskStore: mocks.taskStoreCtor,
AutomationStore: mocks.automationStoreCtor,
AgentStore: mocks.agentStoreCtor,
@@ -474,7 +476,8 @@ vi.mock("@fusion/core", () => ({
syncInsightExtractionAutomation: mocks.syncInsightExtractionAutomationMock,
INSIGHT_EXTRACTION_SCHEDULE_NAME: "Memory Insight Extraction",
processAndAuditInsightExtraction: mocks.processAndAuditInsightExtractionMock,
}));
});
});
vi.mock("@fusion/dashboard", () => ({
createServer: mocks.createServerMock,
@@ -484,7 +487,9 @@ vi.mock("@fusion/dashboard", () => ({
loadTlsCredentialsFromEnv: vi.fn().mockReturnValue(undefined),
}));
vi.mock("@fusion/engine", () => ({
vi.mock("@fusion/engine", async (importOriginal) => {
const { createCliEngineMock } = await import("../../test/mockCoreEngine");
return createCliEngineMock(() => importOriginal<typeof import("@fusion/engine")>(), {
ProjectEngine: mocks.projectEngineCtor,
ProjectEngineManager: vi.fn().mockImplementation((centralCore: any, options: any) => {
const engines = new Map<string, any>();
@@ -546,7 +551,8 @@ vi.mock("@fusion/engine", () => ({
createAiPromptExecutor: mocks.createAiPromptExecutorMock,
HeartbeatMonitor: mocks.heartbeatMonitorCtor,
HeartbeatTriggerScheduler: mocks.heartbeatTriggerSchedulerCtor,
}));
});
});
vi.mock("@mariozechner/pi-coding-agent", () => ({
AuthStorage: {

View File

@@ -105,7 +105,9 @@ function makeMockStore() {
// ── Mock @fusion/core ──────────────────────────────────────────────────
vi.mock("@fusion/core", () => ({
vi.mock("@fusion/core", async (importOriginal) => {
const { createCliCoreMock } = await import("../../test/mockCoreEngine");
return createCliCoreMock(() => importOriginal<typeof import("@fusion/core")>(), {
TaskStore: vi.fn().mockImplementation(() => makeMockStore()),
CentralCore: vi.fn().mockImplementation(() => ({
init: vi.fn().mockResolvedValue(undefined),
@@ -205,7 +207,8 @@ vi.mock("@fusion/core", () => ({
}
return undefined;
}),
}));
});
});
// ── Hoisted shared mocks ───────────────────────────────────────────
@@ -305,6 +308,7 @@ const { WorktreePool } = await import("@fusion/engine");
vi.mock("@fusion/engine", async (importOriginal) => {
const original = await importOriginal<typeof import("@fusion/engine")>();
const { createCliEngineMock } = await import("../../test/mockCoreEngine");
const TriageProcessor = vi.fn().mockImplementation(() => ({
start: vi.fn(),
stop: vi.fn(),
@@ -610,8 +614,7 @@ vi.mock("@fusion/engine", async (importOriginal) => {
}
}
return {
...original,
return createCliEngineMock(async () => original, {}, {
// Keep real WorktreePool & AgentSemaphore
WorktreePool: original.WorktreePool,
AgentSemaphore: original.AgentSemaphore,
@@ -681,7 +684,7 @@ vi.mock("@fusion/engine", async (importOriginal) => {
})),
scanIdleWorktrees: vi.fn().mockResolvedValue([]),
cleanupOrphanedWorktrees: vi.fn().mockResolvedValue(0),
};
});
});
// ── Mock @mariozechner/pi-coding-agent ──────────────────────────────

View File

@@ -511,7 +511,9 @@ const mocks = vi.hoisted(() => {
};
});
vi.mock("@fusion/core", () => ({
vi.mock("@fusion/core", async (importOriginal) => {
const { createCliCoreMock } = await import("../../test/mockCoreEngine");
return createCliCoreMock(() => importOriginal<typeof import("@fusion/core")>(), {
TaskStore: mocks.taskStoreCtor,
AutomationStore: mocks.automationStoreCtor,
AgentStore: mocks.agentStoreCtor,
@@ -530,7 +532,8 @@ vi.mock("@fusion/core", () => ({
})),
GlobalSettingsStore: vi.fn().mockImplementation(() => ({})),
resolveGlobalDir: vi.fn().mockReturnValue("/mock/global"),
}));
});
});
vi.mock("@fusion/dashboard", () => ({
createServer: mocks.createServerMock,
@@ -540,7 +543,9 @@ vi.mock("@fusion/dashboard", () => ({
loadTlsCredentialsFromEnv: vi.fn().mockReturnValue(undefined),
}));
vi.mock("@fusion/engine", () => ({
vi.mock("@fusion/engine", async (importOriginal) => {
const { createCliEngineMock } = await import("../../test/mockCoreEngine");
return createCliEngineMock(() => importOriginal<typeof import("@fusion/engine")>(), {
ProjectEngine: mocks.projectEngineCtor,
ProjectEngineManager: vi.fn().mockImplementation((centralCore: any, options: any) => {
const engines = new Map<string, any>();
@@ -606,7 +611,8 @@ vi.mock("@fusion/engine", () => ({
createAiPromptExecutor: mocks.createAiPromptExecutorMock,
HeartbeatMonitor: mocks.heartbeatMonitorCtor,
HeartbeatTriggerScheduler: mocks.heartbeatTriggerSchedulerCtor,
}));
});
});
vi.mock("@mariozechner/pi-coding-agent", () => ({
AuthStorage: {