Example #1
0
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();
		});
};
Example #2
0
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();
    });
});
Example #3
0
 },{}, 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();
   });
 });
Example #4
0
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();
    });
});
Example #6
0
 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'");
     });
 };
Example #7
0
 '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' });
 },
Example #8
0
 '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());
     });
 },
Example #9
0
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 }
    );
  }
Example #11
0
  '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);
      });
    });
  }
Example #12
0
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();
    });
});
Example #13
0
  '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' }
    );
  },
Example #14
0
  '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 });
  },
Example #15
0
  '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);
    });
  },
Example #16
0
    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);
        })
    };
Example #17
0
 '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);
                 });
              }
           );
        }
     );
 }
Example #18
0
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);
    });
  });
}
Example #19
0
    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();
            }
        });
    }
Example #20
0
 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);
   });
 },
Example #21
0
    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);
      });
    });
Example #22
0
    },{ }, 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();
        });
    });
Example #23
0
  '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']);
    });
  },
Example #24
0
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();
    });
});
Example #25
0
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();
    });
});
Example #26
0
  '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' });
  },
Example #27
0
  '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' }});
  },
Example #28
0
  '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>' });
  },
Example #29
0
 '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);
     });
 },
Example #30
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');