mirror of
https://github.com/openclaw/openclaw.git
synced 2026-05-10 02:32:44 +00:00
test(agents): dedupe agent and cron test scaffolds
This commit is contained in:
@@ -74,6 +74,54 @@ describe("sanitizeSessionHistory", () => {
|
||||
},
|
||||
] as unknown as AgentMessage[];
|
||||
|
||||
const makeUsage = (input: number, output: number, totalTokens: number) => ({
|
||||
input,
|
||||
output,
|
||||
cacheRead: 0,
|
||||
cacheWrite: 0,
|
||||
totalTokens,
|
||||
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
||||
});
|
||||
|
||||
const makeAssistantUsageMessage = (params: {
|
||||
text: string;
|
||||
usage: ReturnType<typeof makeUsage>;
|
||||
timestamp?: number;
|
||||
}) =>
|
||||
({
|
||||
role: "assistant",
|
||||
content: [{ type: "text", text: params.text }],
|
||||
stopReason: "stop",
|
||||
...(typeof params.timestamp === "number" ? { timestamp: params.timestamp } : {}),
|
||||
usage: params.usage,
|
||||
}) as unknown as AgentMessage;
|
||||
|
||||
const makeCompactionSummaryMessage = (tokensBefore: number, timestamp: string) =>
|
||||
({
|
||||
role: "compactionSummary",
|
||||
summary: "compressed",
|
||||
tokensBefore,
|
||||
timestamp,
|
||||
}) as unknown as AgentMessage;
|
||||
|
||||
const sanitizeOpenAIHistory = async (
|
||||
messages: AgentMessage[],
|
||||
overrides: Partial<Parameters<SanitizeSessionHistoryFn>[0]> = {},
|
||||
) =>
|
||||
sanitizeSessionHistory({
|
||||
messages,
|
||||
modelApi: "openai-responses",
|
||||
provider: "openai",
|
||||
sessionManager: mockSessionManager,
|
||||
sessionId: TEST_SESSION_ID,
|
||||
...overrides,
|
||||
});
|
||||
|
||||
const getAssistantMessages = (messages: AgentMessage[]) =>
|
||||
messages.filter((message) => message.role === "assistant") as Array<
|
||||
AgentMessage & { usage?: unknown; content?: unknown }
|
||||
>;
|
||||
|
||||
beforeEach(async () => {
|
||||
sanitizeSessionHistory = await loadSanitizeSessionHistoryWithCleanMocks();
|
||||
});
|
||||
@@ -178,34 +226,14 @@ describe("sanitizeSessionHistory", () => {
|
||||
|
||||
const messages = [
|
||||
{ role: "user", content: "old context" },
|
||||
{
|
||||
role: "assistant",
|
||||
content: [{ type: "text", text: "old answer" }],
|
||||
stopReason: "stop",
|
||||
usage: {
|
||||
input: 191_919,
|
||||
output: 2_000,
|
||||
cacheRead: 0,
|
||||
cacheWrite: 0,
|
||||
totalTokens: 193_919,
|
||||
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
||||
},
|
||||
},
|
||||
{
|
||||
role: "compactionSummary",
|
||||
summary: "compressed",
|
||||
tokensBefore: 191_919,
|
||||
timestamp: new Date().toISOString(),
|
||||
},
|
||||
makeAssistantUsageMessage({
|
||||
text: "old answer",
|
||||
usage: makeUsage(191_919, 2_000, 193_919),
|
||||
}),
|
||||
makeCompactionSummaryMessage(191_919, new Date().toISOString()),
|
||||
] as unknown as AgentMessage[];
|
||||
|
||||
const result = await sanitizeSessionHistory({
|
||||
messages,
|
||||
modelApi: "openai-responses",
|
||||
provider: "openai",
|
||||
sessionManager: mockSessionManager,
|
||||
sessionId: TEST_SESSION_ID,
|
||||
});
|
||||
const result = await sanitizeOpenAIHistory(messages);
|
||||
|
||||
const staleAssistant = result.find((message) => message.role === "assistant") as
|
||||
| (AgentMessage & { usage?: unknown })
|
||||
@@ -218,52 +246,21 @@ describe("sanitizeSessionHistory", () => {
|
||||
vi.mocked(helpers.isGoogleModelApi).mockReturnValue(false);
|
||||
|
||||
const messages = [
|
||||
{
|
||||
role: "assistant",
|
||||
content: [{ type: "text", text: "pre-compaction answer" }],
|
||||
stopReason: "stop",
|
||||
usage: {
|
||||
input: 120_000,
|
||||
output: 3_000,
|
||||
cacheRead: 0,
|
||||
cacheWrite: 0,
|
||||
totalTokens: 123_000,
|
||||
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
||||
},
|
||||
},
|
||||
{
|
||||
role: "compactionSummary",
|
||||
summary: "compressed",
|
||||
tokensBefore: 123_000,
|
||||
timestamp: new Date().toISOString(),
|
||||
},
|
||||
makeAssistantUsageMessage({
|
||||
text: "pre-compaction answer",
|
||||
usage: makeUsage(120_000, 3_000, 123_000),
|
||||
}),
|
||||
makeCompactionSummaryMessage(123_000, new Date().toISOString()),
|
||||
{ role: "user", content: "new question" },
|
||||
{
|
||||
role: "assistant",
|
||||
content: [{ type: "text", text: "fresh answer" }],
|
||||
stopReason: "stop",
|
||||
usage: {
|
||||
input: 1_000,
|
||||
output: 250,
|
||||
cacheRead: 0,
|
||||
cacheWrite: 0,
|
||||
totalTokens: 1_250,
|
||||
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
||||
},
|
||||
},
|
||||
makeAssistantUsageMessage({
|
||||
text: "fresh answer",
|
||||
usage: makeUsage(1_000, 250, 1_250),
|
||||
}),
|
||||
] as unknown as AgentMessage[];
|
||||
|
||||
const result = await sanitizeSessionHistory({
|
||||
messages,
|
||||
modelApi: "openai-responses",
|
||||
provider: "openai",
|
||||
sessionManager: mockSessionManager,
|
||||
sessionId: TEST_SESSION_ID,
|
||||
});
|
||||
const result = await sanitizeOpenAIHistory(messages);
|
||||
|
||||
const assistants = result.filter((message) => message.role === "assistant") as Array<
|
||||
AgentMessage & { usage?: unknown }
|
||||
>;
|
||||
const assistants = getAssistantMessages(result);
|
||||
expect(assistants).toHaveLength(2);
|
||||
expect(assistants[0]?.usage).toEqual(makeZeroUsageSnapshot());
|
||||
expect(assistants[1]?.usage).toBeDefined();
|
||||
@@ -274,35 +271,15 @@ describe("sanitizeSessionHistory", () => {
|
||||
|
||||
const compactionTs = Date.parse("2026-02-26T12:00:00.000Z");
|
||||
const messages = [
|
||||
{
|
||||
role: "compactionSummary",
|
||||
summary: "compressed",
|
||||
tokensBefore: 191_919,
|
||||
timestamp: new Date(compactionTs).toISOString(),
|
||||
},
|
||||
{
|
||||
role: "assistant",
|
||||
content: [{ type: "text", text: "kept pre-compaction answer" }],
|
||||
stopReason: "stop",
|
||||
makeCompactionSummaryMessage(191_919, new Date(compactionTs).toISOString()),
|
||||
makeAssistantUsageMessage({
|
||||
text: "kept pre-compaction answer",
|
||||
timestamp: compactionTs - 1_000,
|
||||
usage: {
|
||||
input: 191_919,
|
||||
output: 2_000,
|
||||
cacheRead: 0,
|
||||
cacheWrite: 0,
|
||||
totalTokens: 193_919,
|
||||
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
||||
},
|
||||
},
|
||||
usage: makeUsage(191_919, 2_000, 193_919),
|
||||
}),
|
||||
] as unknown as AgentMessage[];
|
||||
|
||||
const result = await sanitizeSessionHistory({
|
||||
messages,
|
||||
modelApi: "openai-responses",
|
||||
provider: "openai",
|
||||
sessionManager: mockSessionManager,
|
||||
sessionId: TEST_SESSION_ID,
|
||||
});
|
||||
const result = await sanitizeOpenAIHistory(messages);
|
||||
|
||||
const assistant = result.find((message) => message.role === "assistant") as
|
||||
| (AgentMessage & { usage?: unknown })
|
||||
@@ -315,54 +292,23 @@ describe("sanitizeSessionHistory", () => {
|
||||
|
||||
const compactionTs = Date.parse("2026-02-26T12:00:00.000Z");
|
||||
const messages = [
|
||||
{
|
||||
role: "compactionSummary",
|
||||
summary: "compressed",
|
||||
tokensBefore: 123_000,
|
||||
timestamp: new Date(compactionTs).toISOString(),
|
||||
},
|
||||
{
|
||||
role: "assistant",
|
||||
content: [{ type: "text", text: "kept pre-compaction answer" }],
|
||||
stopReason: "stop",
|
||||
makeCompactionSummaryMessage(123_000, new Date(compactionTs).toISOString()),
|
||||
makeAssistantUsageMessage({
|
||||
text: "kept pre-compaction answer",
|
||||
timestamp: compactionTs - 2_000,
|
||||
usage: {
|
||||
input: 120_000,
|
||||
output: 3_000,
|
||||
cacheRead: 0,
|
||||
cacheWrite: 0,
|
||||
totalTokens: 123_000,
|
||||
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
||||
},
|
||||
},
|
||||
usage: makeUsage(120_000, 3_000, 123_000),
|
||||
}),
|
||||
{ role: "user", content: "new question", timestamp: compactionTs + 1_000 },
|
||||
{
|
||||
role: "assistant",
|
||||
content: [{ type: "text", text: "fresh answer" }],
|
||||
stopReason: "stop",
|
||||
makeAssistantUsageMessage({
|
||||
text: "fresh answer",
|
||||
timestamp: compactionTs + 2_000,
|
||||
usage: {
|
||||
input: 1_000,
|
||||
output: 250,
|
||||
cacheRead: 0,
|
||||
cacheWrite: 0,
|
||||
totalTokens: 1_250,
|
||||
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },
|
||||
},
|
||||
},
|
||||
usage: makeUsage(1_000, 250, 1_250),
|
||||
}),
|
||||
] as unknown as AgentMessage[];
|
||||
|
||||
const result = await sanitizeSessionHistory({
|
||||
messages,
|
||||
modelApi: "openai-responses",
|
||||
provider: "openai",
|
||||
sessionManager: mockSessionManager,
|
||||
sessionId: TEST_SESSION_ID,
|
||||
});
|
||||
const result = await sanitizeOpenAIHistory(messages);
|
||||
|
||||
const assistants = result.filter((message) => message.role === "assistant") as Array<
|
||||
AgentMessage & { usage?: unknown; content?: unknown }
|
||||
>;
|
||||
const assistants = getAssistantMessages(result);
|
||||
const keptAssistant = assistants.find((message) =>
|
||||
JSON.stringify(message.content).includes("kept pre-compaction answer"),
|
||||
);
|
||||
@@ -411,13 +357,7 @@ describe("sanitizeSessionHistory", () => {
|
||||
},
|
||||
] as unknown as AgentMessage[];
|
||||
|
||||
const result = await sanitizeSessionHistory({
|
||||
messages,
|
||||
modelApi: "openai-responses",
|
||||
provider: "openai",
|
||||
sessionManager: mockSessionManager,
|
||||
sessionId: TEST_SESSION_ID,
|
||||
});
|
||||
const result = await sanitizeOpenAIHistory(messages);
|
||||
|
||||
// repairToolUseResultPairing now runs for all providers (including OpenAI)
|
||||
// to fix orphaned function_call_output items that OpenAI would reject.
|
||||
@@ -435,13 +375,7 @@ describe("sanitizeSessionHistory", () => {
|
||||
{ role: "user", content: "hello" },
|
||||
] as unknown as AgentMessage[];
|
||||
|
||||
const result = await sanitizeSessionHistory({
|
||||
messages,
|
||||
modelApi: "openai-responses",
|
||||
provider: "openai",
|
||||
sessionManager: mockSessionManager,
|
||||
sessionId: "test-session",
|
||||
});
|
||||
const result = await sanitizeOpenAIHistory(messages, { sessionId: "test-session" });
|
||||
|
||||
expect(result.map((msg) => msg.role)).toEqual(["user"]);
|
||||
});
|
||||
@@ -463,13 +397,7 @@ describe("sanitizeSessionHistory", () => {
|
||||
{ role: "user", content: "hello" },
|
||||
] as unknown as AgentMessage[];
|
||||
|
||||
const result = await sanitizeSessionHistory({
|
||||
messages,
|
||||
modelApi: "openai-responses",
|
||||
provider: "openai",
|
||||
sessionManager: mockSessionManager,
|
||||
sessionId: TEST_SESSION_ID,
|
||||
});
|
||||
const result = await sanitizeOpenAIHistory(messages);
|
||||
|
||||
expect(result.map((msg) => msg.role)).toEqual(["user"]);
|
||||
});
|
||||
@@ -482,13 +410,8 @@ describe("sanitizeSessionHistory", () => {
|
||||
},
|
||||
] as unknown as AgentMessage[];
|
||||
|
||||
const result = await sanitizeSessionHistory({
|
||||
messages,
|
||||
modelApi: "openai-responses",
|
||||
provider: "openai",
|
||||
const result = await sanitizeOpenAIHistory(messages, {
|
||||
allowedToolNames: ["read"],
|
||||
sessionManager: mockSessionManager,
|
||||
sessionId: TEST_SESSION_ID,
|
||||
});
|
||||
|
||||
expect(result).toEqual([]);
|
||||
|
||||
Reference in New Issue
Block a user