Files
sync-server-v2/tests/services/stream/stream.test.ts
T
2026-07-27 09:32:54 +00:00

63 lines
1.6 KiB
TypeScript

import { describe, expect, it, vi } from "vitest";
import { HonoSSEStream } from "../../../src/services/stream/hono-sse-stream.js";
import { HttpRequestStream } from "../../../src/services/stream/http-request-stream.js";
import { WSStream } from "../../../src/services/stream/ws-stream.js";
describe("stream lifecycle observers", () => {
it("buffers exactly one normal HTTP response", async () => {
const stream = new HttpRequestStream();
await stream.send({
type: "response",
statusCode: 200,
body: { ok: true },
});
expect(stream.getResponse()).toEqual({
type: "response",
statusCode: 200,
body: { ok: true },
});
await expect(
stream.send({
type: "response",
statusCode: 200,
body: { second: true },
}),
).rejects.toThrow("only send one response");
});
it("notifies WebSocket observers registered after remote closure", () => {
const stream = new WSStream({
send: vi.fn(),
close: vi.fn(),
readyState: 1,
});
const onClose = vi.fn();
stream.markClosed();
stream.onClose(onClose);
expect(onClose).toHaveBeenCalledOnce();
});
it("notifies SSE observers registered after local closure", () => {
const streamApi = {
writeSSE: vi.fn(),
close: vi.fn(),
};
const stream = new HonoSSEStream(
streamApi as unknown as ConstructorParameters<typeof HonoSSEStream>[0],
);
const onClose = vi.fn();
stream.close();
stream.onClose(onClose);
stream.close();
expect(streamApi.close).toHaveBeenCalledOnce();
expect(onClose).toHaveBeenCalledOnce();
});
});