From c4bbff3802ebe6d47391e2bcc0cb21b9c87e8809 Mon Sep 17 00:00:00 2001 From: Raul Ochoa Date: Wed, 1 Jun 2016 11:44:24 +0200 Subject: [PATCH] Tests for aggregation dataview ported from windshaft --- test/acceptance/widgets/ported/aggregation.js | 330 ++++++++++++++++++ 1 file changed, 330 insertions(+) create mode 100644 test/acceptance/widgets/ported/aggregation.js diff --git a/test/acceptance/widgets/ported/aggregation.js b/test/acceptance/widgets/ported/aggregation.js new file mode 100644 index 00000000..3f6d924a --- /dev/null +++ b/test/acceptance/widgets/ported/aggregation.js @@ -0,0 +1,330 @@ +require('../../../support/test_helper'); + +var assert = require('../../../support/assert'); +var TestClient = require('../../../support/test-client'); + +describe('widgets', function() { + + describe('aggregations', function() { + + afterEach(function(done) { + if (this.testClient) { + this.testClient.drain(done); + } else { + done(); + } + }); + + + var aggregationMapConfig = { + version: '1.5.0', + layers: [ + { + type: 'mapnik', + options: { + sql: 'select * from populated_places_simple_reduced', + cartocss: '#layer0 { marker-fill: red; marker-width: 10; }', + cartocss_version: '2.0.1', + widgets: { + adm0name: { + type: 'aggregation', + options: { + column: 'adm0name', + aggregation: 'count' + } + } + } + } + } + ] + }; + + it('can be fetched from a valid aggregation', function(done) { + this.testClient = new TestClient(aggregationMapConfig); + this.testClient.getWidget('adm0name', { own_filter: 0 }, function (err, res, aggregation) { + assert.ok(!err, err); + assert.ok(aggregation); + assert.equal(aggregation.type, 'aggregation'); + + assert.equal(aggregation.categories.length, 6); + + assert.deepEqual( + aggregation.categories[0], + { category: 'United States of America', value: 769, agg: false } + ); + + assert.deepEqual( + aggregation.categories[aggregation.categories.length - 1], + { category: 'Other', value: 4914, agg: true } + ); + + done(); + }); + }); + + var filteredCategoriesScenarios = [ + { accept: ['Canada'], values: [256] }, + { accept: ['Canada', 'Spain', 'Chile', 'Thailand'], values: [256, 49, 83, 79] }, + { accept: ['Canada', 'Spain', 'Chile', 'Thailand', 'Japan'], values: [256, 49, 83, 79, 69] }, + { accept: ['Canada', 'Spain', 'Chile', 'Thailand', 'Japan', 'France'], values: [256, 49, 83, 79, 69, 71] }, + { + accept: ['United States of America', 'Canada', 'Spain', 'Chile', 'Thailand', 'Japan', 'France'], + values: [769, 256, 49, 83, 79, 69, 71] + } + ]; + + filteredCategoriesScenarios.forEach(function(scenario) { + it('can filter some categories: ' + scenario.accept.join(', '), function(done) { + this.testClient = new TestClient(aggregationMapConfig); + var adm0nameFilter = { + adm0name: { + accept: scenario.accept + } + }; + var params = { + own_filter: 1, + filters: { + layers: [ + adm0nameFilter + ] + } + }; + this.testClient.getWidget('adm0name', params, function (err, res, aggregation) { + assert.ok(!err, err); + assert.ok(aggregation); + assert.equal(aggregation.type, 'aggregation'); + + assert.equal(aggregation.categories.length, scenario.accept.length); + + var categoriesByCategory = aggregation.categories.reduce(function(byCategory, row) { + byCategory[row.category] = row; + return byCategory; + }, {}); + + var scenarioByCategory = scenario.accept.reduce(function(byCategory, category, index) { + byCategory[category] = { category: category, value: scenario.values[index], agg: false }; + return byCategory; + }, {}); + + Object.keys(categoriesByCategory).forEach(function(category) { + assert.deepEqual(categoriesByCategory[category], scenarioByCategory[category]); + }); + + done(); + }); + }); + }); + + var aggregationSumMapConfig = { + version: '1.5.0', + layers: [ + { + type: 'mapnik', + options: { + sql: 'select * from populated_places_simple_reduced', + cartocss: '#layer0 { marker-fill: red; marker-width: 10; }', + cartocss_version: '2.0.1', + widgets: { + adm0name: { + type: 'aggregation', + options: { + column: 'adm0name', + aggregation: 'sum', + aggregationColumn: 'pop_max' + } + } + } + } + } + ] + }; + + it('can sum other column for aggregation value', function(done) { + + this.testClient = new TestClient(aggregationSumMapConfig); + this.testClient.getWidget('adm0name', { own_filter: 0 }, function (err, res, aggregation) { + assert.ok(!err, err); + assert.ok(aggregation); + assert.equal(aggregation.type, 'aggregation'); + + assert.equal(aggregation.categories.length, 6); + + assert.deepEqual( + aggregation.categories[0], + { category: 'China', value: 374537585, agg: false } + ); + + assert.deepEqual( + aggregation.categories[aggregation.categories.length - 1], + { category: 'Other', value: 1412626289, agg: true } + ); + + done(); + }); + }); + + var filteredCategoriesSumScenarios = [ + { accept: [], values: [] }, + { accept: ['Canada'], values: [23955084] }, + { accept: ['Canada', 'Spain', 'Chile', 'Thailand'], values: [23955084, 22902774, 14356263, 17492483] }, + { + accept: ['United States of America', 'Canada', 'Spain', 'Chile', 'Thailand', 'Japan', 'France'], + values: [239098994, 23955084, 22902774, 14356263, 17492483, 93577001, 25473876] + } + ]; + + filteredCategoriesSumScenarios.forEach(function(scenario) { + it('can filter some categories with sum aggregation: ' + scenario.accept.join(', '), function(done) { + this.testClient = new TestClient(aggregationSumMapConfig); + var adm0nameFilter = { + adm0name: { + accept: scenario.accept + } + }; + var params = { + own_filter: 1, + filters: { + layers: [ + adm0nameFilter + ] + } + }; + this.testClient.getWidget('adm0name', params, function (err, res, aggregation) { + assert.ok(!err, err); + assert.ok(aggregation); + assert.equal(aggregation.type, 'aggregation'); + + assert.equal(aggregation.categories.length, scenario.accept.length); + + var categoriesByCategory = aggregation.categories.reduce(function(byCategory, row) { + byCategory[row.category] = row; + return byCategory; + }, {}); + + var scenarioByCategory = scenario.accept.reduce(function(byCategory, category, index) { + byCategory[category] = { category: category, value: scenario.values[index], agg: false }; + return byCategory; + }, {}); + + Object.keys(categoriesByCategory).forEach(function(category) { + assert.deepEqual(categoriesByCategory[category], scenarioByCategory[category]); + }); + + done(); + }); + }); + }); + + var numericAggregationMapConfig = { + version: '1.5.0', + layers: [ + { + type: 'mapnik', + options: { + sql: 'select * from populated_places_simple_reduced', + cartocss: '#layer0 { marker-fill: red; marker-width: 10; }', + cartocss_version: '2.3.0', + widgets: { + scalerank: { + type: 'aggregation', + options: { + column: 'scalerank', + aggregation: 'count' + } + } + } + } + } + ] + }; + + ['1', 1].forEach(function(filterValue) { + it('can filter numeric categories: ' + (typeof filterValue), function(done) { + this.testClient = new TestClient(numericAggregationMapConfig); + var scalerankFilter = { + scalerank: { + accept: [filterValue] + } + }; + var params = { + own_filter: 1, + filters: { + layers: [scalerankFilter] + } + }; + this.testClient.getWidget('scalerank', params, function (err, res, aggregation) { + assert.ok(!err, err); + assert.ok(aggregation); + assert.equal(aggregation.type, 'aggregation'); + + assert.equal(aggregation.categories.length, 1); + assert.deepEqual(aggregation.categories[0], { category: '1', value: 179, agg: false }); + + done(); + }); + }); + }); + + describe('search', function() { + afterEach(function(done) { + if (this.testClient) { + this.testClient.drain(done); + } else { + done(); + } + }); + + ['1', 1].forEach(function(userQuery) { + it('can search numeric categories: ' + (typeof userQuery), function(done) { + this.testClient = new TestClient(numericAggregationMapConfig); + var scalerankFilter = { + scalerank: { + accept: [userQuery] + } + }; + var params = { + own_filter: 0, + filters: { + layers: [scalerankFilter] + } + }; + this.testClient.widgetSearch('scalerank', userQuery, params, function (err, res, searchResult) { + assert.ok(!err, err); + assert.ok(searchResult); + assert.equal(searchResult.type, 'aggregation'); + + assert.equal(searchResult.categories.length, 2); + assert.deepEqual( + searchResult.categories, + [{ category: 10, value: 515 }, { category: 1, value: 179 }] + ); + + done(); + }); + }); + }); + + var adm0name = 'Argentina'; + [adm0name, adm0name.toLowerCase(), adm0name.toUpperCase()].forEach(function(userQuery) { + it('should search with case insensitive: ' + userQuery, function(done) { + this.testClient = new TestClient(aggregationMapConfig); + this.testClient.widgetSearch('adm0name', userQuery, function (err, res, searchResult) { + assert.ok(!err, err); + assert.ok(searchResult); + assert.equal(searchResult.type, 'aggregation'); + + assert.equal(searchResult.categories.length, 1); + assert.deepEqual( + searchResult.categories, + [{ category:"Argentina", value:159 }] + ); + + done(); + }); + }); + }); + }); + + }); + +});