import { Store } from "../../data/Store"; import { ContentPlaceholder, ContentPlaceholderScope } from "./ContentPlaceholder"; import assert from "assert"; import { PureContainer } from "../PureContainer"; import { createTestRenderer, act } from "../../util/test/createTestRenderer"; import { bind } from "../bind"; describe("ContentPlaceholder", () => { it("allows putting content inside", async () => { let store = new Store(); const component = await createTestRenderer( store,

Header

, ); let tree = component.toJSON(); assert.deepEqual(tree, { type: "div", props: {}, children: [ { type: "header", props: {}, children: [ { type: "h2", props: {}, children: ["Header"], }, ], }, { type: "main", props: {}, children: null, }, ], }); }); it("updates content on change", async () => { let store = new Store({ data: { headerText: "Header", }, }); const component = await createTestRenderer( store,

, ); let getTree = (headerText: string) => ({ type: "div", props: {}, children: [ { type: "h2", props: {}, children: [headerText], }, ], }); assert.deepEqual(component.toJSON(), getTree("Header")); await act(async () => { store.set("headerText", "Footer"); }); assert.deepEqual(component.toJSON(), getTree("Footer")); }); it("allows putting multiple entries inside", async () => { let store = new Store(); const component = await createTestRenderer( store,

Header1

Header2

, ); let tree = component.toJSON(); assert.deepEqual(tree, { type: "div", props: {}, children: [ { type: "header", props: {}, children: [ { type: "h2", props: {}, children: ["Header1"], }, { type: "h2", props: {}, children: ["Header2"], }, ], }, { type: "main", props: {}, children: null, }, ], }); }); it("allows putting multiple entries inside when content is defined before and after the placeholder", async () => { let store = new Store(); const component = await createTestRenderer( store,

Header1

Header2

Header3

Header4

, ); let tree = component.toJSON(); assert.deepEqual(tree, { type: "div", props: {}, children: [ { type: "header", props: {}, children: [ { type: "h2", props: {}, children: ["Header1"], }, { type: "h2", props: {}, children: ["Header2"], }, { type: "h2", props: {}, children: ["Header3"], }, { type: "h2", props: {}, children: ["Header4"], }, ], }, ], }); }); it("allows putting multiple entries into separate placeholders using content placeholder scopes", async () => { let store = new Store(); const component = await createTestRenderer( store,

Header1

Header2

Header3

Header4

, ); let tree = component.toJSON(); assert.deepEqual(tree, { type: "div", props: {}, children: [ { type: "header", props: {}, children: [ { type: "h2", props: {}, children: ["Header1"], }, { type: "h2", props: {}, children: ["Header2"], }, ], }, { type: "header", props: {}, children: [ { type: "h2", props: {}, children: ["Header3"], }, { type: "h2", props: {}, children: ["Header4"], }, ], }, ], }); }); it("is used for defining body position in outer layouts", async () => { let store = new Store(); let layout = (
Header
); const component = await createTestRenderer( store,
, ); assert.deepEqual(component.toJSON(), { type: "div", props: {}, children: [ { type: "header", props: {}, children: ["Header"], }, { type: "main", props: {}, children: null, }, { type: "footer", props: {}, children: ["Footer"], }, ], }); }); it("data in deeply nested placeholders is correctly updated", async () => { let store = new Store({ data: { header: "H", footer: "F", body: "B", }, }); let layout = (
); const component = await createTestRenderer( store,
, ); let getTree = (h: string, b: string, f: string) => ({ type: "div", props: {}, children: [ { type: "header", props: {}, children: [{ type: "div", props: {}, children: [{ type: "span", props: {}, children: [h] }] }], }, { type: "main", props: {}, children: [{ type: "span", props: {}, children: [b] }], }, { type: "footer", props: {}, children: [{ type: "div", props: {}, children: [{ type: "span", props: {}, children: [f] }] }], }, ], }); assert.deepEqual(component.toJSON(), getTree("H", "B", "F")); await act(async () => { store.set("header", "H2"); }); assert.deepEqual(component.toJSON(), getTree("H2", "B", "F")); await act(async () => { store.set("footer", "F2"); }); assert.deepEqual(component.toJSON(), getTree("H2", "B", "F2")); await act(async () => { store.set("body", "B2"); }); assert.deepEqual(component.toJSON(), getTree("H2", "B2", "F2")); }); it("inside a two-level deep outer-layout works", async () => { let store = new Store(); let outerLayout = (
); let innerLayout = (
); const component = await createTestRenderer( store,
, ); let tree = component.toJSON(); assert.deepEqual(tree, { type: "div", props: {}, children: [ { type: "main", props: {}, children: [ { type: "section", props: {}, children: null, }, ], }, ], }); }); it("works in strange order", async () => { let store = new Store(); const component = await createTestRenderer( store,
works It doesn't work
, ); let tree = component.toJSON(); assert.deepEqual(tree, { type: "div", props: {}, children: ["It", "works"], }); }); it("inside a complex two-level-deep outer-layout works", async () => { let store = new Store(); let outerLayout = (
); let innerLayout = (
); const component = await createTestRenderer( store,
, ); assert.deepEqual(component.toJSON(), { type: "div", props: {}, children: [{ type: "main", props: {}, children: [{ type: "section", props: {}, children: null }] }], }); }); it("each level use an outer-layout", async () => { let store = new Store(); let outerLayout1 = (
); let outerLayout2 = (
); const component = await createTestRenderer( store, Content , ); assert.deepEqual(component.toJSON(), { type: "div", props: {}, children: [{ type: "main", props: {}, children: ["Content"] }], }); }); it("data in a two-level deep outer-layout is correctly updated", async () => { let store = new Store({ data: { header: "H", footer: "F", body: "B", }, }); let outerLayout = (
); let innerLayout = (
); const component = await createTestRenderer( store,
, ); let getTree = (h: string, b: string, f: string) => ({ type: "div", props: {}, children: [ { type: "header", props: {}, children: [{ type: "div", props: {}, children: [{ type: "span", props: {}, children: [h] }] }], }, { type: "main", props: {}, children: [{ type: "span", props: {}, children: [b] }], }, { type: "footer", props: {}, children: [{ type: "div", props: {}, children: [{ type: "span", props: {}, children: [f] }] }], }, ], }); assert.deepEqual(component.toJSON(), getTree("H", "B", "F")); await act(async () => { store.set("header", "H2"); }); assert.deepEqual(component.toJSON(), getTree("H2", "B", "F")); await act(async () => { store.set("footer", "F2"); }); assert.deepEqual(component.toJSON(), getTree("H2", "B", "F2")); await act(async () => { store.set("body", "B2"); }); assert.deepEqual(component.toJSON(), getTree("H2", "B2", "F2")); }); });