import { beforeAll, beforeEach, describe, expect, it, vi } from "vitest" ;
const statusSummaryMocks = vi.hoisted(() => ({
hasConfiguredChannelsForReadOnlyScope: vi.fn(() => true ),
buildChannelSummary: vi.fn(async () => ["ok" ]),
}));
vi.mock("../plugins/channel-plugin-ids.js" , () => ({
hasConfiguredChannelsForReadOnlyScope: statusSummaryMocks.hasConfiguredChannelsForReadOnlyScope,
}));
vi.mock("./status.summary.runtime.js" , () => ({
statusSummaryRuntime: {
classifySessionKey: vi.fn(() => "direct" ),
resolveConfiguredStatusModelRef: vi.fn(() => ({
provider: "openai" ,
model: "gpt-5.5" ,
})),
resolveSessionModelRef: vi.fn(() => ({
provider: "openai" ,
model: "gpt-5.5" ,
})),
resolveContextTokensForModel: vi.fn(() => 200 _000 ),
},
}));
vi.mock("../agents/defaults.js" , () => ({
DEFAULT_CONTEXT_TOKENS: 200 _000 ,
DEFAULT_MODEL: "gpt-5.5" ,
DEFAULT_PROVIDER: "openai" ,
}));
vi.mock("../config/io.js" , () => ({
loadConfig: vi.fn(() => ({})),
}));
vi.mock("../gateway/agent-list.js" , () => ({
listGatewayAgentsBasic: vi.fn(() => ({
defaultId: "main" ,
agents: [{ id: "main" }],
})),
}));
vi.mock("../infra/channel-summary.js" , () => ({
buildChannelSummary: statusSummaryMocks.buildChannelSummary,
}));
vi.mock("../infra/heartbeat-summary.js" , () => ({
resolveHeartbeatSummaryForAgent: vi.fn(() => ({
enabled: true ,
every: "5m" ,
everyMs: 300 _000 ,
})),
}));
vi.mock("../infra/system-events.js" , () => ({
peekSystemEvents: vi.fn(() => []),
}));
vi.mock("../tasks/task-registry.maintenance.js" , () => ({
getInspectableTaskRegistrySummary: vi.fn(() => ({
total: 0 ,
active: 0 ,
terminal: 0 ,
failures: 0 ,
byStatus: {
queued: 0 ,
running: 0 ,
succeeded: 0 ,
failed: 0 ,
timed_out: 0 ,
cancelled: 0 ,
lost: 0 ,
},
byRuntime: {
subagent: 0 ,
acp: 0 ,
cli: 0 ,
cron: 0 ,
},
})),
getInspectableTaskAuditSummary: vi.fn(() => ({
total: 1 ,
warnings: 1 ,
errors: 0 ,
byCode: {
stale_queued: 0 ,
stale_running: 0 ,
lost: 0 ,
delivery_failed: 1 ,
missing_cleanup: 0 ,
inconsistent_timestamps: 0 ,
},
})),
}));
vi.mock("../routing/session-key.js" , () => ({
normalizeAgentId: vi.fn((value: string) => value),
normalizeMainKey: vi.fn((value?: string) => value ?? "main" ),
parseAgentSessionKey: vi.fn(() => null ),
}));
vi.mock("../version.js" , async () => {
const actual = await vi.importActual<typeof import ("../version.js" )>("../version.js" );
return {
...actual,
resolveRuntimeServiceVersion: vi.fn(() => "2026.3.8" ),
};
});
vi.mock("./status.link-channel.js" , () => ({
resolveLinkChannelContext: vi.fn(async () => undefined),
}));
const { buildChannelSummary } = await import ("../infra/channel-summary.js" );
const { resolveLinkChannelContext } = await import ("./status.link-channel.js" );
let getStatusSummary: typeof import ("./status.summary.js" ).getStatusSummary;
let statusSummaryRuntime: typeof import ("./status.summary.runtime.js" ).statusSummaryRuntime;
describe("getStatusSummary" , () => {
beforeAll(async () => {
({ getStatusSummary } = await import ("./status.summary.js" ));
({ statusSummaryRuntime } = await import ("./status.summary.runtime.js" ));
});
beforeEach(() => {
vi.clearAllMocks();
statusSummaryMocks.hasConfiguredChannelsForReadOnlyScope.mockReturnValue(true );
statusSummaryMocks.buildChannelSummary.mockResolvedValue(["ok" ]);
});
it("includes runtimeVersion in the status payload" , async () => {
const summary = await getStatusSummary();
expect(summary.runtimeVersion).toBe("2026.3.8" );
expect(summary.heartbeat.defaultAgentId).toBe("main" );
expect(summary.channelSummary).toEqual(["ok" ]);
expect(summary.tasks.active).toBe(0 );
expect(summary.taskAudit.warnings).toBe(1 );
});
it("skips channel summary imports when no channels are configured" , async () => {
statusSummaryMocks.hasConfiguredChannelsForReadOnlyScope.mockReturnValue(false );
const summary = await getStatusSummary();
expect(summary.channelSummary).toEqual([]);
expect(summary.linkChannel).toBeUndefined();
expect(statusSummaryMocks.hasConfiguredChannelsForReadOnlyScope).toHaveBeenCalledWith({
config: {},
});
expect(buildChannelSummary).not.toHaveBeenCalled();
expect(resolveLinkChannelContext).not.toHaveBeenCalled();
});
it("skips channel summary imports when explicitly disabled" , async () => {
const summary = await getStatusSummary({ includeChannelSummary: false });
expect(summary.channelSummary).toEqual([]);
expect(summary.linkChannel).toBeUndefined();
expect(statusSummaryMocks.hasConfiguredChannelsForReadOnlyScope).not.toHaveBeenCalled();
expect(buildChannelSummary).not.toHaveBeenCalled();
expect(resolveLinkChannelContext).not.toHaveBeenCalled();
});
it("does not trigger async context warmup while building status summaries" , async () => {
await getStatusSummary();
expect(vi.mocked(statusSummaryRuntime.resolveContextTokensForModel)).toHaveBeenCalledWith(
expect.objectContaining({ allowAsyncLoad: false }),
);
});
});
Messung V0.5 in Prozent C=100 H=100 G=100
¤ Dauer der Verarbeitung: 0.11 Sekunden
(vorverarbeitet am 2026-06-10)
¤
*© Formatika GbR, Deutschland