mirror of
https://github.com/HKUDS/nanobot.git
synced 2026-08-31 00:03:01 +03:00
* feat(tui): support pasting clipboard images * fix(tui): keep image placeholders atomic * fix(tui): reconcile duplicate image placeholders * fix(tui): retain highlighted image placeholders * fix(tui): preserve image placeholder layout * fix(tui): keep image display state local * fix(tui): reject images in commands
47 lines
1.6 KiB
TypeScript
47 lines
1.6 KiB
TypeScript
import { describe, expect, test } from "bun:test"
|
|
import type { ClipboardReadResult, HostClipboardService } from "@opentui/core"
|
|
|
|
import { createClipboardImageReader } from "./clipboard-image"
|
|
|
|
function clipboard(result: ClipboardReadResult) {
|
|
let disposed = false
|
|
const service = {
|
|
maxWriteBytes: 1,
|
|
read: async () => result,
|
|
writeText: async () => ({ status: "unsupported" as const }),
|
|
clear: async () => ({ status: "unsupported" as const }),
|
|
dispose: async () => { disposed = true },
|
|
} satisfies HostClipboardService
|
|
return { service, disposed: () => disposed }
|
|
}
|
|
|
|
describe("clipboard image reader", () => {
|
|
test("encodes supported native clipboard bytes as a data URL", async () => {
|
|
const fake = clipboard({
|
|
status: "read",
|
|
representation: { mimeType: "image/png", bytes: Uint8Array.from([0, 1, 2, 255]) },
|
|
})
|
|
const reader = createClipboardImageReader(() => fake.service)
|
|
|
|
expect(await reader.read()).toEqual({
|
|
mimeType: "image/png",
|
|
dataUrl: "data:image/png;base64,AAEC/w==",
|
|
})
|
|
await reader.dispose()
|
|
expect(fake.disposed()).toBeTrue()
|
|
})
|
|
|
|
test.each([
|
|
["empty", "No image in clipboard"],
|
|
["limit-exceeded", "Clipboard image is larger than 6 MB"],
|
|
["timed-out", "Clipboard image read timed out"],
|
|
["unsupported", "Clipboard image paste is unavailable"],
|
|
] as const)("reports %s without exposing native details", async (status, message) => {
|
|
const fake = clipboard({ status })
|
|
const reader = createClipboardImageReader(() => fake.service)
|
|
|
|
await expect(reader.read()).rejects.toThrow(message)
|
|
await reader.dispose()
|
|
})
|
|
})
|