270 lines
6.9 KiB
JavaScript
270 lines
6.9 KiB
JavaScript
|
|
||
|
/**
|
||
|
* Module dependencies.
|
||
|
*/
|
||
|
|
||
|
var ejs = require('../')
|
||
|
, assert = require('assert');
|
||
|
|
||
|
module.exports = {
|
||
|
'test .version': function(){
|
||
|
assert.ok(/^\d+\.\d+\.\d+$/.test(ejs.version), 'Test .version format');
|
||
|
},
|
||
|
|
||
|
'test html': function(){
|
||
|
assert.equal('<p>yay</p>', ejs.render('<p>yay</p>'));
|
||
|
},
|
||
|
|
||
|
'test buffered code': function(){
|
||
|
var html = '<p>tj</p>',
|
||
|
str = '<p><%= name %></p>',
|
||
|
locals = { name: 'tj' };
|
||
|
assert.equal(html, ejs.render(str, { locals: locals }));
|
||
|
},
|
||
|
|
||
|
'test unbuffered code': function(){
|
||
|
var html = '<p>tj</p>',
|
||
|
str = '<% if (name) { %><p><%= name %></p><% } %>',
|
||
|
locals = { name: 'tj' };
|
||
|
assert.equal(html, ejs.render(str, { locals: locals }));
|
||
|
},
|
||
|
|
||
|
'test `scope` option': function(){
|
||
|
var html = '<p>tj</p>',
|
||
|
str = '<p><%= this %></p>';
|
||
|
assert.equal(html, ejs.render(str, { scope: 'tj' }));
|
||
|
},
|
||
|
|
||
|
'test escaping': function(){
|
||
|
assert.equal('<script>', ejs.render('<%= "<script>" %>'));
|
||
|
assert.equal('<script>', ejs.render('<%- "<script>" %>'));
|
||
|
},
|
||
|
|
||
|
'test newlines': function(){
|
||
|
var html = '\n<p>tj</p>\n<p>tj@sencha.com</p>',
|
||
|
str = '<% if (name) { %>\n<p><%= name %></p>\n<p><%= email %></p><% } %>',
|
||
|
locals = { name: 'tj', email: 'tj@sencha.com' };
|
||
|
assert.equal(html, ejs.render(str, { locals: locals }));
|
||
|
},
|
||
|
|
||
|
'test single quotes': function(){
|
||
|
var html = '<p>WAHOO</p>',
|
||
|
str = "<p><%= up('wahoo') %></p>",
|
||
|
locals = { up: function(str){ return str.toUpperCase(); }};
|
||
|
assert.equal(html, ejs.render(str, { locals: locals }));
|
||
|
},
|
||
|
|
||
|
'test single quotes in the html': function(){
|
||
|
var html = '<p>WAHOO that\'s cool</p>',
|
||
|
str = '<p><%= up(\'wahoo\') %> that\'s cool</p>',
|
||
|
locals = { up: function(str){ return str.toUpperCase(); }};
|
||
|
assert.equal(html, ejs.render(str, { locals: locals }));
|
||
|
},
|
||
|
|
||
|
'test multiple single quotes': function() {
|
||
|
var html = "<p>couldn't shouldn't can't</p>",
|
||
|
str = "<p>couldn't shouldn't can't</p>";
|
||
|
assert.equal(html, ejs.render(str));
|
||
|
},
|
||
|
|
||
|
'test single quotes inside tags': function() {
|
||
|
var html = '<p>string</p>',
|
||
|
str = "<p><%= 'string' %></p>";
|
||
|
assert.equal(html, ejs.render(str));
|
||
|
},
|
||
|
|
||
|
'test back-slashes in the document': function() {
|
||
|
var html = "<p>backslash: '\\'</p>",
|
||
|
str = "<p>backslash: '\\'</p>";
|
||
|
assert.equal(html, ejs.render(str));
|
||
|
},
|
||
|
|
||
|
'test double quotes': function(){
|
||
|
var html = '<p>WAHOO</p>',
|
||
|
str = '<p><%= up("wahoo") %></p>',
|
||
|
locals = { up: function(str){ return str.toUpperCase(); }};
|
||
|
assert.equal(html, ejs.render(str, { locals: locals }));
|
||
|
},
|
||
|
|
||
|
'test multiple double quotes': function() {
|
||
|
var html = '<p>just a "test" wahoo</p>',
|
||
|
str = '<p>just a "test" wahoo</p>';
|
||
|
assert.equal(html, ejs.render(str));
|
||
|
},
|
||
|
|
||
|
'test whitespace': function(){
|
||
|
var html = '<p>foo</p>',
|
||
|
str = '<p><%="foo"%></p>';
|
||
|
assert.equal(html, ejs.render(str));
|
||
|
|
||
|
var html = '<p>foo</p>',
|
||
|
str = '<p><%=bar%></p>';
|
||
|
assert.equal(html, ejs.render(str, { locals: { bar: 'foo' }}));
|
||
|
},
|
||
|
|
||
|
'test custom tags': function(){
|
||
|
var html = '<p>foo</p>',
|
||
|
str = '<p>{{= "foo" }}</p>';
|
||
|
|
||
|
assert.equal(html, ejs.render(str, {
|
||
|
open: '{{',
|
||
|
close: '}}'
|
||
|
}));
|
||
|
|
||
|
var html = '<p>foo</p>',
|
||
|
str = '<p><?= "foo" ?></p>';
|
||
|
|
||
|
assert.equal(html, ejs.render(str, {
|
||
|
open: '<?',
|
||
|
close: '?>'
|
||
|
}));
|
||
|
},
|
||
|
|
||
|
'test custom tags over 2 chars': function(){
|
||
|
var html = '<p>foo</p>',
|
||
|
str = '<p>{{{{= "foo" }>>}</p>';
|
||
|
|
||
|
assert.equal(html, ejs.render(str, {
|
||
|
open: '{{{{',
|
||
|
close: '}>>}'
|
||
|
}));
|
||
|
|
||
|
var html = '<p>foo</p>',
|
||
|
str = '<p><??= "foo" ??></p>';
|
||
|
|
||
|
assert.equal(html, ejs.render(str, {
|
||
|
open: '<??',
|
||
|
close: '??>'
|
||
|
}));
|
||
|
},
|
||
|
|
||
|
'test global custom tags': function(){
|
||
|
var html = '<p>foo</p>',
|
||
|
str = '<p>{{= "foo" }}</p>';
|
||
|
ejs.open = '{{';
|
||
|
ejs.close = '}}';
|
||
|
assert.equal(html, ejs.render(str));
|
||
|
delete ejs.open;
|
||
|
delete ejs.close;
|
||
|
},
|
||
|
|
||
|
'test iteration': function(){
|
||
|
var html = '<p>foo</p>',
|
||
|
str = '<% for (var key in items) { %>'
|
||
|
+ '<p><%= items[key] %></p>'
|
||
|
+ '<% } %>';
|
||
|
assert.equal(html, ejs.render(str, {
|
||
|
locals: {
|
||
|
items: ['foo']
|
||
|
}
|
||
|
}));
|
||
|
|
||
|
var html = '<p>foo</p>',
|
||
|
str = '<% items.forEach(function(item){ %>'
|
||
|
+ '<p><%= item %></p>'
|
||
|
+ '<% }) %>';
|
||
|
assert.equal(html, ejs.render(str, {
|
||
|
locals: {
|
||
|
items: ['foo']
|
||
|
}
|
||
|
}));
|
||
|
},
|
||
|
|
||
|
'test filter support': function(){
|
||
|
var html = 'Zab',
|
||
|
str = '<%=: items | reverse | first | reverse | capitalize %>';
|
||
|
assert.equal(html, ejs.render(str, {
|
||
|
locals: {
|
||
|
items: ['foo', 'bar', 'baz']
|
||
|
}
|
||
|
}));
|
||
|
},
|
||
|
|
||
|
'test filter argument support': function(){
|
||
|
var html = 'tj, guillermo',
|
||
|
str = '<%=: users | map:"name" | join:", " %>';
|
||
|
assert.equal(html, ejs.render(str, {
|
||
|
locals: {
|
||
|
users: [
|
||
|
{ name: 'tj' },
|
||
|
{ name: 'guillermo' }
|
||
|
]
|
||
|
}
|
||
|
}));
|
||
|
},
|
||
|
|
||
|
'test sort_by filter': function(){
|
||
|
var html = 'tj',
|
||
|
str = '<%=: users | sort_by:"name" | last | get:"name" %>';
|
||
|
assert.equal(html, ejs.render(str, {
|
||
|
locals: {
|
||
|
users: [
|
||
|
{ name: 'guillermo' },
|
||
|
{ name: 'tj' },
|
||
|
{ name: 'mape' }
|
||
|
]
|
||
|
}
|
||
|
}));
|
||
|
},
|
||
|
|
||
|
'test custom filters': function(){
|
||
|
var html = 'Welcome Tj Holowaychuk',
|
||
|
str = '<%=: users | first | greeting %>';
|
||
|
|
||
|
ejs.filters.greeting = function(user){
|
||
|
return 'Welcome ' + user.first + ' ' + user.last + '';
|
||
|
};
|
||
|
|
||
|
assert.equal(html, ejs.render(str, {
|
||
|
locals: {
|
||
|
users: [
|
||
|
{ first: 'Tj', last: 'Holowaychuk' }
|
||
|
]
|
||
|
}
|
||
|
}));
|
||
|
},
|
||
|
|
||
|
'test useful stack traces': function(){
|
||
|
var str = [
|
||
|
"A little somethin'",
|
||
|
"somethin'",
|
||
|
"<% if (name) { %>", // Failing line
|
||
|
" <p><%= name %></p>",
|
||
|
" <p><%= email %></p>",
|
||
|
"<% } %>"
|
||
|
].join("\n");
|
||
|
|
||
|
try {
|
||
|
ejs.render(str)
|
||
|
} catch( err ){
|
||
|
assert.includes(err.message,"name is not defined");
|
||
|
assert.eql(err.name,"ReferenceError");
|
||
|
var lineno = parseInt(err.toString().match(/ejs:(\d+)\n/)[1]);
|
||
|
assert.eql(lineno,3,"Error should been thrown on line 3, was thrown on line "+lineno);
|
||
|
}
|
||
|
},
|
||
|
|
||
|
'test useful stack traces multiline': function(){
|
||
|
var str = [
|
||
|
"A little somethin'",
|
||
|
"somethin'",
|
||
|
"<% var some = 'pretty';",
|
||
|
" var multiline = 'javascript';",
|
||
|
"%>",
|
||
|
"<% if (name) { %>", // Failing line
|
||
|
" <p><%= name %></p>",
|
||
|
" <p><%= email %></p>",
|
||
|
"<% } %>"
|
||
|
].join("\n");
|
||
|
|
||
|
try {
|
||
|
ejs.render(str)
|
||
|
} catch( err ){
|
||
|
assert.includes(err.message,"name is not defined");
|
||
|
assert.eql(err.name,"ReferenceError");
|
||
|
var lineno = parseInt(err.toString().match(/ejs:(\d+)\n/)[1]);
|
||
|
assert.eql(lineno,6,"Error should been thrown on line 3, was thrown on line "+lineno);
|
||
|
}
|
||
|
}
|
||
|
};
|