Files
test/web_enterprise/static/tests/legacy/relational_fields_mobile_tests.js
2023-04-14 17:42:23 +08:00

499 lines
21 KiB
JavaScript

odoo.define('web_enterprise.relational_fields_mobile_tests', function (require) {
"use strict";
var FormView = require('web.FormView');
var testUtils = require('web.test_utils');
var createView = testUtils.createView;
QUnit.module('web_enterprise', {}, function () {
QUnit.module('relational_fields', {
beforeEach: function () {
this.data = {
partner: {
fields: {
display_name: { string: "Displayed name", type: "char" },
trululu: {string: "Trululu", type: "many2one", relation: 'partner'},
sibling_ids: {string: "Sibling", type: "many2many", relation: 'partner'},
p: { string: "one2many field", type: "one2many", relation: 'partner', relation_field: 'trululu' },
},
records: [{
id: 1,
display_name: "first record",
trululu: 4,
}, {
id: 2,
display_name: "second record",
trululu: 1,
}, {
id: 4,
display_name: "aaa",
}],
},
};
}
}, function () {
QUnit.module('FieldStatus');
QUnit.test('statusbar is rendered correclty on small devices', async function (assert) {
assert.expect(7);
var form = await createView({
View: FormView,
model: 'partner',
data: this.data,
arch:
'<form string="Partners">' +
'<header><field name="trululu" widget="statusbar"/></header>' +
'<field name="display_name"/>' +
'</form>',
res_id: 1,
});
assert.strictEqual(form.$('.o_statusbar_status > button:contains(aaa)').length, 1,
"should have only one visible status in mobile, the active one");
assert.containsOnce(form, '.o_statusbar_status .dropdown-menu',
"should have a dropdown containing all status");
assert.containsNone(form, '.o_statusbar_status .dropdown-menu:visible',
"dropdown should be hidden");
// open the dropdown
testUtils.dom.click(form.$('.o_statusbar_status > button'));
assert.containsOnce(form, '.o_statusbar_status .dropdown-menu:visible',
"dropdown should be visible");
assert.containsN(form, '.o_statusbar_status .dropdown-menu button', 3,
"should have 3 status");
assert.containsN(form, '.o_statusbar_status button:disabled', 3,
"all status should be disabled");
var $activeStatus = form.$('.o_statusbar_status .dropdown-menu button[data-value=4]');
assert.hasClass($activeStatus,'btn-primary', "active status should be btn-primary");
form.destroy();
});
QUnit.test('statusbar with no status on extra small screens', async function (assert) {
assert.expect(9);
var form = await createView({
View: FormView,
model: 'partner',
data: this.data,
arch:'<form string="Partners">' +
'<header><field name="trululu" widget="statusbar"/></header>' +
'</form>',
res_id: 4,
});
assert.hasClass(form.$('.o_statusbar_status'),'o_field_empty',
'statusbar widget should have class o_field_empty');
assert.strictEqual(form.$('.o_statusbar_status').children().length, 2,
'statusbar widget should have two children');
assert.containsOnce(form, '.o_statusbar_status button.dropdown-toggle',
'statusbar widget should have a button');
assert.strictEqual(form.$('.o_statusbar_status button.dropdown-toggle').text().trim(), '',
'statusbar button has no text'); // Behavior as of saas-15, might be improved
assert.containsOnce(form, '.o_statusbar_status .dropdown-menu',
'statusbar widget should have a dropdown menu');
assert.containsN(form, '.o_statusbar_status .dropdown-menu button', 3,
'statusbar widget dropdown menu should have 3 buttons');
assert.strictEqual(form.$('.o_statusbar_status .dropdown-menu button').eq(0).text().trim(), 'first record',
'statusbar widget dropdown first button should display the first record display_name');
assert.strictEqual(form.$('.o_statusbar_status .dropdown-menu button').eq(1).text().trim(), 'second record',
'statusbar widget dropdown second button should display the second record display_name');
assert.strictEqual(form.$('.o_statusbar_status .dropdown-menu button').eq(2).text().trim(), 'aaa',
'statusbar widget dropdown third button should display the third record display_name');
form.destroy();
});
QUnit.test('clickable statusbar widget on mobile view', async function (assert) {
assert.expect(5);
var form = await createView({
View: FormView,
model: 'partner',
data: this.data,
arch:'<form string="Partners">' +
'<header><field name="trululu" widget="statusbar" options=\'{"clickable": "1"}\'/></header>' +
'</form>',
res_id: 1,
});
var $selectedStatus = form.$('.o_statusbar_status button[data-value="4"]');
assert.hasClass($selectedStatus, 'btn-primary');
assert.hasClass($selectedStatus,'disabled');
var selector = '.o_statusbar_status button.btn-secondary:not(.dropdown-toggle):not(:disabled)';
assert.containsN(form, selector, 2, "other status should be btn-secondary and not disabled");
await testUtils.dom.click(form.$('.o_statusbar_status .dropdown-toggle'));
await testUtils.dom.clickFirst(form.$(selector));
var $status = form.$('.o_statusbar_status button[data-value="1"]');
assert.hasClass($status, 'btn-primary');
assert.hasClass($status, 'disabled');
form.destroy();
});
QUnit.module('FieldMany2One');
QUnit.test("many2one in a enterprise environment", async function (assert) {
assert.expect(7);
var form = await createView({
View: FormView,
arch:
'<form>' +
'<sheet>' +
'<field name="trululu"/>' +
'</sheet>' +
'</form>',
archs: {
'partner,false,kanban': '<kanban>' +
'<templates><t t-name="kanban-box">' +
'<div class="oe_kanban_global_click"><field name="display_name"/></div>' +
'</t></templates>' +
'</kanban>',
'partner,false,search': '<search></search>',
},
data: this.data,
model: 'partner',
res_id: 2,
viewOptions: {mode: 'edit'},
});
var $input = form.$('.o_field_many2one input');
assert.doesNotHaveClass($input, 'ui-autocomplete-input',
"autocomplete should not be visible in a mobile environment");
await testUtils.dom.click($input);
var $modal = $('.o_modal_full .modal-lg');
assert.equal($modal.length, 1, 'there should be one modal opened in full screen');
assert.containsOnce($modal, '.o_legacy_kanban_view',
'kanban view should be open in SelectCreateDialog');
assert.containsOnce($modal, '.o_cp_searchview',
'should have Search view inside SelectCreateDialog');
assert.containsNone($modal.find(".o_control_panel .o_cp_buttons"), '.o-kanban-button-new',
"kanban view in SelectCreateDialog should not have Create button");
assert.strictEqual($modal.find(".o_legacy_kanban_view .o_kanban_record:not(.o_kanban_ghost)").length, 3,
"popup should load 3 records in kanban");
await testUtils.dom.click($modal.find('.o_legacy_kanban_view .o_kanban_record:first'));
assert.strictEqual($input.val(), 'first record',
'clicking kanban card should select record for many2one field');
form.destroy();
});
QUnit.test("hide/show element using selection_mode in kanban view in a enterprise environment", async function (assert) {
assert.expect(5);
this.data.partner.fields.foo = {string: "Foo", type: "char", default: "My little Foo Value"};
var form = await createView({
View: FormView,
arch:
'<form>' +
'<sheet>' +
'<field name="trululu"/>' +
'</sheet>' +
'</form>',
archs: {
'partner,false,kanban': '<kanban>' +
'<templates><t t-name="kanban-box">' +
'<div class="oe_kanban_global_click">' +
'<field name="display_name"/>' +
'</div>' +
'<div class="o_sibling_tags" t-if="!selection_mode">' +
'<field name="sibling_ids"/>' +
'</div>' +
'<div class="o_foo" t-if="selection_mode">' +
'<field name="foo"/>' +
'</div>' +
'</t></templates>' +
'</kanban>',
'partner,false,search': '<search></search>',
},
data: this.data,
model: 'partner',
res_id: 2,
viewOptions: {mode: 'edit'},
});
var $input = form.$('.o_field_many2one input');
assert.doesNotHaveClass($input, 'ui-autocomplete-input',
"autocomplete should not be visible in a mobile environment");
await testUtils.dom.click($input);
var $modal = $('.o_modal_full .modal-lg');
assert.equal($modal.length, 1, 'there should be one modal opened in full screen');
assert.containsOnce($modal, '.o_legacy_kanban_view',
'kanban view should be open in SelectCreateDialog');
assert.containsNone($modal, '.o_legacy_kanban_view .o_sibling_tags',
'o_sibling_tags div should not be available as div have condition on selection_mode');
assert.containsN($modal, '.o_legacy_kanban_view .o_foo', 3,
'o_foo div should be available as div have condition on selection_mode');
form.destroy();
});
QUnit.test("kanban_view_ref attribute opens specific kanban view given as a reference in a mobile environment", async function (assert) {
assert.expect(5);
var form = await createView({
View: FormView,
arch:
'<form>' +
'<sheet>' +
'<field name="trululu" kanban_view_ref="2"/>' +
'</sheet>' +
'</form>',
archs: {
'partner,1,kanban': '<kanban class="kanban1">' +
'<templates><t t-name="kanban-box">' +
'<div class="oe_kanban_global_click">' +
'<field name="display_name"/>' +
'</div>' +
'</t></templates>' +
'</kanban>',
'partner,2,kanban': '<kanban class="kanban2">' +
'<templates><t t-name="kanban-box">' +
'<div class="oe_kanban_global_click">' +
'<div>' +
'<field name="display_name"/>' +
'</div>' +
'<div>' +
'<field name="trululu"/>' +
'</div>' +
'</div>' +
'</t></templates>' +
'</kanban>',
'partner,false,search': '<search></search>',
},
data: this.data,
model: 'partner',
res_id: 2,
viewOptions: {mode: 'edit'},
});
var $input = form.$('.o_field_many2one input');
assert.doesNotHaveClass($input, 'ui-autocomplete-input',
"autocomplete should not be visible in a mobile environment");
await testUtils.dom.click($input);
var $modal = $('.o_modal_full .modal-lg');
assert.equal($modal.length, 1, 'there should be one modal opened in full screen');
assert.containsOnce($modal, '.o_legacy_kanban_view',
'kanban view should be open in SelectCreateDialog');
assert.hasClass($modal.find('.o_legacy_kanban_view'), 'kanban2',
'kanban view with id 2 should be opened as it is given as kanban_view_ref');
assert.strictEqual($modal.find('.o_legacy_kanban_view .o_kanban_record:first').text(),
'first recordaaa',
'kanban with two fields should be opened');
form.destroy();
});
QUnit.test("many2one dialog on mobile: clear button header", async function (assert) {
assert.expect(7);
const form = await createView({
View: FormView,
arch: `
<form>
<sheet>
<field name="trululu"/>
</sheet>
</form>
`,
archs: {
'partner,false,kanban': `
<kanban>
<templates><t t-name="kanban-box">
<div class="oe_kanban_global_click"><field name="display_name"/></div>
</t></templates>
</kanban>
`,
'partner,false,search': '<search></search>',
},
data: this.data,
model: 'partner',
res_id: 2,
viewOptions: {mode: 'edit'},
});
let $input = form.$('.o_field_many2one input');
assert.doesNotHaveClass($input, 'ui-autocomplete-input',
"autocomplete should not be visible in a mobile environment");
await testUtils.dom.click($input);
assert.containsOnce($('body'), '.modal.o_modal_full',
"there should be a modal opened in full screen");
assert.containsN($('.modal'), '.o_legacy_kanban_view .o_kanban_record:not(.o_kanban_ghost)', 3,
"popup should load 3 records in kanban");
await testUtils.dom.click($('.modal').find('.o_legacy_kanban_view .o_kanban_record:first'));
assert.strictEqual($input.val(), 'first record',
'clicking kanban card should select record for many2one field');
await testUtils.dom.click($input);
// clear button.
assert.containsOnce($('.modal').find('.modal-header'), '.o_clear_button',
"there should be a Clear button in the modal header");
await testUtils.dom.click($('.modal').find('.modal-header .o_clear_button'));
assert.containsNone($('body'), '.modal', "there should be no more modal");
$input = form.$('.o_field_many2one input');
assert.strictEqual($input.val(), "", "many2one should be cleared");
form.destroy();
});
QUnit.module('FieldMany2Many');
QUnit.test("many2many_tags in a mobile environment", async function (assert) {
assert.expect(10);
var rpcReadCount = 0;
var form = await createView({
View: FormView,
arch:
'<form>' +
'<sheet>' +
'<field name="sibling_ids" widget="many2many_tags"/>' +
'</sheet>' +
'</form>',
archs: {
'partner,false,kanban': '<kanban>' +
'<templates><t t-name="kanban-box">' +
'<div class="oe_kanban_global_click"><field name="display_name"/></div>' +
'</t></templates>' +
'</kanban>',
'partner,false,search': '<search></search>',
},
data: this.data,
model: 'partner',
res_id: 2,
viewOptions: {mode: 'edit'},
mockRPC: function (route, args) {
if (args.method === "read" && args.model === "partner") {
if (rpcReadCount === 0) {
assert.deepEqual(args.args[0], [2], "form should initially show partner 2");
} else if (rpcReadCount === 1) {
assert.deepEqual(args.args[0], [1], "partner with id 1 should be selected");
}
rpcReadCount++;
}
return this._super.apply(this, arguments);
},
});
var $input = form.$(".o_field_widget .o_input");
assert.strictEqual($input.find(".badge").length, 0,
"many2many_tags should have no tags");
await testUtils.dom.click($input);
var $modal = $('.o_modal_full .modal-lg');
assert.equal($modal.length, 1, 'there should be one modal opened in full screen');
assert.containsOnce($modal, '.o_legacy_kanban_view',
'kanban view should be open in SelectCreateDialog');
assert.containsOnce($modal, '.o_cp_searchview',
'should have Search view inside SelectCreateDialog');
assert.containsNone($modal.find(".o_control_panel .o_cp_buttons"), '.o-kanban-button-new',
"kanban view in SelectCreateDialog should not have Create button");
assert.strictEqual($modal.find(".o_legacy_kanban_view .o_kanban_record:not(.o_kanban_ghost)").length, 3,
"popup should load 3 records in kanban");
await testUtils.dom.click($modal.find('.o_legacy_kanban_view .o_kanban_record:first'));
assert.strictEqual(rpcReadCount, 2, "there should be a read for current form record and selected sibling");
assert.strictEqual(form.$(".o_field_widget.o_input .badge").length, 1,
"many2many_tags should have partner coucou3");
form.destroy();
});
QUnit.module('FieldOne2Many');
QUnit.test('one2many on mobile: remove header button', async function (assert) {
assert.expect(9);
this.data.partner.records[0].p = [1, 2, 4];
const form = await createView({
View: FormView,
model: 'partner',
data: this.data,
arch: `
<form string="Partners">
<field name="p"/>
</form>
`,
archs: {
'partner,false,form': `
<form string="Partner">
<field name="display_name"/>
</form>
`,
'partner,false,kanban': `
<kanban>
<templates><t t-name="kanban-box">
<div class="oe_kanban_global_click">
<field name="display_name"/>
</div>
</t></templates>
</kanban>
`,
},
res_id: 1,
mockRPC(route, args) {
if (route === '/web/dataset/call_kw/partner/write') {
const commands = args.args[1].p;
assert.strictEqual(commands.length, 3,
'should have generated three commands');
assert.ok(commands[0][0] === 4 && commands[0][1] === 2,
'should have generated the command 4 (LINK_TO) with id 2');
assert.ok(commands[1][0] === 4 && commands[1][1] === 4,
'should have generated the command 2 (LINK_TO) with id 1');
assert.ok(commands[2][0] === 2 && commands[2][1] === 1,
'should have generated the command 2 (DELETE) with id 2');
}
return this._super.apply(this, arguments);
},
});
await testUtils.form.clickEdit(form);
assert.containsN(form, '.o_legacy_kanban_view .o_kanban_record:not(.o_kanban_ghost)', 3,
"should have 3 records in kanban");
await testUtils.dom.click(form.$('.o_legacy_kanban_view .o_kanban_record:first'));
assert.containsOnce($('body'), '.modal.o_modal_full',
"there should be a modal opened in full screen");
// remove button.
assert.containsOnce($('.modal').find('.modal-header'), '.o_btn_remove',
"there should be a 'Remove' button in the modal header");
await testUtils.dom.click($('.modal').find('.modal-header .o_btn_remove'));
assert.containsNone($('body'), '.modal', "there should be no more modal");
assert.containsN(form, '.o_legacy_kanban_view .o_kanban_record:not(.o_kanban_ghost)', 2,
"should have 2 records in kanban");
// save and check that the correct command has been generated
await testUtils.form.clickSave(form);
form.destroy();
});
});
});
});