smoke.test.ts 1.5 KB

123456789101112131415161718192021222324252627
  1. import assert from "node:assert/strict";
  2. import test from "node:test";
  3. import { AppServerClient } from "../src/app-server-client.js";
  4. import { runReadOnlySmoke } from "../src/smoke.js";
  5. import { FakeAppServer, rawThread, successfulHandshake } from "./fake-app-server.js";
  6. test("opt-in smoke workflow synchronizes, classifies, inspects, and stays read-only", async () => {
  7. const fake = new FakeAppServer(successfulHandshake((request, server) => {
  8. if (request.method === "thread/list") {
  9. server.respond(request, { data: [rawThread("current", { status: { type: "idle" } })], nextCursor: null, backwardsCursor: null });
  10. } else if (request.method === "thread/loaded/list") {
  11. server.respond(request, { data: ["current"], nextCursor: null });
  12. } else if (request.method === "thread/read") {
  13. server.respond(request, { thread: rawThread("current", { status: { type: "idle" } }) });
  14. }
  15. }));
  16. const result = await runReadOnlySmoke(new AppServerClient({
  17. url: "ws://127.0.0.1:4500",
  18. webSocketFactory: fake.factory,
  19. }), "ws://127.0.0.1:4500");
  20. assert.equal(result.inspectedThreadId, "current");
  21. assert.equal(result.inspectedStatus, "idle");
  22. assert.deepEqual(result.emittedMethods, ["thread/list", "thread/loaded/list", "thread/read"]);
  23. const permitted = new Set(["initialize", "initialized", ...result.emittedMethods]);
  24. assert.deepEqual(fake.frames.map((frame) => frame.method as string).filter((method) => !permitted.has(method)), []);
  25. });