Files
yoi/tests/support/console_notify_admissions.ts

59 lines
2.0 KiB
TypeScript

import { ComposerAdmissions } from "../../web/workspace/src/lib/workspace/console/composer-delivery.ts";
import type {
Event,
Method,
} from "../../web/workspace/src/lib/generated/protocol.ts";
// Rustの実WS結合試験で得たACKを既存Consoleの受付管理へ渡す。
// モデル・ブラウザ描画は対象外。Denoは通常テストrunnerと同じ前提。
type Exchange = {
method: Extract<Method, { method: "notify" }>;
event: Event;
accepted: boolean;
retry: boolean;
};
const exchanges: Exchange[] = JSON.parse(Deno.args[0]);
const admissions = new ComposerAdmissions();
for (const exchange of exchanges) {
const { method, event, accepted, retry } = exchange;
const snapshot = {
document: method.params.message,
content: method.params.message,
segments: [{ kind: "text" as const, content: method.params.message }],
pastes: [],
textPastes: [],
};
const record = admissions.begin("real-worker", method, snapshot, "notify");
if (JSON.stringify(record.method) !== JSON.stringify(method)) {
throw new Error("次のdraftが前の受付に置き換わった");
}
if (retry) {
admissions.disconnected("real-worker");
if (admissions.get("real-worker")?.status !== "unknown") {
throw new Error("ACK消失が拒否または成功になった");
}
if (
JSON.stringify(admissions.retry("real-worker")?.method) !==
JSON.stringify(method)
) {
throw new Error("再送で入力またはIDが変わった");
}
}
const result = admissions.acknowledge("real-worker", event);
if (!result || result.accepted !== accepted) {
throw new Error(
`実WSのACKが元のIDへ相関しない: ${JSON.stringify(exchange)}`,
);
}
if (
accepted
? admissions.get("real-worker") !== null
: admissions.get("real-worker")?.status !== "rejected"
) {
throw new Error("ACK後の受付状態が不正");
}
}
console.log(
`Console accepted/rejected/retry/next-draft: ${exchanges.length} real WS exchanges`,
);