diff --git a/lib/cartodb/models/mapconfig/adapter/index.js b/lib/cartodb/models/mapconfig/adapter/index.js index f7b49ebc..70704bea 100644 --- a/lib/cartodb/models/mapconfig/adapter/index.js +++ b/lib/cartodb/models/mapconfig/adapter/index.js @@ -1,7 +1,7 @@ 'use strict'; function MapConfigAdapter(adapters) { - this.adapters = adapters; + this.adapters = Array.isArray(adapters) ? adapters : Array.apply(null, arguments); } module.exports = MapConfigAdapter; diff --git a/lib/cartodb/server.js b/lib/cartodb/server.js index 837b8a74..825ae2b7 100644 --- a/lib/cartodb/server.js +++ b/lib/cartodb/server.js @@ -156,13 +156,13 @@ module.exports = function(serverOptions) { var turboCartoParser = new TurboCartoParser(pgQueryRunner); - var mapConfigAdapter = new MapConfigAdapter([ + var mapConfigAdapter = new MapConfigAdapter( new MapConfigNamedLayersAdapter(templateMaps, pgConnection), new SqlWrapMapConfigAdapter(), new AnalysisMapConfigAdapter(analysisBackend), new MapConfigOverviewsAdapter(overviewsMetadataApi, filterStatsApi), new TurboCartoAdapter(turboCartoParser) - ]); + ); var namedMapProviderCache = new NamedMapProviderCache( templateMaps, diff --git a/test/unit/cartodb/mapconfig/adapter.test.js b/test/unit/cartodb/mapconfig/adapter.test.js new file mode 100644 index 00000000..eeb71896 --- /dev/null +++ b/test/unit/cartodb/mapconfig/adapter.test.js @@ -0,0 +1,93 @@ +//require('../../../support/test_helper'); +var assert = require('assert'); + +var MapConfigAdapter = require('../../../../lib/cartodb/models/mapconfig/adapter'); + +describe('MapConfigAdapter', function() { + var user = 'wadus'; + function requestMapConfig() { + return { + val: 0 + }; + } + function params() { + return {}; + } + function context() { + return {}; + } + + function createAdapter(valOperatorFn) { + return function ValMapConfigAdapter() { + this.getMapConfig = function(user, requestMapConfig, params, context, callback) { + requestMapConfig.val = valOperatorFn(requestMapConfig.val); + return callback(null, requestMapConfig); + }; + }; + } + var IncValMapConfigAdapter = createAdapter(function(val) { return val + 1; }); + var Mul2ValMapConfigAdapter = createAdapter(function(val) { return val * 2; }); + + function validateMapConfig(adapter, expectedNumAdapters, expectedVal, callback) { + assert.equal(adapter.adapters.length, expectedNumAdapters); + adapter.getMapConfig(user, requestMapConfig(), params(), context(), function(err, mapConfig) { + assert.equal(mapConfig.val, expectedVal); + return callback(err); + }); + } + + it('works with no adapters', function(done) { + var adapter = new MapConfigAdapter(); + validateMapConfig(adapter, 0, 0, done); + }); + + it('works with no adapters as empty array', function(done) { + var adapter = new MapConfigAdapter([]); + validateMapConfig(adapter, 0, 0, done); + }); + + it('works with basic adapter', function(done) { + var adapter = new MapConfigAdapter(new IncValMapConfigAdapter()); + validateMapConfig(adapter, 1, 1, done); + }); + + it('works with basic adapter as array', function(done) { + var adapter = new MapConfigAdapter([new IncValMapConfigAdapter()]); + validateMapConfig(adapter, 1, 1, done); + }); + + it('works with several adapters', function(done) { + var adapter = new MapConfigAdapter(new IncValMapConfigAdapter(), new IncValMapConfigAdapter()); + validateMapConfig(adapter, 2, 2, done); + }); + + it('works with several adapters as array', function(done) { + var adapter = new MapConfigAdapter([new IncValMapConfigAdapter(), new IncValMapConfigAdapter()]); + validateMapConfig(adapter, 2, 2, done); + }); + + it('should execute in order 1', function(done) { + var adapter = new MapConfigAdapter([new Mul2ValMapConfigAdapter(), new IncValMapConfigAdapter()]); + validateMapConfig(adapter, 2, 1, done); + }); + + it('should execute in order 2', function(done) { + var adapter = new MapConfigAdapter([new IncValMapConfigAdapter(), new Mul2ValMapConfigAdapter()]); + validateMapConfig(adapter, 2, 2, done); + }); + + it('should execute in order 3', function(done) { + var adapter = new MapConfigAdapter([new Mul2ValMapConfigAdapter(), new Mul2ValMapConfigAdapter()]); + validateMapConfig(adapter, 2, 0, done); + }); + + it('should execute in order 4', function(done) { + var Mul5ValMapConfigAdapter = createAdapter(function(val) { return val * 5; }); + var adapter = new MapConfigAdapter( + new IncValMapConfigAdapter(), + new Mul2ValMapConfigAdapter(), + new Mul5ValMapConfigAdapter() + ); + validateMapConfig(adapter, 3, 10, done); + }); +});