Files

72 lines
2.3 KiB
TypeScript

import { expect, test } from "bun:test";
import { defineBlock, object, string } from "@wrnexus/blocks";
import { createBuilderKit } from "../src/kit.ts";
const block = defineBlock({
manifest: {
type: "custom.note",
version: 1,
name: { key: "note", fallback: "Note" },
icon: "note",
category: "content",
props: object({ text: string({ min: 1 }) }),
styles: object({}),
slots: {},
},
create: ({ id }: { id(): string }) => ({
id: id(),
type: "custom.note",
version: 1,
props: { text: "Hello" },
styles: {},
slots: {},
}),
});
test("trusted custom blocks and presets expose independent instances and explicit metadata", () => {
let next = 0;
const context = { id: () => String(++next) };
const kit = createBuilderKit({
blocks: [block],
presets: [
{
id: "note",
name: { key: "preset.note", fallback: "Note" },
icon: "note",
create: block.create,
},
],
});
expect(kit.blocks()[0].manifest.name.fallback).toBe("Note");
expect(kit.presets()[0].id).toBe("note");
const first = kit.createBlock("custom.note", context),
second = kit.createPreset("note", context);
first.props.text = "Changed";
expect(second.props.text).toBe("Hello");
expect(first.id).not.toBe(second.id);
expect(Object.isFrozen(kit)).toBe(true);
expect(() => kit.validateProps("custom.note", { text: "" })).toThrow();
expect(() => kit.createBlock("missing.block", context)).toThrow();
});
test("duplicate registration and invalid factories fail before insertion", () => {
expect(() => createBuilderKit({ blocks: [block, block] })).toThrow();
const preset = {
id: "note",
name: { key: "note", fallback: "Note" },
icon: "note",
create: block.create,
};
expect(() => createBuilderKit({ blocks: [block], presets: [preset, preset] })).toThrow();
const invalid = createBuilderKit({
blocks: [
{ ...block, create: () => ({ ...block.create({ id: () => "id" }), props: { text: "" } }) },
],
});
expect(() => invalid.createBlock("custom.note", { id: () => "id" })).toThrow();
const wrong = createBuilderKit({
blocks: [
{ ...block, create: () => ({ ...block.create({ id: () => "id" }), type: "custom.other" }) },
],
});
expect(() => wrong.createBlock("custom.note", { id: () => "id" })).toThrow();
});