Expose reusable builder kit surfaces and email preset pack
This commit is contained in:
1 parent
e019ac34c8
commit
eb1875f0bc
20 files changed
+635
-4
No files matched your search
@@ -0,0 +1,62 @@
|
||||
import { expect, test } from "bun:test";
|
||||
import { InspectorDrafts, type InspectorValues } from "../src/inspector-drafts.ts";
|
||||
|
||||
const node = { id: "text", props: { text: "Saved" }, styles: {} };
|
||||
const baseline: InspectorValues = {
|
||||
props: { text: "Saved", decorative: false },
|
||||
styles: { fontSize: { value: "", empty: "true" } },
|
||||
};
|
||||
const edited: InspectorValues = {
|
||||
props: { text: "Typing", decorative: true },
|
||||
styles: { fontSize: { value: "20px", empty: "" } },
|
||||
};
|
||||
|
||||
test("selection and preview remount preserve independent props, checkbox, and style drafts", () => {
|
||||
const store = new InspectorDrafts();
|
||||
store.capture(node, baseline, edited);
|
||||
expect(store.restore({ ...node, id: "other" }, baseline)).toEqual(baseline);
|
||||
expect(store.restore(node, baseline)).toEqual(edited);
|
||||
expect(store.restore(node, baseline)).toEqual(edited);
|
||||
expect(node.props.text).toBe("Saved");
|
||||
expect(store.size).toBe(1);
|
||||
});
|
||||
|
||||
test("applying content does not discard pending style changes or resurrect applied content", () => {
|
||||
const store = new InspectorDrafts();
|
||||
store.capture(node, baseline, edited);
|
||||
const applied = { ...node, props: { text: "Typing" } };
|
||||
const next = { ...baseline, props: { ...baseline.props, text: "Typing" } };
|
||||
expect(store.restore(applied, next)).toEqual({ ...next, styles: edited.styles });
|
||||
expect(store.restore(node, baseline).props).toEqual(baseline.props);
|
||||
});
|
||||
|
||||
test("applying styles does not erase content drafts", () => {
|
||||
const store = new InspectorDrafts();
|
||||
store.capture(node, baseline, edited);
|
||||
const applied = { ...node, styles: { fontSize: { base: "20px" } } };
|
||||
const next = { ...baseline, styles: edited.styles };
|
||||
expect(store.restore(applied, next)).toEqual({ props: edited.props, styles: edited.styles });
|
||||
});
|
||||
|
||||
test("reverting fields, discarding, and deleting blocks release their drafts", () => {
|
||||
const store = new InspectorDrafts();
|
||||
store.capture(node, baseline, edited);
|
||||
store.capture(node, baseline, baseline);
|
||||
expect(store.size).toBe(0);
|
||||
store.capture(node, baseline, edited);
|
||||
store.discard(node.id);
|
||||
expect(store.restore(node, baseline)).toEqual(baseline);
|
||||
store.capture(node, baseline, edited);
|
||||
store.retain(new Set(["other"]));
|
||||
expect(store.size).toBe(0);
|
||||
});
|
||||
|
||||
test("capture and restore do not share mutable control snapshots", () => {
|
||||
const store = new InspectorDrafts(),
|
||||
draft = structuredClone(edited);
|
||||
store.capture(node, baseline, draft);
|
||||
draft.styles.fontSize!.value = "99px";
|
||||
const restored = store.restore(node, baseline);
|
||||
restored.styles.fontSize!.value = "88px";
|
||||
expect(store.restore(node, baseline).styles.fontSize!.value).toBe("20px");
|
||||
});
|
||||
Reference in new issue
Block a user