deno.land / x / opine@2.3.4 / test / units / app.render.test.ts
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401import { opine } from "../../mod.ts";import { describe, it } from "../utils.ts";import { expect } from "../deps.ts";import { dirname, fromFileUrl, join } from "../../deps.ts";import { tmpl } from "../support/tmpl.ts";
const __dirname = dirname(import.meta.url);
function createApp() { const app = opine();
app.engine(".tmpl", tmpl);
return app;}
describe("app", function () { describe(".render(name, fn)", function () { it("should support absolute paths", function (done) { const app = createApp();
app.locals.user = { name: "Deno" };
app.render( join(__dirname, "../fixtures", "user.tmpl"), function (err: any, str: string) { if (err) return done(err); expect(str).toEqual("<p>Deno</p>"); done(); }, ); });
it('should support absolute paths with "view engine"', function (done) { const app = createApp();
app.set("view engine", "tmpl"); app.locals.user = { name: "Deno" };
app.render( join(__dirname, "../fixtures", "user"), function (err: any, str: string) { if (err) return done(err); expect(str).toEqual("<p>Deno</p>"); done(); }, ); });
it("should expose app.locals", function (done) { const app = createApp();
app.set("views", join(__dirname, "../fixtures")); app.locals.user = { name: "Deno" };
app.render("user.tmpl", function (err: any, str: string) { if (err) return done(err); expect(str).toEqual("<p>Deno</p>"); done(); }); });
it("should support index.<engine>", function (done) { const app = createApp();
app.set("views", join(__dirname, "../fixtures")); app.set("view engine", "tmpl");
app.render("blog/post", function (err: any, str: string) { if (err) return done(err); expect(str).toEqual("<h1>Blog Post</h1>"); done(); }); });
it("should handle render error throws", function (done) { const app = opine();
function View(this: any, name: string, options: any) { this.name = name; this.pathPromise = Promise.resolve("fake"); }
View.prototype.render = function (options: any, fn: any) { throw new Error("err!"); };
app.set("view", View);
app.render("something", function (err: any, str: string) { expect(err).toBeTruthy(); expect(err.message).toEqual("err!"); done(); }); });
describe("when the file does not exist", function () { it("should provide a helpful error", function (done) { const app = createApp();
app.set("views", join(__dirname, "../fixtures")); app.render("rawr.tmpl", function (err: any) { expect(err).toBeTruthy(); expect(err.message).toEqual( 'Failed to lookup view "rawr.tmpl" in views directory "' + fromFileUrl(join(__dirname, "../fixtures")) + '"', ); done(); }); }); });
describe("when an error occurs", function () { it("should invoke the callback", function (done) { const app = createApp();
app.set("views", join(__dirname, "../fixtures"));
app.render("user.tmpl", function (err: any) { expect(err).toBeTruthy(); expect(err.name).toEqual("RenderError"); done(); }); }); });
describe("when an extension is given", function () { it("should render the template", function (done) { const app = createApp();
app.set("views", join(__dirname, "../fixtures"));
app.render("email.tmpl", function (err: any, str: string) { if (err) return done(err); expect(str).toEqual("<p>This is an email</p>"); done(); }); }); });
describe('when "view engine" is given', function () { it("should render the template", function (done) { const app = createApp();
app.set("view engine", "tmpl"); app.set("views", join(__dirname, "../fixtures"));
app.render("email", function (err: any, str: string) { if (err) return done(err); expect(str).toEqual("<p>This is an email</p>"); done(); }); }); });
describe('when "views" is given', function () { it("should lookup the file in the path", function (done) { const app = createApp();
app.set("views", join(__dirname, "../fixtures", "default_layout")); app.locals.user = { name: "Deno" };
app.render("user.tmpl", function (err: any, str: string) { if (err) return done(err); expect(str).toEqual("<p>Deno</p>"); done(); }); });
describe("when array of paths", function () { it("should lookup the file in the path", function (done) { const app = createApp(); const views = [ join(__dirname, "../fixtures", "local_layout"), join(__dirname, "../fixtures", "default_layout"), ];
app.set("views", views); app.locals.user = { name: "Deno" };
app.render("user.tmpl", function (err: any, str: string) { if (err) return done(err); expect(str).toEqual("<span>Deno</span>"); done(); }); });
it("should lookup in later paths until found", function (done) { const app = createApp(); const views = [ join(__dirname, "../fixtures", "local_layout"), join(__dirname, "../fixtures", "default_layout"), ];
app.set("views", views); app.locals.name = "Deno";
app.render("name.tmpl", function (err: any, str: string) { if (err) return done(err); expect(str).toEqual("<p>Deno</p>"); done(); }); });
it("should error if file does not exist", function (done) { const app = createApp(); const views = [ join(__dirname, "../fixtures", "local_layout"), join(__dirname, "../fixtures", "default_layout"), ];
app.set("views", views); app.locals.name = "Deno";
app.render("pet.tmpl", function (err: any, str: string) { expect(err).toBeTruthy(); expect(err.message).toEqual( 'Failed to lookup view "pet.tmpl" in views directories "' + fromFileUrl(views[0]) + '" or "' + fromFileUrl(views[1]) + '"', ); done(); }); }); }); });
describe('when a "view" constructor is given', function () { it("should create an instance of it", function (done) { const app = opine();
function View(this: any, name: string, options: any) { this.name = name; this.pathPromise = "path is required by application.js as a signal of success even though it is not used there."; }
View.prototype.render = function (options: any, fn: any) { fn(null, "abstract engine"); };
app.set("view", View);
app.render("something", function (err: any, str: string) { if (err) return done(err); expect(str).toEqual("abstract engine"); done(); }); }); });
describe("caching", function () { it("should always lookup view without cache", function (done) { const app = opine(); let count = 0;
function View(this: any, name: string, options: any) { this.name = name; this.pathPromise = "fake"; count++; }
View.prototype.render = function (options: any, fn: any) { fn(null, "abstract engine"); };
app.set("view cache", false); app.set("view", View);
app.render("something", function (err: any, str: string) { if (err) return done(err); expect(count).toEqual(1); expect(str).toEqual("abstract engine"); app.render("something", function (err: any, str: string) { if (err) return done(err); expect(count).toEqual(2); expect(str).toEqual("abstract engine"); done(); }); }); });
it('should cache with "view cache" setting', function (done) { const app = opine(); let count = 0;
function View(this: any, name: string, options: any) { this.name = name; this.pathPromise = "fake"; count++; }
View.prototype.render = function (options: any, fn: any) { fn(null, "abstract engine"); };
app.set("view cache", true); app.set("view", View);
app.render("something", function (err: any, str: string) { if (err) return done(err); expect(count).toEqual(1); expect(str).toEqual("abstract engine"); app.render("something", function (err: any, str: string) { if (err) return done(err); expect(count).toEqual(1); expect(str).toEqual("abstract engine"); done(); }); }); }); }); });
describe(".render(name, options, fn)", function () { it("should render the template", function (done) { const app = createApp();
app.set("views", join(__dirname, "../fixtures"));
const user = { name: "Deno" };
app.render("user.tmpl", { user: user }, function (err: any, str: string) { if (err) return done(err); expect(str).toEqual("<p>Deno</p>"); done(); }); });
it("should expose app.locals", function (done) { const app = createApp();
app.set("views", join(__dirname, "../fixtures")); app.locals.user = { name: "Deno" };
app.render("user.tmpl", {}, function (err: any, str: string) { if (err) return done(err); expect(str).toEqual("<p>Deno</p>"); done(); }); });
it("should give precedence to app.render() locals", function (done) { const app = createApp();
app.set("views", join(__dirname, "../fixtures")); app.locals.user = { name: "Deno" }; const steve = { name: "steve" };
app.render( "user.tmpl", { user: steve }, function (err: any, str: string) { if (err) return done(err); expect(str).toEqual("<p>steve</p>"); done(); }, ); });
describe("caching", function () { it("should cache with cache option", function (done) { const app = opine(); let count = 0;
function View(this: any, name: string, options: any) { this.name = name; this.pathPromise = "fake"; count++; }
View.prototype.render = function (options: any, fn: any) { fn(null, "abstract engine"); };
app.set("view cache", false); app.set("view", View);
app.render( "something", { cache: true }, function (err: any, str: string) { if (err) return done(err); expect(count).toEqual(1); expect(str).toEqual("abstract engine"); app.render( "something", { cache: true }, function (err: any, str: string) { if (err) return done(err); expect(count).toEqual(1); expect(str).toEqual("abstract engine"); done(); }, ); }, ); }); }); });});
Version Info