80 lines
4.0 KiB
TypeScript
80 lines
4.0 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import { startManagerServer } from "../../mgr/server.js";
|
|
import { MemoryAgentRunStore } from "../../mgr/store.js";
|
|
import { ManagerClient } from "../../mgr/client.js";
|
|
import type { QueueCommanderSnapshot, QueueReadCursorRecord, QueueStats, QueueTaskListResult, QueueTaskRecord } from "../../common/types.js";
|
|
import type { SelfTestCase } from "../harness.js";
|
|
|
|
const selfTest: SelfTestCase = async (context) => {
|
|
const server = await startManagerServer({ port: 0, host: "127.0.0.1", sourceCommit: "self-test", store: new MemoryAgentRunStore() });
|
|
try {
|
|
const client = new ManagerClient(server.baseUrl);
|
|
const input = {
|
|
tenantId: "unidesk",
|
|
projectId: "pikasTech/unidesk",
|
|
queue: "dev",
|
|
lane: "main",
|
|
title: "Q1 queue task",
|
|
priority: 10,
|
|
backendProfile: "codex",
|
|
providerId: "G14",
|
|
workspaceRef: { kind: "host-path", path: context.workspace },
|
|
sessionRef: { sessionId: "sess_queue_q1_selftest", metadata: { source: "queue-q1-self-test" } },
|
|
executionPolicy: null,
|
|
resourceBundleRef: null,
|
|
payload: { prompt: "hello" },
|
|
references: [{ kind: "issue", url: "https://github.com/pikasTech/agentrun/issues/39" }],
|
|
metadata: { source: "self-test" },
|
|
idempotencyKey: "queue-q1-self-test",
|
|
};
|
|
const created = await client.post("/api/v1/queue/tasks", input) as QueueTaskRecord;
|
|
assert.equal(created.state, "pending");
|
|
assert.equal(created.sessionRef?.sessionId, "sess_queue_q1_selftest");
|
|
assert.equal(created.sessionPath, "/api/v1/sessions/sess_queue_q1_selftest");
|
|
assert.equal(created.latestAttempt, null);
|
|
const duplicate = await client.post("/api/v1/queue/tasks", input) as QueueTaskRecord;
|
|
assert.equal(duplicate.id, created.id);
|
|
await assert.rejects(
|
|
() => client.post("/api/v1/queue/tasks", { ...input, sessionRef: { sessionId: "sess_queue_q1_other" } }),
|
|
(error) => error instanceof Error && error.message.includes("idempotency key reused"),
|
|
);
|
|
|
|
const listed = await client.get("/api/v1/queue/tasks?queue=dev&limit=10") as QueueTaskListResult;
|
|
assert.equal(listed.count, 1);
|
|
assert.equal(listed.items[0]?.id, created.id);
|
|
|
|
const shown = await client.get(`/api/v1/queue/tasks/${created.id}`) as QueueTaskRecord;
|
|
assert.equal(shown.title, "Q1 queue task");
|
|
assert.equal(shown.sessionPath, "/api/v1/sessions/sess_queue_q1_selftest");
|
|
|
|
const stats = await client.get("/api/v1/queue/stats?queue=dev") as QueueStats;
|
|
assert.equal(stats.total, 1);
|
|
assert.equal(stats.byState.pending, 1);
|
|
|
|
const read = await client.post(`/api/v1/queue/tasks/${created.id}/read`, { readerId: "self-test" }) as QueueReadCursorRecord;
|
|
assert.equal(read.taskId, created.id);
|
|
assert.equal(read.readerId, "self-test");
|
|
|
|
const cancelled = await client.post(`/api/v1/queue/tasks/${created.id}/cancel`, { reason: "self-test complete" }) as QueueTaskRecord;
|
|
assert.equal(cancelled.state, "cancelled");
|
|
assert.equal(cancelled.cancelReason, "self-test complete");
|
|
|
|
const commander = await client.get("/api/v1/queue/commander?queue=dev") as QueueCommanderSnapshot;
|
|
assert.equal(commander.stats.byState.cancelled, 1);
|
|
assert.equal(commander.items[0]?.id, created.id);
|
|
assert.equal(commander.items[0]?.attentionState, "unread");
|
|
|
|
const terminalRead = await client.post(`/api/v1/queue/tasks/${created.id}/read`, { readerId: "self-test" }) as QueueReadCursorRecord;
|
|
assert.equal(terminalRead.taskVersion, cancelled.version);
|
|
const readCommander = await client.get("/api/v1/queue/commander?queue=dev&readerId=self-test") as QueueCommanderSnapshot;
|
|
assert.equal(readCommander.readerId, "self-test");
|
|
assert.equal(readCommander.stats.byState.cancelled, 1);
|
|
assert.equal(readCommander.items.some((item) => item.id === created.id), false);
|
|
return { name: "queue-q1", tests: ["queue-q1-rest-memory"] };
|
|
} finally {
|
|
await new Promise<void>((resolve) => server.server.close(() => resolve()));
|
|
}
|
|
};
|
|
|
|
export default selfTest;
|