/** * 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); } } };