diff --git a/test/acceptance/widgets/named-maps.js b/test/acceptance/widgets/named-maps.js new file mode 100644 index 00000000..4af90245 --- /dev/null +++ b/test/acceptance/widgets/named-maps.js @@ -0,0 +1,197 @@ +var assert = require('../../support/assert'); +var step = require('step'); + +var helper = require('../../support/test_helper'); + +var CartodbWindshaft = require('../../../lib/cartodb/server'); +var serverOptions = require('../../../lib/cartodb/server_options'); +var server = new CartodbWindshaft(serverOptions); + +var LayergroupToken = require('../../../lib/cartodb/models/layergroup_token'); + +describe('named-maps widgets', function() { + + var username = 'localhost'; + var widgetsTemplateName = 'widgets-template'; + + var layergroupid; + var keysToDelete; + + beforeEach(function(done) { + keysToDelete = {}; + + var widgetsTemplate = { + version: '0.0.1', + name: widgetsTemplateName, + layergroup: { + version: '1.5.0', + layers: [ + { + type: 'cartodb', + options: { + sql: "select * from populated_places_simple_reduced_private", + cartocss: '#layer { marker-fill: blue; }', + cartocss_version: '2.3.0', + widgets: { + country_places_count: { + type: 'aggregation', + options: { + column: 'adm0_a3', + aggregation: 'count' + } + }, + pop_max: { + type: 'histogram', + options: { + column: 'pop_max' + } + } + } + } + } + ] + } + }; + + var template_params = {}; + + step( + function createTemplate() + { + var next = this; + assert.response( + server, + { + url: '/api/v1/map/named?api_key=1234', + method: 'POST', + headers: { + host: username, + 'Content-Type': 'application/json' + }, + data: JSON.stringify(widgetsTemplate) + }, + { + status: 200 + }, + function(res, err) { + next(err, res); + } + ); + }, + function instantiateTemplate(err, res) { + assert.ifError(err); + + assert.deepEqual(JSON.parse(res.body), { template_id: widgetsTemplateName }); + var next = this; + assert.response( + server, + { + url: '/api/v1/map/named/' + widgetsTemplateName, + method: 'POST', + headers: { + host: username, + 'Content-Type': 'application/json' + }, + data: JSON.stringify(template_params) + }, + { + status: 200 + }, + function(res) { + next(null, res); + } + ); + }, + function fetchTile(err, res) { + assert.ifError(err); + + var parsed = JSON.parse(res.body); + assert.ok( + parsed.hasOwnProperty('layergroupid'), "Missing 'layergroupid' from response body: " + res.body); + layergroupid = parsed.layergroupid; + + keysToDelete['map_cfg|' + LayergroupToken.parse(parsed.layergroupid).token] = 0; + keysToDelete['user:localhost:mapviews:global'] = 5; + + return done(); + } + ); + + }); + + afterEach(function(done) { + step( + function deleteTemplate(err) { + assert.ifError(err); + var next = this; + assert.response( + server, + { + url: '/api/v1/map/named/' + widgetsTemplateName + '?api_key=1234', + method: 'DELETE', + headers: { + host: username + } + }, + { + status: 204 + }, + function(res, err) { + next(err, res); + } + ); + }, + function deleteRedisKeys(err) { + assert.ifError(err); + helper.deleteRedisKeys(keysToDelete, done); + } + ); + }); + + function getWidget(widgetName, callback) { + assert.response( + server, + { + url: '/api/v1/map/' + layergroupid + '/0/widget/' + widgetName, + method: 'GET', + headers: { + host: username + } + }, + { + status: 200 + }, + function(res, err) { + if (err) { + return callback(err); + } + var parsedBody = JSON.parse(res.body); + return callback(err, res, parsedBody); + } + ); + } + + + it("should retrieve aggregation", function(done) { + getWidget('country_places_count', function(err, response, aggregation) { + assert.ok(!err, err); + + assert.equal(aggregation.type, 'aggregation'); + assert.equal(aggregation.max, 769); + + return done(); + }); + }); + + it("should retrieve histogram", function(done) { + getWidget('pop_max', function(err, response, histogram) { + assert.ok(!err, err); + + assert.equal(histogram.type, 'histogram'); + assert.equal(histogram.bin_width, 743250); + + return done(); + }); + }); + +});