UNPKG

8.12 kBJavaScriptView Raw
1var Lab = require('lab');
2var Template = require('../lib/template');
3var assert = require('chai').assert;
4var FS = require('fs');
5
6var lab = exports.lab = Lab.script();
7
8lab.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});