fix(ai-toolbar): honor AI state in shortcuts and clipboard dedup
This commit is contained in:
@@ -13,35 +13,74 @@ import {
|
||||
|
||||
describe("imageFileKey – stable identity for dedup", () => {
|
||||
test("returns a string combining name and size", () => {
|
||||
const file = new File(["hello"], "flyer.png", { type: "image/png" });
|
||||
const file = new File(["hello"], "flyer.png", {
|
||||
type: "image/png",
|
||||
lastModified: 123,
|
||||
});
|
||||
const key = imageFileKey(file);
|
||||
expect(typeof key).toBe("string");
|
||||
expect(key).toContain("flyer.png");
|
||||
expect(key).toContain(String(file.size));
|
||||
expect(key).toContain(String(file.lastModified));
|
||||
});
|
||||
|
||||
test("two files with the same name and size produce the same key", () => {
|
||||
const a = new File(["hello"], "a.png", { type: "image/png" });
|
||||
const b = new File(["hello"], "a.png", { type: "image/png" });
|
||||
test("two files with the same name, size, and lastModified produce the same key", () => {
|
||||
const a = new File(["hello"], "a.png", {
|
||||
type: "image/png",
|
||||
lastModified: 123,
|
||||
});
|
||||
const b = new File(["hello"], "a.png", {
|
||||
type: "image/png",
|
||||
lastModified: 123,
|
||||
});
|
||||
expect(imageFileKey(a)).toBe(imageFileKey(b));
|
||||
});
|
||||
|
||||
test("two files with the same name but different content produce different keys", () => {
|
||||
const a = new File(["hello"], "a.png", { type: "image/png" });
|
||||
const b = new File(["hello world"], "a.png", { type: "image/png" });
|
||||
const a = new File(["hello"], "a.png", {
|
||||
type: "image/png",
|
||||
lastModified: 123,
|
||||
});
|
||||
const b = new File(["hello world"], "a.png", {
|
||||
type: "image/png",
|
||||
lastModified: 123,
|
||||
});
|
||||
expect(imageFileKey(a)).not.toBe(imageFileKey(b));
|
||||
});
|
||||
|
||||
test("two files with different names but same content produce different keys", () => {
|
||||
const a = new File(["hello"], "a.png", { type: "image/png" });
|
||||
const b = new File(["hello"], "b.png", { type: "image/png" });
|
||||
const a = new File(["hello"], "a.png", {
|
||||
type: "image/png",
|
||||
lastModified: 123,
|
||||
});
|
||||
const b = new File(["hello"], "b.png", {
|
||||
type: "image/png",
|
||||
lastModified: 123,
|
||||
});
|
||||
expect(imageFileKey(a)).not.toBe(imageFileKey(b));
|
||||
});
|
||||
|
||||
test("clipboard fallback files with the same fallback name and size stay distinct when lastModified differs", () => {
|
||||
const a = new File(["abcd"], "clipboard-image", {
|
||||
type: "image/png",
|
||||
lastModified: 100,
|
||||
});
|
||||
const b = new File(["wxyz"], "clipboard-image", {
|
||||
type: "image/png",
|
||||
lastModified: 101,
|
||||
});
|
||||
|
||||
expect(a.size).toBe(b.size);
|
||||
expect(imageFileKey(a)).not.toBe(imageFileKey(b));
|
||||
});
|
||||
});
|
||||
|
||||
describe("appendImagesDeduped – append with deduplication", () => {
|
||||
const makeFile = (name: string, content = "data") =>
|
||||
new File([content], name, { type: "image/png" });
|
||||
const makeFile = (
|
||||
name: string,
|
||||
content = "data",
|
||||
lastModified = 123,
|
||||
) => new File([content], name, { type: "image/png", lastModified });
|
||||
|
||||
test("appends new files to an empty list", () => {
|
||||
const result = appendImagesDeduped([], [makeFile("a.png")]);
|
||||
@@ -100,4 +139,18 @@ describe("appendImagesDeduped – append with deduplication", () => {
|
||||
expect(result).toHaveLength(2);
|
||||
expect(result.map((f) => f.name)).toEqual(["a.png", "b.png"]);
|
||||
});
|
||||
|
||||
test("keeps distinct clipboard fallback files that share the same name and byte size", () => {
|
||||
const existing: File[] = [];
|
||||
const incoming = [
|
||||
makeFile("clipboard-image", "abcd", 100),
|
||||
makeFile("clipboard-image", "wxyz", 101),
|
||||
];
|
||||
|
||||
const result = appendImagesDeduped(existing, incoming);
|
||||
|
||||
expect(result).toHaveLength(2);
|
||||
expect(result[0].lastModified).toBe(100);
|
||||
expect(result[1].lastModified).toBe(101);
|
||||
});
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user