146 lines
5.2 KiB
JavaScript
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]");
|
|
});
|
|
});
|
|
});
|