Files
pikasTech-agentrun/src/selftest/cases/70-queue-q1.ts
T

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;