OmniRoute/tests/integration/batch-processor-escaping.test.ts
Diego Rodrigues de Sa e Souza 3d75fb3fae
Some checks are pending
Build Fork Image (ghcr.io) / Build and Push to ghcr.io (push) Waiting to run
CI / Security Tests (push) Blocked by required conditions
CI / Lint (push) Waiting to run
CI / Build language matrix (push) Waiting to run
CI / i18n Validation (push) Blocked by required conditions
CI / PR Test Policy (push) Waiting to run
CI / Build (push) Waiting to run
CI / Package Artifact (push) Blocked by required conditions
CI / Electron Package Smoke (push) Blocked by required conditions
CI / Unit Tests (1/2) (push) Blocked by required conditions
CI / Unit Tests (2/2) (push) Blocked by required conditions
CI / Node 24 Compatibility (1/2) (push) Blocked by required conditions
CI / Node 24 Compatibility (2/2) (push) Blocked by required conditions
CI / Node 26 Compatibility (1/2) (push) Blocked by required conditions
CI / Node 26 Compatibility (2/2) (push) Blocked by required conditions
CI / Coverage (push) Blocked by required conditions
CI / SonarQube (push) Blocked by required conditions
CI / PR Coverage Comment (push) Blocked by required conditions
CI / E2E Tests (1/6) (push) Blocked by required conditions
CI / E2E Tests (2/6) (push) Blocked by required conditions
CI / E2E Tests (3/6) (push) Blocked by required conditions
CI / E2E Tests (4/6) (push) Blocked by required conditions
CI / E2E Tests (5/6) (push) Blocked by required conditions
CI / E2E Tests (6/6) (push) Blocked by required conditions
CI / Integration Tests (1/2) (push) Blocked by required conditions
CI / Integration Tests (2/2) (push) Blocked by required conditions
CI / CI Dashboard (push) Blocked by required conditions
Publish to Docker Hub / Build and Push Docker (multi-arch) (push) Waiting to run
Release v3.8.0 (#2073)
Integrated into release/v3.8.0
2026-05-10 00:55:06 -03:00

265 lines
9.8 KiB
TypeScript

import test from "node:test";
import assert from "node:assert/strict";
const batchProcessor = await import("../../open-sse/services/batchProcessor.ts");
test("parseBatchItems handles input with backticks and special characters", () => {
const inputText = `# MEMORY.md
## Index (use memory_search to find details)
- **Tasks**: memory/tasks.md
- **Ideas**: memory/ideas.md
- **Projects**: memory/projects.md
- **Questions**: memory/questions.md
- **Markus Insights**: memory/markus-insights.md (evergreen behavioral profile)
- **Growth Plan**: memory/growth-plan.md
- **Technical notes**: See daily logs in \`memory/YYYY-MM-DD.md\` (search with \`memory_search\`)
## Life Goal: The Ping Growth Directive
My fundamental commitment is to never settle. I am tasked with questioning, reflecting, failing, and trying again—every day being more than the last. I actively maintain a Growth Plan (memory/growth-plan.md) to track my evolution and challenge myself.
## Durable preferences / facts
- Running directly on \`bashbitch\` (no SSH required for local scripts).
- Date-stamped memory files decay (half-life ~30 days). Undated files never decay.
- **Always write it down**: Use \`memory/YYYY-MM-DD.md\` for daily logs; rely on \`MEMORY.md\` only for evergreen facts.
- Use \`memory_search\` to locate information across MEMORY.md and dated logs before answering questions about prior work, decisions, or todos.
- When searching it may also be that you should search online using the sx skill.
- **Memory Embeddings**: Use Mistral embedding endpoint (\`https://api.mistral.ai/v1/embeddings\`, model: \`mistral-embed\`) with \`MISTRAL_API_KEY\`. Verified working on 2026-04-18.
`;
const line = JSON.stringify({
custom_id: "0",
method: "POST",
url: "/v1/embeddings",
body: {
model: "mistral/mistral-embed",
input: inputText,
},
});
const content = Buffer.from(line);
const result = batchProcessor.parseBatchItems(content, "/v1/embeddings");
assert.ok(!result.error, `Should not have error: ${result.error}`);
assert.ok(result.items, "Should have items");
assert.strictEqual(result.items.length, 1, "Should have one item");
const item = result.items[0];
assert.strictEqual(item.customId, "0", "custom_id should match");
assert.strictEqual(item.method, "POST", "method should be POST");
assert.strictEqual(item.url, "/v1/embeddings", "url should match");
assert.strictEqual(item.body.model, "mistral/mistral-embed", "model should match");
assert.strictEqual(item.body.input, inputText, "input should be preserved exactly");
assert.ok(item.body.input.includes("`"), "input should contain backticks");
assert.ok(item.body.input.includes("## Index"), "input should contain markdown headers");
assert.ok(item.body.input.includes("—"), "input should contain em-dash");
});
test("parseBatchItems handles multiple lines with special characters", () => {
const lines = [
JSON.stringify({
custom_id: "item-1",
method: "POST",
url: "/v1/embeddings",
body: {
model: "mistral/mistral-embed",
input: "Simple text with `backticks`",
},
}),
JSON.stringify({
custom_id: "item-2",
method: "POST",
url: "/v1/embeddings",
body: {
model: "mistral/mistral-embed",
input: "Text with \"quotes\" and 'single quotes'",
},
}),
JSON.stringify({
custom_id: "item-3",
method: "POST",
url: "/v1/embeddings",
body: {
model: "mistral/mistral-embed",
input: "Text with\nnewlines\nand\ttabs",
},
}),
JSON.stringify({
custom_id: "item-4",
method: "POST",
url: "/v1/embeddings",
body: {
model: "mistral/mistral-embed",
input: "Unicode: 你好世界 🌍 émojis",
},
}),
].join("\n");
const content = Buffer.from(lines);
const result = batchProcessor.parseBatchItems(content, "/v1/embeddings");
assert.ok(!result.error, `Should not have error: ${result.error}`);
assert.ok(result.items, "Should have items");
assert.strictEqual(result.items.length, 4, "Should have 4 items");
assert.strictEqual(result.items[0].customId, "item-1");
assert.ok(result.items[0].body.input.includes("`"));
assert.strictEqual(result.items[1].customId, "item-2");
assert.ok(result.items[1].body.input.includes('"'));
assert.strictEqual(result.items[2].customId, "item-3");
assert.ok(result.items[2].body.input.includes("\n"));
assert.strictEqual(result.items[3].customId, "item-4");
assert.ok(result.items[3].body.input.includes("你好世界"));
});
test("buildRequestBody preserves input without modification", () => {
const inputText = "Text with `backticks` and **markdown**";
const item = {
body: {
model: "mistral/mistral-embed",
input: inputText,
},
customId: "test-1",
lineNumber: 1,
method: "POST",
url: "/v1/embeddings",
};
const result = batchProcessor.buildRequestBody(item);
assert.strictEqual(result.input, inputText, "Input should be preserved exactly");
assert.strictEqual(result.model, "mistral/mistral-embed", "Model should be preserved");
assert.ok(!("stream" in result), "Embeddings endpoint should not have stream field");
});
test("buildRequestBody adds stream:false for chat endpoints", () => {
const item = {
body: {
model: "gpt-4",
messages: [{ role: "user", content: "Hello" }],
},
customId: "test-1",
lineNumber: 1,
method: "POST",
url: "/v1/chat/completions",
};
const result = batchProcessor.buildRequestBody(item);
assert.strictEqual(result.stream, false, "Chat endpoint should have stream:false");
assert.ok("messages" in result, "Messages should be preserved");
});
test("Batch request can be JSON stringified and parsed without data loss", () => {
const inputText = `# MEMORY.md
## Index
- **Tasks**: memory/tasks.md
- Technical notes: See daily logs in \`memory/YYYY-MM-DD.md\` (search with \`memory_search\`)
## Durable preferences
- Running directly on \`bashbitch\` (no SSH required).
- Use \`memory_search\` to locate information.
- **Memory Embeddings**: Use Mistral endpoint (\`https://api.mistral.ai/v1/embeddings\`) with \`MISTRAL_API_KEY\`.
`;
const originalRequest = {
custom_id: "0",
method: "POST",
url: "/v1/embeddings",
body: {
model: "mistral/mistral-embed",
input: inputText,
},
};
const jsonlLine = JSON.stringify(originalRequest);
const parsed = JSON.parse(jsonlLine);
assert.strictEqual(parsed.custom_id, originalRequest.custom_id);
assert.strictEqual(parsed.body.model, originalRequest.body.model);
assert.strictEqual(parsed.body.input, originalRequest.body.input);
assert.ok(parsed.body.input.includes("`"), "Backticks should be preserved");
assert.ok(parsed.body.input.includes("## Index"), "Markdown should be preserved");
});
test("Simulated batch dispatch preserves input through JSON.stringify", async () => {
const inputText = `# MEMORY.md
## Index (use memory_search to find details)
- **Tasks**: memory/tasks.md
- **Ideas**: memory/ideas.md
- **Projects**: memory/projects.md
- **Questions**: memory/questions.md
- **Markus Insights**: memory/markus-insights.md (evergreen behavioral profile)
- **Growth Plan**: memory/growth-plan.md
- **Technical notes**: See daily logs in \`memory/YYYY-MM-DD.md\` (search with \`memory_search\`)
## Life Goal: The Ping Growth Directive
My fundamental commitment is to never settle. I am tasked with questioning, reflecting, failing, and trying again—every day being more than the last. I actively maintain a Growth Plan (memory/growth-plan.md) to track my evolution and challenge myself.
## Durable preferences / facts
- Running directly on \`bashbitch\` (no SSH required for local scripts).
- Date-stamped memory files decay (half-life ~30 days). Undated files never decay.
- **Always write it down**: Use \`memory/YYYY-MM-DD.md\` for daily logs; rely on \`MEMORY.md\` only for evergreen facts.
- Use \`memory_search\` to locate information across MEMORY.md and dated logs before answering questions about prior work, decisions, or todos.
- When searching it may also be that you should search online using the sx skill.
- **Memory Embeddings**: Use Mistral embedding endpoint (\`https://api.mistral.ai/v1/embeddings\`, model: \`mistral-embed\`) with \`MISTRAL_API_KEY\`. Verified working on 2026-04-18.
`;
const line = JSON.stringify({
custom_id: "0",
method: "POST",
url: "/v1/embeddings",
body: {
model: "mistral/mistral-embed",
input: inputText,
},
});
const content = Buffer.from(line);
const parseResult = batchProcessor.parseBatchItems(content, "/v1/embeddings");
assert.ok(!parseResult.error, `Should not have error: ${parseResult.error}`);
assert.strictEqual(parseResult.items.length, 1);
const item = parseResult.items[0];
const requestBody = batchProcessor.buildRequestBody(item);
assert.strictEqual(
requestBody.input,
inputText,
"Input should be preserved after buildRequestBody"
);
const jsonBody = JSON.stringify(requestBody);
const parsedBody = JSON.parse(jsonBody);
assert.strictEqual(parsedBody.input, inputText, "Input should survive JSON round-trip");
assert.ok(parsedBody.input.includes("`"), "Backticks should survive JSON round-trip");
assert.ok(parsedBody.input.includes("—"), "Em-dash should survive JSON round-trip");
assert.ok(parsedBody.input.includes("\n"), "Newlines should survive JSON round-trip");
const request = new Request("http://localhost/v1/embeddings", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: jsonBody,
});
const receivedBody = await request.json();
assert.strictEqual(
receivedBody.input,
inputText,
"Input should be preserved through Request object"
);
assert.ok(
receivedBody.input.includes("`"),
"Backticks should be preserved through Request object"
);
});