43 lines
1.3 KiB
TypeScript
43 lines
1.3 KiB
TypeScript
import { describe, expect, it, vi } from "vitest";
|
|
|
|
import { createSafeStreamWriter } from "./stream-writer.js";
|
|
|
|
describe("createSafeStreamWriter", () => {
|
|
it("signals broken pipes and closes the writer", () => {
|
|
const onBrokenPipe = vi.fn();
|
|
const writer = createSafeStreamWriter({ onBrokenPipe });
|
|
const stream = {
|
|
write: vi.fn(() => {
|
|
const err = new Error("EPIPE") as NodeJS.ErrnoException;
|
|
err.code = "EPIPE";
|
|
throw err;
|
|
}),
|
|
} as unknown as NodeJS.WriteStream;
|
|
|
|
expect(writer.writeLine(stream, "hello")).toBe(false);
|
|
expect(writer.isClosed()).toBe(true);
|
|
expect(onBrokenPipe).toHaveBeenCalledTimes(1);
|
|
|
|
onBrokenPipe.mockClear();
|
|
expect(writer.writeLine(stream, "again")).toBe(false);
|
|
expect(onBrokenPipe).toHaveBeenCalledTimes(0);
|
|
});
|
|
|
|
it("treats broken pipes from beforeWrite as closed", () => {
|
|
const onBrokenPipe = vi.fn();
|
|
const writer = createSafeStreamWriter({
|
|
onBrokenPipe,
|
|
beforeWrite: () => {
|
|
const err = new Error("EIO") as NodeJS.ErrnoException;
|
|
err.code = "EIO";
|
|
throw err;
|
|
},
|
|
});
|
|
const stream = { write: vi.fn(() => true) } as unknown as NodeJS.WriteStream;
|
|
|
|
expect(writer.write(stream, "hi")).toBe(false);
|
|
expect(writer.isClosed()).toBe(true);
|
|
expect(onBrokenPipe).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|