Files
emdash-patch-imageupload/packages/contentful-to-portable-text/test/build-includes.test.ts
kunthawat 2d1be52177 Emdash source with visual editor image upload fix
Fixes:
1. media.ts: wrap placeholder generation in try-catch
2. toolbar.ts: check r.ok, display error message in popover
2026-05-03 10:44:54 +07:00

124 lines
3.6 KiB
TypeScript

/**
* Tests for the buildIncludes() utility.
*/
import { describe, it, expect } from "vitest";
import { buildIncludes } from "../src/index.js";
import fixture from "./fixtures/contentful-blogpost.json";
describe("buildIncludes", () => {
it("builds entries Map from includes.Entry[] with id → { id, contentType, fields }", () => {
const includes = buildIncludes({
Entry: fixture.items as Array<Record<string, unknown>>,
});
// Fixture has 13 items total
expect(includes.entries.size).toBe(13);
// Check a specific entry (blogCodeBlock)
const codeBlock = includes.entries.get("code-block-1");
expect(codeBlock).toBeDefined();
expect(codeBlock!.id).toBe("code-block-1");
expect(codeBlock!.contentType).toBe("blogCodeBlock");
expect(codeBlock!.fields).toBeDefined();
expect(typeof codeBlock!.fields.code).toBe("string");
});
it("builds assets Map from includes.Asset[] with id → { id, title, description, url, width, height, contentType }", () => {
const includes = buildIncludes({
Asset: (fixture.includes?.Asset ?? []) as Array<Record<string, unknown>>,
});
expect(includes.assets.size).toBe(1);
const asset = includes.assets.get("asset-1");
expect(asset).toBeDefined();
expect(asset!.id).toBe("asset-1");
expect(asset!.title).toBe("Architecture diagram");
expect(asset!.description).toBe("A diagram showing the migration pipeline architecture");
expect(asset!.url).toBe(
"//images.ctfassets.net/test-space/asset-1/abc123/architecture-diagram.png",
);
expect(asset!.width).toBe(1200);
expect(asset!.height).toBe(800);
expect(asset!.contentType).toBe("image/png");
});
it("empty/missing includes → empty Maps (no crash)", () => {
const includes1 = buildIncludes({});
expect(includes1.entries.size).toBe(0);
expect(includes1.assets.size).toBe(0);
const includes2 = buildIncludes({ Entry: [], Asset: [] });
expect(includes2.entries.size).toBe(0);
expect(includes2.assets.size).toBe(0);
});
it("asset file URL and dimensions extracted from fields.file.url and fields.file.details.image", () => {
const includes = buildIncludes({
Asset: [
{
sys: { id: "test-asset" },
fields: {
title: "Test Image",
description: "A test image",
file: {
url: "//images.ctfassets.net/test.png",
contentType: "image/png",
details: {
size: 12345,
image: {
width: 800,
height: 600,
},
},
},
},
},
],
});
const asset = includes.assets.get("test-asset");
expect(asset).toBeDefined();
expect(asset!.url).toBe("//images.ctfassets.net/test.png");
expect(asset!.width).toBe(800);
expect(asset!.height).toBe(600);
expect(asset!.contentType).toBe("image/png");
expect(asset!.title).toBe("Test Image");
expect(asset!.description).toBe("A test image");
});
it("entries without contentType → contentType defaults to 'unknown'", () => {
const includes = buildIncludes({
Entry: [
{
sys: { id: "no-ct" },
fields: { name: "test" },
},
],
});
const entry = includes.entries.get("no-ct");
expect(entry).toBeDefined();
expect(entry!.contentType).toBe("unknown");
});
it("assets without file → url defaults to empty string, dimensions undefined", () => {
const includes = buildIncludes({
Asset: [
{
sys: { id: "no-file-asset" },
fields: { title: "No File" },
},
],
});
const asset = includes.assets.get("no-file-asset");
expect(asset).toBeDefined();
expect(asset!.url).toBe("");
expect(asset!.width).toBeUndefined();
expect(asset!.height).toBeUndefined();
});
});