diff options
Diffstat (limited to 'addons/web/static/tests/fields/basic_fields_tests.js')
| -rw-r--r-- | addons/web/static/tests/fields/basic_fields_tests.js | 1056 |
1 files changed, 528 insertions, 528 deletions
diff --git a/addons/web/static/tests/fields/basic_fields_tests.js b/addons/web/static/tests/fields/basic_fields_tests.js index f1640b06c82..b4998b01712 100644 --- a/addons/web/static/tests/fields/basic_fields_tests.js +++ b/addons/web/static/tests/fields/basic_fields_tests.js @@ -18,6 +18,9 @@ var DebouncedField = basicFields.DebouncedField; var JournalDashboardGraph = basicFields.JournalDashboardGraph; var _t = core._t; +var DOM = testUtils.DOM; +var mock = testUtils.mock; + QUnit.module('fields', {}, function () { QUnit.module('basic_fields', { @@ -163,11 +166,11 @@ QUnit.module('basic_fields', { }); // change the value - form.$('input').val('new value').trigger('input'); + testUtils.fields.editInput(form.$('input'), 'new value'); assert.verifySteps([], "_setValue shouldn't have been called yet"); // save - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.verifySteps(['_setValue'], "_setValue should have been called once"); // destroy the form view @@ -199,47 +202,47 @@ QUnit.module('basic_fields', { res_id: 1, }); - assert.strictEqual(form.$('.o_field_boolean input:checked').length, 1, + assert.containsOnce(form, '.o_field_boolean input:checked', "checkbox should be checked"); // switch to edit mode and check the result - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('.o_field_boolean input:checked').length, 1, + testUtils.form.clickEdit(form); + assert.containsOnce(form, '.o_field_boolean input:checked', "checkbox should still be checked"); // uncheck the checkbox - form.$('.o_field_boolean input:checked').click(); - assert.strictEqual(form.$('.o_field_boolean input:checked').length, 0, + testUtils.dom.click(form.$('.o_field_boolean input:checked')); + assert.containsNone(form, '.o_field_boolean input:checked', "checkbox should no longer be checked"); // save - form.$buttons.find('.o_form_button_save').click(); - assert.strictEqual(form.$('.o_field_boolean input:checked').length, 0, + testUtils.form.clickSave(form); + assert.containsNone(form, '.o_field_boolean input:checked', "checkbox should still no longer be checked"); // switch to edit mode and test the opposite change - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('.o_field_boolean input:checked').length, 0, + testUtils.form.clickEdit(form); + assert.containsNone(form, '.o_field_boolean input:checked', "checkbox should still be unchecked"); // check the checkbox - form.$('.o_field_boolean input').click(); - assert.strictEqual(form.$('.o_field_boolean input:checked').length, 1, + testUtils.dom.click(form.$('.o_field_boolean input')); + assert.containsOnce(form, '.o_field_boolean input:checked', "checkbox should now be checked"); // uncheck it back - form.$('.o_field_boolean input').click(); - assert.strictEqual(form.$('.o_field_boolean input:checked').length, 0, + testUtils.dom.click(form.$('.o_field_boolean input')); + assert.containsNone(form, '.o_field_boolean input:checked', "checkbox should now be unchecked"); // check the checkbox by clicking on label - form.$('label:first').click(); - assert.strictEqual(form.$('.o_field_boolean input:checked').length, 1, + testUtils.dom.click(form.$('label:first')); + assert.containsOnce(form, '.o_field_boolean input:checked', "checkbox should now be checked"); // uncheck it back - form.$('label:first').click(); - assert.strictEqual(form.$('.o_field_boolean input:checked').length, 0, + testUtils.dom.click(form.$('label:first')); + assert.containsNone(form, '.o_field_boolean input:checked', "checkbox should now be unchecked"); // check the checkbox by hitting the "enter" key after focusing it @@ -247,18 +250,18 @@ QUnit.module('basic_fields', { .trigger("focusin") .trigger({type: "keydown", which: $.ui.keyCode.ENTER}) .trigger({type: "keyup", which: $.ui.keyCode.ENTER}); - assert.strictEqual(form.$('.o_field_boolean input:checked').length, 1, + assert.containsOnce(form, '.o_field_boolean input:checked', "checkbox should now be checked"); // blindly press enter again, it should uncheck the checkbox $(document.activeElement).trigger({type: "keydown", which: $.ui.keyCode.ENTER}); - assert.strictEqual(form.$('.o_field_boolean input:checked').length, 0, + assert.containsNone(form, '.o_field_boolean input:checked', "checkbox should not be checked"); // blindly press enter again, it should check the checkbox back $(document.activeElement).trigger({type: "keydown", which: $.ui.keyCode.ENTER}); // save - form.$buttons.find('.o_form_button_save').click(); - assert.strictEqual(form.$('.o_field_boolean input:checked').length, 1, + testUtils.form.clickSave(form); + assert.containsOnce(form, '.o_field_boolean input:checked', "checkbox should still be checked"); form.destroy(); }); @@ -282,13 +285,13 @@ QUnit.module('basic_fields', { var $cell = list.$('tr.o_data_row:has(.custom-checkbox input:checked) td:not(.o_list_record_selector)').first(); assert.ok($cell.find('.custom-checkbox input:checked').prop('disabled'), "input should be disabled in readonly mode"); - $cell.click(); + testUtils.dom.click($cell); assert.ok(!$cell.find('.custom-checkbox input:checked').prop('disabled'), "input should not have the disabled property in edit mode"); - $cell.find('.custom-checkbox input:checked').click(); + testUtils.dom.click($cell.find('.custom-checkbox input:checked')); // save - list.$buttons.find('.o_list_button_save').click(); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); $cell = list.$('tr.o_data_row:has(.custom-checkbox input:not(:checked)) td:not(.o_list_record_selector)').first(); assert.ok($cell.find('.custom-checkbox input:not(:checked)').prop('disabled'), "input should be disabled again"); @@ -298,12 +301,12 @@ QUnit.module('basic_fields', { "should now have only 3 checked input"); // Re-Edit the line and fake-check the checkbox - $cell.click(); - $cell.find('.custom-checkbox input').click(); // Change the checkbox - $cell.find('.custom-checkbox input').click(); // Undo the change + testUtils.dom.click($cell); + testUtils.dom.click($cell.find('.custom-checkbox input')); + testUtils.dom.click($cell.find('.custom-checkbox input')); // Save - list.$buttons.find('.o_list_button_save').click(); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); assert.strictEqual(list.$('tbody td:not(.o_list_record_selector) .custom-checkbox input').length, 5, "should still have 5 checkboxes"); assert.strictEqual(list.$('tbody td:not(.o_list_record_selector) .custom-checkbox input:checked').length, 3, @@ -312,10 +315,8 @@ QUnit.module('basic_fields', { // Re-Edit the line to check the checkbox back but this time click on // the checkbox directly in readonly mode ! $cell = list.$('tr.o_data_row:has(.custom-checkbox input:not(:checked)) td:not(.o_list_record_selector)').first(); - $cell.find('.custom-checkbox .custom-control-label').click(); + testUtils.dom.click($cell.find('.custom-checkbox .custom-control-label')); - // save - list.$buttons.find('.o_form_button_save').click(); assert.strictEqual(list.$('tbody td:not(.o_list_record_selector) .custom-checkbox input').length, 5, "should still have 5 checkboxes"); assert.strictEqual(list.$('tbody td:not(.o_list_record_selector) .custom-checkbox input:checked').length, 4, @@ -328,7 +329,6 @@ QUnit.module('basic_fields', { QUnit.test('use custom terminology in form view', function (assert) { assert.expect(2); - var terminology = { string_true: "Production Environment", hover_true: "Switch to test environment", @@ -370,7 +370,7 @@ QUnit.module('basic_fields', { res_id: 2, }); - assert.strictEqual(form.$(".custom-checkbox.o_boolean_toggle").length, 1, "Boolean toggle widget applied to boolean field"); + assert.containsOnce(form, ".custom-checkbox.o_boolean_toggle", "Boolean toggle widget applied to boolean field"); form.destroy(); }); @@ -389,23 +389,23 @@ QUnit.module('basic_fields', { '</tree>', }); - assert.strictEqual(list.$('button i.fa.fa-circle.o_toggle_button_success').length, 4, + assert.containsN(list, 'button i.fa.fa-circle.o_toggle_button_success', 4, "should have 4 green buttons"); - assert.strictEqual(list.$('button i.fa.fa-circle.text-muted').length, 1, + assert.containsOnce(list, 'button i.fa.fa-circle.text-muted', "should have 1 muted button"); - assert.strictEqual(list.$('button').first().attr('title'), "Reported in last payslips", + assert.hasAttrValue(list.$('button').first(), 'title', "Reported in last payslips", "active buttons should have proper tooltip"); - assert.strictEqual(list.$('button').last().attr('title'), "To Report in Payslip", + assert.hasAttrValue(list.$('button').last(), 'title', "To Report in Payslip", "inactive buttons should have proper tooltip"); // clicking on first button to check the state is properly changed - list.$('button').first().click(); - assert.strictEqual(list.$('button i.fa.fa-circle.o_toggle_button_success').length, 3, + testUtils.dom.click(list.$('button').first()); + assert.containsN(list, 'button i.fa.fa-circle.o_toggle_button_success', 3, "should have 3 green buttons"); - list.$('button').first().click(); - assert.strictEqual(list.$('button i.fa.fa-circle.o_toggle_button_success').length, 4, + testUtils.dom.click(list.$('button').first()); + assert.containsN(list, 'button i.fa.fa-circle.o_toggle_button_success', 4, "should have 4 green buttons"); list.destroy(); }); @@ -437,14 +437,14 @@ QUnit.module('basic_fields', { 1, "should be green"); // click on the button to toggle the value - form.$('.o_field_widget[name=bar]').click(); + testUtils.dom.click(form.$('.o_field_widget[name=bar]')); assert.strictEqual(form.$('.o_field_widget[name=bar] i.text-muted:not(.o_toggle_button_success)').length, 1, "should be gray"); assert.verifySteps([]); // save - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_widget[name=bar] i.text-muted:not(.o_toggle_button_success)').length, 1, "should still be gray"); @@ -477,7 +477,7 @@ QUnit.module('basic_fields', { 1, "should be green"); // click on the button to toggle the value - form.$('.o_field_widget[name=bar]').click(); + testUtils.dom.click(form.$('.o_field_widget[name=bar]')); assert.strictEqual(form.$('.o_field_widget[name=bar] i.text-muted:not(.o_toggle_button_success)').length, 1, "should be gray"); @@ -503,7 +503,7 @@ QUnit.module('basic_fields', { res_id: 4, }); - assert.notOk(form.$('.o_field_widget').hasClass('o_field_empty'), + assert.doesNotHaveClass(form.$('.o_field_widget'), 'o_field_empty', 'Non-set float field should be considered as 0.'); assert.strictEqual(form.$('.o_field_widget').text(), "0.000", 'Non-set float field should be considered as 0.'); @@ -547,21 +547,21 @@ QUnit.module('basic_fields', { res_id: 2, }); - assert.ok(!form.$('.o_field_widget').hasClass('o_field_empty'), + assert.doesNotHaveClass(form.$('.o_field_widget'), 'o_field_empty', 'Float field should be considered set for value 0.'); assert.strictEqual(form.$('.o_field_widget').first().text(), '0.000', 'The value should be displayed properly.'); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('input').val(), '0.000', 'The value should be rendered with correct precision.'); - form.$('input').val('108.2458938598598').trigger('input'); + testUtils.fields.editInput(form.$('input'), '108.2458938598598'); assert.strictEqual(form.$('input').val(), '108.2458938598598', 'The value should not be formated yet.'); - form.$('input').val('18.8958938598598').trigger('input'); - form.$buttons.find('.o_form_button_save').click(); + testUtils.fields.editInput(form.$('input'), '18.8958938598598'); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_widget').first().text(), '18.896', 'The new value should be rounded properly.'); @@ -586,17 +586,17 @@ QUnit.module('basic_fields', { // switch to edit mode var $cell = list.$('tr.o_data_row td:not(.o_list_record_selector)').first(); - $cell.click(); + testUtils.dom.click($cell); - assert.strictEqual(list.$('input[name="qux"]').length, 1, + assert.containsOnce(list, 'input[name="qux"]', 'The view should have 1 input for editable float.'); - list.$('input[name="qux"]').val('108.2458938598598').trigger('input'); + testUtils.fields.editInput(list.$('input[name="qux"]'), '108.2458938598598'); assert.strictEqual(list.$('input[name="qux"]').val(), '108.2458938598598', 'The value should not be formated yet.'); - list.$('input[name="qux"]').val('18.8958938598598').trigger('input'); - list.$buttons.find('.o_list_button_save').click(); + testUtils.fields.editInput(list.$('input[name="qux"]'), '18.8958938598598'); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); assert.strictEqual(list.$('.o_field_widget').first().text(), '18.896', 'The new value should be rounded properly.'); @@ -625,8 +625,8 @@ QUnit.module('basic_fields', { } }); - form.$buttons.find('.o_form_button_edit').click(); - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickEdit(form); + testUtils.form.clickSave(form); assert.verifySteps(['read']); // should not have save as nothing changed @@ -669,7 +669,7 @@ QUnit.module('basic_fields', { id: 1, qux: -8.89859, currency_id: 1, - }] + }]; var form = createView({ View: FormView, model: 'partner', @@ -690,17 +690,17 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('.o_field_widget').first().text(), '$\u00a0-8.9', 'The value should be displayed properly.'); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('input').val(), '-8.9', 'The input should be rendered without the currency symbol.'); assert.strictEqual(form.$('input').parent().children().first().text(), '$', 'The input should be preceded by a span containing the currency symbol.'); - form.$('input').val('109.2458938598598').trigger('input'); + testUtils.fields.editInput(form.$('.o_field_monetary input'), '109.2458938598598'); assert.strictEqual(form.$('input').val(), '109.2458938598598', 'The value should not be formated yet.'); - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); // Non-breaking space between the currency and the amount assert.strictEqual(form.$('.o_field_widget').first().text(), '$\u00a0109.2', 'The new value should be rounded properly.'); @@ -725,17 +725,17 @@ QUnit.module('basic_fields', { }, }); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.ok(form.$('.o_field_widget')[0].hasAttribute('type'), 'Float field with option type must have a type attribute.'); - assert.strictEqual(form.$('.o_field_widget').attr('type'), 'number', + assert.hasAttrValue(form.$('.o_field_widget'), 'type', 'number', 'Float field with option type must have a type attribute equals to "number".'); - form.$('input').val('123456.7890').trigger('input'); - form.$buttons.find('.o_form_button_save').click(); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.fields.editInput(form.$('input'), '123456.7890'); + testUtils.form.clickSave(form); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('.o_field_widget').val(), '123456.789', 'Float value must be not formatted if input type is number.'); - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_widget').text(), '123,456.8', 'Float value must be formatted in readonly view even if the input type is number.'); @@ -759,13 +759,13 @@ QUnit.module('basic_fields', { }, }); - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('.o_field_widget').attr('type'), 'text', + testUtils.form.clickEdit(form); + assert.hasAttrValue(form.$('.o_field_widget'), 'type', 'text', 'Float field with option type must have a text type (default type).'); - form.$('input').val('123456.7890').trigger('input'); - form.$buttons.find('.o_form_button_save').click(); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.fields.editInput(form.$('input'), '123456.7890'); + testUtils.form.clickSave(form); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('.o_field_widget').val(), '123,456.8', 'Float value must be formatted if input type isn\'t number.'); @@ -797,25 +797,25 @@ QUnit.module('basic_fields', { "should have a anchor with correct classes"); assert.strictEqual($mailtoLink.text(), 'yop', "the value should be displayed properly"); - assert.strictEqual($mailtoLink.attr('href'), 'mailto:yop', + assert.hasAttrValue($mailtoLink, 'href', 'mailto:yop', "should have proper mailto prefix"); // switch to edit mode and check the result - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('input[type="text"].o_field_widget').length, 1, + testUtils.form.clickEdit(form); + assert.containsOnce(form, 'input[type="text"].o_field_widget', "should have an input for the email field"); assert.strictEqual(form.$('input[type="text"].o_field_widget').val(), 'yop', "input should contain field value in edit mode"); // change value in edit mode - form.$('input[type="text"].o_field_widget').val('new').trigger('input'); + testUtils.fields.editInput(form.$('input[type="text"].o_field_widget'), 'new'); // save - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); $mailtoLink = form.$('a.o_form_uri.o_field_widget.o_text_overflow'); assert.strictEqual($mailtoLink.text(), 'new', "new value should be displayed properly"); - assert.strictEqual($mailtoLink.attr('href'), 'mailto:new', + assert.hasAttrValue($mailtoLink, 'href', 'mailto:new', "should still have proper mailto prefix"); form.destroy(); @@ -839,27 +839,27 @@ QUnit.module('basic_fields', { var $mailtoLink = list.$('a.o_form_uri.o_field_widget.o_text_overflow'); assert.strictEqual($mailtoLink.length, 5, "should have anchors with correct classes"); - assert.strictEqual($mailtoLink.first().attr('href'), 'mailto:yop', + assert.hasAttrValue($mailtoLink.first(), 'href', 'mailto:yop', "should have proper mailto prefix"); // Edit a line and check the result var $cell = list.$('tbody td:not(.o_list_record_selector)').first(); - $cell.click(); - assert.ok($cell.parent().hasClass('o_selected_row'), 'should be set as edit mode'); + testUtils.dom.click($cell); + assert.hasClass($cell.parent(),'o_selected_row', 'should be set as edit mode'); assert.strictEqual($cell.find('input').val(), 'yop', 'should have the corect value in internal input'); - $cell.find('input').val('new').trigger('input'); + testUtils.fields.editInput($cell.find('input'), 'new'); // save - list.$buttons.find('.o_list_button_save').click(); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); $cell = list.$('tbody td:not(.o_list_record_selector)').first(); - assert.ok(!$cell.parent().hasClass('o_selected_row'), 'should not be in edit mode anymore'); + assert.doesNotHaveClass($cell.parent(), 'o_selected_row', 'should not be in edit mode anymore'); assert.strictEqual(list.$('tbody td:not(.o_list_record_selector)').first().text(), 'new', "value should be properly updated"); $mailtoLink = list.$('a.o_form_uri.o_field_widget.o_text_overflow'); assert.strictEqual($mailtoLink.length, 5, "should still have anchors with correct classes"); - assert.strictEqual($mailtoLink.first().attr('href'), 'mailto:new', + assert.hasAttrValue($mailtoLink.first(), 'href', 'mailto:new', "should still have proper mailto prefix"); list.destroy(); @@ -908,17 +908,17 @@ QUnit.module('basic_fields', { "the value should be displayed properly"); // switch to edit mode and check the result - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('input[type="text"].o_field_widget').length, 1, + testUtils.form.clickEdit(form); + assert.containsOnce(form, 'input[type="text"].o_field_widget', "should have an input for the char field"); assert.strictEqual(form.$('input[type="text"].o_field_widget').val(), 'yop', "input should contain field value in edit mode"); // change value in edit mode - form.$('input[type="text"].o_field_widget').val('limbo').trigger('input'); + testUtils.fields.editInput(form.$('input[type="text"].o_field_widget'), 'limbo'); // save - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_widget').text(), 'limbo', 'the new value should be displayed'); form.destroy(); @@ -949,10 +949,10 @@ QUnit.module('basic_fields', { } }); - form.$('input[type="text"].o_field_widget').val('').trigger('input'); + testUtils.fields.editInput(form.$('input[type="text"].o_field_widget'), ''); // save - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); form.destroy(); }); @@ -975,7 +975,7 @@ QUnit.module('basic_fields', { }, }); - assert.strictEqual(form.$('input.o_field_widget').attr('maxlength'), '5', + assert.hasAttrValue(form.$('input.o_field_widget'), 'maxlength', '5', "maxlength attribute should have been set correctly on the input"); form.destroy(); @@ -998,16 +998,16 @@ QUnit.module('basic_fields', { // Edit a line and check the result var $cell = list.$('tbody td:not(.o_list_record_selector)').first(); - $cell.click(); - assert.ok($cell.parent().hasClass('o_selected_row'), 'should be set as edit mode'); + testUtils.dom.click($cell); + assert.hasClass($cell.parent(),'o_selected_row', 'should be set as edit mode'); assert.strictEqual($cell.find('input').val(), 'yop', 'should have the corect value in internal input'); - $cell.find('input').val('brolo').trigger('input'); + testUtils.fields.editInput($cell.find('input'), 'brolo'); // save - list.$buttons.find('.o_list_button_save').click(); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); $cell = list.$('tbody td:not(.o_list_record_selector)').first(); - assert.ok(!$cell.parent().hasClass('o_selected_row'), 'should not be in edit mode anymore'); + assert.doesNotHaveClass($cell.parent(), 'o_selected_row', 'should not be in edit mode anymore'); assert.strictEqual(list.$('tbody td:not(.o_list_record_selector)').first().text(), 'brolo', "value should be properly updated"); list.destroy(); @@ -1041,10 +1041,10 @@ QUnit.module('basic_fields', { return this._super.apply(this, arguments); }, }); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); var $button = form.$('input[type="text"].o_field_char + .o_field_translate'); assert.strictEqual($button.length, 1, "should have a translate button"); - $button.click(); + testUtils.dom.click($button); form.destroy(); form = createView({ @@ -1086,8 +1086,8 @@ QUnit.module('basic_fields', { }, }); - form.$('input').val('<script>throw Error();</script>').trigger('input'); - form.$buttons.find('.o_form_button_save').click(); + testUtils.fields.editInput(form.$('input'), '<script>throw Error();</script>'); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_widget').text(), '<script>throw Error();</script>', 'the value should have been properly escaped'); @@ -1117,13 +1117,13 @@ QUnit.module('basic_fields', { }, }); - form.$('input[name="foo"]').val(' abc ').trigger('input'); - form.$('input[name="foo2"]').val(' def ').trigger('input'); + testUtils.fields.editInput(form.$('input[name="foo"]'), ' abc '); + testUtils.fields.editInput(form.$('input[name="foo2"]'), ' def '); - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); // edit mode - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('input[name="foo"]').val(), 'abc', 'Foo value should have been trimmed'); assert.strictEqual(form.$('input[name="foo2"]').val(), ' def ', 'Foo2 value should not have been trimmed'); @@ -1169,17 +1169,17 @@ QUnit.module('basic_fields', { }, }); - form.$('.o_field_x2many_list_row_add a').click(); + testUtils.dom.click(form.$('.o_field_x2many_list_row_add a')); assert.strictEqual(form.$('input[name="foo"]').val(), 'My little Foo Value', 'should contain the default value'); def = $.Deferred(); - form.$('.o_field_many2one input').click(); - var $dropdown = form.$('.o_field_many2one input').autocomplete('widget'); - $dropdown.find('li:first()').click(); + + testUtils.fields.many2one.clickOpenDropdown('product_id'); + testUtils.fields.many2one.clickHighlightedItem('product_id'); // set foo before onchange - form.$('input[name="foo"]').val("tralala").trigger('input'); + testUtils.fields.editInput(form.$('input[name="foo"]'), "tralala"); assert.strictEqual(form.$('input[name="foo"]').val(), 'tralala', 'input should contain tralala'); @@ -1230,12 +1230,11 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('input[name="foo"]').val(), 'yop', 'should contain the correct value'); - form.$('.o_field_many2one input').click(); - var $dropdown = form.$('.o_field_many2one input').autocomplete('widget'); - $dropdown.find('li:first()').click(); + testUtils.fields.many2one.clickOpenDropdown('product_id'); + testUtils.fields.many2one.clickHighlightedItem('product_id'); // set foo before onchange - form.$('input[name="foo"]').val("tralala").trigger('input'); + testUtils.fields.editInput(form.$('input[name="foo"]'), "tralala"); assert.strictEqual(form.$('input[name="foo"]').val(), 'tralala', 'input should contain tralala'); @@ -1265,9 +1264,9 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('.o_field_char').text(), "***", "password field value should be hidden with '*' in read mode"); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); - assert.strictEqual(form.$('input.o_field_char').attr('type'), 'password', + assert.hasAttrValue(form.$('input.o_field_char'), 'type', 'password', "password field input should be with type 'password' in edit mode"); assert.strictEqual(form.$('input.o_field_char').val(), 'yop', "password field input value should be the (non-hidden) password value"); @@ -1293,9 +1292,9 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('.o_field_char').text(), "", "password field value should be empty in read mode"); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); - assert.strictEqual(form.$('input.o_field_char').attr('type'), 'password', + assert.hasAttrValue(form.$('input.o_field_char'), 'type', 'password', "password field input should be with type 'password' in edit mode"); assert.strictEqual(form.$('input.o_field_char').val(), '', "password field input value should be the (non-hidden, empty) password value"); @@ -1322,30 +1321,30 @@ QUnit.module('basic_fields', { res_id: 1, }); - assert.strictEqual(form.$('a.o_form_uri.o_field_widget.o_text_overflow').length, 1, + assert.containsOnce(form, 'a.o_form_uri.o_field_widget.o_text_overflow', "should have a anchor with correct classes"); - assert.strictEqual(form.$('a.o_form_uri.o_field_widget.o_text_overflow').attr('href'), 'yop', + assert.hasAttrValue(form.$('a.o_form_uri.o_field_widget.o_text_overflow'), 'href', 'yop', "should have proper href link"); - assert.strictEqual(form.$('a.o_form_uri.o_field_widget.o_text_overflow').attr('target'), '_blank', + assert.hasAttrValue(form.$('a.o_form_uri.o_field_widget.o_text_overflow'), 'target', '_blank', "should have target attribute set to _blank"); assert.strictEqual(form.$('a.o_form_uri.o_field_widget.o_text_overflow').text(), 'yop', "the value should be displayed properly"); // switch to edit mode and check the result - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('input[type="text"].o_field_widget').length, 1, + testUtils.form.clickEdit(form); + assert.containsOnce(form, 'input[type="text"].o_field_widget', "should have an input for the char field"); assert.strictEqual(form.$('input[type="text"].o_field_widget').val(), 'yop', "input should contain field value in edit mode"); // change value in edit mode - form.$('input[type="text"].o_field_widget').val('limbo').trigger('input'); + testUtils.fields.editInput(form.$('input[type="text"].o_field_widget'), 'limbo'); // save - form.$buttons.find('.o_form_button_save').click(); - assert.strictEqual(form.$('a.o_form_uri.o_field_widget.o_text_overflow').length, 1, + testUtils.form.clickSave(form); + assert.containsOnce(form, 'a.o_form_uri.o_field_widget.o_text_overflow', "should still have a anchor with correct classes"); - assert.strictEqual(form.$('a.o_form_uri.o_field_widget.o_text_overflow').attr('href'), 'limbo', + assert.hasAttrValue(form.$('a.o_form_uri.o_field_widget.o_text_overflow'), 'href', 'limbo', "should have proper new href link"); assert.strictEqual(form.$('a.o_form_uri.o_field_widget.o_text_overflow').text(), 'limbo', 'the new value should be displayed'); @@ -1383,28 +1382,28 @@ QUnit.module('basic_fields', { assert.strictEqual(list.$('tbody td:not(.o_list_record_selector)').length, 5, "should have 5 cells"); - assert.strictEqual(list.$('a.o_form_uri.o_field_widget.o_text_overflow').length, 5, + assert.containsN(list, 'a.o_form_uri.o_field_widget.o_text_overflow', 5, "should have 5 anchors with correct classes"); - assert.strictEqual(list.$('a.o_form_uri.o_field_widget.o_text_overflow').first().attr('href'), 'yop', + assert.hasAttrValue(list.$('a.o_form_uri.o_field_widget.o_text_overflow').first(), 'href', 'yop', "should have proper href link"); assert.strictEqual(list.$('tbody td:not(.o_list_record_selector)').first().text(), 'yop', "value should be displayed properly as text"); // Edit a line and check the result var $cell = list.$('tbody td:not(.o_list_record_selector)').first(); - $cell.click(); - assert.ok($cell.parent().hasClass('o_selected_row'), 'should be set as edit mode'); + testUtils.dom.click($cell); + assert.hasClass($cell.parent(),'o_selected_row', 'should be set as edit mode'); assert.strictEqual($cell.find('input').val(), 'yop', 'should have the corect value in internal input'); - $cell.find('input').val('brolo').trigger('input'); + testUtils.fields.editInput($cell.find('input'), 'brolo'); // save - list.$buttons.find('.o_list_button_save').click(); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); $cell = list.$('tbody td:not(.o_list_record_selector)').first(); - assert.ok(!$cell.parent().hasClass('o_selected_row'), 'should not be in edit mode anymore'); - assert.strictEqual(list.$('a.o_form_uri.o_field_widget.o_text_overflow').length, 5, + assert.doesNotHaveClass($cell.parent(), 'o_selected_row', 'should not be in edit mode anymore'); + assert.containsN(list, 'a.o_form_uri.o_field_widget.o_text_overflow', 5, "should still have 5 anchors with correct classes"); - assert.strictEqual(list.$('a.o_form_uri.o_field_widget.o_text_overflow').first().attr('href'), 'brolo', + assert.hasAttrValue(list.$('a.o_form_uri.o_field_widget.o_text_overflow').first(), 'href', 'brolo', "should have proper new href link"); assert.strictEqual(list.$('a.o_form_uri.o_field_widget.o_text_overflow').first().text(), 'brolo', "value should be properly updated"); @@ -1446,8 +1445,8 @@ QUnit.module('basic_fields', { '</sheet>' + '</form>', }).then(function (form) { - assert.strictEqual(form.$('.o_clipboard_button.o_btn_text_copy').length, 1,"Should have copy button on text type field"); - assert.strictEqual(form.$('.o_clipboard_button.o_btn_char_copy').length, 1,"Should have copy button on char type field"); + assert.containsOnce(form, '.o_clipboard_button.o_btn_text_copy',"Should have copy button on text type field"); + assert.containsOnce(form, '.o_clipboard_button.o_btn_char_copy',"Should have copy button on char type field"); form.destroy(); done(); }); @@ -1473,19 +1472,19 @@ QUnit.module('basic_fields', { assert.ok(form.$('.o_field_text').length, "should have a text area"); assert.strictEqual(form.$('.o_field_text').text(), 'yop', 'should be "yop" in readonly'); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); var $textarea = form.$('textarea.o_field_text'); assert.ok($textarea.length, "should have a text area"); assert.strictEqual($textarea.val(), 'yop', 'should still be "yop" in edit'); - $textarea.val('hello').trigger('input'); + testUtils.fields.editInput($textarea, 'hello'); assert.strictEqual($textarea.val(), 'hello', 'should be "hello" after first edition'); - $textarea.val('hello world').trigger('input'); + testUtils.fields.editInput($textarea, 'hello world'); assert.strictEqual($textarea.val(), 'hello world', 'should be "hello world" after second edition'); - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_text').text(), 'hello world', 'should be "hello world" after save'); @@ -1512,7 +1511,7 @@ QUnit.module('basic_fields', { assert.strictEqual($field.outerHeight(), $field[0].scrollHeight, "text field should not have a scroll bar"); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); var $textarea = form.$('textarea:first'); @@ -1535,7 +1534,7 @@ QUnit.module('basic_fields', { res_id: 1, }); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); var $textarea = form.$('textarea:first'); @@ -1564,7 +1563,7 @@ QUnit.module('basic_fields', { // the focus on the textarea by clicking on another column. // The main goal is to test the resize is actually triggered in this // particular case. - list.$('.o_data_cell:first').click(); + testUtils.dom.click(list.$('.o_data_cell:first')); var $textarea = list.$('textarea:first'); // make sure the correct data is there @@ -1602,9 +1601,9 @@ QUnit.module('basic_fields', { // edit the form // trigger a textarea reset (through onchange) by clicking the box // then check there is no scroll bar - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); - form.$('div[name="bar"] input').click(); + testUtils.dom.click(form.$('div[name="bar"] input')); var $textarea = form.$('textarea:first'); assert.strictEqual($textarea.innerHeight(), $textarea[0].scrollHeight, @@ -1641,10 +1640,10 @@ QUnit.module('basic_fields', { return this._super.apply(this, arguments); }, }); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); var $button = form.$('textarea + .o_field_translate'); assert.strictEqual($button.length, 1, "should have a translate button"); - $button.click(); + testUtils.dom.click($button); form.destroy(); form = createView({ @@ -1681,7 +1680,7 @@ QUnit.module('basic_fields', { '</list>', }); - list.$('tbody tr:first .o_list_text').click(); + testUtils.dom.click(list.$('tbody tr:first .o_list_text')); var $textarea = list.$('textarea.o_field_text'); assert.strictEqual($textarea.length, 1, "should have a text area"); assert.strictEqual($textarea.val(), 'yop', 'should still be "yop" in edit'); @@ -1755,40 +1754,40 @@ QUnit.module('basic_fields', { res_id: 1, }); - assert.strictEqual(form.$('a.o_field_widget[name="document"] > .fa-download').length, 1, + assert.containsOnce(form, 'a.o_field_widget[name="document"] > .fa-download', "the binary field should be rendered as a downloadable link in readonly"); assert.strictEqual(form.$('a.o_field_widget[name="document"]').text().trim(), 'coucou.txt', "the binary field should display the name of the file in the link"); assert.strictEqual(form.$('.o_field_char').text(), 'coucou.txt', "the filename field should have the file name as value"); - form.$('a.o_field_widget[name="document"]').click(); + testUtils.dom.click(form.$('a.o_field_widget[name="document"]')); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); - assert.strictEqual(form.$('a.o_field_widget[name="document"] > .fa-download').length, 0, + assert.containsNone(form, 'a.o_field_widget[name="document"] > .fa-download', "the binary field should not be rendered as a downloadable link in edit"); assert.strictEqual(form.$('div.o_field_binary_file[name="document"] > input').val(), 'coucou.txt', "the binary field should display the file name in the input edit mode"); - assert.strictEqual(form.$('.o_field_binary_file > input').attr('readonly'), 'readonly', + assert.hasAttrValue(form.$('.o_field_binary_file > input'), 'readonly', 'readonly', "the input should be readonly"); - assert.strictEqual(form.$('.o_field_binary_file > .o_clear_file_button').length, 1, + assert.containsOnce(form, '.o_field_binary_file > .o_clear_file_button', "there shoud be a button to clear the file"); assert.strictEqual(form.$('input.o_field_char').val(), 'coucou.txt', "the filename field should have the file name as value"); - form.$('.o_field_binary_file > .o_clear_file_button').click(); + testUtils.dom.click(form.$('.o_field_binary_file > .o_clear_file_button')); - assert.ok(form.$('.o_field_binary_file > input').hasClass('o_hidden'), + assert.isNotVisible(form.$('.o_field_binary_file > input'), "the input should be hidden"); assert.strictEqual(form.$('.o_field_binary_file > .o_select_file_button:not(.o_hidden)').length, 1, "there shoud be a button to upload the file"); assert.strictEqual(form.$('input.o_field_char').val(), '', "the filename field should be empty since we removed the file"); - form.$buttons.find('.o_form_button_save').click(); - assert.strictEqual(form.$('a.o_field_widget[name="document"] > .fa-download').length, 0, + testUtils.form.clickSave(form); + assert.containsNone(form, 'a.o_field_widget[name="document"] > .fa-download', "the binary field should not render as a downloadable link since we removed the file"); assert.strictEqual(form.$('a.o_field_widget[name="document"]').text().trim(), '', "the binary field should not display a filename in the link since we removed the file"); @@ -1830,16 +1829,14 @@ QUnit.module('basic_fields', { res_id: 1, }); - form.$buttons.find('.o_form_button_create').click(); - var $dropdown = form.$('.o_field_many2one input').autocomplete('widget'); - - form.$('.o_field_many2one input').click(); - $dropdown.find('li:not(.o_m2o_dropdown_option):contains(xphone)').click(); + testUtils.form.clickCreate(form); + testUtils.fields.many2one.clickOpenDropdown('product_id'); + testUtils.fields.many2one.clickHighlightedItem('product_id'); - assert.strictEqual(form.$('a.o_field_widget[name="document"] > .fa-download').length, 1, + assert.containsOnce(form, 'a.o_field_widget[name="document"] > .fa-download', 'The link to download the binary should be present'); - form.$('a.o_field_widget[name="document"]').click(); + testUtils.dom.click(form.$('a.o_field_widget[name="document"]')); assert.verifySteps([]); // We shoudln't have passed through steps @@ -1862,12 +1859,12 @@ QUnit.module('basic_fields', { '</form>', }); - assert.ok(form.$('.o_field_widget').hasClass('o_field_pdfviewer')); + assert.hasClass(form.$('.o_field_widget'), 'o_field_pdfviewer'); assert.strictEqual(form.$('.o_select_file_button:not(.o_hidden)').length, 1, "there should be a visible 'Upload' button"); - assert.ok(form.$('.o_field_widget iframe.o_pdfview_iframe').hasClass('o_hidden'), + assert.isNotVisible(form.$('.o_field_widget iframe.o_pdfview_iframe'), "there should be an invisible iframe"); - assert.strictEqual(form.$('input[type="file"]').length, 1, + assert.containsOnce(form, 'input[type="file"]', "there should be one input"); form.destroy(); @@ -1893,12 +1890,12 @@ QUnit.module('basic_fields', { } }); - assert.ok(form.$('.o_field_widget').hasClass('o_field_pdfviewer')); + assert.hasClass(form.$('.o_field_widget'), 'o_field_pdfviewer'); assert.strictEqual(form.$('.o_select_file_button:not(.o_hidden)').length, 0, "there should not be a any visible 'Upload' button"); - assert.notOk(form.$('.o_field_widget iframe.o_pdfview_iframe').hasClass('o_hidden'), + assert.isVisible(form.$('.o_field_widget iframe.o_pdfview_iframe'), "there should be an visible iframe"); - assert.strictEqual(form.$('.o_field_widget iframe.o_pdfview_iframe').attr('data-src'), + assert.hasAttrValue(form.$('.o_field_widget iframe.o_pdfview_iframe'), 'data-src', '/web/static/lib/pdfjs/web/viewer.html?file=%2Fweb%2Fimage%3Fmodel%3Dpartner%26field%3Ddocument%26id%3D1#page=1', "the src attribute should be correctly set on the iframe"); @@ -1908,7 +1905,7 @@ QUnit.module('basic_fields', { QUnit.test("pdf_viewer: upload rendering", function (assert) { assert.expect(6); - testUtils.patch(field_registry.map.pdf_viewer, { + testUtils.mock.patch(field_registry.map.pdf_viewer, { on_file_change: function (ev) { ev.target = {files: [new Blob()]}; this._super.apply(this, arguments); @@ -1944,7 +1941,7 @@ QUnit.module('basic_fields', { form.$('input[type="file"]').trigger('change'); assert.verifySteps(['_getURI', 'open']); - testUtils.unpatch(field_registry.map.pdf_viewer); + testUtils.mock.unpatch(field_registry.map.pdf_viewer); form.destroy(); }); @@ -1983,7 +1980,7 @@ QUnit.module('basic_fields', { '</tree>', }); - list.$buttons.find('.o_list_button_add').click(); + testUtils.dom.click(list.$buttons.find('.o_list_button_add')); assert.strictEqual(list.$('textarea').first().get(0), document.activeElement, "text area should have the focus"); @@ -2016,12 +2013,12 @@ QUnit.module('basic_fields', { def.resolve(); }; - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); - form.$('textarea').val("1").trigger('input'); + testUtils.fields.editInput(form.$('textarea').first(), "1"); assert.strictEqual(nbNotifyChanges, 0, "no event should have been triggered"); - form.$('textarea').val("12").trigger('input'); + testUtils.fields.editInput(form.$('textarea').first(), "12"); assert.strictEqual(nbNotifyChanges, 0, "no event should have been triggered"); @@ -2030,7 +2027,7 @@ QUnit.module('basic_fields', { "one event should have been triggered"); // add something in the textarea, then focus another input - form.$('textarea').first().val("123").trigger('input'); + testUtils.fields.editInput(form.$('textarea').first(), "123"); form.$('textarea').first().change(); assert.strictEqual(nbNotifyChanges, 2, "one event should have been triggered immediately"); @@ -2080,13 +2077,13 @@ QUnit.module('basic_fields', { }, }); - assert.ok(form.$('div[name="document"]').hasClass('o_field_image'), + assert.hasClass(form.$('div[name="document"]'),'o_field_image', "the widget should have the correct class"); - assert.strictEqual(form.$('div[name="document"] > img').length, 1, + assert.containsOnce(form, 'div[name="document"] > img', "the widget should contain an image"); - assert.ok(form.$('div[name="document"] > img').hasClass('img-fluid'), + assert.hasClass(form.$('div[name="document"] > img'),'img-fluid', "the image should have the correct class"); - assert.strictEqual(form.$('div[name="document"] > img').attr('width'), "90", + assert.hasAttrValue(form.$('div[name="document"] > img'), 'width', "90", "the image should correctly set its attributes"); assert.strictEqual(form.$('div[name="document"] > img').css('max-width'), "90px", "the image should correctly set its attributes"); @@ -2132,11 +2129,11 @@ QUnit.module('basic_fields', { }); assert.verifySteps(["The view's image should have been fetched"]); - assert.strictEqual(form.$('tr.o_data_row').length, 1, + assert.containsOnce(form, 'tr.o_data_row', 'There should be one record in the many2many'); // Actual flow: click on an element of the m2m to get its form view - form.$('tbody td:contains(gold)').click(); + testUtils.dom.click(form.$('tbody td:contains(gold)')); assert.strictEqual($('.modal').length, 1, 'The modal should have opened'); assert.verifySteps([ @@ -2175,7 +2172,7 @@ QUnit.module('basic_fields', { }, }); - assert.strictEqual(form.$('tr.o_data_row').length, 1, + assert.containsOnce(form, 'tr.o_data_row', 'There should be one record in the many2many'); form.destroy(); @@ -2199,11 +2196,11 @@ QUnit.module('basic_fields', { }, }); - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); - assert.ok(form.$('.o_form_view').hasClass('o_form_editable'), + assert.hasClass(form.$('.o_form_view'),'o_form_editable', "form view should still be editable"); - assert.ok(form.$('.o_field_widget').hasClass('o_field_invalid'), + assert.hasClass(form.$('.o_field_widget'),'o_field_invalid', "image field should be displayed as invalid"); form.destroy(); @@ -2251,7 +2248,7 @@ QUnit.module('basic_fields', { var done = assert.async(); assert.expect(6); - testUtils.patch(JournalDashboardGraph, { + testUtils.mock.patch(JournalDashboardGraph, { on_attach_callback: function () { assert.step('on_attach_callback'); }, @@ -2289,7 +2286,7 @@ QUnit.module('basic_fields', { ]); kanban.destroy(); - testUtils.unpatch(JournalDashboardGraph); + testUtils.mock.unpatch(JournalDashboardGraph); done(); }); }); @@ -2354,7 +2351,7 @@ QUnit.module('basic_fields', { // when being destroyed before nv has been loaded assert.expect(2); - testUtils.patch(basicFields.JournalDashboardGraph, { + testUtils.mock.patch(basicFields.JournalDashboardGraph, { destroy: function () { assert.step('destroy'); var nv = window.nv; @@ -2380,7 +2377,7 @@ QUnit.module('basic_fields', { }); kanban.destroy(); - testUtils.unpatch(basicFields.JournalDashboardGraph); + testUtils.mock.unpatch(basicFields.JournalDashboardGraph); assert.verifySteps(['destroy']); @@ -2393,7 +2390,7 @@ QUnit.module('basic_fields', { // when being destroyed before nv has been completely loaded assert.expect(2); - testUtils.patch(basicFields.JournalDashboardGraph, { + testUtils.mock.patch(basicFields.JournalDashboardGraph, { destroy: function () { assert.step('destroy'); // nv is fully loaded only when nvd3.js has been loaded @@ -2422,7 +2419,7 @@ QUnit.module('basic_fields', { }); kanban.destroy(); - testUtils.unpatch(basicFields.JournalDashboardGraph); + testUtils.mock.unpatch(basicFields.JournalDashboardGraph); assert.verifySteps(['destroy']); @@ -2452,14 +2449,14 @@ QUnit.module('basic_fields', { concurrency.delay(0).then(function () { return concurrency.delay(0); }).then(function () { - assert.strictEqual(kanban.$('.o_dashboard_graph svg').length, 2, "there should be two graph rendered"); + assert.containsN(kanban, '.o_dashboard_graph svg', 2, "there should be two graph rendered"); return kanban.update({}); }).then(function () { return concurrency.delay(0); // one graph is re-rendered }).then(function () { return concurrency.delay(0); // one graph is re-rendered }).then(function () { - assert.strictEqual(kanban.$('.o_dashboard_graph svg').length, 2, "there should be one graph rendered"); + assert.containsN(kanban, '.o_dashboard_graph svg', 2, "there should be one graph rendered"); kanban.destroy(); done(); }); @@ -2488,12 +2485,12 @@ QUnit.module('basic_fields', { concurrency.delay(0).then(function () { return concurrency.delay(0); }).then(function () { - assert.strictEqual(kanban.$('.o_dashboard_graph svg').length, 2, "there should be two graph rendered"); + assert.containsN(kanban, '.o_dashboard_graph svg', 2, "there should be two graph rendered"); return kanban.update({groupBy: ['selection'], domain: [['int_field', '=', 10]]}); }).then(function () { return concurrency.delay(0); }).then(function () { - assert.strictEqual(kanban.$('.o_dashboard_graph svg').length, 1, "there should be one graph rendered"); + assert.containsOnce(kanban, '.o_dashboard_graph svg', "there should be one graph rendered"); kanban.destroy(); done(); }); @@ -2550,18 +2547,18 @@ QUnit.module('basic_fields', { assert.notOk(form.$('td span.o_row_handle').is(':visible'), "handle should be invisible in readonly mode"); - assert.strictEqual(form.$('span.o_row_handle').length, 2, "should have 2 handles"); + assert.containsN(form, 'span.o_row_handle', 2, "should have 2 handles"); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); - assert.ok(form.$('td:first').hasClass('o_handle_cell'), + assert.hasClass(form.$('td:first'),'o_handle_cell', "column widget should be displayed in css class"); assert.ok(form.$('td span.o_row_handle').is(':visible'), "handle should be visible in readonly mode"); - form.$('td').eq(1).click(); - assert.strictEqual(form.$('td:first span.o_row_handle').length, 1, + testUtils.dom.click(form.$('td').eq(1)); + assert.containsOnce(form, 'td:first span.o_row_handle', "content of the cell should have been replaced"); form.destroy(); }); @@ -2579,7 +2576,7 @@ QUnit.module('basic_fields', { '</tree>', }); - assert.strictEqual(list.$('.o_row_handle:visible').length, this.data.partner.records.length, + assert.containsN(list, '.o_row_handle:visible', this.data.partner.records.length, 'there should be a visible handle for each record'); list.destroy(); }); @@ -2603,13 +2600,13 @@ QUnit.module('basic_fields', { assert.strictEqual($('.bootstrap-datetimepicker-widget:visible').length, 0, "datepicker should be closed initially"); - testUtils.openDatepicker(form.$('.o_datepicker')); + testUtils.dom.openDatepicker(form.$('.o_datepicker')); assert.strictEqual($('.bootstrap-datetimepicker-widget:visible').length, 1, "datepicker should be opened"); // focus another field - form.$('.o_field_widget[name=foo]').click().focus(); + testUtils.dom.click(form.$('.o_field_widget[name=foo]').focus().mouseenter()); assert.strictEqual($('.bootstrap-datetimepicker-widget:visible').length, 0, "datepicker should close itself when the user clicks outside"); @@ -2644,15 +2641,15 @@ QUnit.module('basic_fields', { res_id: 4, }); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); // open datepicker and select a date - testUtils.openDatepicker(form.$('.o_datepicker')); + testUtils.dom.openDatepicker(form.$('.o_datepicker')); assert.strictEqual(form.$('.o_datepicker_input').val(), '', "date field's input should be empty on first click"); - $('.day:contains(22)').click(); + testUtils.dom.click($('.day:contains(22)')); // re-open datepicker - testUtils.openDatepicker(form.$('.o_datepicker')); + testUtils.dom.openDatepicker(form.$('.o_datepicker')); assert.strictEqual($('.day.active').text(), '22', "datepicker should be highlight with 22nd day of month"); @@ -2688,25 +2685,25 @@ QUnit.module('basic_fields', { 'the date should be correctly displayed in readonly'); // switch to edit mode - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('.o_datepicker_input').val(), '02/03/2017', 'the date should be correct in edit mode'); // open datepicker and select another value - testUtils.openDatepicker(form.$('.o_datepicker')); + testUtils.dom.openDatepicker(form.$('.o_datepicker')); assert.ok($('.bootstrap-datetimepicker-widget').length, 'datepicker should be open'); assert.strictEqual($('.day.active').data('day'), '02/03/2017', 'datepicker should be highlight February 3'); - $('.bootstrap-datetimepicker-widget .picker-switch').first().click(); // Month selection - $('.bootstrap-datetimepicker-widget .picker-switch').first().click(); // Year selection - $('.bootstrap-datetimepicker-widget .year:contains(2017)').click(); - $('.bootstrap-datetimepicker-widget .month').eq(1).click(); // February - $('.day:contains(22)').click(); // select the 22 February + testUtils.dom.click($('.bootstrap-datetimepicker-widget .picker-switch').first()); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .picker-switch:eq(1)').first()); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .year:contains(2017)')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .month').eq(1)); + testUtils.dom.click($('.day:contains(22)')); assert.ok(!$('.bootstrap-datetimepicker-widget').length, 'datepicker should be closed'); assert.strictEqual(form.$('.o_datepicker_input').val(), '02/22/2017', 'the selected date should be displayed in the input'); // save - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_date').text(), '02/22/2017', 'the selected date should be displayed after saving'); form.destroy(); @@ -2735,7 +2732,7 @@ QUnit.module('basic_fields', { 'the date should be correctly displayed in readonly'); // switch to edit mode - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('.o_datepicker_input').val(), '02/03/2017', 'the date should be correct in edit mode'); @@ -2756,19 +2753,19 @@ QUnit.module('basic_fields', { }); // switch to edit mode - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); // open datepicker and select another value - testUtils.openDatepicker(form.$('.o_datepicker')); - $('.bootstrap-datetimepicker-widget .picker-switch').first().click(); // Month selection - $('.bootstrap-datetimepicker-widget .picker-switch').first().click(); // Year selection - $('.bootstrap-datetimepicker-widget .year').eq(11).click(); // last year - $('.bootstrap-datetimepicker-widget .month').eq(11).click(); // December - $('.day:contains(31)').click(); // select the 31 December + testUtils.dom.openDatepicker(form.$('.o_datepicker')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .picker-switch').first()); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .picker-switch:eq(1)')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .year').eq(11)); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .month').eq(11)); + testUtils.dom.click($('.day:contains(31)')); var $warn = form.$('.o_datepicker_warning:visible'); assert.strictEqual($warn.length, 1, "should have a warning in the form view"); - form.$('.o_field_widget[name=date] input').val('').trigger('change'); // remove the value + testUtils.fields.editSelect(form.$('.o_field_widget[name=date] input'), ''); // remove the value $warn = form.$('.o_datepicker_warning:visible'); assert.strictEqual($warn.length, 0, "the warning in the form view should be hidden"); @@ -2799,9 +2796,9 @@ QUnit.module('basic_fields', { var $cell = list.$('tr.o_data_row td:not(.o_list_record_selector)').first(); assert.strictEqual($cell.text(), '02/03/2017', 'the date should be displayed correctly in readonly'); - $cell.click(); + testUtils.dom.click($cell); - assert.strictEqual(list.$('input.o_datepicker_input').length, 1, + assert.containsOnce(list, 'input.o_datepicker_input', "the view should have a date input for editable mode"); assert.strictEqual(list.$('input.o_datepicker_input').get(0), document.activeElement, @@ -2811,19 +2808,19 @@ QUnit.module('basic_fields', { 'the date should be correct in edit mode'); // open datepicker and select another value - testUtils.openDatepicker(list.$('.o_datepicker')); + testUtils.dom.openDatepicker(list.$('.o_datepicker')); assert.ok($('.bootstrap-datetimepicker-widget').length, 'datepicker should be open'); - $('.bootstrap-datetimepicker-widget .picker-switch').first().click(); // Month selection - $('.bootstrap-datetimepicker-widget .picker-switch').first().click(); // Year selection - $('.bootstrap-datetimepicker-widget .year:contains(2017)').click(); - $('.bootstrap-datetimepicker-widget .month').eq(1).click(); // February - $('.day:contains(22)').click(); // select the 22 February + testUtils.dom.click($('.bootstrap-datetimepicker-widget .picker-switch').first()); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .picker-switch:eq(1)')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .year:contains(2017)')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .month').eq(1)); + testUtils.dom.click($('.day:contains(22)')); assert.ok(!$('.bootstrap-datetimepicker-widget').length, 'datepicker should be closed'); assert.strictEqual(list.$('.o_datepicker_input').val(), '02/22/2017', 'the selected date should be displayed in the input'); // save - list.$buttons.find('.o_list_button_save').click(); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); assert.strictEqual(list.$('tr.o_data_row td:not(.o_list_record_selector)').text(), '02/22/2017', 'the selected date should be displayed after saving'); @@ -2851,16 +2848,16 @@ QUnit.module('basic_fields', { }); // switch to edit mode - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('.o_datepicker_input').val(), '02/03/2017', 'the date should be correct in edit mode'); - form.$('.o_datepicker_input').val('').trigger('input').trigger('change').trigger('focusout'); + testUtils.fields.editAndTrigger(form.$('.o_datepicker_input'), '', ['input', 'change', 'focusout']); assert.strictEqual(form.$('.o_datepicker_input').val(), '', 'should have correctly removed the value'); // save - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_date').text(), '', 'the selected date should be displayed after saving'); @@ -2892,9 +2889,8 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('.o_datepicker_input').val(), '02/08/2017', 'the date should be correct'); - form.$('input[name="datetime"]').val('02/08/2017') - .trigger('input').trigger('change').trigger('focusout'); - form.$buttons.find('.o_form_button_save').click(); + testUtils.fields.editAndTrigger(form.$('input[name="datetime"]'),'02/08/2017', ['input', 'change', 'focusout']); + testUtils.form.clickSave(form); assert.verifySteps(['read']); // should not have save as nothing changed @@ -2928,24 +2924,23 @@ QUnit.module('basic_fields', { 'the datetime should be correctly displayed in readonly'); // switch to edit mode - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('.o_datepicker_input').val(), expectedDateString, 'the datetime should be correct in edit mode'); // select 22 February at 8:23:33 assert.ok($('.bootstrap-datetimepicker-widget').length, 'datepicker should be open'); - $('.bootstrap-datetimepicker-widget .picker-switch').first().click(); // Month selection - $('.bootstrap-datetimepicker-widget .picker-switch').first().click(); // Year selection - $('.bootstrap-datetimepicker-widget .year:contains(2017)').click(); - $('.bootstrap-datetimepicker-widget .month').eq(3).click(); // April - $('.bootstrap-datetimepicker-widget .day:contains(22)').click(); - $('.bootstrap-datetimepicker-widget .fa-clock-o').click(); - $('.bootstrap-datetimepicker-widget .timepicker-hour').click(); - $('.bootstrap-datetimepicker-widget .hour:contains(08)').click(); - $('.bootstrap-datetimepicker-widget .timepicker-minute').click(); - $('.bootstrap-datetimepicker-widget .minute:contains(25)').click(); - $('.bootstrap-datetimepicker-widget .timepicker-second').click(); - $('.bootstrap-datetimepicker-widget .second:contains(35)').click(); - $('.bootstrap-datetimepicker-widget .fa-times').click(); // close + testUtils.dom.click($('.bootstrap-datetimepicker-widget .picker-switch').first()); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .picker-switch:eq(1)')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .year:contains(2017)')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .month').eq(3)); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .day:contains(22)')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .fa-clock-o')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .timepicker-hour')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .hour:contains(08)')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .timepicker-minute')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .minute:contains(25)')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .timepicker-second')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .second:contains(35)')); assert.ok(!$('.bootstrap-datetimepicker-widget').length, 'datepicker should be closed'); var newExpectedDateString = "04/22/2017 08:25:35"; @@ -2953,7 +2948,7 @@ QUnit.module('basic_fields', { 'the selected date should be displayed in the input'); // save - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_date').text(), newExpectedDateString, 'the selected date should be displayed after saving'); @@ -3006,7 +3001,7 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('.o_field_date input').val(), expectedDateString, 'the datetime should be correctly displayed in readonly'); - form.$buttons.find('.o_form_button_cancel').click(); + testUtils.form.clickDiscard(form); assert.strictEqual($('.modal').length, 0, "there should not be a Warning dialog"); @@ -3041,8 +3036,8 @@ QUnit.module('basic_fields', { 'the datetime should be correctly displayed in readonly'); // switch to edit mode - $cell.click(); - assert.strictEqual(list.$('input.o_datepicker_input').length, 1, + testUtils.dom.click($cell); + assert.containsOnce(list, 'input.o_datepicker_input', "the view should have a date input for editable mode"); assert.strictEqual(list.$('input.o_datepicker_input').get(0), document.activeElement, @@ -3053,19 +3048,18 @@ QUnit.module('basic_fields', { // select 22 February at 8:23:33 assert.ok($('.bootstrap-datetimepicker-widget').length, 'datepicker should be open'); - $('.bootstrap-datetimepicker-widget .picker-switch').first().click(); // Month selection - $('.bootstrap-datetimepicker-widget .picker-switch').first().click(); // Year selection - $('.bootstrap-datetimepicker-widget .year:contains(2017)').click(); - $('.bootstrap-datetimepicker-widget .month').eq(3).click(); // April - $('.bootstrap-datetimepicker-widget .day:contains(22)').click(); - $('.bootstrap-datetimepicker-widget .fa-clock-o').click(); - $('.bootstrap-datetimepicker-widget .timepicker-hour').click(); - $('.bootstrap-datetimepicker-widget .hour:contains(08)').click(); - $('.bootstrap-datetimepicker-widget .timepicker-minute').click(); - $('.bootstrap-datetimepicker-widget .minute:contains(25)').click(); - $('.bootstrap-datetimepicker-widget .timepicker-second').click(); - $('.bootstrap-datetimepicker-widget .second:contains(35)').click(); - $('.bootstrap-datetimepicker-widget .fa-times').click(); // close + testUtils.dom.click($('.bootstrap-datetimepicker-widget .picker-switch').first()); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .picker-switch:eq(1)')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .year:contains(2017)')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .month').eq(3)); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .day:contains(22)')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .fa-clock-o')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .timepicker-hour')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .hour:contains(08)')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .timepicker-minute')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .minute:contains(25)')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .timepicker-second')); + testUtils.dom.click($('.bootstrap-datetimepicker-widget .second:contains(35)')); assert.ok(!$('.bootstrap-datetimepicker-widget').length, 'datepicker should be closed'); var newExpectedDateString = "04/22/2017 08:25:35"; @@ -3073,7 +3067,7 @@ QUnit.module('basic_fields', { 'the selected datetime should be displayed in the input'); // save - list.$buttons.find('.o_list_button_save').click(); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); assert.strictEqual(list.$('tr.o_data_row td:not(.o_list_record_selector)').text(), newExpectedDateString, 'the selected datetime should be displayed after saving'); @@ -3107,16 +3101,16 @@ QUnit.module('basic_fields', { }); // switch to edit mode - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('.o_datepicker_input').val(), '02/08/2017 12:00:00', 'the date time should be correct in edit mode'); - $('.o_datepicker_input').val('').trigger('input').trigger('change').trigger('focusout'); + testUtils.fields.editAndTrigger($('.o_datepicker_input'), '', ['input', 'change', 'focusout']); assert.strictEqual(form.$('.o_datepicker_input').val(), '', "should have an empty input"); // save - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_date').text(), '', 'the selected date should be displayed after saving'); @@ -3160,7 +3154,7 @@ QUnit.module('basic_fields', { 'the datetime (datetime widget) should be correctly displayed in tree view'); // switch to form view - form.$('.o_field_widget[name=p] .o_data_row').click(); + testUtils.dom.click(form.$('.o_field_widget[name=p] .o_data_row')); assert.strictEqual($('.modal .o_field_date[name=datetime]').text(), '02/07/2017', 'the datetime (date widget) should be correctly displayed in form view'); @@ -3204,7 +3198,7 @@ QUnit.module('basic_fields', { 'the datetime (datetime widget) should be correctly displayed in tree view'); // switch to form view - form.$('.o_field_widget[name=p] .o_data_row').click(); + testUtils.dom.click(form.$('.o_field_widget[name=p] .o_data_row')); assert.strictEqual($('.modal .o_field_date[name=datetime]').text(), '02/08/2017', 'the datetime (date widget) should be correctly displayed in form view'); @@ -3212,7 +3206,7 @@ QUnit.module('basic_fields', { }); QUnit.test('datepicker option: daysOfWeekDisabled', function (assert) { - assert.expect(2); + assert.expect(42); this.data.partner.fields.datetime.default = "2017-08-02 12:00:05"; this.data.partner.fields.datetime.required = true; @@ -3228,12 +3222,16 @@ QUnit.module('basic_fields', { res_id: 1, }); - form.$buttons.find('.o_form_button_create').click(); - assert.ok($('.day:last-child(),.day:nth-child(2)').hasClass('disabled'), - 'first and last days must be disabled'); - assert.notOk($('.day:not(:last-child()):not(:nth-child(2))').hasClass('disabled'), - 'other days must stay clickable'); - + testUtils.form.clickCreate(form); + $.each($('.day:last-child(),.day:nth-child(2)'), function (index, value) { + assert.hasClass(value, 'disabled', 'first and last days must be disabled'); + }); + // the assertions below could be replaced by a single hasClass classic on the jQuery set using the idea + // All not <=> not Exists. But we want to be sure that the set is non empty. We don't have an helper + // function for that. + $.each($('.day:not(:last-child()):not(:nth-child(2))'), function (index, value) { + assert.doesNotHaveClass(value, 'disabled', 'other days must stay clickable'); + }); form.destroy(); }); @@ -3262,17 +3260,17 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('.o_field_widget').first().text(), '$\u00a09.10', 'The value should be displayed properly.'); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('input').val(), '9.10', 'The input should be rendered without the currency symbol.'); assert.strictEqual(form.$('input').parent().children().first().text(), '$', 'The input should be preceded by a span containing the currency symbol.'); - form.$('input').val('108.2458938598598').trigger('input'); + testUtils.fields.editInput(form.$('.o_field_monetary input'), '108.2458938598598'); assert.strictEqual(form.$('input').val(), '108.2458938598598', 'The value should not be formated yet.'); - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); // Non-breaking space between the currency and the amount assert.strictEqual(form.$('.o_field_widget').first().text(), '$\u00a0108.25', 'The new value should be rounded properly.'); @@ -3303,17 +3301,17 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('.o_field_widget').first().text(), '0.00\u00a0€', 'The value should be displayed properly.'); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('input').first().val(), '0.00', 'The input should be rendered without the currency symbol.'); assert.strictEqual(form.$('input').parent().children().eq(1).text(), '€', 'The input should be followed by a span containing the currency symbol.'); - form.$('input').first().val('108.2458938598598').trigger('input'); + testUtils.fields.editInput(form.$('input').first(), '108.2458938598598'); assert.strictEqual(form.$('input').first().val(), '108.2458938598598', 'The value should not be formated yet.'); - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); // Non-breaking space between the currency and the amount assert.strictEqual(form.$('.o_field_widget').first().text(), '108.25\u00a0€', 'The new value should be rounded properly.'); @@ -3360,17 +3358,17 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('.o_field_widget').first().text(), '99.1234\u00a0Bs.F', 'The value should be displayed properly.'); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('input').first().val(), '99.1234', 'The input should be rendered without the currency symbol.'); assert.strictEqual(form.$('input').parent().children().eq(1).text(), 'Bs.F', 'The input should be followed by a span containing the currency symbol.'); - form.$('input').first().val('99.111111111').trigger('input'); + testUtils.fields.editInput(form.$('input').first(), '99.111111111'); assert.strictEqual(form.$('input').first().val(), '99.111111111', 'The value should not be formated yet.'); - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); // Non-breaking space between the currency and the amount assert.strictEqual(form.$('.o_field_widget').first().text(), '99.1111\u00a0Bs.F', 'The new value should be rounded properly.'); @@ -3408,22 +3406,22 @@ QUnit.module('basic_fields', { // switch to edit mode var $cell = list.$('tr.o_data_row td:not(.o_list_record_selector):contains($)'); - $cell.click(); + testUtils.dom.click($cell); assert.strictEqual($cell.children().length, 1, 'The cell td should only contain the special div of monetary widget.'); - assert.strictEqual(list.$('[name="qux"] input').length, 1, + assert.containsOnce(list, '[name="qux"] input', 'The view should have 1 input for editable monetary float.'); assert.strictEqual(list.$('[name="qux"] input').val(), '9.10', 'The input should be rendered without the currency symbol.'); assert.strictEqual(list.$('[name="qux"] input').parent().children().first().text(), '$', 'The input should be preceded by a span containing the currency symbol.'); - list.$('[name="qux"] input').val('108.2458938598598').trigger('input'); + testUtils.fields.editInput(list.$('[name="qux"] input'), '108.2458938598598'); assert.strictEqual(list.$('[name="qux"] input').val(), '108.2458938598598', 'The typed value should be correctly displayed.'); - list.$buttons.find('.o_list_button_save').click(); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); assert.strictEqual(list.$('tr.o_data_row td:not(.o_list_record_selector):contains($)').text(), '$\u00a0108.25', 'The new value should be rounded properly.'); @@ -3469,20 +3467,19 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('.o_field_monetary').first().next().html(), "$ 4.20", "readonly value should contain the currency"); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('.o_field_monetary > input').val(), "9.10", "input value in edition should only contain the value, without the currency"); - form.$('input[type="checkbox"]').click(); // Change the field on which the monetary depends - assert.strictEqual(form.$('.o_field_monetary > input').length, 1, + testUtils.dom.click(form.$('input[type="checkbox"]')); + assert.containsOnce(form, '.o_field_monetary > input', "After the onchange, the monetary <input/> should not have been duplicated"); - assert.strictEqual(form.$('.o_field_monetary[name=quux]').length, 1, + assert.containsOnce(form, '.o_field_monetary[name=quux]', "After the onchange, the monetary readonly field should not have been duplicated"); - var $dropdown = form.$('.o_field_many2one input').autocomplete('widget'); - form.$('.o_field_many2one input').click(); - $dropdown.find('li:not(.o_m2o_dropdown_option):last').mouseenter().click(); + testUtils.fields.many2one.clickOpenDropdown('currency_id'); + testUtils.fields.many2one.clickItem('currency_id','€'); assert.strictEqual(form.$('.o_field_monetary > span').html(), "€", "After currency change, the monetary field currency should have been updated"); assert.strictEqual(form.$('.o_field_monetary').first().next().html(), "4.20 €", @@ -3552,30 +3549,30 @@ QUnit.module('basic_fields', { // test the monetary field inside the one2many var $o2m = form.$('.o_field_widget[name=p]'); - $o2m.find('.o_field_x2many_list_row_add a').click(); - $o2m.find('.o_field_widget input').val("22").trigger('input'); + testUtils.dom.click($o2m.find('.o_field_x2many_list_row_add a')); + testUtils.fields.editInput($o2m.find('.o_field_widget input'), "22"); assert.strictEqual($o2m.find('.o_field_widget input').get(0), document.activeElement, "the focus should still be on the input"); assert.strictEqual($o2m.find('.o_field_widget input').val(), "22", "the value should not have been formatted yet"); - form.$el.click(); // focusout the input + testUtils.dom.click(form.$el); assert.strictEqual($o2m.find('.o_field_widget[name=qux]').html(), "$ 22.00", "the value should have been formatted after losing the focus"); // test the monetary field inside the many2many var $m2m = form.$('.o_field_widget[name=m2m]'); - $m2m.find('.o_data_row td:first').click(); - $m2m.find('.o_field_widget input').val("22").trigger('input'); + testUtils.dom.click($m2m.find('.o_data_row td:first')); + testUtils.fields.editInput($m2m.find('.o_field_widget input'), "22"); assert.strictEqual($m2m.find('.o_field_widget input').get(0), document.activeElement, "the focus should still be on the input"); assert.strictEqual($m2m.find('.o_field_widget input').val(), "22", "the value should not have been formatted yet"); - form.$el.click(); // focusout the input + testUtils.dom.click(form.$el); assert.strictEqual($m2m.find('.o_field_widget[name=qux]').html(), "22.00 €", "the value should have been formatted after losing the focus"); @@ -3583,7 +3580,7 @@ QUnit.module('basic_fields', { form.destroy(); }); - QUnit.test('monetary field with currency set by an onchange', function (assert) { + QUnit.test('monetary field with currency set by an onchange',async function (assert) { // this test ensures that the monetary field can be re-rendered with and // without currency (which can happen as the currency can be set by an // onchange) @@ -3609,31 +3606,33 @@ QUnit.module('basic_fields', { }, }); - list.$buttons.find('.o_list_button_add').click(); - assert.strictEqual(list.$('div.o_field_widget[name=qux] input').length, 1, + testUtils.dom.click(list.$buttons.find('.o_list_button_add')); + assert.containsOnce(list, 'div.o_field_widget[name=qux] input', "monetary field should have been rendered correctly (without currency)"); - assert.strictEqual(list.$('.o_field_widget[name=qux] span').length, 0, + assert.containsNone(list, '.o_field_widget[name=qux] span', "monetary field should have been rendered correctly (without currency)"); // set a value for int_field -> should set the currency and re-render qux - list.$('.o_field_widget[name=int_field]').click().val('7').trigger('input'); - assert.strictEqual(list.$('div.o_field_widget[name=qux] input').length, 1, + testUtils.fields.editInput(list.$('.o_field_widget[name=int_field]'),'7'); + assert.containsOnce(list, 'div.o_field_widget[name=qux] input', "monetary field should have been re-rendered correctly (with currency)"); assert.strictEqual(list.$('.o_field_widget[name=qux] span:contains(€)').length, 1, "monetary field should have been re-rendered correctly (with currency)"); var $quxInput = list.$('.o_field_widget[name=qux] input'); - $quxInput.click(); // check that the field is focusable + testUtils.dom.click($quxInput); assert.strictEqual(document.activeElement, $quxInput[0], "focus should be on the qux field's input"); // unset the value of int_field -> should unset the currency and re-render qux - list.$('.o_field_widget[name=int_field]').click().val('0').trigger('input'); + testUtils.dom.click(list.$('.o_field_widget[name=int_field]')); + testUtils.fields.editInput(list.$('.o_field_widget[name=int_field]'),'0'); $quxInput = list.$('div.o_field_widget[name=qux] input'); assert.strictEqual($quxInput.length, 1, "monetary field should have been re-rendered correctly (without currency)"); - assert.strictEqual(list.$('.o_field_widget[name=qux] span').length, 0, + assert.containsNone(list, '.o_field_widget[name=qux] span', "monetary field should have been re-rendered correctly (without currency)"); - $quxInput.click(); // check that the field is still focusable + await concurrency.delay(0); + testUtils.dom.click($quxInput); assert.strictEqual(document.activeElement, $quxInput[0], "focus should be on the qux field's input"); @@ -3653,7 +3652,7 @@ QUnit.module('basic_fields', { res_id: 4, }); - assert.notOk(form.$('.o_field_widget').hasClass('o_field_empty'), + assert.doesNotHaveClass(form.$('.o_field_widget'), 'o_field_empty', 'Non-set integer field should be recognized as 0.'); assert.strictEqual(form.$('.o_field_widget').text(), "0", 'Non-set integer field should be recognized as 0.'); @@ -3672,18 +3671,18 @@ QUnit.module('basic_fields', { res_id: 2, }); - assert.ok(!form.$('.o_field_widget').hasClass('o_field_empty'), + assert.doesNotHaveClass(form.$('.o_field_widget'), 'o_field_empty', 'Integer field should be considered set for value 0.'); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('input').val(), '0', 'The value should be rendered correctly in edit mode.'); - form.$('input').val('-18').trigger('input'); + testUtils.fields.editInput(form.$('input'), '-18'); assert.strictEqual(form.$('input').val(), '-18', 'The value should be correctly displayed in the input.'); - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_widget').text(), '-18', 'The new value should be saved and displayed properly.'); @@ -3725,16 +3724,16 @@ QUnit.module('basic_fields', { // switch to edit mode var $cell = list.$('tr.o_data_row td:not(.o_list_record_selector)').first(); - $cell.click(); + testUtils.dom.click($cell); - assert.strictEqual(list.$('input[name="int_field"]').length, 1, + assert.containsOnce(list, 'input[name="int_field"]', 'The view should have 1 input for editable integer.'); - list.$('input[name="int_field"]').val('-28').trigger('input'); + testUtils.fields.editInput(list.$('input[name="int_field"]'), '-28'); assert.strictEqual(list.$('input[name="int_field"]').val(), '-28', 'The value should be displayed properly in the input.'); - list.$buttons.find('.o_list_button_save').click(); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); assert.strictEqual(list.$('td:not(.o_list_record_selector)').first().text(), '-28', 'The new value should be saved and displayed properly.'); @@ -3758,18 +3757,18 @@ QUnit.module('basic_fields', { }, }); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.ok(form.$('.o_field_widget')[0].hasAttribute('type'), 'Integer field with option type must have a type attribute.'); - assert.strictEqual(form.$('.o_field_widget').attr('type'), 'number', + assert.hasAttrValue(form.$('.o_field_widget'), 'type', 'number', 'Integer field with option type must have a type attribute equals to "number".'); - form.$('input').val('1234567890').trigger('input'); - form.$buttons.find('.o_form_button_save').click(); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.fields.editInput(form.$('input'), '1234567890'); + testUtils.form.clickSave(form); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('.o_field_widget').val(), '1234567890', 'Integer value must be not formatted if input type is number.'); - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_widget').text(), '1,234,567,890', 'Integer value must be formatted in readonly view even if the input type is number.'); @@ -3793,13 +3792,13 @@ QUnit.module('basic_fields', { }, }); - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('.o_field_widget').attr('type'), 'text', + testUtils.form.clickEdit(form); + assert.hasAttrValue(form.$('.o_field_widget'), 'type', 'text', 'Integer field without option type must have a text type (default type).'); - form.$('input').val('1234567890').trigger('input'); - form.$buttons.find('.o_form_button_save').click(); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.fields.editInput(form.$('input'), '1234567890'); + testUtils.form.clickSave(form); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('.o_field_widget').val(), '1,234,567,890', 'Integer value must be formatted if input type isn\'t number.'); @@ -3835,15 +3834,15 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('.o_field_widget').first().text(), '09:06', 'The formatted time value should be displayed properly.'); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('input').val(), '09:06', 'The value should be rendered correctly in the input.'); - form.$('input').val('-11:48').trigger('input'); + testUtils.fields.editInput(form.$('input'), '-11:48'); assert.strictEqual(form.$('input').val(), '-11:48', 'The new value should be displayed properly in the input.'); - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_widget').first().text(), '-11:48', 'The new value should be saved and displayed properly.'); @@ -3877,13 +3876,13 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('.o_field_widget').first().text(), '4.55', // 9.1 / 0.5 'The formatted value should be displayed properly.'); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('input').val(), '4.55', 'The value should be rendered correctly in the input.'); - form.$('input').val('2.3').trigger('input'); + testUtils.fields.editInput(form.$('input'), '2.3'); - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_widget').first().text(), '2.30', 'The new value should be saved and displayed properly.'); @@ -3916,17 +3915,17 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('.o_field_widget').first().text(), '0.056', 'The formatted time value should be displayed properly.'); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('button.o_field_float_toggle').text(), '0.056', 'The value should be rendered correctly on the button.'); - form.$('button.o_field_float_toggle').click(); // clicking will make the next value 1, since 0 was the closest of 0.056 + testUtils.dom.click(form.$('button.o_field_float_toggle')); assert.strictEqual(form.$('button.o_field_float_toggle').text(), '1.000', 'The value should be rendered correctly on the button.'); - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_widget').first().text(), '1.000', 'The new value should be saved and displayed properly.'); @@ -3966,17 +3965,17 @@ QUnit.module('basic_fields', { "value should be displayed properly"); // switch to edit mode and check the result - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('input[type="text"].o_field_widget').length, 1, + testUtils.form.clickEdit(form); + assert.containsOnce(form, 'input[type="text"].o_field_widget', "should have an input for the phone field"); assert.strictEqual(form.$('input[type="text"].o_field_widget').val(), 'yop', "input should contain field value in edit mode"); // change value in edit mode - form.$('input[type="text"].o_field_widget').val('new').trigger('input'); + testUtils.fields.editInput(form.$('input[type="text"].o_field_widget'), 'new'); // save - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('a.o_field_widget.o_form_uri').text(), 'new', "new value should be displayed properly"); @@ -4003,24 +4002,24 @@ QUnit.module('basic_fields', { assert.strictEqual(list.$('tbody td:not(.o_list_record_selector)').first().text(), 'yop', "value should be displayed properly"); - assert.strictEqual(list.$('a.o_field_widget.o_form_uri').length, 5, + assert.containsN(list, 'a.o_field_widget.o_form_uri', 5, "should have the correct classnames"); // Edit a line and check the result var $cell = list.$('tbody td:not(.o_list_record_selector)').first(); - $cell.click(); - assert.ok($cell.parent().hasClass('o_selected_row'), 'should be set as edit mode'); + testUtils.dom.click($cell); + assert.hasClass($cell.parent(),'o_selected_row', 'should be set as edit mode'); assert.strictEqual($cell.find('input').val(), 'yop', 'should have the corect value in internal input'); - $cell.find('input').val('new').trigger('input'); + testUtils.fields.editInput($cell.find('input'), 'new'); // save - list.$buttons.find('.o_list_button_save').click(); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); $cell = list.$('tbody td:not(.o_list_record_selector)').first(); - assert.ok(!$cell.parent().hasClass('o_selected_row'), 'should not be in edit mode anymore'); + assert.doesNotHaveClass($cell.parent(), 'o_selected_row', 'should not be in edit mode anymore'); assert.strictEqual(list.$('tbody td:not(.o_list_record_selector)').first().text(), 'new', "value should be properly updated"); - assert.strictEqual(list.$('a.o_field_widget.o_form_uri').length, 5, + assert.containsN(list, 'a.o_field_widget.o_form_uri', 5, "should still have links with correct classes"); list.destroy(); @@ -4043,7 +4042,7 @@ QUnit.module('basic_fields', { '</form>', }); - form.$('input[name=display_name]').click(); + testUtils.dom.click(form.$('input[name=display_name]')); assert.strictEqual(form.$('input[name="display_name"]')[0], document.activeElement, "display_name should be focused"); form.$('input[name="display_name"]').trigger($.Event('keydown', {which: $.ui.keyCode.TAB})); @@ -4123,7 +4122,7 @@ QUnit.module('basic_fields', { // occurs in a setTimeout after 200ms so it's not trivial to test it here. // switch to edit mode and check the result - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('.o_field_widget.o_priority').find('a.o_priority_star').length, 2, "should still have two stars"); assert.strictEqual(form.$('.o_field_widget.o_priority').find('a.o_priority_star.fa-star').length, 1, @@ -4132,7 +4131,7 @@ QUnit.module('basic_fields', { "should still have one empty star since the value is the second value"); // save - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_widget.o_priority').find('a.o_priority_star').length, 2, "should still have two stars"); assert.strictEqual(form.$('.o_field_widget.o_priority').find('a.o_priority_star.fa-star').length, 1, @@ -4141,7 +4140,7 @@ QUnit.module('basic_fields', { "should still have one empty star since the value is the second value"); // switch to edit mode to check that the new value was properly written - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); assert.strictEqual(form.$('.o_field_widget.o_priority').find('a.o_priority_star').length, 2, "should still have two stars"); assert.strictEqual(form.$('.o_field_widget.o_priority').find('a.o_priority_star.fa-star').length, 1, @@ -4150,7 +4149,7 @@ QUnit.module('basic_fields', { "should still have one empty star since the value is the second value"); // click on the second star in edit mode - form.$('.o_field_widget.o_priority a.o_priority_star.fa-star-o').last().click(); + testUtils.dom.click(form.$('.o_field_widget.o_priority a.o_priority_star.fa-star-o').last()); assert.strictEqual(form.$('.o_field_widget.o_priority').find('a.o_priority_star').length, 2, "should still have two stars"); @@ -4160,7 +4159,7 @@ QUnit.module('basic_fields', { "should now have no empty star since the value is the third value"); // save - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); assert.strictEqual(form.$('.o_field_widget.o_priority').find('a.o_priority_star').length, 2, "should still have two stars"); assert.strictEqual(form.$('.o_field_widget.o_priority').find('a.o_priority_star.fa-star').length, 2, @@ -4195,7 +4194,7 @@ QUnit.module('basic_fields', { // switch to edit mode and check the result var $cell = list.$('tbody td:not(.o_list_record_selector)').first(); - $cell.click(); + testUtils.dom.click($cell); assert.strictEqual(list.$('.o_data_row').first().find('.o_priority a.o_priority_star').length, 2, "should have two stars for representing each possible value: no star, one star and two stars"); assert.strictEqual(list.$('.o_data_row').first().find('.o_priority a.o_priority_star.fa-star').length, 1, @@ -4204,7 +4203,7 @@ QUnit.module('basic_fields', { "should have one empty star since the value is the second value"); // save - list.$buttons.find('.o_list_button_save').click(); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); assert.strictEqual(list.$('.o_data_row').first().find('.o_priority a.o_priority_star').length, 2, "should have two stars for representing each possible value: no star, one star and two stars"); assert.strictEqual(list.$('.o_data_row').first().find('.o_priority a.o_priority_star.fa-star').length, 1, @@ -4222,7 +4221,7 @@ QUnit.module('basic_fields', { "should temporary have no empty star since we are hovering the third value"); // click on the first star in readonly mode - list.$('.o_priority a.o_priority_star.fa-star').first().click(); + testUtils.dom.click(list.$('.o_priority a.o_priority_star.fa-star').first()); assert.strictEqual(list.$('.o_data_row').first().find('.o_priority a.o_priority_star').length, 2, "should still have two stars"); @@ -4233,7 +4232,7 @@ QUnit.module('basic_fields', { // re-enter edit mode to force re-rendering the widget to check if the value was correctly saved $cell = list.$('tbody td:not(.o_list_record_selector)').first(); - $cell.click(); + testUtils.dom.click($cell); assert.strictEqual(list.$('.o_data_row').first().find('.o_priority a.o_priority_star').length, 2, "should still have two stars"); @@ -4243,7 +4242,7 @@ QUnit.module('basic_fields', { "should now have two empty stars since the value is the first value"); // Click on second star in edit mode - list.$('.o_priority a.o_priority_star.fa-star-o').last().click(); + testUtils.dom.click(list.$('.o_priority a.o_priority_star.fa-star-o').last()); assert.strictEqual(list.$('.o_data_row').last().find('.o_priority a.o_priority_star').length, 2, "should still have two stars"); @@ -4253,7 +4252,7 @@ QUnit.module('basic_fields', { "should now have no empty star since the value is the third value"); // save - list.$buttons.find('.o_list_button_save').click(); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); assert.strictEqual(list.$('.o_data_row').last().find('.o_priority a.o_priority_star').length, 2, "should still have two stars"); assert.strictEqual(list.$('.o_data_row').last().find('.o_priority a.o_priority_star.fa-star').length, 2, @@ -4287,65 +4286,65 @@ QUnit.module('basic_fields', { }, }); - assert.strictEqual(form.$('.o_field_widget.o_selection > a span.o_status.o_status_red').length, 1, + assert.containsOnce(form, '.o_field_widget.o_selection > a span.o_status.o_status_red', "should have one red status since selection is the second, blocked state"); - assert.strictEqual(form.$('.o_field_widget.o_selection > a span.o_status.o_status_green').length, 0, + assert.containsNone(form, '.o_field_widget.o_selection > a span.o_status.o_status_green', "should not have one green status since selection is the second, blocked state"); - assert.strictEqual(form.$('.dropdown-menu.state:visible').length, 0, + assert.containsNone(form, '.dropdown-menu.state:visible', "there should not be a dropdown"); // Click on the status button to make the dropdown appear - form.$('.o_field_widget.o_selection .o_status').first().click(); - assert.strictEqual(form.$('.dropdown-menu.state:visible').length, 1, + testUtils.dom.click(form.$('.o_field_widget.o_selection .o_status').first()); + assert.containsOnce(form, '.dropdown-menu.state:visible', "there should be a dropdown"); - assert.strictEqual(form.$('.dropdown-menu.state:visible .dropdown-item').length, 2, + assert.containsN(form, '.dropdown-menu.state:visible .dropdown-item', 2, "there should be two options in the dropdown"); // Click on the first option, "Normal" - form.$('.dropdown-menu.state:visible .dropdown-item').first().click(); - assert.strictEqual(form.$('.dropdown-menu.state:visible').length, 0, + testUtils.dom.click(form.$('.dropdown-menu.state:visible .dropdown-item').first()); + assert.containsNone(form, '.dropdown-menu.state:visible', "there should not be a dropdown anymore"); - assert.strictEqual(form.$('.o_field_widget.o_selection > a span.o_status.o_status_red').length, 0, + assert.containsNone(form, '.o_field_widget.o_selection > a span.o_status.o_status_red', "should not have one red status since selection is the first, normal state"); - assert.strictEqual(form.$('.o_field_widget.o_selection > a span.o_status.o_status_green').length, 0, + assert.containsNone(form, '.o_field_widget.o_selection > a span.o_status.o_status_green', "should not have one green status since selection is the first, normal state"); - assert.strictEqual(form.$('.o_field_widget.o_selection > a span.o_status').length, 1, + assert.containsOnce(form, '.o_field_widget.o_selection > a span.o_status', "should have one grey status since selection is the first, normal state"); // switch to edit mode and check the result - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('.dropdown-menu.state:visible').length, 0, + testUtils.form.clickEdit(form); + assert.containsNone(form, '.dropdown-menu.state:visible', "there should still not be a dropdown"); - assert.strictEqual(form.$('.o_field_widget.o_selection > a span.o_status.o_status_red').length, 0, + assert.containsNone(form, '.o_field_widget.o_selection > a span.o_status.o_status_red', "should still not have one red status since selection is the first, normal state"); - assert.strictEqual(form.$('.o_field_widget.o_selection > a span.o_status.o_status_green').length, 0, + assert.containsNone(form, '.o_field_widget.o_selection > a span.o_status.o_status_green', "should still not have one green status since selection is the first, normal state"); - assert.strictEqual(form.$('.o_field_widget.o_selection > a span.o_status').length, 1, + assert.containsOnce(form, '.o_field_widget.o_selection > a span.o_status', "should still have one grey status since selection is the first, normal state"); // Click on the status button to make the dropdown appear - form.$('.o_field_widget.o_selection .o_status').first().click(); - assert.strictEqual(form.$('.dropdown-menu.state:visible').length, 1, + testUtils.dom.click(form.$('.o_field_widget.o_selection .o_status').first()); + assert.containsOnce(form, '.dropdown-menu.state:visible', "there should be a dropdown"); - assert.strictEqual(form.$('.dropdown-menu.state:visible .dropdown-item').length, 2, + assert.containsN(form, '.dropdown-menu.state:visible .dropdown-item', 2, "there should be two options in the dropdown"); // Click on the last option, "Done" - form.$('.dropdown-menu.state:visible .dropdown-item').last().click(); - assert.strictEqual(form.$('.dropdown-menu.state:visible').length, 0, + testUtils.dom.click(form.$('.dropdown-menu.state:visible .dropdown-item').last()); + assert.containsNone(form, '.dropdown-menu.state:visible', "there should not be a dropdown anymore"); - assert.strictEqual(form.$('.o_field_widget.o_selection > a span.o_status.o_status_red').length, 0, + assert.containsNone(form, '.o_field_widget.o_selection > a span.o_status.o_status_red', "should not have one red status since selection is the third, done state"); - assert.strictEqual(form.$('.o_field_widget.o_selection > a span.o_status.o_status_green').length, 1, + assert.containsOnce(form, '.o_field_widget.o_selection > a span.o_status.o_status_green', "should have one green status since selection is the third, done state"); // save - form.$buttons.find('.o_form_button_save').click(); - assert.strictEqual(form.$('.dropdown-menu.state:visible').length, 0, + testUtils.form.clickSave(form); + assert.containsNone(form, '.dropdown-menu.state:visible', "there should still not be a dropdown anymore"); - assert.strictEqual(form.$('.o_field_widget.o_selection > a span.o_status.o_status_red').length, 0, + assert.containsNone(form, '.o_field_widget.o_selection > a span.o_status.o_status_red', "should still not have one red status since selection is the third, done state"); - assert.strictEqual(form.$('.o_field_widget.o_selection > a span.o_status.o_status_green').length, 1, + assert.containsOnce(form, '.o_field_widget.o_selection > a span.o_status.o_status_green', "should still have one green status since selection is the third, done state"); form.destroy(); @@ -4364,97 +4363,97 @@ QUnit.module('basic_fields', { '</tree>', }); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status').length, 5, + assert.containsN(list, '.o_state_selection_cell .o_selection > a span.o_status', 5, "should have five status selection widgets"); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status.o_status_red').length, 1, + assert.containsOnce(list, '.o_state_selection_cell .o_selection > a span.o_status.o_status_red', "should have one red status"); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status.o_status_green').length, 1, + assert.containsOnce(list, '.o_state_selection_cell .o_selection > a span.o_status.o_status_green', "should have one green status"); - assert.strictEqual(list.$('.dropdown-menu.state:visible').length, 0, + assert.containsNone(list, '.dropdown-menu.state:visible', "there should not be a dropdown"); // Click on the status button to make the dropdown appear var $cell = list.$('tbody td.o_state_selection_cell').first(); - list.$('.o_state_selection_cell .o_selection > a span.o_status').first().click(); - assert.ok(!$cell.parent().hasClass('o_selected_row'), + testUtils.dom.click(list.$('.o_state_selection_cell .o_selection > a span.o_status').first()); + assert.doesNotHaveClass($cell.parent(), 'o_selected_row', 'should not be in edit mode since we clicked on the state selection widget'); - assert.strictEqual(list.$('.dropdown-menu.state:visible').length, 1, + assert.containsOnce(list, '.dropdown-menu.state:visible', "there should be a dropdown"); - assert.strictEqual(list.$('.dropdown-menu.state:visible .dropdown-item').length, 2, + assert.containsN(list, '.dropdown-menu.state:visible .dropdown-item', 2, "there should be two options in the dropdown"); // Click on the first option, "Normal" - list.$('.dropdown-menu.state:visible .dropdown-item').first().click(); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status').length, 5, + testUtils.dom.click(list.$('.dropdown-menu.state:visible .dropdown-item').first()); + assert.containsN(list, '.o_state_selection_cell .o_selection > a span.o_status', 5, "should still have five status selection widgets"); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status.o_status_red').length, 0, + assert.containsNone(list, '.o_state_selection_cell .o_selection > a span.o_status.o_status_red', "should now have no red status"); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status.o_status_green').length, 1, + assert.containsOnce(list, '.o_state_selection_cell .o_selection > a span.o_status.o_status_green', "should still have one green status"); - assert.strictEqual(list.$('.dropdown-menu.state:visible').length, 0, + assert.containsNone(list, '.dropdown-menu.state:visible', "there should not be a dropdown"); // switch to edit mode and check the result $cell = list.$('tbody td.o_state_selection_cell').first(); - $cell.click(); - assert.ok($cell.parent().hasClass('o_selected_row'), + testUtils.dom.click($cell); + assert.hasClass($cell.parent(),'o_selected_row', 'should now be in edit mode'); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status').length, 5, + assert.containsN(list, '.o_state_selection_cell .o_selection > a span.o_status', 5, "should still have five status selection widgets"); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status.o_status_red').length, 0, + assert.containsNone(list, '.o_state_selection_cell .o_selection > a span.o_status.o_status_red', "should now have no red status"); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status.o_status_green').length, 1, + assert.containsOnce(list, '.o_state_selection_cell .o_selection > a span.o_status.o_status_green', "should still have one green status"); - assert.strictEqual(list.$('.dropdown-menu.state:visible').length, 0, + assert.containsNone(list, '.dropdown-menu.state:visible', "there should not be a dropdown"); // Click on the status button to make the dropdown appear - list.$('.o_state_selection_cell .o_selection > a span.o_status').first().click(); - assert.strictEqual(list.$('.dropdown-menu.state:visible').length, 1, + testUtils.dom.click(list.$('.o_state_selection_cell .o_selection > a span.o_status').first()); + assert.containsOnce(list, '.dropdown-menu.state:visible', "there should be a dropdown"); - assert.strictEqual(list.$('.dropdown-menu.state:visible .dropdown-item').length, 2, + assert.containsN(list, '.dropdown-menu.state:visible .dropdown-item', 2, "there should be two options in the dropdown"); // Click on another row - var $firstCell = list.$('tbody td.o_state_selection_cell').first(); var $lastCell = list.$('tbody td.o_state_selection_cell').last(); - $lastCell.click(); - assert.strictEqual(list.$('.dropdown-menu.state:visible').length, 0, + testUtils.dom.click($lastCell); + assert.containsNone(list, '.dropdown-menu.state:visible', "there should not be a dropdown anymore"); - assert.ok(!$firstCell.parent().hasClass('o_selected_row'), + var $firstCell = list.$('tbody td.o_state_selection_cell').first(); + assert.doesNotHaveClass($firstCell.parent(), 'o_selected_row', 'first row should not be in edit mode anymore'); - assert.ok($lastCell.parent().hasClass('o_selected_row'), + assert.hasClass($lastCell.parent(),'o_selected_row', 'last row should be in edit mode'); // Click on the last status button to make the dropdown appear - list.$('.o_state_selection_cell .o_selection > a span.o_status').last().click(); - assert.strictEqual(list.$('.dropdown-menu.state:visible').length, 1, + testUtils.dom.click(list.$('.o_state_selection_cell .o_selection > a span.o_status').last()); + assert.containsOnce(list, '.dropdown-menu.state:visible', "there should be a dropdown"); - assert.strictEqual(list.$('.dropdown-menu.state:visible .dropdown-item').length, 2, + assert.containsN(list, '.dropdown-menu.state:visible .dropdown-item', 2, "there should be two options in the dropdown"); // Click on the last option, "Done" - list.$('.dropdown-menu.state:visible .dropdown-item').last().click(); - assert.strictEqual(list.$('.dropdown-menu.state:visible').length, 0, + testUtils.dom.click(list.$('.dropdown-menu.state:visible .dropdown-item').last()); + assert.containsNone(list, '.dropdown-menu.state:visible', "there should not be a dropdown anymore"); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status').length, 5, + assert.containsN(list, '.o_state_selection_cell .o_selection > a span.o_status', 5, "should still have five status selection widgets"); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status.o_status_red').length, 0, + assert.containsNone(list, '.o_state_selection_cell .o_selection > a span.o_status.o_status_red', "should still have no red status"); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status.o_status_green').length, 2, + assert.containsN(list, '.o_state_selection_cell .o_selection > a span.o_status.o_status_green', 2, "should now have two green status"); - assert.strictEqual(list.$('.dropdown-menu.state:visible').length, 0, + assert.containsNone(list, '.dropdown-menu.state:visible', "there should not be a dropdown"); // save - list.$buttons.find('.o_list_button_save').click(); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status').length, 5, + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); + assert.containsN(list, '.o_state_selection_cell .o_selection > a span.o_status', 5, "should have five status selection widgets"); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status.o_status_red').length, 0, + assert.containsNone(list, '.o_state_selection_cell .o_selection > a span.o_status.o_status_red', "should have no red status"); - assert.strictEqual(list.$('.o_state_selection_cell .o_selection > a span.o_status.o_status_green').length, 2, + assert.containsN(list, '.o_state_selection_cell .o_selection > a span.o_status.o_status_green', 2, "should have two green status"); - assert.strictEqual(list.$('.dropdown-menu.state:visible').length, 0, + assert.containsNone(list, '.dropdown-menu.state:visible', "there should not be a dropdown"); list.destroy(); @@ -4482,14 +4481,14 @@ QUnit.module('basic_fields', { domain: [['id', '=', 1]], }); - assert.strictEqual(kanban.$('.o_kanban_record .o_field_widget.o_favorite > a i.fa.fa-star').length, 1, + assert.containsOnce(kanban, '.o_kanban_record .o_field_widget.o_favorite > a i.fa.fa-star', 'should be favorite'); assert.strictEqual(kanban.$('.o_kanban_record .o_field_widget.o_favorite > a').text(), ' Remove from Favorites', 'the label should say "Remove from Favorites"'); // click on favorite - kanban.$('.o_field_widget.o_favorite').click(); - assert.strictEqual(kanban.$('.o_kanban_record .o_field_widget.o_favorite > a i.fa.fa-star').length, 0, + testUtils.dom.click(kanban.$('.o_field_widget.o_favorite')); + assert.containsNone(kanban, '.o_kanban_record .o_field_widget.o_favorite > a i.fa.fa-star', 'should not be favorite'); assert.strictEqual(kanban.$('.o_kanban_record .o_field_widget.o_favorite > a').text(), ' Add to Favorites', 'the label should say "Add to Favorites"'); @@ -4514,35 +4513,35 @@ QUnit.module('basic_fields', { res_id: 1, }); - assert.strictEqual(form.$('.o_field_widget.o_favorite > a i.fa.fa-star').length, 1, + assert.containsOnce(form, '.o_field_widget.o_favorite > a i.fa.fa-star', 'should be favorite'); assert.strictEqual(form.$('.o_field_widget.o_favorite > a').text(), ' Remove from Favorites', 'the label should say "Remove from Favorites"'); // click on favorite - form.$('.o_field_widget.o_favorite').click(); - assert.strictEqual(form.$('.o_field_widget.o_favorite > a i.fa.fa-star').length, 0, + testUtils.dom.click(form.$('.o_field_widget.o_favorite')); + assert.containsNone(form, '.o_field_widget.o_favorite > a i.fa.fa-star', 'should not be favorite'); assert.strictEqual(form.$('.o_field_widget.o_favorite > a').text(), ' Add to Favorites', 'the label should say "Add to Favorites"'); // switch to edit mode - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('.o_field_widget.o_favorite > a i.fa.fa-star-o').length, 1, + testUtils.form.clickEdit(form); + assert.containsOnce(form, '.o_field_widget.o_favorite > a i.fa.fa-star-o', 'should not be favorite'); assert.strictEqual(form.$('.o_field_widget.o_favorite > a').text(), ' Add to Favorites', 'the label should say "Add to Favorites"'); // click on favorite - form.$('.o_field_widget.o_favorite').click(); - assert.strictEqual(form.$('.o_field_widget.o_favorite > a i.fa.fa-star').length, 1, + testUtils.dom.click(form.$('.o_field_widget.o_favorite')); + assert.containsOnce(form, '.o_field_widget.o_favorite > a i.fa.fa-star', 'should be favorite'); assert.strictEqual(form.$('.o_field_widget.o_favorite > a').text(), ' Remove from Favorites', 'the label should say "Remove from Favorites"'); // save - form.$buttons.find('.o_form_button_save').click(); - assert.strictEqual(form.$('.o_field_widget.o_favorite > a i.fa.fa-star').length, 1, + testUtils.form.clickSave(form); + assert.containsOnce(form, '.o_field_widget.o_favorite > a i.fa.fa-star', 'should be favorite'); assert.strictEqual(form.$('.o_field_widget.o_favorite > a').text(), ' Remove from Favorites', 'the label should say "Remove from Favorites"'); @@ -4562,22 +4561,22 @@ QUnit.module('basic_fields', { '</tree>', }); - assert.strictEqual(list.$('.o_data_row:first .o_field_widget.o_favorite > a i.fa.fa-star').length, 1, + assert.containsOnce(list, '.o_data_row:first .o_field_widget.o_favorite > a i.fa.fa-star', 'should be favorite'); // switch to edit mode - list.$('tbody td:not(.o_list_record_selector)').first().click(); - assert.strictEqual(list.$('.o_data_row:first .o_field_widget.o_favorite > a i.fa.fa-star').length, 1, + testUtils.dom.click(list.$('tbody td:not(.o_list_record_selector)').first()); + assert.containsOnce(list, '.o_data_row:first .o_field_widget.o_favorite > a i.fa.fa-star', 'should be favorite'); // click on favorite - list.$('.o_data_row:first .o_field_widget.o_favorite').click(); - assert.strictEqual(list.$('.o_data_row:first .o_field_widget.o_favorite > a i.fa.fa-star').length, 0, + testUtils.dom.click(list.$('.o_data_row:first .o_field_widget.o_favorite')); + assert.containsNone(list, '.o_data_row:first .o_field_widget.o_favorite > a i.fa.fa-star', 'should not be favorite'); // save - list.$buttons.find('.o_list_button_save').click(); - assert.strictEqual(list.$('.o_data_row:first .o_field_widget.o_favorite > a i.fa.fa-star-o').length, 1, + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); + assert.containsOnce(list, '.o_data_row:first .o_field_widget.o_favorite > a i.fa.fa-star-o', 'should not be favorite'); list.destroy(); @@ -4604,33 +4603,33 @@ QUnit.module('basic_fields', { res_id: 1, }); - assert.strictEqual(form.$('.o_field_widget.badge.badge-warning').length, 1, + assert.containsOnce(form, '.o_field_widget.badge.badge-warning', "should have a warning status label since selection is the second, blocked state"); - assert.strictEqual(form.$('.o_field_widget.badge.badge-secondary').length, 0, + assert.containsNone(form, '.o_field_widget.badge.badge-secondary', "should not have a default status since selection is the second, blocked state"); - assert.strictEqual(form.$('.o_field_widget.badge.badge-success').length, 0, + assert.containsNone(form, '.o_field_widget.badge.badge-success', "should not have a success status since selection is the second, blocked state"); assert.strictEqual(form.$('.o_field_widget.badge.badge-warning').text(), 'Blocked', "the label should say 'Blocked' since this is the label value for that state"); // // switch to edit mode and check the result - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('.o_field_widget.badge.badge-warning').length, 1, + testUtils.form.clickEdit(form); + assert.containsOnce(form, '.o_field_widget.badge.badge-warning', "should have a warning status label since selection is the second, blocked state"); - assert.strictEqual(form.$('.o_field_widget.badge.badge-secondary').length, 0, + assert.containsNone(form, '.o_field_widget.badge.badge-secondary', "should not have a default status since selection is the second, blocked state"); - assert.strictEqual(form.$('.o_field_widget.badge.badge-success').length, 0, + assert.containsNone(form, '.o_field_widget.badge.badge-success', "should not have a success status since selection is the second, blocked state"); assert.strictEqual(form.$('.o_field_widget.badge.badge-warning').text(), 'Blocked', "the label should say 'Blocked' since this is the label value for that state"); // save - form.$buttons.find('.o_form_button_save').click(); - assert.strictEqual(form.$('.o_field_widget.badge.badge-warning').length, 1, + testUtils.form.clickSave(form); + assert.containsOnce(form, '.o_field_widget.badge.badge-warning', "should have a warning status label since selection is the second, blocked state"); - assert.strictEqual(form.$('.o_field_widget.badge.badge-secondary').length, 0, + assert.containsNone(form, '.o_field_widget.badge.badge-secondary', "should not have a default status since selection is the second, blocked state"); - assert.strictEqual(form.$('.o_field_widget.badge.badge-success').length, 0, + assert.containsNone(form, '.o_field_widget.badge.badge-success', "should not have a success status since selection is the second, blocked state"); assert.strictEqual(form.$('.o_field_widget.badge.badge-warning').text(), 'Blocked', "the label should say 'Blocked' since this is the label value for that state"); @@ -4654,49 +4653,49 @@ QUnit.module('basic_fields', { assert.strictEqual(list.$('.o_field_widget.badge:not(:empty)').length, 3, "should have three visible status labels"); - assert.strictEqual(list.$('.o_field_widget.badge.badge-warning').length, 1, + assert.containsOnce(list, '.o_field_widget.badge.badge-warning', "should have one warning status label"); assert.strictEqual(list.$('.o_field_widget.badge.badge-warning').text(), 'Blocked', "the warning label should read 'Blocked'"); - assert.strictEqual(list.$('.o_field_widget.badge.badge-secondary').length, 1, + assert.containsOnce(list, '.o_field_widget.badge.badge-secondary', "should have one default status label"); assert.strictEqual(list.$('.o_field_widget.badge.badge-secondary').text(), 'Normal', "the default label should read 'Normal'"); - assert.strictEqual(list.$('.o_field_widget.badge.badge-success').length, 1, + assert.containsOnce(list, '.o_field_widget.badge.badge-success', "should have one success status label"); assert.strictEqual(list.$('.o_field_widget.badge.badge-success').text(), 'Done', "the success label should read 'Done'"); // switch to edit mode and check the result - list.$('tbody td:not(.o_list_record_selector)').first().click(); + testUtils.dom.click(list.$('tbody td:not(.o_list_record_selector)').first()); assert.strictEqual(list.$('.o_field_widget.badge:not(:empty)').length, 3, "should have three visible status labels"); - assert.strictEqual(list.$('.o_field_widget.badge.badge-warning').length, 1, + assert.containsOnce(list, '.o_field_widget.badge.badge-warning', "should have one warning status label"); assert.strictEqual(list.$('.o_field_widget.badge.badge-warning').text(), 'Blocked', "the warning label should read 'Blocked'"); - assert.strictEqual(list.$('.o_field_widget.badge.badge-secondary').length, 1, + assert.containsOnce(list, '.o_field_widget.badge.badge-secondary', "should have one default status label"); assert.strictEqual(list.$('.o_field_widget.badge.badge-secondary').text(), 'Normal', "the default label should read 'Normal'"); - assert.strictEqual(list.$('.o_field_widget.badge.badge-success').length, 1, + assert.containsOnce(list, '.o_field_widget.badge.badge-success', "should have one success status label"); assert.strictEqual(list.$('.o_field_widget.badge.badge-success').text(), 'Done', "the success label should read 'Done'"); // save and check the result - list.$buttons.find('.o_list_button_save').click(); + testUtils.dom.click(list.$buttons.find('.o_list_button_save')); assert.strictEqual(list.$('.o_field_widget.badge:not(:empty)').length, 3, "should have three visible status labels"); - assert.strictEqual(list.$('.o_field_widget.badge.badge-warning').length, 1, + assert.containsOnce(list, '.o_field_widget.badge.badge-warning', "should have one warning status label"); assert.strictEqual(list.$('.o_field_widget.badge.badge-warning').text(), 'Blocked', "the warning label should read 'Blocked'"); - assert.strictEqual(list.$('.o_field_widget.badge.badge-secondary').length, 1, + assert.containsOnce(list, '.o_field_widget.badge.badge-secondary', "should have one default status label"); assert.strictEqual(list.$('.o_field_widget.badge.badge-secondary').text(), 'Normal', "the default label should read 'Normal'"); - assert.strictEqual(list.$('.o_field_widget.badge.badge-success').length, 1, + assert.containsOnce(list, '.o_field_widget.badge.badge-success', "should have one success status label"); assert.strictEqual(list.$('.o_field_widget.badge.badge-success').text(), 'Done', "the success label should read 'Done'"); @@ -4763,7 +4762,7 @@ QUnit.module('basic_fields', { res_id: 1, }); - assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info').length, 1, + assert.containsOnce(form, '.oe_stat_button .o_field_widget.o_stat_info', "should have one stat button"); assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info .o_stat_value').text(), '10', "should have 10 as value"); @@ -4771,8 +4770,8 @@ QUnit.module('basic_fields', { 'int_field', "should have 'int_field' as text"); // switch to edit mode and check the result - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info').length, 1, + testUtils.form.clickEdit(form); + assert.containsOnce(form, '.oe_stat_button .o_field_widget.o_stat_info', "should still have one stat button"); assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info .o_stat_value').text(), '10', "should still have 10 as value"); @@ -4780,8 +4779,8 @@ QUnit.module('basic_fields', { 'int_field', "should have 'int_field' as text"); // save - form.$buttons.find('.o_form_button_save').click(); - assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info').length, 1, + testUtils.form.clickSave(form); + assert.containsOnce(form, '.oe_stat_button .o_field_widget.o_stat_info', "should have one stat button"); assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info .o_stat_value').text(), '10', "should have 10 as value"); @@ -4815,7 +4814,7 @@ QUnit.module('basic_fields', { res_id: 1, }); - assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info').length, 1, + assert.containsOnce(form, '.oe_stat_button .o_field_widget.o_stat_info', "should have one stat button"); assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info .o_stat_value').text(), '10', "should have 10 as value"); @@ -4823,8 +4822,8 @@ QUnit.module('basic_fields', { 'yop', "should have 'yop' as text, since it is the value of field foo"); // switch to edit mode and check the result - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info').length, 1, + testUtils.form.clickEdit(form); + assert.containsOnce(form, '.oe_stat_button .o_field_widget.o_stat_info', "should still have one stat button"); assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info .o_stat_value').text(), '10', "should still have 10 as value"); @@ -4832,8 +4831,8 @@ QUnit.module('basic_fields', { 'yop', "should have 'yop' as text, since it is the value of field foo"); // save - form.$buttons.find('.o_form_button_save').click(); - assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info').length, 1, + testUtils.form.clickSave(form); + assert.containsOnce(form, '.oe_stat_button .o_field_widget.o_stat_info', "should have one stat button"); assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info .o_stat_value').text(), '10', "should have 10 as value"); @@ -4866,7 +4865,7 @@ QUnit.module('basic_fields', { res_id: 1, }); - assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info').length, 1, + assert.containsOnce(form, '.oe_stat_button .o_field_widget.o_stat_info', "should have one stat button"); assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info .o_stat_value').text(), '10', "should have 10 as value"); @@ -4874,8 +4873,8 @@ QUnit.module('basic_fields', { '', "should not have any label"); // switch to edit mode and check the result - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info').length, 1, + testUtils.form.clickEdit(form); + assert.containsOnce(form, '.oe_stat_button .o_field_widget.o_stat_info', "should still have one stat button"); assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info .o_stat_value').text(), '10', "should still have 10 as value"); @@ -4883,8 +4882,8 @@ QUnit.module('basic_fields', { '', "should not have any label"); // save - form.$buttons.find('.o_form_button_save').click(); - assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info').length, 1, + testUtils.form.clickSave(form); + assert.containsOnce(form, '.oe_stat_button .o_field_widget.o_stat_info', "should have one stat button"); assert.strictEqual(form.$('.oe_stat_button .o_field_widget.o_stat_info .o_stat_value').text(), '10', "should have 10 as value"); @@ -4914,7 +4913,7 @@ QUnit.module('basic_fields', { res_id: 1, }); - assert.strictEqual(form.$('.o_field_percent_pie.o_field_widget .o_pie').length, 1, + assert.containsOnce(form, '.o_field_percent_pie.o_field_widget .o_pie', "should have a pie chart"); assert.strictEqual(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_pie_value').text(), '10%', "should have 10% as pie value since int_field=10"); @@ -4924,8 +4923,8 @@ QUnit.module('basic_fields', { 'transform: rotate(36deg);'), "right mask should be rotated from 360*(10/100) = 36 degrees"); // switch to edit mode and check the result - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('.o_field_percent_pie.o_field_widget .o_pie').length, 1, + testUtils.form.clickEdit(form); + assert.containsOnce(form, '.o_field_percent_pie.o_field_widget .o_pie', "should have a pie chart"); assert.strictEqual(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_pie_value').text(), '10%', "should have 10% as pie value since int_field=10"); @@ -4935,8 +4934,8 @@ QUnit.module('basic_fields', { 'transform: rotate(36deg);'), "right mask should be rotated from 360*(10/100) = 36 degrees"); // save - form.$buttons.find('.o_form_button_save').click(); - assert.strictEqual(form.$('.o_field_percent_pie.o_field_widget .o_pie').length, 1, + testUtils.form.clickSave(form); + assert.containsOnce(form, '.o_field_percent_pie.o_field_widget .o_pie', "should have a pie chart"); assert.strictEqual(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_pie_value').text(), '10%', "should have 10% as pie value since int_field=10"); @@ -4965,35 +4964,35 @@ QUnit.module('basic_fields', { res_id: 3, }); - assert.strictEqual(form.$('.o_field_percent_pie.o_field_widget .o_pie').length, 1, + assert.containsOnce(form, '.o_field_percent_pie.o_field_widget .o_pie', "should have a pie chart"); assert.strictEqual(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_pie_value').text(), '80%', "should have 80% as pie value since int_field=80"); assert.ok(_.str.include(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_mask').first().attr('style'), 'transform: rotate(288deg);'), "left mask should be rotated from 360*(80/100) = 288 degrees"); - assert.ok(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_mask').last().hasClass('o_full'), + assert.hasClass(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_mask').last(),'o_full', "right mask should be hidden since the value > 50%"); // switch to edit mode and check the result - form.$buttons.find('.o_form_button_edit').click(); - assert.strictEqual(form.$('.o_field_percent_pie.o_field_widget .o_pie').length, 1, + testUtils.form.clickEdit(form); + assert.containsOnce(form, '.o_field_percent_pie.o_field_widget .o_pie', "should have a pie chart"); assert.strictEqual(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_pie_value').text(), '80%', "should have 80% as pie value since int_field=80"); assert.ok(_.str.include(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_mask').first().attr('style'), 'transform: rotate(288deg);'), "left mask should be rotated from 360*(80/100) = 288 degrees"); - assert.ok(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_mask').last().hasClass('o_full'), + assert.hasClass(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_mask').last(),'o_full', "right mask should be hidden since the value > 50%"); // save - form.$buttons.find('.o_form_button_save').click(); - assert.strictEqual(form.$('.o_field_percent_pie.o_field_widget .o_pie').length, 1, + testUtils.form.clickSave(form); + assert.containsOnce(form, '.o_field_percent_pie.o_field_widget .o_pie', "should have a pie chart"); assert.strictEqual(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_pie_value').text(), '80%', "should have 80% as pie value since int_field=80"); assert.ok(_.str.include(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_mask').first().attr('style'), 'transform: rotate(288deg);'), "left mask should be rotated from 360*(80/100) = 288 degrees"); - assert.ok(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_mask').last().hasClass('o_full'), + assert.hasClass(form.$('.o_field_percent_pie.o_field_widget .o_pie .o_mask').last(),'o_full', "right mask should be hidden since the value > 50%"); form.destroy(); @@ -5018,7 +5017,7 @@ QUnit.module('basic_fields', { // '</tree>', // }); // - // assert.strictEqual(list.$('.o_field_percent_pie .o_pie').length, 5, + // assert.containsN(list, '.o_field_percent_pie .o_pie', 5, // "should have five pie charts"); // assert.strictEqual(list.$('.o_field_percent_pie:first .o_pie .o_pie_value').first().text(), // '10%', "should have 10% as pie value since int_field=10"); @@ -5028,7 +5027,7 @@ QUnit.module('basic_fields', { // 'transform: rotate(36deg);', "right mask should be rotated from 360*(10/100) = 36 degrees"); // // // switch to edit mode and check the result - // list.$('tbody td:not(.o_list_record_selector)').first().click(); +// testUtils.dom.click( list.$('tbody td:not(.o_list_record_selector)').first()); // assert.strictEqual(list.$('.o_field_percent_pie:first .o_pie .o_pie_value').first().text(), // '10%', "should have 10% as pie value since int_field=10"); // assert.strictEqual(list.$('.o_field_percent_pie:first .o_pie .o_mask').first().attr('style'), @@ -5037,7 +5036,7 @@ QUnit.module('basic_fields', { // 'transform: rotate(36deg);', "right mask should be rotated from 360*(10/100) = 36 degrees"); // // // save - // list.$buttons.find('.o_list_button_save').click(); +// testUtils.dom.click( list.$buttons.find('.o_list_button_save')); // assert.strictEqual(list.$('.o_field_percent_pie:first .o_pie .o_pie_value').first().text(), // '10%', "should have 10% as pie value since int_field=10"); // assert.strictEqual(list.$('.o_field_percent_pie:first .o_pie .o_mask').first().attr('style'), @@ -5097,7 +5096,7 @@ QUnit.module('basic_fields', { '</form>', res_id: 1, }); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); // As the domain is empty, there should be a button to add the first // domain part @@ -5108,7 +5107,7 @@ QUnit.module('basic_fields', { // Clicking on the button should add the [["id", "=", "1"]] domain, so // there should be a field selector in the DOM - $domainAddFirstNodeButton.click(); + testUtils.dom.click($domainAddFirstNodeButton); var $fieldSelector = $domain.find(".o_field_selector"); assert.equal($fieldSelector.length, 1, "there should be a field selector"); @@ -5135,14 +5134,14 @@ QUnit.module('basic_fields', { // Clicking on this field should close the popover, then changing the // associated value should reveal one matched record - $colorIndex.click(); + testUtils.dom.click($colorIndex); $domain.find(".o_domain_leaf_value_input").val(2).change(); assert.equal($domain.find(".o_domain_show_selection_button").text().trim().substr(0, 2), "1 ", "changing color value to 2 should reveal only one record"); // Saving the form view should show a readonly domain containing the // "color" field - form.$buttons.find('.o_form_button_save').click(); + testUtils.form.clickSave(form); $domain = form.$(".o_field_domain"); assert.ok($domain.html().indexOf("Color index") >= 0, "field selector readonly value should now contain 'Color index'"); @@ -5171,7 +5170,7 @@ QUnit.module('basic_fields', { '</form>', res_id: 1, }); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); // As the domain is equal to [["id", "=", 1]] there should be a field // selector to change this @@ -5202,7 +5201,8 @@ QUnit.module('basic_fields', { "field selector popover should contain 'Product Name' field"); // Now change the value of the "bar" field to "partner_type" - form.$("input.o_field_widget").click().val("partner_type").trigger("input"); + testUtils.dom.click(form.$("input.o_field_widget")); + testUtils.fields.editInput(form.$("input.o_field_widget"), "partner_type"); // Refocusing the field selector input should open the popover again $fieldSelector = form.$(".o_field_selector"); @@ -5256,7 +5256,7 @@ QUnit.module('basic_fields', { "the domain being empty, there should be 5 records"); // update display_name to trigger the onchange and reset foo - form.$('.o_field_widget[name=display_name]').val('new value').trigger('input'); + testUtils.fields.editInput(form.$('.o_field_widget[name=display_name]'), 'new value'); assert.equal(form.$('.o_domain_show_selection_button').text().trim(), '1 record(s)', "the domain has changed, there should be only 1 record"); @@ -5296,7 +5296,7 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('.o_field_widget[name=foo]:not(.o_field_empty)').length, 1, "there should be a domain field, not considered empty"); - form.$buttons.find('.o_form_button_edit').click(); + testUtils.form.clickEdit(form); var $warning = form.$('.o_field_widget[name=foo] .text-warning'); assert.strictEqual($warning.length, 0, "should not display that the domain is invalid"); @@ -5332,14 +5332,14 @@ QUnit.module('basic_fields', { "selection should contain 2 records"); // open the selection - form.$(".o_domain_show_selection_button").click(); + testUtils.dom.click(form.$(".o_domain_show_selection_button")); assert.strictEqual($('.modal .o_list_view .o_data_row').length, 2, "should have open a list view with 2 records in a dialog"); // click on a record -> should not open the record // we don't actually check that it doesn't open the record because even // if it tries to, it will crash as we don't define an arch in this test - $('.modal .o_list_view .o_data_row:first .o_data_cell').click(); + testUtils.dom.click($('.modal .o_list_view .o_data_row:first .o_data_cell')); form.destroy(); }); |
