Files
diegosouzapw--omniroute/tests/unit/system-role-extraction.test.ts
2026-07-13 13:39:12 +08:00

138 lines
4.3 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
import { extractSystemRoleMessages } from "../../open-sse/handlers/chatCore.ts";
test("extractSystemRoleMessages moves role=system to top-level system", () => {
const payload = {
messages: [
{ role: "system", content: "Memory context: foo" },
{ role: "user", content: "hello" },
{ role: "assistant", content: "hi" },
],
};
extractSystemRoleMessages(payload);
assert.equal(payload.messages.length, 2);
assert.equal(payload.messages[0].role, "user");
assert.deepEqual(payload.system, [{ type: "text", text: "Memory context: foo" }]);
});
test("extractSystemRoleMessages also lifts role=developer (OpenAI Responses system alias)", () => {
const payload = {
messages: [
{ role: "developer", content: "Dev instructions" },
{ role: "system", content: "Sys context" },
{ role: "user", content: "hello" },
],
};
extractSystemRoleMessages(payload);
// both developer and system are removed from messages and lifted into system
assert.equal(payload.messages.length, 1);
assert.equal(payload.messages[0].role, "user");
assert.deepEqual(payload.system, [
{ type: "text", text: "Dev instructions" },
{ type: "text", text: "Sys context" },
]);
});
test("extractSystemRoleMessages merges with existing top-level system string", () => {
const payload = {
system: "You are Claude.",
messages: [
{ role: "system", content: "Memory context: bar" },
{ role: "user", content: "hello" },
],
};
extractSystemRoleMessages(payload);
assert.equal(payload.messages.length, 1);
assert.deepEqual(payload.system, [
{ type: "text", text: "You are Claude." },
{ type: "text", text: "Memory context: bar" },
]);
});
test("extractSystemRoleMessages merges with existing top-level system array", () => {
const payload = {
system: [{ type: "text", text: "Existing system" }],
messages: [
{ role: "system", content: "Memory context: baz" },
{ role: "user", content: "hello" },
],
};
extractSystemRoleMessages(payload);
assert.equal(payload.messages.length, 1);
assert.deepEqual(payload.system, [
{ type: "text", text: "Existing system" },
{ type: "text", text: "Memory context: baz" },
]);
});
test("extractSystemRoleMessages does nothing when no system role messages", () => {
const payload = {
messages: [
{ role: "user", content: "hello" },
{ role: "assistant", content: "hi" },
],
};
extractSystemRoleMessages(payload);
assert.equal(payload.messages.length, 2);
assert.equal(payload.system, undefined);
});
test("extractSystemRoleMessages handles non-array messages gracefully", () => {
const payload = { messages: "not-an-array" };
extractSystemRoleMessages(payload);
assert.equal(payload.messages, "not-an-array");
});
test("extractSystemRoleMessages handles empty messages array", () => {
const payload = { messages: [] };
extractSystemRoleMessages(payload);
assert.equal(payload.messages.length, 0);
});
test("extractSystemRoleMessages handles case-insensitive role System", () => {
const payload = {
messages: [
{ role: "System", content: "Memory context: caps" },
{ role: "user", content: "hello" },
],
};
extractSystemRoleMessages(payload);
assert.equal(payload.messages.length, 1);
assert.deepEqual(payload.system, [{ type: "text", text: "Memory context: caps" }]);
});
test("extractSystemRoleMessages drops empty text content from system messages", () => {
const payload = {
messages: [
{ role: "system", content: "" },
{ role: "system", content: "valid" },
{ role: "user", content: "hello" },
],
};
extractSystemRoleMessages(payload);
assert.equal(payload.messages.length, 1);
assert.deepEqual(payload.system, [{ type: "text", text: "valid" }]);
});
test("extractSystemRoleMessages handles system messages with array content", () => {
const payload = {
messages: [
{
role: "system",
content: [
{ type: "text", text: "Block 1" },
{ type: "text", text: "Block 2" },
],
},
{ role: "user", content: "hello" },
],
};
extractSystemRoleMessages(payload);
assert.equal(payload.messages.length, 1);
assert.deepEqual(payload.system, [
{ type: "text", text: "Block 1" },
{ type: "text", text: "Block 2" },
]);
});