69 lines
2.5 KiB
TypeScript
69 lines
2.5 KiB
TypeScript
import assert from "node:assert/strict";
|
|
import test from "node:test";
|
|
import { WebSocket } from "ws";
|
|
import { LinkRegistry } from "../src/link-server.js";
|
|
import { handleMcpRequest } from "../src/mcp-server.js";
|
|
|
|
test("probe-computers returns no computers message when registry is empty", async () => {
|
|
const registry = new LinkRegistry();
|
|
assert.equal(await registry.probeComputers(10), "No computers connected.");
|
|
});
|
|
|
|
test("probe-computers aggregates multiple successful responses", async () => {
|
|
const registry = new LinkRegistry();
|
|
const computer1 = new FakeSocket();
|
|
const computer2 = new FakeSocket();
|
|
|
|
registry.register({ computerId: 12, label: "base-turtle", ws: computer1 as unknown as WebSocket, connectedAt: 1, lastSeenAt: 1 });
|
|
registry.register({ computerId: 13, label: "miner-1", ws: computer2 as unknown as WebSocket, connectedAt: 1, lastSeenAt: 1 });
|
|
|
|
const promise = registry.probeComputers(50);
|
|
computer1.respond(registry, 12, "pong from 12 (Label: base-turtle)");
|
|
computer2.respond(registry, 13, "pong from 13 (Label: miner-1)");
|
|
|
|
assert.equal(await promise, "pong from 12 (Label: base-turtle)\npong from 13 (Label: miner-1)");
|
|
});
|
|
|
|
test("probe-computers reports timeout for a connected computer that does not answer", async () => {
|
|
const registry = new LinkRegistry();
|
|
registry.register({ computerId: 14, label: "farm-turtle", ws: new FakeSocket() as unknown as WebSocket, connectedAt: 1, lastSeenAt: 1 });
|
|
|
|
assert.equal(await registry.probeComputers(5), "timeout from 14 (Label: farm-turtle)");
|
|
});
|
|
|
|
test("MCP tool call returns text content", async () => {
|
|
const registry = new LinkRegistry();
|
|
const response = await handleMcpRequest(
|
|
{ jsonrpc: "2.0", id: 1, method: "tools/call", params: { name: "probe-computers", arguments: {} } },
|
|
registry,
|
|
10,
|
|
);
|
|
|
|
assert.deepEqual(response, {
|
|
jsonrpc: "2.0",
|
|
id: 1,
|
|
result: { content: [{ type: "text", text: "No computers connected." }] },
|
|
});
|
|
});
|
|
|
|
class FakeSocket {
|
|
sent: unknown[] = [];
|
|
|
|
send(data: unknown): void {
|
|
this.sent.push(data);
|
|
}
|
|
|
|
close(): void {
|
|
return;
|
|
}
|
|
|
|
respond(registry: LinkRegistry, computerId: number, result: string): void {
|
|
const last = this.sent.at(-1);
|
|
assert.equal(typeof last, "string");
|
|
const request = JSON.parse(last as string) as { id: string };
|
|
registry.handleFrame(this as unknown as WebSocket, JSON.stringify({ type: "response", id: request.id, ok: true, result }));
|
|
|
|
assert.equal(computerId > 0, true);
|
|
}
|
|
}
|