exports['POST /facebook/:id/checkin No Latitude Longitude'] = function(test) { var params = JSON.stringify({ message: "testing" }); assert.response(test,Bozuko.app, { url: '/facebook/'+id+'/checkin'+tokstr, headers: headers, method: 'POST', data: params }, { status:400, headers: {'Content-Type': 'application/json; charset=utf-8'} }, function(res) { console.log(res.body); var result = JSON.parse(res.body); console.log(result); test.done(); }); };
it('/assets/bones/routers.js', function(done) { assert.response(server, { url: '/assets/bones/routers.js', method: 'GET' }, { status: 200 }, function(err, res) { checkAsset(res, 'test/fixture/node_modules/submodule/routers/Foo'); checkAsset(res, 'test/fixture/routers/Page'); // Doesn't include server files. excludesAsset(res, 'test/fixture/routers/Secret.server'); excludesAsset(res, 'test/fixture/routers/Deprecated.server'); // Correct order. assert.ok(res.body.indexOf('// ---- start test/fixture/node_modules/submodule/routers/Foo.bones.js ----') >= 0); assert.ok(res.body.indexOf('// ---- start test/fixture/node_modules/submodule/routers/Foo.bones.js ----') < res.body.indexOf('// ---- start test/fixture/routers/Page.bones.js ----')); assert.ok(res.body.indexOf('// ---- end test/fixture/node_modules/submodule/routers/Foo.bones.js ----') >= 0); assert.ok(res.body.indexOf('// ---- end test/fixture/node_modules/submodule/routers/Foo.bones.js ----') < res.body.indexOf('// ---- start test/fixture/routers/Page.bones.js ----')); done(); }); });
},{}, function(res) { assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); assert.equal(res.headers['x-cache-channel'], 'NONE'); assert.equal(res.headers['cache-control'], expected_cache_control); var pbody = JSON.parse(res.body); assert.equal(pbody.rows.length, 0); assert.response(app, { url: "/api/v1/sql?" + querystring.stringify({ q: 'SELECT count(*) FROM test_table', api_key: 1234 }), headers: {host: 'vizzuality.cartodb.com'}, method: 'GET' },{}, function(res) { assert.equal(res.statusCode, 200, res.statusCode + ': ' + res.body); assert.equal(res.headers['x-cache-channel'], 'cartodb_test_user_1_db:test_table'); assert.equal(res.headers['cache-control'], expected_cache_control); var pbody = JSON.parse(res.body); assert.equal(pbody.total_rows, 1); assert.equal(pbody.rows[0]['count'], 0); done(); }); });
exports['POST /facebook/:id/checkin No User'] = function(test) { var params = JSON.stringify({ lat: 42.646261785714, lng: -71.303897114286, message: "testing" }); assert.response(test,Bozuko.app, { url: '/facebook/'+id+'/checkin', headers: headers, method: 'POST', data: params }, { status:401, headers: {'Content-Type': 'application/json; charset=utf-8'} }, function(res) { var result = JSON.parse(res.body); test.done(); }); };
test('SHP format, authenticated', function(done){ assert.response(app, { url: '/api/v1/sql?q=SELECT%20*%20FROM%20untitle_table_4%20LIMIT%201&format=shp&api_key=1234', headers: {host: 'vizzuality.cartodb.com'}, encoding: 'binary', method: 'GET' },{ }, function(res){ assert.equal(res.statusCode, 200, res.body); var cd = res.header('Content-Disposition'); assert.equal(true, /filename=cartodb-query.zip/gi.test(cd)); var tmpfile = '/tmp/myshape.zip'; var err = fs.writeFileSync(tmpfile, res.body, 'binary'); if (err) { done(err); return } var zf = new zipfile.ZipFile(tmpfile); assert.ok(_.contains(zf.names, 'cartodb-query.shp'), 'SHP zipfile does not contain .shp: ' + zf.names); assert.ok(_.contains(zf.names, 'cartodb-query.shx'), 'SHP zipfile does not contain .shx: ' + zf.names); assert.ok(_.contains(zf.names, 'cartodb-query.dbf'), 'SHP zipfile does not contain .dbf: ' + zf.names); assert.ok(_.contains(zf.names, 'cartodb-query.prj'), 'SHP zipfile does not contain .prj: ' + zf.names); // TODO: check contents of the DBF fs.unlinkSync(tmpfile); done(); }); });
exports['test project creation with invalid id'] = function() { var data = readJSON('create-project'); data.id = 'Bad !@!ID'; assert.response(command.servers['Core'], { url: '/api/Project/Bad%20!@!ID', method: 'PUT', headers: { 'content-type': 'application/json', 'cookie': 'bones.token=' + data['bones.token'], 'accept': 'application/json' }, data: JSON.stringify(data) }, { status: 409 }, function(res) { var body = JSON.parse(res.body); delete body.stack; assert.deepEqual({ message: "Error: Filename may include alphanumeric characters, dashes and underscores." }, body); assert['throws'](function() { fs.statSync('./test/fixtures/files/project/Bad !@!ID'); }, "ENOENT, No such file or directory './test/fixtures/files/project/Bad !@!ID'"); }); };
'test #configure() precedence': function(){ var app = express.createServer(); app.configure(function(){ app.use(function(req, res, next){ res.write('first'); next(); }); app.use(app.router); app.use(function(req, res, next){ res.end('last'); }); }); app.get('/', function(req, res, next){ res.write(' route '); next(); }); assert.response(app, { url: '/' }, { body: 'first route last' }); },
'test maxAge option': function(){ // 1 hour var app = create( connect.cookieParser() , connect.session({ secret: 'keyboard cat' , cookie: { maxAge: 3600000 } }) , function(req, res, next){ res.end('wahoo'); } ); assert.response(app, { url: '/' }, function(res){ var exp = new Date(expires(res)) , now = new Date; now.getYear().should.equal(exp.getYear()); exp.getHours().should.not.equal(now.getHours()); }); },
test('errors are not confused with warnings', function(done){ var query = querystring.stringify({ q: "SELECT 'POINT(0 0)'::geometry as g" + ", 1 as a_very_very_very_long_field_name" + " UNION ALL " + "SELECT 'LINESTRING(0 0, 1 0)'::geometry, 2", format: 'shp' }); assert.response(app, { url: '/api/v1/sql?' + query, headers: {host: 'vizzuality.cartodb.com'}, encoding: 'binary', method: 'GET' },{ }, function(res){ assert.deepEqual(res.headers['content-type'], 'application/json; charset=utf-8'); assert.deepEqual(res.headers['content-disposition'], 'inline'); assert.equal(res.statusCode, 400, res.statusCode + ': ' +res.body); var parsedBody = JSON.parse(res.body); var expectedBody = {"error":["ERROR 1: Attempt to write non-point (LINESTRING) geometry to point shapefile."]} assert.deepEqual(parsedBody, expectedBody); done(); }); });
'express : middleware : merged-data': function() { app.post( '/user/:id', form( filter("id").toInt(), filter("stuff").toUpper(), filter("rad").toUpper() ), function(req, res){ // Validate filtered form data assert.strictEqual(req.form.id, 5); // from param assert.equal(req.form.stuff, "THINGS"); // from query param assert.equal(req.form.rad, "COOL"); // from body // Check that originl values are still in place assert.ok(typeof req.params.id, "string"); assert.equal(req.query.stuff, "things"); assert.equal(req.body.rad, "cool"); res.send(JSON.stringify(req.form)); } ); assert.response(app, { url: '/user/5?stuff=things&id=overridden', method: 'POST', body: JSON.stringify({ id: "overridden by url param", stuff: "overridden by query param", rad: "cool" }), headers: { 'Content-Type': 'application/json' } }, { status: 200 } ); }
'SproutCore flavor': function(){ server.config.flavor = "sproutcore"; // First create the document assert.response(app, { url: '/tests/tests', method: 'POST', data: '{"test":"sproutcore"}', headers: { 'Content-Type': 'application/json' } }, function(res) { assert.equal(res.body, '{"ok":1}'); assert.equal(res.statusCode, 201); var location = res.header('Location').split('/').slice(1); assert.equal(location[0], 'tests'); assert.equal(location[1], 'tests'); assert.isNotNull(location[2]); assert.length(location[2], 24); var objectId = location[2]; // Check whether we can query it. assert.response(app, { url: '/tests/tests/'+objectId, method: 'GET', }, function(res) { assert.eql(JSON.parse(res.body), { "test":"sproutcore", "guid":objectId } ); assert.equal(res.statusCode, 200); }); }); }
test('numeric fields are rendered as numbers in JSON', function(done){ assert.response(app, { url: '/api/v1/sql?' + querystring.stringify({ q: "WITH inp AS ( SELECT 1::int2 as a, 2::int4 as b, " + "3::int8 as c, 4::float4 as d, " + "5::float8 as e, 6::numeric as f" + ") SELECT a,b,c,d,e,f," + " ARRAY[a] AS _a, " + " ARRAY[b] AS _b, " + " ARRAY[c] AS _c, " + " ARRAY[d] AS _d, " + " ARRAY[e] AS _e, " + " ARRAY[f] AS _f " + "FROM inp" }), headers: {host: 'vizzuality.cartodb.com'}, method: 'GET' },{ }, function(res) { assert.equal(res.statusCode, 200, res.body); var parsedBody = JSON.parse(res.body); var row = parsedBody.rows[0]; assert.equal(typeof(row.a), 'number'); assert.equal(typeof(row.b), 'number'); assert.equal(typeof(row.c), 'number'); assert.equal(typeof(row.d), 'number'); assert.equal(typeof(row.e), 'number'); assert.equal(typeof(row.f), 'number'); assert.equal(typeof(row._a[0]), 'number'); assert.equal(typeof(row._b[0]), 'number'); assert.equal(typeof(row._c[0]), 'number'); assert.equal(typeof(row._d[0]), 'number'); assert.equal(typeof(row._e[0]), 'number'); assert.equal(typeof(row._f[0]), 'number'); done(); }); });
'test .app property after returning control to parent': function() { var app = express.createServer() , blog = express.createServer(); // Mounted servers did not restore `req.app` and `res.app` when // passing control back to parent via `out()` in `#handle()`. blog.get('/', function(req, res, next){ req.app.should.equal(blog); res.app.should.equal(blog); next(); }); app.use(blog); app.use(function(req, res, next) { res.send((res.app === app) ? 'restored' : 'not-restored'); }); assert.response(app, { url: '/' }, { body: 'restored' } ); },
'test app.param() multiple calls with error': function(){ var app = express.createServer(); var commits = ['foo', 'bar', 'baz']; app.param('commit', function(req, res, next, id){ req.commit = parseInt(id); if (isNaN(req.commit)) return next('route'); next(); }); app.param('commit', function(req, res, next, id){ req.commit = commits[req.commit]; next(new Error('failed')); }); app.get('/commit/:commit', function(req, res){ res.send(req.commit); }); assert.response(app, { url: '/commit/0' }, { status: 500 }); },
'test use() several': function(beforeExit){ var app = connect.createServer() , calls = 0; function a(req, res, next){ ++calls; next(); } function b(req, res, next){ ++calls; res.end('admin'); } app.use('/admin', a, b); assert.response(app, { url: '/admin' }, { body: 'admin' }); beforeExit(function(){ calls.should.equal(2); }); },
exports['test project endpoint'] = function(beforeExit) { var completed = false; assert.response(command.servers['Core'], { url: '/api/Project/demo_01' }, { status: 200 }, function(res) { var body = JSON.parse(res.body); var _updated = body._updated; cleanProject(body); assert.deepEqual(readJSON('existing-project'), body); // No new update. assert.response(command.servers['Core'], { url: '/api/Project/demo_01/' + _updated }, { body: '{}', status: 200 } ); // Update notification. assert.response(command.servers['Core'], { url: '/api/Project/demo_01/' + (+_updated - 1000) }, { status: 200 }, function(res) { var body = JSON.parse(res.body); var _updated = body._updated; cleanProject(body); assert.deepEqual(readJSON('existing-project'), body); completed = true; } ); } ); beforeExit(function() { assert.ok(completed); }) };
'UPDATE' : function(){ assert.response(app, { url: '/logs/new' , method: 'POST', headers: { 'Content-Type' : 'application/json' }, data: JSON.stringify( { time: 1302913999000, level: 'ERROR', ip: '39.191.103.1', line_num: 'tcp.stuff.js:159:20', body: 'this is just anoher log', component: 'mobile' } ) }, {}, function(){ Log.findOne({ time: 1302913999000, level: 'ERROR', ip: '39.191.103.1', line_num: 'tcp.stuff.js:159:20', body: 'this is just anoher log', component: 'mobile' }, function(err, docs){ docs.component = 'dispatch'; docs.save(function(err){ assert.isNull(err); }); } ); } ); }
exports['POST /moves'] = function() { assert.response(server, { url: '/moves', method: 'POST', data: 'move[condition]=a good move is a"scary move&move[definition]=On a 7 - 9 On a 10%2b roll%2bhot', headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }, { status: 302 }, function(res) { assert.eql('http://undefined/moves/a-good-move-is-ascary-move', res.headers.location); Move.findOne({ 'meta.slug': 'a-good-move-is-ascary-move' }, function(err, move) { assert.eql('a-good-move-is-ascary-move', move.meta.slug); assert.eql('a good move is a"scary move', move.condition); assert.eql('hot', move.stat); assert.eql('<p>On a 7 - 9 On a 10+ roll+hot</p>', move.definition_markdown); assert.eql('On a 7 - 9 On a 10+ roll+hot', move.definition); }); }); }
function ping() { assert.response(core, { url: '/api/Export/' + antiMeridianJob.id, method: 'GET', headers: { cookie: "bones.token=" + token, 'content-type': "application/json" } }, { status: 200 }, function(res) { var data = JSON.parse(res.body); if (data.status === 'processing') { // Don't flood the socket or the test will fail. setTimeout(ping, 1000); } else if (data.status === 'error') { throw new Error(data.error); } else { antiMeridianJob.status = "complete"; antiMeridianJob.progress = 1; console.log(data); assert.ok(data.pid); assert.ok(data.created); delete antiMeridianJob['bones.token']; delete data.created; delete data.pid; delete data.remaining; delete data.updated; delete data.rate; assert.deepEqual(antiMeridianJob, data); done(); } }); }
function raiseBothWarningAndNotice(err) { if ( err ) throw err; var next = this; assert.response(app, { url: '/api/v1/sql?' + querystring.stringify({ q: "SET client_min_messages TO 'notice'; select raise('warning', 'hello again warning'), raise('notice', 'hello again notice');" }), headers: {host: 'vizzuality.cartodb.com'}, method: 'GET' },{}, function(res) { var err = null; try { assert.equal(res.statusCode, 200, res.body); var parsedBody = JSON.parse(res.body); assert.ok(parsedBody.hasOwnProperty('warnings'), 'Missing warnings from result'); assert.equal(parsedBody.warnings.length, 1); assert.equal(parsedBody.warnings[0], 'hello again warning'); assert.ok(parsedBody.hasOwnProperty('notices'), 'Missing notices from result'); assert.equal(parsedBody.notices.length, 1); assert.equal(parsedBody.notices[0], 'hello again notice'); } catch (e) { err = e; } next(err); }); },
function(res) { assert.equal(res.body, '{"ok":1}'); assert.equal(res.statusCode, 201); var location = res.header('Location').split('/').slice(1); assert.equal(location[0], 'tests'); assert.equal(location[1], 'tests'); assert.isNotNull(location[2]); assert.length(location[2], 24); var objectId = location[2]; // Check whether we can query it. assert.response(app, { url: '/tests/tests/'+objectId, method: 'GET', }, function(res) { assert.eql(JSON.parse(res.body), { "test":"sproutcore", "guid":objectId } ); assert.equal(res.statusCode, 200); }); });
},{ }, function(res){ assert.equal(res.statusCode, 200, res.body); var cd = res.header('Content-Disposition'); assert.ok(/filename=cartodb-query.svg/gi.test(cd), cd); assert.equal(res.header('Content-Type'), 'image/svg+xml; charset=utf-8'); assert.ok( res.body.indexOf('<path d="M 0 768 L 1024 0 500.12 167.01" />') > 0, res.body ); // TODO: test viewBox queryobj.dp = 3; assert.response(app, { url: '/api/v1/sql?' + querystring.stringify(queryobj), headers: {host: 'vizzuality.cartodb.com'}, method: 'GET' },{}, function(res) { assert.equal(res.statusCode, 200, res.body); var cd = res.header('Content-Disposition'); assert.equal(true, /^attachment/.test(cd), 'SVG is not disposed as attachment: ' + cd); assert.ok(/filename=cartodb-query.svg/gi.test(cd), cd); assert.equal(res.header('Content-Type'), 'image/svg+xml; charset=utf-8'); assert.ok( res.body.indexOf('<path d="M 0 768 L 1024 0 500.123 167.012" />') > 0, res.body ); // TODO: test viewBox done(); }); });
'test #configure()': function(beforeExit){ var calls = []; var server = express.createServer(); server.set('env', 'development'); var ret = server.configure(function(){ assert.equal(this, server, 'Test context of configure() is the server'); calls.push('any'); }).configure('development', function(){ calls.push('dev'); }).configure('production', function(){ calls.push('production'); }); should.equal(ret, server, 'Test #configure() returns server for chaining'); assert.response(server, { url: '/' }, { body: 'Cannot GET /' }); beforeExit(function(){ calls.should.eql(['any', 'dev']); }); },
test('SHP format, unauthenticated, with utf8 data', function(done){ var query = querystring.stringify({ q: "SELECT '♥♦♣♠' as f, st_makepoint(0,0,4326) as the_geom", format: 'shp', filename: 'myshape' }); assert.response(app, { url: '/api/v1/sql?' + query, headers: {host: 'vizzuality.cartodb.com'}, encoding: 'binary', method: 'GET' },{ }, function(res){ assert.equal(res.statusCode, 200, res.body); var tmpfile = '/tmp/myshape.zip'; var err = fs.writeFileSync(tmpfile, res.body, 'binary'); if (err) { done(err); return } var zf = new zipfile.ZipFile(tmpfile); var buffer = zf.readFileSync('myshape.dbf'); fs.unlinkSync(tmpfile); var strings = buffer.toString(); assert.ok(/♥♦♣♠/.exec(strings), "Cannot find '♥♦♣♠' in here:\n" + strings); done(); }); });
test('SHP format, unauthenticated, with custom, dangerous filename', function(done){ assert.response(app, { url: '/api/v1/sql?q=SELECT%20*%20FROM%20untitle_table_4%20LIMIT%201&format=shp&filename=b;"%20()[]a', headers: {host: 'vizzuality.cartodb.com'}, encoding: 'binary', method: 'GET' },{ }, function(res){ assert.equal(res.statusCode, 200, res.body); var fname = "b_______a"; var cd = res.header('Content-Disposition'); assert.equal(true, /^attachment/.test(cd), 'SHP is not disposed as attachment: ' + cd); assert.equal(true, /filename=b_______a.zip/gi.test(cd), 'Unexpected SHP filename: ' + cd); var tmpfile = '/tmp/myshape.zip'; var err = fs.writeFileSync(tmpfile, res.body, 'binary'); if (err) { done(err); return } var zf = new zipfile.ZipFile(tmpfile); assert.ok(_.contains(zf.names, fname + '.shp'), 'SHP zipfile does not contain .shp: ' + zf.names); assert.ok(_.contains(zf.names, fname + '.shx'), 'SHP zipfile does not contain .shx: ' + zf.names); assert.ok(_.contains(zf.names, fname + '.dbf'), 'SHP zipfile does not contain .dbf: ' + zf.names); assert.ok(_.contains(zf.names, fname+ '.prj'), 'SHP zipfile does not contain .prj: ' + zf.names); fs.unlinkSync(tmpfile); done(); }); });
'test deep nesting': function(){ var app = express.createServer(); var user = app.resource('users', { index: function(req, res){ res.end('users'); } }); var forum = app.resource('forums', require('./fixtures/forum')); var thread = app.resource('threads', require('./fixtures/thread')); var ret = user.add(forum); ret.should.equal(user); var ret = forum.add(thread); ret.should.equal(forum); assert.response(app, { url: '/forums/20' }, { status: 404 }); assert.response(app, { url: '/users' }, { body: 'users' }); assert.response(app, { url: '/users/5/forums' }, { body: 'forum index' }); assert.response(app, { url: '/users/5/forums/12' }, { body: 'show forum 12' }); assert.response(app, { url: '/users/5/forums/12/threads' }, { body: 'thread index of forum 12' }); assert.response(app, { url: '/users/5/forums/1/threads/50' }, { body: 'show thread 50 of forum 1' }); },
'test #sendfile()': function(){ var app = express.createServer(); app.get('/*', function(req, res, next){ var file = req.params[0] , path = __dirname + '/fixtures/' + file; res.sendfile(path); }); app.use(express.errorHandler()); assert.response(app, { url: '/../express.test.js' }, { body: 'Forbidden', status: 403 }); assert.response(app, { url: '/user.json' }, { body: '{"name":"tj"}' , status: 200, headers: { 'Content-Type': 'application/json' }}); assert.response(app, { url: '/hello.haml' }, { body: '%p Hello World' , status: 200, headers: { 'Content-Type': 'application/octet-stream' }}); assert.response(app, { url: '/doesNotExist' }, { body: 'Cannot GET /doesNotExist', status: 404 }); assert.response(app, { url: '/partials' }, { body: 'Cannot GET /partials', status: 404 }); assert.response(app, { url: '/large.json' }, { status: 200, headers: { 'Content-Type': 'application/json' }}); },
'test #partial()': function(){ var app = create(); app.set('view engine', 'jade'); // Auto-assigned local w/ collection option app.get('/', function(req, res){ res.render('items.jade', { items: ['one', 'two'] }); }); assert.response(app, { url: '/' }, { body: '<html><body><ul><li>one</li><li>two</li></ul></body></html>' }); // Auto-assigned local w/ collection array var movies = [ { title: 'Nightmare Before Christmas', director: 'Tim Burton' }, { title: 'Avatar', director: 'James Cameron' } ]; app.get('/movies', function(req, res){ res.render('movies.jade', { movies: movies }); }); var html = [ '<html>', '<body>', '<ul>', '<li>', '<div class="title">Nightmare Before Christmas</div>', '<div class="director">Tim Burton</div>', '</li>', '<li>', '<div class="title">Avatar</div>', '<div class="director">James Cameron</div>', '</li>', '</ul>', '</body>', '</html>' ].join(''); assert.response(app, { url: '/movies' }, { body: html }); // as: str collection option app.get('/user', function(req, res){ res.partial('user', { as: 'person', collection: [{ name: 'tj' }] }); }); assert.response(app, { url: '/user' }, { body: '<p>tj</p>' }); // as: with object collection app.get('/user/object', function(req, res){ res.partial('user.jade', { as: 'person', collection: { 0: { name: 'tj' }, length: 1 } }); }); assert.response(app, { url: '/user' }, { body: '<p>tj</p>' }); // as: this collection option app.get('/person', function(req, res){ res.partial('person.jade', { as: this, collection: [{ name: 'tj' }], locals: { label: 'name:' } }); }); assert.response(app, { url: '/person' }, { body: '<p>name: tj</p>' }); // as: global collection option app.get('/videos', function(req, res){ res.partial('video.jade', { as: global, collection: movies }); }); assert.response(app, { url: '/videos' }, { body: '<p>Tim Burton</p><p>James Cameron</p>' }); // Magic variables app.get('/magic', function(req, res){ res.partial('magic.jade', { as: 'word', collection: ['one', 'two', 'three'] }); }); assert.response(app, { url: '/magic' }, { body: '<li class="first">one</li><li class="word-1">two</li><li class="last">three</li>' }); // Non-collection support app.get('/movie', function(req, res){ res.partial('movie.jade', { object: movies[0] }); }); assert.response(app, { url: '/movie' }, { body: '<li><div class="title">Nightmare Before Christmas</div><div class="director">Tim Burton</div></li>' }); app.get('/video-global', function(req, res){ res.partial('video.jade', { object: movies[0], as: global }); }); // Non-collection as: global assert.response(app, { url: '/video-global' }, { body: '<p>Tim Burton</p>' }); app.get('/person-this', function(req, res){ res.partial('person.jade', { object: { name: 'tj' }, locals: { label: 'User:'******'/person-this' }, { body: '<p>User: tj</p>' }); // No options app.get('/nothing', function(req, res){ res.partial('hello.ejs'); }); assert.response(app, { url: '/nothing' }, { body: 'Hello' }); // Path segments + "as" app.get('/role/as', function(req, res){ res.partial('user/role.ejs', { as: 'role', collection: ['admin', 'member'] }); }); assert.response(app, { url: '/role/as' }, { body: '<li>Role: admin</li><li>Role: member</li>' }); // Deduce name from last segment app.get('/role', function(req, res){ res.partial('user/role.ejs', ['admin', 'member']); }); assert.response(app, { url: '/role' }, { body: '<li>Role: admin</li><li>Role: member</li>' }); // Non-basic object support function Movie(title, director){ this.title = title; this.director = director; } app.get('/movie/object', function(req, res){ res.partial('movie', new Movie('The TJ', 'tj')); }); assert.response(app, { url: '/movie/object' }, { body: '<li><div class="title">The TJ</div><div class="director">tj</div></li>' }); // Locals app.get('/stats', function(req, res){ res.partial('stats', { hits: 12 , misses: 1 }); }); assert.response(app, { url: '/stats' }, { body: '<p>Hits 12</p><p>Misses 1</p>' }); // Locals app.get('/stats/locals', function(req, res){ res.partial('stats', { locals: { hits: 12 , misses: 1 } }); }); assert.response(app, { url: '/stats/locals' }, { body: '<p>Hits 12</p><p>Misses 1</p>' }); // Collection + locals app.get('/items', function(req, res){ res.partial('item-title', { collection: ['foo', 'bar'] , title: 'test' , as: 'item' }); }); assert.response(app, { url: '/items' }, { body: '<li>test foo</li><li>test bar</li>' }); app.get('/stats/callback', function(req, res){ res.partial('stats', { hits: 12, misses: 1 }, function(err, html){ res.send('got: ' + html); }); }); assert.response(app, { url: '/stats/callback' }, { body: 'got: <p>Hits 12</p><p>Misses 1</p>' }); app.get('/stats/callback/2', function(req, res){ res.locals({ hits: 12, misses: 1 }); res.partial('stats', function(err, html){ res.send('got: ' + html); }); }); assert.response(app, { url: '/stats/callback/2' }, { body: 'got: <p>Hits 12</p><p>Misses 1</p>' }); },
'test #render()': function(){ var app = create(); app.set('view engine', 'jade'); app.get('/', function(req, res){ res.render('index.jade', { layout: false }); }); app.get('/jade', function(req, res){ res.render('index', { layout: false }); }); app.get('/haml', function(req, res){ res.render('hello.haml', { layout: false }); }); app.get('/callback/layout/no-options', function(req, res){ res.render('hello.jade', function(err, str){ assert.ok(!err); res.send(str.replace(':(', ':)')); }); }); app.get('/callback/layout', function(req, res){ res.render('hello.jade', {}, function(err, str){ assert.ok(!err); res.send(str.replace(':(', ':)')); }); }); app.get('/callback', function(req, res){ res.render('hello.haml', { layout: false }, function(err, str){ assert.ok(!err); res.send(str.replace('Hello World', ':)')); }); }); app.get('/invalid', function(req, res){ res.render('invalid.jade', { layout: false }); }); app.get('/invalid-async', function(req, res){ process.nextTick(function(){ res.render('invalid.jade', { layout: false }); }); }); app.get('/error', function(req, res){ res.render('invalid.jade', { layout: false }, function(err){ res.send(err.arguments[0]); }); }); app.get('/absolute', function(req, res){ res.render(__dirname + '/fixtures/index.jade', { layout: false }); }); app.get('/ferret', function(req, res){ res.render('ferret', { layout: false, ferret: { name: 'Tobi' }}); }); app.get('/status', function(req, res){ res.render('hello.jade', { status: 500 }); }); assert.response(app, { url: '/status' }, { status: 500 }); assert.response(app, { url: '/ferret' }, { body: '<li class="ferret">Tobi</li>' }); assert.response(app, { url: '/' }, { body: '<p>Welcome</p>', headers: { 'Content-Type': 'text/html; charset=utf-8' }}); assert.response(app, { url: '/jade' }, { body: '<p>Welcome</p>' }); assert.response(app, { url: '/absolute' }, { body: '<p>Welcome</p>' }); assert.response(app, { url: '/haml' }, { body: '\n<p>Hello World</p>' }); assert.response(app, { url: '/callback' }, { body: '\n<p>:)</p>' }); assert.response(app, { url: '/callback/layout' }, { body: '<html><body><p>:)</p></body></html>' }); assert.response(app, { url: '/callback/layout/no-options' }, { body: '<html><body><p>:)</p></body></html>' }); assert.response(app, { url: '/error' }, { body: 'doesNotExist' }); assert.response(app, { url: '/invalid' }, function(res){ assert.ok(res.body.indexOf('ReferenceError') >= 0); assert.ok(res.body.indexOf('doesNotExist') >= 0); }); assert.response(app, { url: '/invalid-async' }, function(res){ assert.ok(res.body.indexOf('ReferenceError') >= 0); assert.ok(res.body.indexOf('doesNotExist') >= 0); }); },
require('../modules'); var config = require('../config'), request = require('request/lib/main'), assert = require('assert'), sys = require('sys'); assert.response = function(method, url, statusCode, contentType, inBody) { request({ uri: 'http://localhost:'+config.port+url, method: method }, function(error, response, body) { if(error) throw new Error(error); assert.equal(response.statusCode, statusCode); assert.equal(response.headers['content-type'], contentType); assert.notEqual(body.indexOf(inBody), -1); sys.puts('OK: '+method+' '+url+' '+statusCode+' '+contentType+' "'+inBody+'" found in body'); }); } assert.response('GET', '/', 200, 'text/html', 'something great'); assert.response('GET', '/index.html', 200, 'text/html', 'something great'); assert.response('GET', '/css/reset.css', 200, 'text/css', 'html,body'); assert.response('GET', '/css/main.less', 200, 'text/css', 'background: #eeeeee;'); assert.response('GET', '/js/main.js', 200, 'text/javascript', 'ready'); assert.response('GET', '/hello', 200, 'text/html', 'World'); assert.response('GET', '/notexistent', 404, 'text', '404'); assert.response('POST', '/say?word=kewl', 200, 'application/json', 'kewl'); assert.response('PUT', '/update', 200, 'text', 'awesome'); assert.response('DELETE', '/delete', 200, 'text', 'delete'); assert.response('GET', '/before', 200, 'text/html', 'yep');