9router/tests/unit/openai-to-kiro.test.js

146 lines
5.2 KiB
JavaScript

/**
* Unit tests for open-sse/translator/request/openai-to-kiro.js
*
* Tests cover:
* - buildKiroPayload() - basic message conversion
* - Image forwarding fix: images in currentMessage must be included in payload
*/
import { describe, it, expect } from "vitest";
import { buildKiroPayload } from "../../open-sse/translator/request/openai-to-kiro.js";
describe("buildKiroPayload", () => {
describe("basic message conversion", () => {
it("should convert a simple text message", () => {
const body = {
messages: [{ role: "user", content: "Hello" }]
};
const result = buildKiroPayload("claude-sonnet-4.6", body, true, {});
const currentMsg = result.conversationState.currentMessage;
expect(currentMsg.userInputMessage.content).toContain("Hello");
expect(currentMsg.userInputMessage.modelId).toBe("claude-sonnet-4.6");
expect(currentMsg.userInputMessage.origin).toBe("AI_EDITOR");
});
it("should not include images field when no images are present", () => {
const body = {
messages: [{ role: "user", content: "No images here" }]
};
const result = buildKiroPayload("claude-sonnet-4.6", body, true, {});
const currentMsg = result.conversationState.currentMessage;
expect(currentMsg.userInputMessage.images).toBeUndefined();
});
});
describe("image forwarding", () => {
it("should forward base64 image from image_url content part", () => {
const fakeBase64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==";
const body = {
messages: [
{
role: "user",
content: [
{ type: "text", text: "Describe this image" },
{ type: "image_url", image_url: { url: `data:image/png;base64,${fakeBase64}` } }
]
}
]
};
const result = buildKiroPayload("claude-sonnet-4.6", body, true, {});
const currentMsg = result.conversationState.currentMessage;
expect(currentMsg.userInputMessage.images).toBeDefined();
expect(currentMsg.userInputMessage.images).toHaveLength(1);
expect(currentMsg.userInputMessage.images[0].format).toBe("png");
expect(currentMsg.userInputMessage.images[0].source.bytes).toBe(fakeBase64);
});
it("should forward multiple base64 images", () => {
const fakeBase64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==";
const body = {
messages: [
{
role: "user",
content: [
{ type: "text", text: "Compare these images" },
{ type: "image_url", image_url: { url: `data:image/jpeg;base64,${fakeBase64}` } },
{ type: "image_url", image_url: { url: `data:image/png;base64,${fakeBase64}` } }
]
}
]
};
const result = buildKiroPayload("claude-sonnet-4.6", body, true, {});
const currentMsg = result.conversationState.currentMessage;
expect(currentMsg.userInputMessage.images).toHaveLength(2);
expect(currentMsg.userInputMessage.images[0].format).toBe("jpeg");
expect(currentMsg.userInputMessage.images[1].format).toBe("png");
});
it("should not include images field when images array is empty", () => {
const body = {
messages: [
{
role: "user",
content: [
{ type: "text", text: "Just text" }
]
}
]
};
const result = buildKiroPayload("claude-sonnet-4.6", body, true, {});
const currentMsg = result.conversationState.currentMessage;
expect(currentMsg.userInputMessage.images).toBeUndefined();
});
it("should include both images and text content together", () => {
const fakeBase64 = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg==";
const body = {
messages: [
{
role: "user",
content: [
{ type: "text", text: "What is in this image?" },
{ type: "image_url", image_url: { url: `data:image/jpeg;base64,${fakeBase64}` } }
]
}
]
};
const result = buildKiroPayload("claude-sonnet-4.6", body, true, {});
const currentMsg = result.conversationState.currentMessage;
expect(currentMsg.userInputMessage.content).toContain("What is in this image?");
expect(currentMsg.userInputMessage.images).toHaveLength(1);
});
it("should treat http image URLs as text fallback (Kiro only supports base64)", () => {
const body = {
messages: [
{
role: "user",
content: [
{ type: "text", text: "Look at this" },
{ type: "image_url", image_url: { url: "https://example.com/photo.jpg" } }
]
}
]
};
const result = buildKiroPayload("claude-sonnet-4.6", body, true, {});
const currentMsg = result.conversationState.currentMessage;
// HTTP URLs are not supported by Kiro — converted to text placeholder
expect(currentMsg.userInputMessage.images).toBeUndefined();
expect(currentMsg.userInputMessage.content).toContain("[Image: https://example.com/photo.jpg]");
});
});
});