1 | 'use strict';
|
2 | var assert = require('assert');
|
3 | var hbs = require('..');
|
4 | var path = require('path');
|
5 | var H = require('./helpers');
|
6 |
|
7 |
|
8 | describe('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 |
|
28 | describe('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 |
|
88 |
|
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 |
|
110 | describe('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 |
|
175 | describe('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 |
|
223 | describe('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 |
|
244 | describe('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), '<strong>foo</strong><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 |
|
286 | describe('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 |
|
315 | describe('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 | '<strong>foo</strong><em>foo</em>'
|
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 |
|
376 | describe('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 |
|
394 | describe('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 |
|
414 | describe('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 |
|
433 | describe('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 | });
|