refactor(attempt-tests): share wrapped stream helper

This commit is contained in:
Peter Steinberger 2026-03-17 07:22:47 +00:00
parent 9c047c5423
commit 1843248c69

View File

@ -17,6 +17,11 @@ import {
wrapStreamFnTrimToolCallNames,
} from "./attempt.js";
type FakeWrappedStream = {
result: () => Promise<unknown>;
[Symbol.asyncIterator]: () => AsyncIterator<unknown>;
};
function createOllamaProviderConfig(injectNumCtxForOpenAICompat: boolean): OpenClawConfig {
return {
models: {
@ -32,6 +37,34 @@ function createOllamaProviderConfig(injectNumCtxForOpenAICompat: boolean): OpenC
};
}
function createFakeStream(params: {
events: unknown[];
resultMessage: unknown;
}): FakeWrappedStream {
return {
async result() {
return params.resultMessage;
},
[Symbol.asyncIterator]() {
return (async function* () {
for (const event of params.events) {
yield event;
}
})();
},
};
}
async function invokeWrappedTestStream(
wrap: (
baseFn: (...args: never[]) => unknown,
) => (...args: never[]) => FakeWrappedStream | Promise<FakeWrappedStream>,
baseFn: (...args: never[]) => unknown,
): Promise<FakeWrappedStream> {
const wrappedFn = wrap(baseFn);
return await Promise.resolve(wrappedFn({} as never, {} as never, {} as never));
}
describe("resolvePromptBuildHookResult", () => {
function createLegacyOnlyHookRunner() {
return {
@ -190,30 +223,14 @@ describe("resolveAttemptFsWorkspaceOnly", () => {
});
});
describe("wrapStreamFnTrimToolCallNames", () => {
function createFakeStream(params: { events: unknown[]; resultMessage: unknown }): {
result: () => Promise<unknown>;
[Symbol.asyncIterator]: () => AsyncIterator<unknown>;
} {
return {
async result() {
return params.resultMessage;
},
[Symbol.asyncIterator]() {
return (async function* () {
for (const event of params.events) {
yield event;
}
})();
},
};
}
async function invokeWrappedStream(
baseFn: (...args: never[]) => unknown,
allowedToolNames?: Set<string>,
) {
const wrappedFn = wrapStreamFnTrimToolCallNames(baseFn as never, allowedToolNames);
return await wrappedFn({} as never, {} as never, {} as never);
return await invokeWrappedTestStream(
(innerBaseFn) => wrapStreamFnTrimToolCallNames(innerBaseFn as never, allowedToolNames),
baseFn,
);
}
function createEventStream(params: {
@ -725,27 +742,11 @@ describe("wrapStreamFnTrimToolCallNames", () => {
});
describe("wrapStreamFnRepairMalformedToolCallArguments", () => {
function createFakeStream(params: { events: unknown[]; resultMessage: unknown }): {
result: () => Promise<unknown>;
[Symbol.asyncIterator]: () => AsyncIterator<unknown>;
} {
return {
async result() {
return params.resultMessage;
},
[Symbol.asyncIterator]() {
return (async function* () {
for (const event of params.events) {
yield event;
}
})();
},
};
}
async function invokeWrappedStream(baseFn: (...args: never[]) => unknown) {
const wrappedFn = wrapStreamFnRepairMalformedToolCallArguments(baseFn as never);
return await wrappedFn({} as never, {} as never, {} as never);
return await invokeWrappedTestStream(
(innerBaseFn) => wrapStreamFnRepairMalformedToolCallArguments(innerBaseFn as never),
baseFn,
);
}
it("repairs anthropic-compatible tool arguments when trailing junk follows valid JSON", async () => {