UNPKG

12.9 kBJavaScriptView Raw
1'use strict';
2var assert = require('assert');
3var hbs = require('..');
4var path = require('path');
5var H = require('./helpers');
6
7
8describe('issue-22 template', function() {
9 var dirname = path.join(__dirname, 'issues/22');
10
11 it('should use multiple layouts with caching', function(done) {
12 var render = hbs.create().express3({});
13 var locals1 = H.createLocals('express3', dirname, { layout: 'layout1', cache: true });
14 var locals2 = H.createLocals('express3', dirname, { layout: 'layout2', cache: true });
15
16 render(dirname + '/template.hbs', locals1, function(err, html) {
17 assert.ifError(err);
18 assert.equal('<layout1>template</layout1>', H.stripWs(html));
19 render(dirname + '/template.hbs', locals2, function(err, html) {
20 assert.ifError(err);
21 assert.equal('<layout2>template</layout2>', H.stripWs(html));
22 done();
23 });
24 });
25 });
26});
27
28describe('issue-23', function() {
29 var dirname = path.join(__dirname, 'issues/23');
30
31 it('should not pass an empty or missing partial to handlebars', function(done) {
32 var render = hbs.create().express3({
33 partialsDir: [dirname + '/partials']
34 });
35
36 function check(err, html) {
37 assert.ifError(err);
38 assert.equal('<html>Hello</html>', H.stripWs(html));
39 done();
40 }
41 var result = render(dirname + '/index.hbs', {cache: true, settings: {views: dirname + '/views'}}, check);
42 });
43
44 it('should handle empty string', function(done) {
45 var render = hbs.create().express3({
46 partialsDir: [dirname + '/partials']
47 });
48
49 function check(err, html) {
50 assert.ifError(err);
51 assert.equal('', H.stripWs(html));
52 done();
53 }
54 var result = render(dirname + '/empty.hbs', {cache: true, settings: {views: dirname + '/views'}}, check);
55 });
56
57
58 it('should register empty partial', function(done) {
59 var hb = hbs.create();
60 var render = hb.express3({
61 partialsDir: [dirname + '/partials']
62 });
63 hb.handlebars.registerPartial('emptyPartial', '');
64
65 var pass = 0;
66 function check(err, html) {
67 pass++;
68 assert.ifError(err);
69 assert.equal('foo', H.stripWs(html));
70 if (pass < 3) {
71 doIt();
72 } else {
73 done();
74 }
75 }
76 function doIt() {
77 render(dirname + '/emptyPartial.hbs', {cache: true, settings: {views: dirname + '/views'}}, check);
78 }
79 doIt();
80 });
81
82 it('should register partial that results in empty string (comment)', function(done) {
83 var hb = hbs.create();
84 var render = hb.express3({
85 partialsDir: [dirname + '/partials']
86 });
87 // this fails
88 //hb.handlebars.registerPartial('emptyComment', '{{! just a comment}}');
89 hb.registerPartial('emptyComment', '{{! just a comment}}');
90
91 var pass = 0;
92 function check(err, html) {
93 pass++;
94 assert.ifError(err);
95 assert.equal('foo', H.stripWs(html));
96 if (pass < 3) {
97 doIt();
98 } else {
99 done();
100 }
101 }
102 function doIt() {
103 render(dirname + '/emptyComment.hbs', {cache: true, settings: {views: dirname + '/views'}}, check);
104 }
105 doIt();
106 });
107});
108
109
110describe('issue-21', function() {
111 var dirname = path.join(__dirname, 'issues/21');
112 var render = hbs.create().express3({
113 layoutsDir: dirname + '/views/layouts'
114 });
115
116 it('should allow specifying layouts without the parent dir', function(done) {
117 function check(err, html) {
118 assert.ifError(err);
119 assert.equal('<html>index</html>', H.stripWs(html));
120 done();
121 }
122
123 var options = {cache: true, layout: 'default', settings: {views: dirname + '/views'}};
124 var result = render(dirname + '/views/index.hbs', options, check);
125 });
126
127
128 it('should allow specifying layouts without the parent dir in a sub view', function(done) { function check(err, html) {
129 assert.ifError(err);
130 assert.equal('<html>sub</html>', H.stripWs(html));
131 done();
132 }
133
134 var options = {cache: true, layout: 'default', settings: {views: dirname + '/views'}};
135 var result = render(dirname + '/views/sub/sub.hbs', options, check);
136 });
137
138 it('should treat layouts that start with "." relative to template', function(done) { function check(err, html) {
139 assert.ifError(err);
140 assert.equal('<relative>sub</relative>', H.stripWs(html));
141 done();
142 }
143
144 var options = {cache: true, layout: './relativeLayout', settings: {views: dirname + '/views'}};
145 var result = render(dirname + '/views/sub/sub.hbs', options, check);
146 });
147
148 it('should allow layouts in subfolders', function(done) {
149 function check(err, html) {
150 assert.ifError(err);
151 assert.equal('<sub>useLayoutInDir</sub>', H.stripWs(html));
152 done();
153 }
154
155 var options = {cache: true, layout: 'sub/child', settings: {views: dirname + '/views'}};
156 var result = render(dirname + '/views/useLayoutInDir.hbs', options, check);
157 });
158
159 it('should treat layouts relative to views directory if layoutsDir is not passed', function(done) {
160 var dirname = path.join(__dirname, 'issues/21');
161 var render = hbs.create().express3();
162
163 function check(err, html) {
164 assert.ifError(err);
165 assert.equal('<sub>sub</sub>', H.stripWs(html));
166 done();
167 }
168
169 var options = {cache: true, layout: 'layouts/sub/child', settings: {views: dirname + '/views'}};
170 var result = render(dirname + '/views/sub/sub.hbs', options, check);
171 });
172});
173
174
175describe('issue-49', function() {
176 var dirname = path.join(__dirname, 'issues/49');
177
178 it('should report filename with error', function(done) {
179 var hb = hbs.create()
180 var render = hb.express3({});
181 var locals = H.createLocals('express3', dirname, {});
182 render(dirname + '/error.hbs', locals, function(err, html) {
183 assert(err.stack.indexOf('[error.hbs]') > 0);
184 done();
185 });
186 });
187
188 it('should report relative filename with error', function(done) {
189 var hb = hbs.create()
190 var render = hb.express3({});
191 var locals = H.createLocals('express3', dirname, {});
192 render(dirname + '/front/error.hbs', locals, function(err, html) {
193 assert(err.stack.indexOf('[front/error.hbs]') > 0);
194 done();
195 });
196 });
197
198 it('should report filename with partial error', function(done) {
199 var hb = hbs.create()
200 var render = hb.express3({
201 partialsDir: dirname + '/partials'
202 });
203 var locals = H.createLocals('express3', dirname, {});
204 render(dirname + '/partial.hbs', locals, function(err, html) {
205 assert(err.stack.indexOf('[partial.hbs]') > 0);
206 done();
207 });
208 });
209
210 it('should report filename with layout error', function(done) {
211 var hb = hbs.create()
212 var render = hb.express3({
213 partialsDir: dirname + '/partials'
214 });
215 var locals = H.createLocals('express3', dirname, {});
216 render(dirname + '/index.hbs', locals, function(err, html) {
217 assert(err.stack.indexOf('[layouts/default.hbs]') > 0);
218 done();
219 });
220 });
221});
222
223describe('issue-53', function() {
224 var dirname = path.join(__dirname, 'issues/53');
225
226 it('should use block with async helpers', function(done) {
227 var hb = hbs.create()
228 var res = 0;
229 hb.registerAsyncHelper('weird', function(_, resultcb) {
230 setTimeout(function() {
231 resultcb(++res);
232 }, 1)
233 });
234 var render = hb.express3({});
235 var locals = H.createLocals('express3', dirname, {});
236 render(dirname + '/index.hbs', locals, function(err, html) {
237 assert.ifError(err);
238 assert.ok(html.indexOf('__aSyNcId_') < 0);
239 done();
240 });
241 });
242});
243
244describe('issue-59', function() {
245 var dirname = __dirname + '/issues/59';
246 it('should escape or not', function (done) {
247 var hb = hbs.create();
248
249 function async(s, cb) {
250 cb('<strong>' + s + '</strong>');
251 }
252
253 hb.registerAsyncHelper("async", async);
254
255 var render = hb.express3({
256 viewsDir: dirname
257 });
258 var locals = H.createLocals('express3', dirname);
259
260 render(dirname + '/index.hbs', locals, function (err, html) {
261 assert.equal(H.stripWs(html), '&lt;strong&gt;foo&lt;/strong&gt;<strong>foo</strong>');
262 done();
263 });
264 });
265 it('should not escape SafeString', function (done) {
266 var hb = hbs.create();
267
268 function async(s, cb) {
269 cb(new hb.SafeString('<em>' + s + '</em>'));
270 }
271
272 hb.registerAsyncHelper('async', async);
273
274 var render = hb.express3({
275 viewsDir: dirname
276 });
277 var locals = H.createLocals('express3', dirname);
278
279 render(dirname + '/index.hbs', locals, function (err, html) {
280 assert.equal(H.stripWs(html), '<em>foo</em><em>foo</em>');
281 done();
282 });
283 });
284});
285
286describe('issue-73', function() {
287 var dirname = path.join(__dirname, 'issues/73');
288 it('should allow compile options', function(done){
289 var hb = hbs.create();
290 var render = hb.express3({
291 viewsDir: dirname,
292 partialsDir: dirname + '/partials',
293 onCompile: function(eh, source, filename) {
294 var options;
295 if (filename && filename.indexOf('partials')) {
296 options = {preventIndent: true};
297 }
298 return eh.handlebars.compile(source, options);
299 }
300 });
301
302 var locals = H.createLocals('express3', dirname);
303 render(dirname + '/index.hbs', locals, function (err, html) {
304 if (err) return console.log('error', err);
305
306 assert.ifError(err);
307 assert.ok(html.match(/^Hello/m));
308 assert.ok(html.match(/^second line/m));
309 done();
310 });
311 });
312});
313
314
315describe('issue-62', function() {
316 var dirname = path.join(__dirname, 'issues/62');
317
318 it('should provide options for async helpers', function (done) {
319 var hb = hbs.create();
320
321 function async(c, o, cb) {
322 if (o.hash.type === 'em') {
323 cb('<em>' + c + '</em>');
324 } else {
325 cb('<strong>' + c + '</strong>');
326 }
327 }
328
329 hb.registerAsyncHelper("async", async);
330
331 var render = hb.express3({
332 viewsDir: dirname
333 });
334 var locals = H.createLocals('express3', dirname);
335
336 render(dirname + '/basic.hbs', locals, function (err, html) {
337 assert.equal(
338 H.stripWs(html),
339 '&lt;strong&gt;foo&lt;/strong&gt;&lt;em&gt;foo&lt;/em&gt;'
340 );
341 done();
342 });
343 });
344
345 it('should allow for block async helpers', function (done) {
346 var hb = hbs.create();
347
348 function async(c, o, cb) {
349 var self = this;
350 self.output = c;
351
352 if (o.hash.inverse === 'true') {
353 cb(o.inverse(self));
354 } else {
355 cb(o.fn(self));
356 }
357 }
358
359 hb.registerAsyncHelper("async", async);
360
361 var render = hb.express3({
362 viewsDir: dirname
363 });
364 var locals = H.createLocals('express3', dirname);
365
366 render(dirname + '/block.hbs', locals, function (err, html) {
367 assert.equal(
368 H.stripWs(html),
369 '<p>GoodbyeWorld</p><p>HelloHandlebars</p>'
370 );
371 done();
372 });
373 });
374});
375
376describe('issue-76', function() {
377 var dirname = path.join(__dirname, 'issues/76');
378
379 it('should allow cachePartials to be called independently of render', function (done) {
380 var hb = hbs.create();
381
382 var render = hb.express3({
383 partialsDir: dirname
384 });
385
386 hb.cachePartials(function (err) {
387 assert.ifError(err);
388 assert.ok(true);
389 done();
390 });
391 });
392});
393
394describe('issue-84', function () {
395 var dirname = path.join(__dirname, 'issues/84');
396
397 it('should render deeply nested partials', function (done) {
398 var render = hbs.create().express3({
399 partialsDir: [dirname + '/partials']
400 });
401
402 function check(err, html) {
403 if (err) {
404 done(err);
405 }
406 assert.equal('<div>Testing3levelsdown</div>', H.stripWs(html));
407 done();
408 }
409
410 render(dirname + '/index.hbs', {cache: true, settings: {views: dirname + '/views'}}, check);
411 });
412});
413
414describe('issue-144', function() {
415 var dirname = path.join(__dirname, 'issues/144');
416
417 it('should repalce with async helpers even special string like $\'', function(done) {
418 var hb = hbs.create()
419 hb.registerAsyncHelper('special_string', function(_, resultcb) {
420 setTimeout(function() {
421 resultcb(new hbs.SafeString('<p><code>\'$example$\'</code> abcd</p>'));
422 }, 1)
423 });
424 var render = hb.express3({});
425 var locals = H.createLocals('express3', dirname, {});
426 render(dirname + '/index.hbs', locals, function(err, html) {
427 assert.equal('<div><p><code>\'$example$\'</code> abcd</p></div>\n', html);
428 done();
429 });
430 });
431});
432
433describe('issue-153', function() {
434 var dirname = path.join(__dirname, 'issues/153');
435 it('should concat contentFor blocks with newline', function(done) {
436 var check = function (err, html) {
437 if (err) {
438 done(err);
439 }
440 assert.equal('1\n2', html.trim());
441 done();
442 }
443 var hb = hbs.create()
444 var render = hb.express3({});
445 var locals = H.createLocals('express3', dirname, { });
446 render(dirname + '/index.hbs', locals, check);
447 });
448});