test(slack): type draft stream harness callbacks

This commit is contained in:
Peter Steinberger
2026-02-18 13:02:59 +00:00
parent 7b46f2c17f
commit 53ad08f319

View File

@@ -1,24 +1,30 @@
import { describe, expect, it, vi } from "vitest"; import { describe, expect, it, vi } from "vitest";
import { createSlackDraftStream } from "./draft-stream.js"; import { createSlackDraftStream } from "./draft-stream.js";
type DraftStreamParams = Parameters<typeof createSlackDraftStream>[0];
type DraftSendFn = NonNullable<DraftStreamParams["send"]>;
type DraftEditFn = NonNullable<DraftStreamParams["edit"]>;
type DraftRemoveFn = NonNullable<DraftStreamParams["remove"]>;
type DraftWarnFn = NonNullable<DraftStreamParams["warn"]>;
function createDraftStreamHarness( function createDraftStreamHarness(
params: { params: {
maxChars?: number; maxChars?: number;
send?: ReturnType<typeof vi.fn>; send?: DraftSendFn;
edit?: ReturnType<typeof vi.fn>; edit?: DraftEditFn;
remove?: ReturnType<typeof vi.fn>; remove?: DraftRemoveFn;
warn?: ReturnType<typeof vi.fn>; warn?: DraftWarnFn;
} = {}, } = {},
) { ) {
const send = const send =
params.send ?? params.send ??
vi.fn(async () => ({ vi.fn<DraftSendFn>(async () => ({
channelId: "C123", channelId: "C123",
messageId: "111.222", messageId: "111.222",
})); }));
const edit = params.edit ?? vi.fn(async () => {}); const edit = params.edit ?? vi.fn<DraftEditFn>(async () => {});
const remove = params.remove ?? vi.fn(async () => {}); const remove = params.remove ?? vi.fn<DraftRemoveFn>(async () => {});
const warn = params.warn ?? vi.fn(); const warn = params.warn ?? vi.fn<DraftWarnFn>();
const stream = createSlackDraftStream({ const stream = createSlackDraftStream({
target: "channel:C123", target: "channel:C123",
token: "xoxb-test", token: "xoxb-test",
@@ -63,7 +69,7 @@ describe("createSlackDraftStream", () => {
it("supports forceNewMessage for subsequent assistant messages", async () => { it("supports forceNewMessage for subsequent assistant messages", async () => {
const send = vi const send = vi
.fn() .fn<DraftSendFn>()
.mockResolvedValueOnce({ channelId: "C123", messageId: "111.222" }) .mockResolvedValueOnce({ channelId: "C123", messageId: "111.222" })
.mockResolvedValueOnce({ channelId: "C123", messageId: "333.444" }); .mockResolvedValueOnce({ channelId: "C123", messageId: "333.444" });
const { stream, edit } = createDraftStreamHarness({ send }); const { stream, edit } = createDraftStreamHarness({ send });
@@ -117,10 +123,10 @@ describe("createSlackDraftStream", () => {
}); });
it("clear warns when cleanup fails", async () => { it("clear warns when cleanup fails", async () => {
const remove = vi.fn(async () => { const remove = vi.fn<DraftRemoveFn>(async () => {
throw new Error("cleanup failed"); throw new Error("cleanup failed");
}); });
const warn = vi.fn(); const warn = vi.fn<DraftWarnFn>();
const { stream } = createDraftStreamHarness({ remove, warn }); const { stream } = createDraftStreamHarness({ remove, warn });
stream.update("hello"); stream.update("hello");