From 9489bc63f8fc74909e8aa896fd4ed4d78bf7d918 Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Sat, 7 Mar 2026 13:47:49 -0600 Subject: [PATCH] test(orchestrator): add mission-control phase 1 gate coverage --- .../mission-control.controller.spec.ts | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 apps/orchestrator/src/api/mission-control/mission-control.controller.spec.ts diff --git a/apps/orchestrator/src/api/mission-control/mission-control.controller.spec.ts b/apps/orchestrator/src/api/mission-control/mission-control.controller.spec.ts new file mode 100644 index 0000000..ada0606 --- /dev/null +++ b/apps/orchestrator/src/api/mission-control/mission-control.controller.spec.ts @@ -0,0 +1,67 @@ +import { beforeEach, describe, expect, it, vi } from "vitest"; +import type { AgentSession } from "@mosaic/shared"; +import type { PrismaService } from "../../prisma/prisma.service"; +import { AgentProviderRegistry } from "../agents/agent-provider.registry"; +import { MissionControlController } from "./mission-control.controller"; +import { MissionControlService } from "./mission-control.service"; + +describe("MissionControlController", () => { + let controller: MissionControlController; + let registry: { + listAllSessions: ReturnType; + getProviderForSession: ReturnType; + }; + + beforeEach(() => { + registry = { + listAllSessions: vi.fn(), + getProviderForSession: vi.fn(), + }; + + const prisma = { + operatorAuditLog: { + create: vi.fn().mockResolvedValue(undefined), + }, + }; + + const service = new MissionControlService( + registry as unknown as AgentProviderRegistry, + prisma as unknown as PrismaService + ); + + controller = new MissionControlController(service); + }); + + it("Phase 1 gate: unified sessions endpoint returns internal provider sessions", async () => { + const internalSession: AgentSession = { + id: "session-internal-1", + providerId: "internal", + providerType: "internal", + status: "active", + createdAt: new Date("2026-03-07T20:00:00.000Z"), + updatedAt: new Date("2026-03-07T20:01:00.000Z"), + }; + + const externalSession: AgentSession = { + id: "session-openclaw-1", + providerId: "openclaw", + providerType: "external", + status: "active", + createdAt: new Date("2026-03-07T20:02:00.000Z"), + updatedAt: new Date("2026-03-07T20:03:00.000Z"), + }; + + registry.listAllSessions.mockResolvedValue([internalSession, externalSession]); + + const response = await controller.listSessions(); + + expect(registry.listAllSessions).toHaveBeenCalledTimes(1); + expect(response.sessions).toEqual([internalSession, externalSession]); + expect(response.sessions).toContainEqual( + expect.objectContaining({ + id: "session-internal-1", + providerId: "internal", + }) + ); + }); +});