mirror of
https://github.com/GitbookIO/gitbook.git
synced 2026-09-17 08:05:19 +00:00
265 lines
8.8 KiB
JavaScript
265 lines
8.8 KiB
JavaScript
var _ = require("lodash");
|
|
var should = require("should");
|
|
var path = require("path");
|
|
|
|
var Plugin = require("../lib/plugin");
|
|
var parsers = require("gitbook-parsers");
|
|
var PLUGINS_ROOT = path.resolve(__dirname, "plugins");
|
|
|
|
describe("Plugins", function () {
|
|
var book;
|
|
|
|
before(function() {
|
|
return books.parse("basic")
|
|
.then(function(_book) {
|
|
book = _book;
|
|
});
|
|
});
|
|
|
|
describe("Invalid", function() {
|
|
var plugin;
|
|
|
|
before(function() {
|
|
plugin = new Plugin(book, "invalid");
|
|
plugin.load("./invalid", PLUGINS_ROOT);
|
|
});
|
|
|
|
it("should be detected", function() {
|
|
should(plugin.isValid()).be.exactly(false);
|
|
});
|
|
});
|
|
|
|
describe("Empty", function() {
|
|
var plugin;
|
|
|
|
before(function() {
|
|
plugin = new Plugin(book, "empty");
|
|
plugin.load("./empty", PLUGINS_ROOT);
|
|
});
|
|
|
|
it("should valid a plugin", function() {
|
|
should(plugin.isValid()).be.exactly(true);
|
|
});
|
|
|
|
it("should return an empty list of resources", function() {
|
|
return plugin.getResources()
|
|
.then(function(resources) {
|
|
_.each(Plugin.RESOURCES, function(resName) {
|
|
resources[resName].should.have.lengthOf(0);
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("Resources", function() {
|
|
var plugin;
|
|
|
|
before(function() {
|
|
plugin = new Plugin(book, "resources");
|
|
plugin.load("./resources", PLUGINS_ROOT);
|
|
|
|
return book.plugins.load(plugin);
|
|
});
|
|
|
|
it("should valid a plugin", function() {
|
|
should(plugin.isValid()).be.exactly(true);
|
|
});
|
|
|
|
describe("Website", function() {
|
|
it("should return a valid list of resources", function() {
|
|
return plugin.getResources("website")
|
|
.then(function(resources) {
|
|
resources.js.should.have.lengthOf(1);
|
|
});
|
|
});
|
|
|
|
it("should extend books plugins", function() {
|
|
var resources = book.plugins.resources("website");
|
|
resources.js.should.have.lengthOf(1);
|
|
});
|
|
});
|
|
|
|
describe("eBook", function() {
|
|
it("should return a valid list of resources", function() {
|
|
return plugin.getResources("ebook")
|
|
.then(function(resources) {
|
|
resources.css.should.have.lengthOf(1);
|
|
});
|
|
});
|
|
|
|
it("should extend books plugins", function() {
|
|
var resources = book.plugins.resources("ebook");
|
|
|
|
// There is resources from highlight plugin and this plugin
|
|
resources.css.should.have.lengthOf(2);
|
|
should.exist(_.find(resources.css, {
|
|
path: "./resources/test"
|
|
}));
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("Filters", function() {
|
|
var plugin;
|
|
|
|
before(function() {
|
|
plugin = new Plugin(book, "filters");
|
|
plugin.load("./filters", PLUGINS_ROOT);
|
|
|
|
return book.plugins.load(plugin);
|
|
});
|
|
|
|
it("should valid a plugin", function() {
|
|
should(plugin.isValid()).be.exactly(true);
|
|
});
|
|
|
|
it("should return a map of filters", function() {
|
|
var filters = plugin.getFilters();
|
|
|
|
_.size(filters).should.equal(2);
|
|
filters.should.have.property("hello");
|
|
filters.should.have.property("helloCtx");
|
|
});
|
|
|
|
it("should correctly extend template filters", function() {
|
|
return book.template.renderString("{{ \"World\"|hello }}")
|
|
.then(function(content) {
|
|
content.should.equal("Hello World");
|
|
});
|
|
});
|
|
|
|
it("should correctly set book as context", function() {
|
|
return book.template.renderString("{{ \"root\"|helloCtx }}")
|
|
.then(function(content) {
|
|
content.should.equal("root:"+book.root);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("Blocks", function() {
|
|
var plugin;
|
|
|
|
before(function() {
|
|
plugin = new Plugin(book, "blocks");
|
|
plugin.load("./blocks", PLUGINS_ROOT);
|
|
|
|
return book.plugins.load(plugin);
|
|
});
|
|
|
|
var testTpl = function(str, args, options) {
|
|
return book.template.renderString(str, args, options)
|
|
.then(book.template.postProcess);
|
|
};
|
|
|
|
it("should valid a plugin", function() {
|
|
should(plugin.isValid()).be.exactly(true);
|
|
});
|
|
|
|
it("should correctly extend template blocks", function() {
|
|
return testTpl("{% test %}hello{% endtest %}")
|
|
.then(function(content) {
|
|
content.should.equal("testhellotest");
|
|
});
|
|
});
|
|
|
|
it("should correctly accept shortcuts", function() {
|
|
return testTpl("$$hello$$", {}, {
|
|
type: "markdown"
|
|
})
|
|
.then(function(content) {
|
|
content.should.equal("testhellotest");
|
|
});
|
|
});
|
|
|
|
it("should correctly extend template blocks with defined end", function() {
|
|
return testTpl("{% test2 %}hello{% endtest2end %}")
|
|
.then(function(content) {
|
|
content.should.equal("test2hellotest2");
|
|
});
|
|
});
|
|
|
|
it("should correctly extend template blocks with sub-blocks", function() {
|
|
return testTpl("{% test3join separator=\";\" %}hello{% also %}world{% endtest3join %}")
|
|
.then(function(content) {
|
|
content.should.equal("hello;world");
|
|
});
|
|
});
|
|
|
|
it("should correctly extend template blocks with different sub-blocks", function() {
|
|
return testTpl("{% test4join separator=\";\" %}hello{% also %}the{% finally %}world{% endtest4join %}")
|
|
.then(function(content) {
|
|
content.should.equal("hello;the;world");
|
|
});
|
|
});
|
|
|
|
it("should correctly extend template blocks with arguments (1)", function() {
|
|
return testTpl("{% test5args \"a\" %}{% endtest5args %}")
|
|
.then(function(content) {
|
|
content.should.equal("test5atest5");
|
|
});
|
|
});
|
|
|
|
it("should correctly extend template blocks with arguments (2)", function() {
|
|
return testTpl("{% test5args 'a', 'b' %}{% endtest5args %}")
|
|
.then(function(content) {
|
|
content.should.equal("test5a,btest5");
|
|
});
|
|
});
|
|
|
|
it("should correctly extend template blocks with arguments (3)", function() {
|
|
return testTpl("{% test5args 'a', 'b', 'c' %}{% endtest5args %}")
|
|
.then(function(content) {
|
|
content.should.equal("test5a,b,ctest5");
|
|
});
|
|
});
|
|
|
|
it("should correctly extend template blocks with args and kwargs", function() {
|
|
return testTpl("{% test5kwargs 'a', 'b', 'c', d='test', e='test2' %}{% endtest5kwargs %}")
|
|
.then(function(content) {
|
|
content.should.equal("test5a,b,c,d:test,e:test2,__keywords:truetest5");
|
|
});
|
|
});
|
|
|
|
it("should correctly extend template blocks with access to context", function() {
|
|
return testTpl("{% set name = 'john' %}{% test6context %}{% endtest6context %}", {})
|
|
.then(function(content) {
|
|
content.should.equal("test6johntest6");
|
|
});
|
|
});
|
|
});
|
|
|
|
describe("Blocks without parsing", function() {
|
|
var plugin;
|
|
|
|
before(function() {
|
|
plugin = new Plugin(book, "blocks");
|
|
plugin.load("./blocks", PLUGINS_ROOT);
|
|
|
|
return book.plugins.load(plugin);
|
|
});
|
|
|
|
var testTpl = function(markup, str, args, options) {
|
|
var filetype = parsers.get(markup);
|
|
|
|
return book.template.renderString(str, args, options)
|
|
.then(filetype.page).get("sections").get(0).get("content")
|
|
.then(book.template.postProcess);
|
|
};
|
|
|
|
it("should correctly process unparsable for markdown", function() {
|
|
return testTpl(".md", "{% test %}**hello**{% endtest %}")
|
|
.then(function(content) {
|
|
content.should.equal("<p>test**hello**test</p>\n");
|
|
});
|
|
});
|
|
|
|
it("should correctly process unparsable for asciidoc", function() {
|
|
return testTpl(".adoc", "{% test %}**hello**{% endtest %}")
|
|
.then(function(content) {
|
|
content.should.equal("<div class=\"paragraph\">\n<p>test**hello**test</p>\n</div>");
|
|
});
|
|
});
|
|
});
|
|
});
|
|
|