summaryrefslogtreecommitdiff
path: root/addons/web/static/tests
diff options
context:
space:
mode:
Diffstat (limited to 'addons/web/static/tests')
-rw-r--r--addons/web/static/tests/helpers/mock_server.js39
-rw-r--r--addons/web/static/tests/views/abstract_view_tests.js4
-rw-r--r--addons/web/static/tests/views/basic_model_tests.js6
-rw-r--r--addons/web/static/tests/views/kanban_model_tests.js4
-rw-r--r--addons/web/static/tests/views/kanban_tests.js124
-rw-r--r--addons/web/static/tests/views/list_tests.js124
-rw-r--r--addons/web/static/tests/views/search_view_tests.js2
-rw-r--r--addons/web/static/tests/views/view_dialogs_tests.js17
8 files changed, 225 insertions, 95 deletions
diff --git a/addons/web/static/tests/helpers/mock_server.js b/addons/web/static/tests/helpers/mock_server.js
index 0f96b098bb8..d2060de9f59 100644
--- a/addons/web/static/tests/helpers/mock_server.js
+++ b/addons/web/static/tests/helpers/mock_server.js
@@ -808,7 +808,8 @@ var MockServer = Class.extend({
* @param {string[]} kwargs.fields fields that we are aggregating
* @param {Array} kwargs.domain the domain used for the read_group
* @param {boolean} kwargs.lazy still mostly ignored
- * @param {integer} kwargs.limit ignored as well
+ * @param {integer} [kwargs.limit]
+ * @param {integer} [kwargs.offset]
* @returns {Object[]}
*/
_mockReadGroup: function (model, kwargs) {
@@ -982,6 +983,11 @@ var MockServer = Class.extend({
});
}
+ if (kwargs.limit) {
+ var offset = kwargs.offset || 0;
+ result = result.slice(offset, kwargs.limit + offset);
+ }
+
return result;
},
/**
@@ -1165,6 +1171,34 @@ var MockServer = Class.extend({
return true;
},
/**
+ * Simulate a 'web_read_group' call to the server.
+ *
+ * Note: some keys in kwargs are still ignored
+ *
+ * @private
+ * @param {string} model a string describing an existing model
+ * @param {Object} kwargs various options supported by read_group
+ * @param {string[]} kwargs.groupby fields that we are grouping
+ * @param {string[]} kwargs.fields fields that we are aggregating
+ * @param {Array} kwargs.domain the domain used for the read_group
+ * @param {boolean} kwargs.lazy still mostly ignored
+ * @param {integer} [kwargs.limit]
+ * @param {integer} [kwargs.offset]
+ * @returns {Object[]}
+ */
+ _mockWebReadGroup: function (model, kwargs) {
+ var allGroups = this._mockReadGroup(model, {
+ domain: kwargs.domain,
+ fields: ['display_name'],
+ groupby: kwargs.groupby,
+ lazy: kwargs.lazy,
+ });
+ return {
+ groups: this._mockReadGroup(model, kwargs),
+ length: allGroups.length,
+ };
+ },
+ /**
* Simulate a 'write' operation
*
* @private
@@ -1243,6 +1277,9 @@ var MockServer = Class.extend({
case 'read_group':
return Promise.resolve(this._mockReadGroup(args.model, args.kwargs));
+ case 'web_read_group':
+ return Promise.resolve(this._mockWebReadGroup(args.model, args.kwargs));
+
case 'read_progress_bar':
return Promise.resolve(this._mockReadProgressBar(args.model, args.kwargs));
diff --git a/addons/web/static/tests/views/abstract_view_tests.js b/addons/web/static/tests/views/abstract_view_tests.js
index ba819379279..b2e0cee0dcd 100644
--- a/addons/web/static/tests/views/abstract_view_tests.js
+++ b/addons/web/static/tests/views/abstract_view_tests.js
@@ -129,8 +129,8 @@ QUnit.module('Views', {
'foo,false,search': '<search></search>',
},
data: this.data,
- mockRPC: function(route, args) {
- if (args.method === 'read_group') {
+ mockRPC: function (route, args) {
+ if (args.method === 'web_read_group') {
assert.deepEqual(args.kwargs.groupby, ['bar']);
}
return this._super.apply(this, arguments);
diff --git a/addons/web/static/tests/views/basic_model_tests.js b/addons/web/static/tests/views/basic_model_tests.js
index 2a9fbec6bd4..d840210d4ff 100644
--- a/addons/web/static/tests/views/basic_model_tests.js
+++ b/addons/web/static/tests/views/basic_model_tests.js
@@ -917,14 +917,14 @@ odoo.define('web.basic_model_tests', function (require) {
Model: BasicModel,
data: this.data,
mockRPC: function (route, args) {
- if (args.method === 'read_group' && filterEnabled) {
+ if (args.method === 'web_read_group' && filterEnabled) {
// as this is not yet supported by the MockServer, simulates
// a read_group that returns empty groups
// this is the case for several models (e.g. project.task
// grouped by stage_id)
return this._super.apply(this, arguments).then(function (result) {
// artificially filter out records of first group
- result[0].product_id_count = 0;
+ result.groups[0].product_id_count = 0;
return result;
});
}
@@ -982,7 +982,7 @@ odoo.define('web.basic_model_tests', function (require) {
Model: BasicModel,
data: this.data,
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
+ if (args.method === 'web_read_group') {
assert.deepEqual(args.kwargs.fields, ['foo', 'date'],
"should have correctly trimmed the magic grouping info from the field name");
}
diff --git a/addons/web/static/tests/views/kanban_model_tests.js b/addons/web/static/tests/views/kanban_model_tests.js
index 29dd60c3d15..e69b08aa3a8 100644
--- a/addons/web/static/tests/views/kanban_model_tests.js
+++ b/addons/web/static/tests/views/kanban_model_tests.js
@@ -117,7 +117,7 @@ QUnit.module('Views', {
// check the rpcs done
assert.strictEqual(Object.keys(calledRoutes).length, 3, 'three different routes have been called');
- var nbReadGroups = calledRoutes['/web/dataset/call_kw/partner/read_group'];
+ var nbReadGroups = calledRoutes['/web/dataset/call_kw/partner/web_read_group'];
var nbSearchRead = calledRoutes['/web/dataset/search_read'];
var nbNameCreate = calledRoutes['/web/dataset/call_kw/product/name_create'];
assert.strictEqual(nbReadGroups, 1, 'should have done 1 read_group');
@@ -170,7 +170,7 @@ QUnit.module('Views', {
Model: KanbanModel,
data: this.data,
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
+ if (args.method === 'web_read_group') {
assert.deepEqual(args.kwargs.groupby, ['product_id'],
"the second level of groupBy should have been removed");
}
diff --git a/addons/web/static/tests/views/kanban_tests.js b/addons/web/static/tests/views/kanban_tests.js
index 4cb99e17314..280cf85291f 100644
--- a/addons/web/static/tests/views/kanban_tests.js
+++ b/addons/web/static/tests/views/kanban_tests.js
@@ -108,7 +108,7 @@ QUnit.module('Views', {
'</t></templates></kanban>',
groupBy: ['bar'],
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
+ if (args.method === 'web_read_group') {
// the lazy option is important, so the server can fill in
// the empty groups
assert.ok(args.kwargs.lazy, "should use lazy read_group");
@@ -485,7 +485,7 @@ QUnit.module('Views', {
"first column should contain two records");
assert.verifySteps([
- 'read_group', // initial read_group
+ 'web_read_group', // initial read_group
'/web/dataset/search_read', // initial search_read (first column)
'/web/dataset/search_read', // initial search_read (second column)
'default_get', // quick create
@@ -558,7 +558,7 @@ QUnit.module('Views', {
"first column should contain two records");
assert.verifySteps([
- 'read_group', // initial read_group
+ 'web_read_group', // initial read_group
'/web/dataset/search_read', // initial search_read (first column)
'/web/dataset/search_read', // initial search_read (second column)
'load_views', // form view in quick create
@@ -616,7 +616,7 @@ QUnit.module('Views', {
"first column should contain three records");
assert.verifySteps([
- 'read_group', // initial read_group
+ 'web_read_group', // initial read_group
'/web/dataset/search_read', // initial search_read (first column)
'/web/dataset/search_read', // initial search_read (second column)
'default_get', // quick create
@@ -683,7 +683,7 @@ QUnit.module('Views', {
"first column should contain three records");
assert.verifySteps([
- 'read_group', // initial read_group
+ 'web_read_group', // initial read_group
'/web/dataset/search_read', // initial search_read (first column)
'/web/dataset/search_read', // initial search_read (second column)
'load_views', // form view in quick create
@@ -735,7 +735,6 @@ QUnit.module('Views', {
await testUtils.kanban.clickCreate(kanban);
var $quickCreate = kanban.$('.o_kanban_group:first .o_kanban_quick_create');
- var $quickCreate = kanban.$('.o_kanban_group:first .o_kanban_quick_create');
assert.strictEqual($quickCreate.length, 1,
"should have a quick create element in the first column");
assert.strictEqual($quickCreate.find('.o_field_widget[name=int_field]').val(), '4',
@@ -748,7 +747,7 @@ QUnit.module('Views', {
"onchange should have been triggered");
assert.verifySteps([
- 'read_group', // initial read_group
+ 'web_read_group', // initial read_group
'/web/dataset/search_read', // initial search_read (first column)
'/web/dataset/search_read', // initial search_read (second column)
'load_views', // form view in quick create
@@ -1824,14 +1823,17 @@ QUnit.module('Views', {
'</kanban>',
groupBy: ['product_id'],
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
+ if (args.method === 'web_read_group') {
// override read_group to return empty groups, as this is
// the case for several models (e.g. project.task grouped
// by stage_id)
- var result = [
- {__domain: [['product_id', '=', 3]], product_id_count: 0},
- {__domain: [['product_id', '=', 5]], product_id_count: 0},
- ];
+ var result = {
+ groups: [
+ {__domain: [['product_id', '=', 3]], product_id_count: 0},
+ {__domain: [['product_id', '=', 5]], product_id_count: 0},
+ ],
+ length: 2,
+ };
return Promise.resolve(result);
}
return this._super.apply(this, arguments);
@@ -2408,11 +2410,11 @@ QUnit.module('Views', {
await kanban.reload();
assert.verifySteps([
- 'read_group',
+ 'web_read_group',
'/web/dataset/search_read',
'/web/dataset/search_read',
'read',
- 'read_group',
+ 'web_read_group',
'/web/dataset/search_read',
'/web/dataset/search_read',
'read',
@@ -2444,11 +2446,11 @@ QUnit.module('Views', {
await kanban.reload(kanban);
assert.verifySteps([
- 'read_group',
+ 'web_read_group',
'/web/dataset/search_read',
'/web/dataset/search_read',
'read',
- 'read_group',
+ 'web_read_group',
'/web/dataset/search_read',
'/web/dataset/search_read',
'read',
@@ -2487,11 +2489,11 @@ QUnit.module('Views', {
await kanban.reload();
assert.verifySteps([
- 'read_group',
+ 'web_read_group',
'/web/dataset/search_read',
'/web/dataset/search_read',
'name_get',
- 'read_group',
+ 'web_read_group',
'/web/dataset/search_read',
'/web/dataset/search_read',
'name_get',
@@ -2766,7 +2768,7 @@ QUnit.module('Views', {
'<div><field name="foo"/></div>' +
'</t></templates></kanban>',
mockRPC: function (route, args) {
- if (route === '/web/dataset/call_kw/partner/read_group') {
+ if (route === '/web/dataset/call_kw/partner/web_read_group') {
readGroupCount++;
var correctGroupBy;
if (readGroupCount === 2) {
@@ -2976,10 +2978,10 @@ QUnit.module('Views', {
'</kanban>',
groupBy: ['product_id'],
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
+ if (args.method === 'web_read_group') {
return this._super.apply(this, arguments).then(function (result) {
- result[2].__fold = true;
- result[8].__fold = true;
+ result.groups[2].__fold = true;
+ result.groups[8].__fold = true;
return result;
});
}
@@ -3119,7 +3121,7 @@ QUnit.module('Views', {
'Undefined column could not be edited');
assert.ok(!kanban.$('.o_kanban_group:first .o_column_archive_records').length, "Records of undefined column could not be archived");
assert.ok(!kanban.$('.o_kanban_group:first .o_column_unarchive_records').length, "Records of undefined column could not be restored");
- assert.verifySteps(['read_group', 'unlink', 'read_group']);
+ assert.verifySteps(['web_read_group', 'unlink', 'web_read_group']);
assert.strictEqual(kanban.renderer.widgets.length, 2,
"the old widgets should have been correctly deleted");
@@ -3139,14 +3141,14 @@ QUnit.module('Views', {
kanban.$('.o_kanban_header_title:last'), {position: 'right'}
);
assert.deepEqual([3, newColumnID], resequencedIDs,
- "moving the Undefined column should not affect order of other columns")
+ "moving the Undefined column should not affect order of other columns");
await testUtils.dom.dragAndDrop(
kanban.$('.o_kanban_header_title:first'),
kanban.$('.o_kanban_header_title:nth(1)'), {position: 'right'}
);
await nextTick(); // wait for resequence after drag and drop
assert.deepEqual([newColumnID, 3], resequencedIDs,
- "moved column should be resequenced accordingly")
+ "moved column should be resequenced accordingly");
assert.verifySteps(['name_create', 'read', 'read', 'read']);
kanban.destroy();
@@ -3474,12 +3476,12 @@ QUnit.module('Views', {
'</kanban>',
groupBy: ['product_id'],
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
+ if (args.method === 'web_read_group') {
// override read_group to return empty groups, as this is
// the case for several models (e.g. project.task grouped
// by stage_id)
return this._super.apply(this, arguments).then(function (result) {
- _.each(result, function (group) {
+ _.each(result.groups, function (group) {
group[args.kwargs.groupby[0] + '_count'] = 0;
});
return result;
@@ -3595,10 +3597,13 @@ QUnit.module('Views', {
'</kanban>',
groupBy: ['product_id'],
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
- var result = [
- {__domain: [['product_id', '=', 3]], product_id_count: 0, product_id: [3, 'hello']},
- ];
+ if (args.method === 'web_read_group') {
+ var result = {
+ groups: [
+ {__domain: [['product_id', '=', 3]], product_id_count: 0, product_id: [3, 'hello']},
+ ],
+ length: 1,
+ };
return Promise.resolve(result);
}
return this._super.apply(this, arguments);
@@ -3637,10 +3642,13 @@ QUnit.module('Views', {
'</kanban>',
groupBy: ['product_id'],
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
- var result = [
- {__domain: [['product_id', '=', 3]], product_id_count: 0, product_id: [3, 'hello']},
- ];
+ if (args.method === 'web_read_group') {
+ var result = {
+ groups: [
+ {__domain: [['product_id', '=', 3]], product_id_count: 0, product_id: [3, 'hello']},
+ ],
+ length: 1,
+ };
return Promise.resolve(result);
}
return this._super.apply(this, arguments);
@@ -3682,10 +3690,13 @@ QUnit.module('Views', {
'</kanban>',
groupBy: ['product_id'],
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
- var result = [
- {__domain: [['product_id', '=', 3]], product_id_count: 0, product_id: [3, 'hello']},
- ];
+ if (args.method === 'web_read_group') {
+ var result = {
+ groups: [
+ {__domain: [['product_id', '=', 3]], product_id_count: 0, product_id: [3, 'hello']},
+ ],
+ length: 1,
+ };
return Promise.resolve(result);
}
return this._super.apply(this, arguments);
@@ -3726,10 +3737,13 @@ QUnit.module('Views', {
'</kanban>',
groupBy: ['product_id'],
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
- var result = [
- {__domain: [['product_id', '=', 3]], product_id_count: 0, product_id: [3, 'hello']},
- ];
+ if (args.method === 'web_read_group') {
+ var result = {
+ groups: [
+ {__domain: [['product_id', '=', 3]], product_id_count: 0, product_id: [3, 'hello']},
+ ],
+ length: 1,
+ };
return Promise.resolve(result);
}
return this._super.apply(this, arguments);
@@ -4727,12 +4741,12 @@ QUnit.module('Views', {
assert.verifySteps([
// initial load
- 'read_group',
+ 'web_read_group',
'read_progress_bar',
'/web/dataset/search_read',
'/web/dataset/search_read',
// reload
- 'read_group',
+ 'web_read_group',
'read_progress_bar',
'/web/dataset/search_read',
'/web/dataset/search_read',
@@ -5061,7 +5075,7 @@ QUnit.module('Views', {
groupBy: ['bar'],
mockRPC: function (route, args) {
var result = this._super(route, args);
- if (args.method === 'read_group') {
+ if (args.method === 'web_read_group') {
var isFirstUpdate = _.isEmpty(args.kwargs.domain) &&
args.kwargs.groupby &&
args.kwargs.groupby[0] === 'bar';
@@ -5200,22 +5214,22 @@ QUnit.module('Views', {
'</t></templates></kanban>',
groupBy: ['state'],
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
+ if (args.method === 'web_read_group') {
// override read_group to return empty groups, as this is
// the case for several models (e.g. project.task grouped
// by stage_id)
return this._super.apply(this, arguments).then(function (result) {
// add 2 empty columns in the middle
- result.splice(1,0,{state_count:0,state:'def',
- __domain:[["state","=","def"]]});
- result.splice(1,0,{state_count:0,state:'def',
- __domain:[["state","=","def"]]});
+ result.groups.splice(1, 0, {state_count: 0, state: 'def',
+ __domain: [["state", "=", "def"]]});
+ result.groups.splice(1, 0, {state_count: 0, state: 'def',
+ __domain: [["state", "=", "def"]]});
// add 1 empty column in the beginning and the end
- result.unshift({state_count:0,state:'def',
- __domain:[["state","=","def"]]});
- result.push({state_count:0,state:'def',
- __domain:[["state","=","def"]]});
+ result.groups.unshift({state_count: 0, state: 'def',
+ __domain: [["state", "=", "def"]]});
+ result.groups.push({state_count: 0, state: 'def',
+ __domain: [["state", "=", "def"]]});
return result;
});
}
diff --git a/addons/web/static/tests/views/list_tests.js b/addons/web/static/tests/views/list_tests.js
index 66201d3c38b..fbed65758b5 100644
--- a/addons/web/static/tests/views/list_tests.js
+++ b/addons/web/static/tests/views/list_tests.js
@@ -1026,7 +1026,7 @@ QUnit.module('Views', {
groupBy: ['foo'],
arch: '<tree editable="bottom"><field name="foo" /><field name="int_field" sum="Sum"/></tree>',
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
+ if (args.method === 'web_read_group') {
assert.step(args.kwargs.orderby || 'default order');
}
return this._super.apply(this, arguments);
@@ -1042,7 +1042,7 @@ QUnit.module('Views', {
assert.strictEqual(list.$('tbody .o_list_number').text(), '51017',
"order should be 5, 10, 17");
- await testUtils.dom.click(list.$('.o_column_sortable'));
+ await testUtils.dom.click(list.$('.o_column_sortable'));
assert.strictEqual(list.$('tbody .o_list_number').text(), '17105',
"initial order should be 17, 10, 5");
assert.strictEqual(list.$('tfoot td:last()').text(), '32', "total should still be 32");
@@ -1055,10 +1055,10 @@ QUnit.module('Views', {
QUnit.test('groups cannot be sorted on non-aggregable fields', async function (assert) {
assert.expect(6);
this.data.foo.fields.sort_field = {string: "sortable_field", type: "sting", sortable: true, default: "value"};
- _.each(this.data.records, function(elem) {
+ _.each(this.data.records, function (elem) {
elem.sort_field = "value" + elem.id;
});
- this.data.foo.fields.foo.sortable= true;
+ this.data.foo.fields.foo.sortable = true;
var list = await createView({
View: ListView,
model: 'foo',
@@ -1066,7 +1066,7 @@ QUnit.module('Views', {
groupBy: ['foo'],
arch: '<tree editable="bottom"><field name="foo" /><field name="int_field"/><field name="sort_field"/></tree>',
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
+ if (args.method === 'web_read_group') {
assert.step(args.kwargs.orderby || 'default order');
}
return this._super.apply(this, arguments);
@@ -1252,7 +1252,7 @@ QUnit.module('Views', {
assert.isVisible(list.pager.$el, "pager should be visible");
assert.strictEqual(list.pager.state.size, 4, "pager's size should be 4");
await list.update({ groupBy: ['bar']});
- assert.isNotVisible(list.pager.$el, "pager should be invisible");
+ assert.strictEqual(list.pager.state.size, 2, "pager's size should be 2");
list.destroy();
});
@@ -2079,7 +2079,7 @@ QUnit.module('Views', {
arch: '<tree><field name="id"/><field name="int_field"/></tree>',
groupBy: ['m2o', 'foo'],
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
+ if (args.method === 'web_read_group') {
if (args.kwargs.groupby[0] === 'foo') { // nested read_group
// called twice (once when opening the group, once when sorting)
assert.deepEqual(args.kwargs.domain, [['m2o', '=', 1]],
@@ -3709,18 +3709,19 @@ QUnit.module('Views', {
mockRPC: function (route, args) {
// Override of the read_group to display the row even if there is no record in it,
// to mock the behavihour of some fields e.g stage_id on the sale order.
- if (args.method === 'read_group' && args.kwargs.groupby[0] === "m2o") {
- return Promise.resolve([
- {
+ if (args.method === 'web_read_group' && args.kwargs.groupby[0] === "m2o") {
+ return Promise.resolve({
+ groups: [{
id: 8,
- m2o:[1,"Value 1"],
+ m2o: [1, "Value 1"],
m2o_count: 0
}, {
id: 2,
- m2o:[2,"Value 2"],
+ m2o: [2, "Value 2"],
m2o_count: 1
- }
- ]);
+ }],
+ length: 1,
+ });
}
return this._super.apply(this, arguments);
},
@@ -4065,6 +4066,38 @@ QUnit.module('Views', {
delete widgetRegistry.map.asyncWidget;
});
+ QUnit.test('grouped lists with groups_limit attribute', async function (assert) {
+ assert.expect(8);
+
+ var list = await createView({
+ View: ListView,
+ model: 'foo',
+ data: this.data,
+ arch: '<tree groups_limit="3"><field name="foo"/></tree>',
+ groupBy: ['int_field'],
+ mockRPC: function (route, args) {
+ assert.step(args.method || route);
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ assert.containsN(list, '.o_group_header', 3); // page 1
+ assert.containsNone(list, '.o_data_row');
+ assert.containsOnce(list, '.o_pager_counter'); // has a pager
+
+ await testUtils.dom.click(list.$('.o_pager_next')); // switch to page 2
+
+ assert.containsN(list, '.o_group_header', 1); // page 2
+ assert.containsNone(list, '.o_data_row');
+
+ assert.verifySteps([
+ 'web_read_group', // read_group page 1
+ 'web_read_group', // read_group page 2
+ ]);
+
+ list.destroy();
+ });
+
QUnit.test('grouped list with expand attribute', async function (assert) {
assert.expect(6);
@@ -4084,7 +4117,7 @@ QUnit.module('Views', {
assert.containsN(list, '.o_data_row', 4);
assert.verifySteps([
- 'read_group',
+ 'web_read_group',
'/web/dataset/search_read',
'/web/dataset/search_read',
]);
@@ -4111,9 +4144,54 @@ QUnit.module('Views', {
assert.containsN(list, '.o_group_header', 6);
assert.verifySteps([
- 'read_group', // global
- 'read_group', // first group
- 'read_group', // second group
+ 'web_read_group', // global
+ 'web_read_group', // first group
+ 'web_read_group', // second group
+ ]);
+
+ list.destroy();
+ });
+
+ QUnit.test('grouped lists with expand attribute and a lot of groups', async function (assert) {
+ assert.expect(10);
+
+ for (var i = 0; i < 15; i++) {
+ this.data.foo.records.push({foo: 'record ' + i, int_field: i});
+ }
+
+ var nbSearchRead = 0;
+ var list = await createView({
+ View: ListView,
+ model: 'foo',
+ data: this.data,
+ arch: '<tree expand="1"><field name="foo"/></tree>',
+ groupBy: ['int_field'],
+ mockRPC: function (route, args) {
+ if (args.method === 'web_read_group') {
+ assert.step(args.method);
+ }
+ if (route === '/web/dataset/search_read') {
+ nbSearchRead++;
+ }
+ return this._super.apply(this, arguments);
+ },
+ });
+
+ assert.containsN(list, '.o_group_header', 10); // page 1
+ assert.containsN(list, '.o_data_row', 11); // one group contains two records
+ assert.strictEqual(nbSearchRead, 10);
+ assert.containsOnce(list, '.o_pager_counter'); // has a pager
+
+ nbSearchRead = 0;
+ await testUtils.dom.click(list.$('.o_pager_next')); // switch to page 2
+
+ assert.containsN(list, '.o_group_header', 7); // page 2
+ assert.containsN(list, '.o_data_row', 7);
+ assert.strictEqual(nbSearchRead, 7);
+
+ assert.verifySteps([
+ 'web_read_group', // read_group page 1
+ 'web_read_group', // read_group page 2
]);
list.destroy();
@@ -4628,7 +4706,7 @@ QUnit.module('Views', {
assert.hasClass(list.$('.o_data_row:nth(4)'), 'o_selected_row');
assert.verifySteps([
- 'read_group',
+ 'web_read_group',
'/web/dataset/search_read',
'/web/dataset/search_read',
'write',
@@ -4666,7 +4744,7 @@ QUnit.module('Views', {
assert.containsOnce(list, 'tbody tr td:contains(new value)');
assert.verifySteps([
- 'read_group',
+ 'web_read_group',
'/web/dataset/search_read',
'write',
'read',
@@ -4709,7 +4787,7 @@ QUnit.module('Views', {
assert.hasClass(list.$('tr.o_data_row:eq(3)'), 'o_selected_row');
assert.verifySteps([
- '/web/dataset/call_kw/foo/read_group',
+ 'web_read_group',
'/web/dataset/search_read',
'/web/dataset/search_read',
'default_get',
@@ -4752,7 +4830,7 @@ QUnit.module('Views', {
assert.doesNotHaveClass(list.$('tr.o_data_row:eq(2)'), 'o_selected_row');
assert.verifySteps([
- 'read_group',
+ 'web_read_group',
'/web/dataset/search_read',
'/web/dataset/search_read',
]);
@@ -4794,7 +4872,7 @@ QUnit.module('Views', {
assert.doesNotHaveClass(list.$('tr.o_data_row:eq(2)'), 'o_selected_row');
assert.verifySteps([
- 'read_group',
+ 'web_read_group',
'/web/dataset/search_read',
'/web/dataset/search_read',
]);
diff --git a/addons/web/static/tests/views/search_view_tests.js b/addons/web/static/tests/views/search_view_tests.js
index f7d07f8da9d..5980ab9211b 100644
--- a/addons/web/static/tests/views/search_view_tests.js
+++ b/addons/web/static/tests/views/search_view_tests.js
@@ -440,7 +440,7 @@ QUnit.module('Search View', {
archs: this.archs,
data: this.data,
mockRPC: function (route, args) {
- if (route === '/web/dataset/call_kw/partner/read_group') {
+ if (route === '/web/dataset/call_kw/partner/web_read_group') {
assert.deepEqual(args.kwargs.groupby, groupbys.shift());
}
return this._super.apply(this, arguments);
diff --git a/addons/web/static/tests/views/view_dialogs_tests.js b/addons/web/static/tests/views/view_dialogs_tests.js
index b17112c8978..9dd78f3b724 100644
--- a/addons/web/static/tests/views/view_dialogs_tests.js
+++ b/addons/web/static/tests/views/view_dialogs_tests.js
@@ -146,22 +146,23 @@ QUnit.module('Views', {
'</search>',
},
mockRPC: function (route, args) {
- if (args.method === 'read_group') {
+ if (args.method === 'web_read_group') {
assert.deepEqual(args.kwargs, {
context: {},
- domain: [["display_name","like","a"], "&", ["display_name","ilike","piou"], ["foo","ilike","piou"]],
- fields: ["display_name","foo","bar"],
+ domain: [["display_name", "like", "a"], "&", ["display_name", "ilike", "piou"], ["foo", "ilike", "piou"]],
+ fields: ["display_name", "foo", "bar"],
groupby: ["bar"],
orderby: '',
- lazy: true
+ lazy: true,
+ limit: 80,
}, "should search with the complete domain (domain + search), and group by 'bar'");
}
if (search === 0 && route === '/web/dataset/search_read') {
search++;
assert.deepEqual(args, {
context: {},
- domain: [["display_name","like","a"], "&", ["display_name","ilike","piou"], ["foo","ilike","piou"]],
- fields: ["display_name","foo"],
+ domain: [["display_name", "like", "a"], "&", ["display_name", "ilike", "piou"], ["foo", "ilike", "piou"]],
+ fields: ["display_name", "foo"],
model: "partner",
limit: 80,
sort: ""
@@ -169,8 +170,8 @@ QUnit.module('Views', {
} else if (search === 1 && route === '/web/dataset/search_read') {
assert.deepEqual(args, {
context: {},
- domain: [["display_name","like","a"]],
- fields: ["display_name","foo"],
+ domain: [["display_name", "like", "a"]],
+ fields: ["display_name", "foo"],
model: "partner",
limit: 80,
sort: ""