From 2e78aa4f56e6dd5f85a1f8de37b47e30d112b2db Mon Sep 17 00:00:00 2001 From: Adrien Dieudonne Date: Wed, 29 Aug 2018 09:38:01 +0200 Subject: [PATCH] [FIX] web: domain: quarter and last quarter Before this commit, it was not possible to compare data if the time range selected was quarter or last quarter. String and integer was concatenated and the returned domain to evaluate was wrong: -3 3 - (context_today().month - 1) % 3 instead of: -3 + 3 - (context_today().month - 1) % 3 Offset period param is always an integer but it's not the case of boundary params. For 'quarter' and 'last quarter', it's an expression to evaluate. Anyway, this part of code will be refactored in a while but it's important to make the test to avoid this king of issue. --- addons/web/static/src/js/core/domain.js | 12 +- .../static/tests/views/search_view_tests.js | 189 +++++++++++++++--- 2 files changed, 161 insertions(+), 40 deletions(-) diff --git a/addons/web/static/src/js/core/domain.js b/addons/web/static/src/js/core/domain.js index 01d9aaee8ff..c31feb61a8f 100644 --- a/addons/web/static/src/js/core/domain.js +++ b/addons/web/static/src/js/core/domain.js @@ -244,18 +244,16 @@ var Domain = collections.Tree.extend({ function makeInterval () { switch (comparisonPeriod) { case 'previous_period': - _.map(offsetPeriodParams, function (value, key) { - if (_.isNumber(value)) { + _.each(offsetPeriodParams, function (value, key) { + if (!leftBoundaryParams[key] ||_.isNumber(leftBoundaryParams[key])) { leftBoundaryParams[key] = value + (leftBoundaryParams[key] || 0); } else { - leftBoundaryParams[key] = value + ' + ' + (leftBoundaryParams[key] || 0); + leftBoundaryParams[key] = value + ' + ' + leftBoundaryParams[key]; } - }); - _.map(offsetPeriodParams, function (value, key) { - if (_.isNumber(value)) { + if (!rightBoundaryParams[key] || _.isNumber(rightBoundaryParams[key])) { rightBoundaryParams[key] = value + (rightBoundaryParams[key] || 0); } else { - rightBoundaryParams[key] = value + ' + ' + (rightBoundaryParams[key] || 0); + rightBoundaryParams[key] = value + ' + ' + rightBoundaryParams[key]; } }); break; diff --git a/addons/web/static/tests/views/search_view_tests.js b/addons/web/static/tests/views/search_view_tests.js index 9b1248bb309..c2b06f2c49a 100644 --- a/addons/web/static/tests/views/search_view_tests.js +++ b/addons/web/static/tests/views/search_view_tests.js @@ -3,6 +3,7 @@ odoo.define('web.search_view_tests', function (require) { var testUtils = require('web.test_utils'); var createActionManager = testUtils.createActionManager; +var patchDate = testUtils.patchDate; QUnit.module('Search View', { beforeEach: function () { @@ -184,6 +185,82 @@ QUnit.module('Search View', { '' + '', }; + + this.periodOptions = [ + 'today', + 'this_week', + 'this_month', + 'this_quarter', + 'this_year', + 'yesterday', + 'last_week', + 'last_month', + 'last_quarter', + 'last_year', + 'last_7_days', + 'last_30_days', + 'last_365_days' + ]; + + // assuming that the current time is: 2017-03-22:01:00:00 + this.periodDomains = [ + // today + ['&', ["date_field", ">=", "2017-03-22"],["date_field", "<", "2017-03-23"]], + // this week + ['&', ["date_field", ">=", "2017-03-20"],["date_field", "<", "2017-03-27"]], + // this month + ['&', ["date_field", ">=", "2017-03-01"],["date_field", "<", "2017-04-01"]], + // this quarter + ['&', ["date_field", ">=", "2017-01-01"],["date_field", "<", "2017-04-01"]], + // this year + ['&', ["date_field", ">=", "2017-01-01"],["date_field", "<", "2018-01-01"]], + // yesterday + ['&', ["date_field", ">=", "2017-03-21"],["date_field", "<", "2017-03-22"]], + // last week + ['&', ["date_field", ">=", "2017-03-13"],["date_field", "<", "2017-03-20"]], + // last month + ['&', ["date_field", ">=", "2017-02-01"],["date_field", "<", "2017-03-01"]], + // last quarter + ['&', ["date_field", ">=", "2016-10-01"],["date_field", "<", "2017-01-01"]], + // last year + ['&', ["date_field", ">=", "2016-01-01"],["date_field", "<", "2017-01-01"]], + // last 7 days (whole days) + ['&', ["date_field", ">=", "2017-03-15"],["date_field", "<", "2017-03-22"]], + // last 30 days + ['&', ["date_field", ">=", "2017-02-20"],["date_field", "<", "2017-03-22"]], + // last 365 days + ['&', ["date_field", ">=", "2016-03-22"],["date_field", "<", "2017-03-22"]], + ]; + + // assuming that the current time is: 2017-03-22:01:00:00 + this.previousPeriodDomains = [ + // today - 1 day + ['&', ["date_field", ">=", "2017-03-21"],["date_field", "<", "2017-03-22"]], + // this week - 1 week + ['&', ["date_field", ">=", "2017-03-13"],["date_field", "<", "2017-03-20"]], + // this month - 1 month + ['&', ["date_field", ">=", "2017-02-01"],["date_field", "<", "2017-03-01"]], + // this quarter - 3 months + ['&', ["date_field", ">=", "2016-10-01"],["date_field", "<", "2017-01-01"]], + // this year - 1 year + ['&', ["date_field", ">=", "2016-01-01"],["date_field", "<", "2017-01-01"]], + // yesterday - 1 day + ['&', ["date_field", ">=", "2017-03-20"],["date_field", "<", "2017-03-21"]], + // last week - 1 week + ['&', ["date_field", ">=", "2017-03-06"],["date_field", "<", "2017-03-13"]], + // last month - 1 month + ['&', ["date_field", ">=", "2017-01-01"],["date_field", "<", "2017-02-01"]], + // last quarter - 3 months + ['&', ["date_field", ">=", "2016-07-01"],["date_field", "<", "2016-10-01"]], + // last year - 1 year + ['&', ["date_field", ">=", "2015-01-01"],["date_field", "<", "2016-01-01"]], + // last 7 days (whole days) - 1 week + ['&', ["date_field", ">=", "2017-03-08"],["date_field", "<", "2017-03-15"]], + // last 30 days - 30 days + ['&', ["date_field", ">=", "2017-01-21"],["date_field", "<", "2017-02-20"]], + // last 365 days + ['&', ["date_field", ">=", "2015-03-23"],["date_field", "<", "2016-03-22"]], + ]; }, }, function () { QUnit.module('Groupby Menu'); @@ -420,43 +497,14 @@ QUnit.module('Search View', { }); QUnit.test('filter by a date field using period works', function (assert) { - assert.expect(14); + var self = this; + this.archs['partner,4,search'] = ''+ '' + ''; - var domains = [ - [], - // today - ['&', ["date_field", ">=", "2017-03-22"],["date_field", "<", "2017-03-23"]], - // this week - ['&', ["date_field", ">=", "2017-03-20"],["date_field", "<", "2017-03-27"]], - // this month - ['&', ["date_field", ">=", "2017-03-01"],["date_field", "<", "2017-04-01"]], - // this quarter - ['&', ["date_field", ">=", "2017-01-01"],["date_field", "<", "2017-04-01"]], - // this year - ['&', ["date_field", ">=", "2017-01-01"],["date_field", "<", "2018-01-01"]], - // yesterday - ['&', ["date_field", ">=", "2017-03-21"],["date_field", "<", "2017-03-22"]], - // last week - ['&', ["date_field", ">=", "2017-03-13"],["date_field", "<", "2017-03-20"]], - // last month - ['&', ["date_field", ">=", "2017-02-01"],["date_field", "<", "2017-03-01"]], - // last quarter - ['&', ["date_field", ">=", "2016-10-01"],["date_field", "<", "2017-01-01"]], - // last year - ['&', ["date_field", ">=", "2016-01-01"],["date_field", "<", "2017-01-01"]], - // last 7 days (whole days) - ['&', ["date_field", ">=", "2017-03-15"],["date_field", "<", "2017-03-22"]], - // last 30 days - ['&', ["date_field", ">=", "2017-02-20"],["date_field", "<", "2017-03-22"]], - // last 365 days - ['&', ["date_field", ">=", "2016-03-22"],["date_field", "<", "2017-03-22"]], - ]; - var RealDate = window.Date; window.Date = function TestDate() { @@ -472,8 +520,8 @@ QUnit.module('Search View', { archs: this.archs, data: this.data, mockRPC: function (route, args) { - if (route === '/web/dataset/search_read') { - assert.deepEqual(args.domain, domains.shift()); + if (route === '/web/dataset/search_read' && args.domain.length) { + assert.deepEqual(args.domain, self.periodDomains.shift()); } return this._super.apply(this, arguments); }, @@ -485,6 +533,13 @@ QUnit.module('Search View', { $('.o_search_options .fa-filter').click(); // open menu options $('.o_menu_item').click(); + + var periodOptions = $('.o_menu_item .o_item_option').map(function () { + return $(this).data('option_id'); + }).toArray(); + assert.deepEqual(periodOptions, this.periodOptions, + "13 period options should be available:"); + $('.o_menu_item .o_item_option[data-option_id="today"]').click(); $('.o_menu_item .o_item_option[data-option_id="this_week"]').click(); $('.o_menu_item .o_item_option[data-option_id="this_month"]').click(); @@ -664,5 +719,73 @@ QUnit.module('Search View', { actionManager.destroy(); }); + QUnit.test('time range menu in comparison mode', function (assert) { + assert.expect(43); + + var self = this; + + var periodOptionText, periodOptionValue; + var unpatchDate = patchDate(2017, 2, 22, 1, 0, 0); + + var actionManager = createActionManager({ + actions: this.actions, + archs: this.archs, + data: this.data, + mockRPC: function (route, args) { + if (route === '/web/dataset/call_kw/partner/read_group') { + var timeRangeMenuData = args.kwargs.context.timeRangeMenuData; + if (timeRangeMenuData) { + assert.deepEqual(timeRangeMenuData.timeRange, + self.periodDomains.shift(), + "time range domain for " + periodOptionText); + assert.deepEqual(timeRangeMenuData.comparisonTimeRange, + self.previousPeriodDomains.shift(), + "comparaison time range domain for " + periodOptionText); + } + } + return this._super.apply(this, arguments); + }, + }); + // time range menu should be available in graph view + actionManager.doAction(4); + + var $timeRangeMenu = $('.o_time_range_menu'); + assert.strictEqual($timeRangeMenu.not('.o_hidden').length, 1, + "Time range menu should be visible"); + assert.strictEqual($('.o_facet_values').length, 0, + "Search view has no facet"); + + var $periodOptions = $timeRangeMenu.find('.o_time_range_selector option'); + var periodOptions = $periodOptions.map(function () { + return $(this).val(); + }).toArray(); + assert.deepEqual(periodOptions, this.periodOptions, + "13 period options should be available:"); + + $periodOptions.each(function () { + periodOptionText = $(this).text().trim(); + periodOptionValue = $(this).val(); + // opens time range menu dropdown + $('.o_time_range_menu_button').click(); + var $timeRangeMenu = $('.o_time_range_menu'); + // comparison is not checked by default + if (!$timeRangeMenu.find('.o_comparison_checkbox').is(':checked')) { + $timeRangeMenu.find('.o_comparison_checkbox').click(); + assert.strictEqual($('.o_comparison_time_range_selector:visible').length, 1, + "Comparison has to be checked (only at the first time)"); + } + // select one period option to test it + $timeRangeMenu.find('.o_time_range_selector').val(periodOptionValue); + // apply + $timeRangeMenu.find('.o_apply_range').click(); + assert.strictEqual($('.o_facet_values').text().trim(), + "Date: " + periodOptionText + " / Previous Period", + "Facet should be updated with this period: " + periodOptionValue); + }); + + unpatchDate(); + actionManager.destroy(); + }); + }); });