From 2b2c22cdd50b8ea505581ee72e5a73c1f602f70b Mon Sep 17 00:00:00 2001 From: Sandro Santilli Date: Thu, 28 Mar 2013 12:48:00 +0100 Subject: [PATCH] Add test showing use of mapnik subtitution tokens in multilayer config --- test/acceptance/multilayer.js | 169 +++++++++++++++++++++++++++++++++- 1 file changed, 167 insertions(+), 2 deletions(-) diff --git a/test/acceptance/multilayer.js b/test/acceptance/multilayer.js index 9691fff0..dd3cf312 100644 --- a/test/acceptance/multilayer.js +++ b/test/acceptance/multilayer.js @@ -165,12 +165,177 @@ suite('multilayer', function() { ); }); + + test("layergroup can hold substitution tokens", function(done) { + + var layergroup = { + version: '1.0.0', + layers: [ + { options: { + sql: 'select 1 as cartodb_id, ' + + 'ST_Buffer(!bbox!, -32*greatest(!pixel_width!,!pixel_height!)) as the_geom_webmercator', + cartocss: '#layer { polygon-fill:red; }', + cartocss_version: '2.0.1' + } } + ] + }; + + var expected_token; // = "d442ca6d3ece793b9c16c02a1d1ea5f2"; + Step( + function do_post() + { + var next = this; + assert.response(server, { + url: '/tiles/layergroup', + method: 'POST', + headers: {host: 'localhost', 'Content-Type': 'application/json' }, + data: JSON.stringify(layergroup) + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + var parsedBody = JSON.parse(res.body); + var expectedBody = { layergroupid: expected_token }; + // check last modified + var qTables = JSON.stringify({ + 'q': 'SELECT CDB_QueryTables($windshaft$' + + layergroup.layers[0].options.sql + + '$windshaft$)' + }); + expectedBody.last_updated = JSON.stringify({ + 'q': 'SELECT EXTRACT(EPOCH FROM max(updated_at)) as max ' + + 'FROM CDB_TableMetadata m WHERE m.tabname::name = any (\'{' + + qTables + '}\')' + }); + if ( expected_token ) { + //assert.equal(parsedBody.layergroupid, expectedBody.layergroupid); + //assert.equal(parsedBody.last_updated, expectedBody.last_updated); + assert.deepEqual(parsedBody, expectedBody); + } + else expected_token = parsedBody.layergroupid; + next(null, res); + }); + }, + function do_get_tile1(err) + { + if ( err ) throw err; + var next = this; + assert.response(server, { + url: '/tiles/layergroup/' + expected_token + '/1/0/0.png', + method: 'GET', + headers: {host: 'localhost' }, + encoding: 'binary' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "image/png"); + + // Check X-Cache-Channel + var cc = res.headers['x-cache-channel']; + assert.ok(cc); + var dbname = 'cartodb_test_user_1_db' + assert.equal(cc.substring(0, dbname.length), dbname); + var jsonquery = cc.substring(dbname.length+1); + var sentquery = JSON.parse(jsonquery); + assert.equal(sentquery.q, 'SELECT CDB_QueryTables($windshaft$' + + layergroup.layers[0].options.sql + + '$windshaft$)'); + + assert.imageEqualsFile(res.body, 'test/fixtures/test_multilayer_bbox.png', 2, + function(err, similarity) { + next(err); + }); + }); + }, + function do_get_tile4(err) + { + if ( err ) throw err; + var next = this; + assert.response(server, { + url: '/tiles/layergroup/' + expected_token + '/4/0/0.png', + method: 'GET', + headers: {host: 'localhost' }, + encoding: 'binary' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "image/png"); + + // Check X-Cache-Channel + var cc = res.headers['x-cache-channel']; + assert.ok(cc); + var dbname = 'cartodb_test_user_1_db' + assert.equal(cc.substring(0, dbname.length), dbname); + var jsonquery = cc.substring(dbname.length+1); + var sentquery = JSON.parse(jsonquery); + assert.equal(sentquery.q, 'SELECT CDB_QueryTables($windshaft$' + + layergroup.layers[0].options.sql + + '$windshaft$)'); + + assert.imageEqualsFile(res.body, 'test/fixtures/test_multilayer_bbox.png', 2, + function(err, similarity) { + next(err); + }); + }); + }, + function do_get_grid1(err) + { + if ( err ) throw err; + var next = this; + assert.response(server, { + url: '/tiles/layergroup/' + expected_token + + '/layer0/1/0/0.grid.json?interactivity=cartodb_id', + headers: {host: 'localhost' }, + method: 'GET' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "text/javascript; charset=utf-8; charset=utf-8"); + assert.utfgridEqualsFile(res.body, 'test/fixtures/test_multilayer_bbox.grid.json', 2, + function(err, similarity) { + next(err); + }); + }); + }, + function do_get_grid4(err) + { + if ( err ) throw err; + var next = this; + assert.response(server, { + url: '/tiles/layergroup/' + expected_token + + '/layer0/4/0/0.grid.json?interactivity=cartodb_id', + headers: {host: 'localhost' }, + method: 'GET' + }, {}, function(res) { + assert.equal(res.statusCode, 200, res.body); + assert.equal(res.headers['content-type'], "text/javascript; charset=utf-8; charset=utf-8"); + assert.utfgridEqualsFile(res.body, 'test/fixtures/test_multilayer_bbox.grid.json', 2, + function(err, similarity) { + next(err); + }); + }); + }, + function finish(err) { + var errors = []; + if ( err ) { + errors.push(err.message); + console.log("Error: " + err); + } + redis_client.keys("map_style|cartodb_test_user_1_db|~" + expected_token, function(err, matches) { + if ( err ) errors.push(err.message); + assert.equal(matches.length, 1, "Missing expected token " + expected_token + " from redis: " + matches); + redis_client.del(matches, function(err) { + if ( err ) errors.push(err.message); + if ( errors.length ) done(new Error(errors)); + else done(null); + }); + }); + } + ); + }); + suiteTeardown(function(done) { // This test will add map_style records, like // 'map_style|null|publicuser|my_table', redis_client.keys("map_style|*", function(err, matches) { - _.each(matches, function(k) { redis_client.del(k); }); - sqlapi_server.close(done); + redis_client.del(matches, function(err) { + sqlapi_server.close(done); + }); }); });