1 | var Lab = require('lab');
|
2 | var Template = require('../lib/template');
|
3 | var assert = require('chai').assert;
|
4 | var FS = require('fs');
|
5 |
|
6 | var lab = exports.lab = Lab.script();
|
7 |
|
8 | lab.experiment('VMNode', function() {
|
9 | var fixture = {};
|
10 |
|
11 | lab.before(function(done) {
|
12 | fixture = {};
|
13 | fixture.template = new Template(require('../lib/vm_node'));
|
14 | fixture.VM = fixture.template.VM;
|
15 | fixture.vm = new fixture.VM();
|
16 | fixture.vm.resetCache();
|
17 | done();
|
18 | });
|
19 |
|
20 | lab.test('extend with same path', function(done) {
|
21 | var options = {
|
22 | basePath: '/'
|
23 | };
|
24 |
|
25 | options.filename = '/layout.slm';
|
26 | fixture.vm.cache(options.filename, fixture.template.exec([
|
27 | 'html',
|
28 | ' head',
|
29 | ' = content("head")',
|
30 | ' body',
|
31 | ' = content()'
|
32 | ].join('\n'), options, fixture.vm));
|
33 |
|
34 | options.filename = '/view.slm';
|
35 | var src = [
|
36 | '- extend("layout")',
|
37 | '= content("head")',
|
38 | ' meta name="keywords" content=this.who',
|
39 | 'p Hello, ${this.who}'
|
40 | ].join('\n');
|
41 |
|
42 |
|
43 | var result = fixture.template.render(src, {who: 'World', what: 'the best'}, options, fixture.vm);
|
44 | assert.deepEqual(result, '<html><head><meta content="World" name="keywords" /></head><body><p>Hello, World</p></body></html>');
|
45 | done();
|
46 | });
|
47 |
|
48 | lab.test('extend with abs path', function(done) {
|
49 | var options = {
|
50 | basePath: '/views'
|
51 | };
|
52 |
|
53 | options.filename = '/views/layout.slm';
|
54 | fixture.vm.cache('/views/layout.slm', fixture.template.exec([
|
55 | 'html',
|
56 | ' head',
|
57 | ' = content("head")',
|
58 | ' body',
|
59 | ' = content()'
|
60 | ].join('\n'), options, fixture.vm));
|
61 |
|
62 | options.filename = '/views/view';
|
63 | var src = [
|
64 | '- extend("/layout")',
|
65 | '= content("head");',
|
66 | ' meta name="keywords" content=this.who',
|
67 | 'p Hello, ${this.who}'
|
68 | ].join('\n');
|
69 |
|
70 | var result = fixture.template.render(src, {who: 'World', what: 'the best'}, options, fixture.vm);
|
71 | assert.deepEqual(result, '<html><head><meta content="World" name="keywords" /></head><body><p>Hello, World</p></body></html>');
|
72 | done();
|
73 | });
|
74 |
|
75 | lab.test('extend with same nested path', function(done) {
|
76 | var options = {
|
77 | basePath: '/'
|
78 | };
|
79 |
|
80 | options.filename = '/views/layout.slm';
|
81 | fixture.vm.cache(options.filename, fixture.template.exec([
|
82 | 'html',
|
83 | ' head',
|
84 | ' = content("head")',
|
85 | ' body',
|
86 | ' = content()'
|
87 | ].join('\n'), {}, fixture.vm));
|
88 |
|
89 | options.filename = '/views/view.slm';
|
90 |
|
91 | var src = [
|
92 | '- extend("layout")',
|
93 | '= content("head");',
|
94 | ' meta name="keywords" content=this.who',
|
95 | 'p Hello, ${this.who}'
|
96 | ].join('\n');
|
97 |
|
98 | var result = fixture.template.render(src, {who: 'World', what: 'the best'}, options, fixture.vm);
|
99 | assert.deepEqual(result, '<html><head><meta content="World" name="keywords" /></head><body><p>Hello, World</p></body></html>');
|
100 | done();
|
101 | });
|
102 |
|
103 | lab.test('extend with same nested path 2', function(done) {
|
104 | var options = {
|
105 | basePath: '/views'
|
106 | };
|
107 | options.filename = '/views/layouts/app.slm';
|
108 | fixture.vm.cache(options.filename, fixture.template.exec([
|
109 | 'html',
|
110 | ' head',
|
111 | ' = content("head")',
|
112 | ' body',
|
113 | ' = content()'
|
114 | ].join('\n'), options, fixture.vm));
|
115 |
|
116 | options.filename = '/views/products/form.slm';
|
117 | fixture.vm.cache(options.filename, fixture.template.exec([
|
118 | 'form',
|
119 | ' input type="submit"'
|
120 | ].join('\n'), options, fixture.vm));
|
121 |
|
122 | options.filename = '/views/products/new.slm';
|
123 |
|
124 | var src = [
|
125 | '- extend("../layouts/app")',
|
126 | '= content("head");',
|
127 | ' meta name="keywords" content=this.who',
|
128 | '= partial("form", this)'
|
129 | ].join('\n');
|
130 |
|
131 | var result = fixture.template.render(src, {who: 'World', what: 'the best'}, options, fixture.vm);
|
132 | assert.deepEqual(result, '<html><head><meta content="World" name="keywords" /></head><body><form><input type="submit" /></form></body></html>');
|
133 | done();
|
134 | });
|
135 |
|
136 | lab.test('test require', function(done) {
|
137 | var options = {
|
138 | basePath: '/views',
|
139 | require: module.require
|
140 | };
|
141 |
|
142 | options.filename = '/views/forms/form.slm';
|
143 | var src = [
|
144 | '- var p = require("path")',
|
145 | 'p = p.extname("super.slm")'
|
146 | ].join('\n');
|
147 |
|
148 | var result = fixture.template.render(src, {}, options, fixture.vm);
|
149 | assert.deepEqual(result, '<p>.slm</p>');
|
150 |
|
151 | done();
|
152 | });
|
153 |
|
154 | lab.test('test content default', function(done) {
|
155 | var options = {
|
156 | basePath: '/views'
|
157 | };
|
158 |
|
159 | options.filename = '/views/layouts/app.slm';
|
160 |
|
161 | fixture.vm.cache(options.filename, fixture.template.exec([
|
162 | 'html',
|
163 | ' head',
|
164 | ' = content("title", "default")',
|
165 | ' title Default title',
|
166 | ' body',
|
167 | ' = content()'
|
168 | ].join('\n'), options, fixture.vm));
|
169 |
|
170 | options.filename = '/views/forms/form.slm';
|
171 | var src = [
|
172 | '- extend("../layouts/app")',
|
173 | 'p Body from view'
|
174 | ].join('\n');
|
175 |
|
176 | var result = fixture.template.render(src, {}, options, fixture.vm);
|
177 | assert.deepEqual(result, '<html><head><title>Default title</title></head><body><p>Body from view</p></body></html>');
|
178 |
|
179 | var src2 = [
|
180 | '- extend("../layouts/app")',
|
181 | '= content("title")',
|
182 | ' title New title',
|
183 | 'p Body from view'
|
184 | ].join('\n');
|
185 |
|
186 | var result2 = fixture.template.render(src2, {}, options, fixture.vm);
|
187 | assert.deepEqual(result2, '<html><head><title>New title</title></head><body><p>Body from view</p></body></html>');
|
188 | done();
|
189 | });
|
190 |
|
191 | lab.test('test content append', function(done) {
|
192 | var options = {
|
193 | basePath: '/views'
|
194 | };
|
195 |
|
196 | options.filename = '/views/layouts/app.slm';
|
197 |
|
198 | fixture.vm.cache(options.filename, fixture.template.exec([
|
199 | 'html',
|
200 | ' head',
|
201 | ' = content("title")',
|
202 | ' body',
|
203 | ' = content()'
|
204 | ].join('\n'), options, fixture.vm));
|
205 |
|
206 | options.filename = '/views/forms/form.slm';
|
207 | var src = [
|
208 | '- extend("../layouts/app")',
|
209 | '= content("title", "append")',
|
210 | ' title 1',
|
211 | 'p Body from view'
|
212 | ].join('\n');
|
213 |
|
214 | var result = fixture.template.render(src, {}, options, fixture.vm);
|
215 | assert.deepEqual(result, '<html><head><title>1</title></head><body><p>Body from view</p></body></html>');
|
216 |
|
217 | var src2 = [
|
218 | '- extend("../layouts/app")',
|
219 | '= content("title", "prepend")',
|
220 | ' title 2',
|
221 | 'p Body from view'
|
222 | ].join('\n');
|
223 |
|
224 | var result2 = fixture.template.render(src2, {}, options, fixture.vm);
|
225 | assert.deepEqual(result2, '<html><head><title>2</title></head><body><p>Body from view</p></body></html>');
|
226 | done();
|
227 | });
|
228 |
|
229 |
|
230 | lab.test('test view loading', function(done) {
|
231 | var options = {
|
232 | basePath: __dirname + '/views',
|
233 | filename: __dirname + '/views/index.slm'
|
234 | };
|
235 |
|
236 | var src = FS.readFileSync(options.filename, 'utf8');
|
237 |
|
238 | var compile = require('../lib/slm').compile;
|
239 |
|
240 | var fn1 = compile(src, options);
|
241 | var res1 = fn1({});
|
242 | options.useCache = true;
|
243 | var fn2 = compile(src, options);
|
244 | var res2 = fn2({});
|
245 | options.useCache = false;
|
246 | var fn3 = compile(src, options);
|
247 | var res3 = fn3({});
|
248 | var expected = '<!DOCTYPE html><html><head><title>Nice</title><style type="text/css">body {background :red};</style></head><body><h1>Partial</h1><p>This is new footer</p></body><script>console.log(\'script\');</script><script type="text/javascript">console.log(\'javascript\');</script></html>';
|
249 | assert.deepEqual(res1, expected);
|
250 | assert.deepEqual(res2, expected);
|
251 | assert.deepEqual(res3, expected);
|
252 |
|
253 | done();
|
254 | });
|
255 |
|
256 | lab.test('test resolvePath', function(done) {
|
257 | var options = {
|
258 | filename: __dirname + '/views/index.slm'
|
259 | };
|
260 |
|
261 | var src = FS.readFileSync(options.filename, 'utf8');
|
262 |
|
263 | var compile = require('../lib/slm').compile;
|
264 |
|
265 | var fn1 = compile(src, options);
|
266 | assert.throw(function() {
|
267 | fn1({});
|
268 | }, 'the "basePath" option is required to use with "absolute" paths');
|
269 |
|
270 | var fn2 = compile(src, {});
|
271 | assert.throw(function() {
|
272 | fn2({});
|
273 | }, 'the "filename" option is required to use with "relative" paths');
|
274 |
|
275 | done();
|
276 | });
|
277 | });
|