UNPKG

honkit

Version:

HonKit is building beautiful books using Markdown.

173 lines (172 loc) 8.45 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const nunjucks_1 = __importDefault(require("nunjucks")); const immutable_1 = __importDefault(require("immutable")); const promise_1 = __importDefault(require("../../utils/promise")); const templateBlock_1 = __importDefault(require("../templateBlock")); describe("TemplateBlock", () => { describe("create", () => { test("must initialize a simple TemplateBlock from a function", () => { const templateBlock = templateBlock_1.default.create("sayhello", (block) => { return { body: "<p>Hello, World!</p>", parse: true, }; }); // Check basic templateBlock properties expect(templateBlock.getName()).toBe("sayhello"); expect(templateBlock.getEndTag()).toBe("endsayhello"); expect(templateBlock.getBlocks().size).toBe(0); expect(templateBlock.getExtensionName()).toBe("BlocksayhelloExtension"); // Check result of applying block return (0, promise_1.default)() .then(() => { return templateBlock.applyBlock(); }) .then((result) => { expect(result.name).toBe("sayhello"); expect(result.body).toBe("<p>Hello, World!</p>"); }); }); }); describe("getShortcuts", () => { test("must return undefined if no shortcuts", () => { const templateBlock = templateBlock_1.default.create("sayhello", (block) => { return { body: "<p>Hello, World!</p>", parse: true, }; }); expect(templateBlock.getShortcuts()).toBeFalsy(); }); test("must return complete shortcut", () => { const templateBlock = templateBlock_1.default.create("sayhello", { process: function (block) { return "<p>Hello, World!</p>"; }, shortcuts: { parsers: ["markdown"], start: "$", end: "-", }, }); const shortcut = templateBlock.getShortcuts(); expect(shortcut).toBeDefined(); expect(shortcut.getStart()).toEqual("$"); expect(shortcut.getEnd()).toEqual("-"); expect(shortcut.getStartTag()).toEqual("sayhello"); expect(shortcut.getEndTag()).toEqual("endsayhello"); }); }); describe("toNunjucksExt()", () => { test("should replace by block anchor", () => { const templateBlock = templateBlock_1.default.create("sayhello", (block) => { return "Hello"; }); let blocks = {}; // Create a fresh Nunjucks environment const env = new nunjucks_1.default.Environment(null, { autoescape: false }); // Add template block to environement const Ext = templateBlock.toNunjucksExt({}, blocks); env.addExtension(templateBlock.getExtensionName(), new Ext()); // Render a template using the block const src = "{% sayhello %}{% endsayhello %}"; return promise_1.default.nfcall(env.renderString.bind(env), src).then((res) => { blocks = immutable_1.default.fromJS(blocks); expect(blocks.size).toBe(1); const blockId = blocks.keySeq().get(0); const block = blocks.get(blockId); expect(res).toBe(`{{-%${blockId}%-}}`); expect(block.get("body")).toBe("Hello"); expect(block.get("name")).toBe("sayhello"); }); }); test("must create a valid nunjucks extension", () => { const templateBlock = templateBlock_1.default.create("sayhello", (block) => { return { body: "<p>Hello, World!</p>", parse: true, }; }); // Create a fresh Nunjucks environment const env = new nunjucks_1.default.Environment(null, { autoescape: false }); // Add template block to environement const Ext = templateBlock.toNunjucksExt(); env.addExtension(templateBlock.getExtensionName(), new Ext()); // Render a template using the block const src = "{% sayhello %}{% endsayhello %}"; return promise_1.default.nfcall(env.renderString.bind(env), src).then((res) => { expect(res).toBe("<p>Hello, World!</p>"); }); }); test("must apply block arguments correctly", () => { const templateBlock = templateBlock_1.default.create("sayhello", (block) => { return { body: `<${block.kwargs.tag}>Hello, ${block.kwargs.name}!</${block.kwargs.tag}>`, parse: true, }; }); // Create a fresh Nunjucks environment const env = new nunjucks_1.default.Environment(null, { autoescape: false }); // Add template block to environement const Ext = templateBlock.toNunjucksExt(); env.addExtension(templateBlock.getExtensionName(), new Ext()); // Render a template using the block const src = '{% sayhello name="Samy", tag="p" %}{% endsayhello %}'; return promise_1.default.nfcall(env.renderString.bind(env), src).then((res) => { expect(res).toBe("<p>Hello, Samy!</p>"); }); }); test("must accept an async function", () => { const templateBlock = templateBlock_1.default.create("sayhello", (block) => { return (0, promise_1.default)().then(() => { return { body: `Hello ${block.body}`, parse: true, }; }); }); // Create a fresh Nunjucks environment const env = new nunjucks_1.default.Environment(null, { autoescape: false }); // Add template block to environement const Ext = templateBlock.toNunjucksExt(); env.addExtension(templateBlock.getExtensionName(), new Ext()); // Render a template using the block const src = "{% sayhello %}Samy{% endsayhello %}"; return promise_1.default.nfcall(env.renderString.bind(env), src).then((res) => { expect(res).toBe("Hello Samy"); }); }); test("must handle nested blocks", () => { const templateBlock = new templateBlock_1.default({ name: "yoda", blocks: immutable_1.default.List(["start", "end"]), process: function (block) { const nested = {}; block.blocks.forEach((blk) => { nested[blk.name] = blk.body.trim(); }); return { body: `<p class="yoda">${nested.end} ${nested.start}</p>`, parse: true, }; }, }); // Create a fresh Nunjucks environment const env = new nunjucks_1.default.Environment(null, { autoescape: false }); // Add template block to environement // @ts-expect-error ts-migrate(2339) FIXME: Property 'toNunjucksExt' does not exist on type 'M... Remove this comment to see the full error message const Ext = templateBlock.toNunjucksExt(); // @ts-expect-error ts-migrate(2339) FIXME: Property 'getExtensionName' does not exist on type... Remove this comment to see the full error message env.addExtension(templateBlock.getExtensionName(), new Ext()); // Render a template using the block const src = "{% yoda %}{% start %}this sentence should be{% end %}inverted{% endyoda %}"; return promise_1.default.nfcall(env.renderString.bind(env), src).then((res) => { expect(res).toBe('<p class="yoda">inverted this sentence should be</p>'); }); }); }); });