honkit
Version:
HonKit is building beautiful books using Markdown.
173 lines (172 loc) • 8.45 kB
JavaScript
;
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>');
});
});
});
});