diff options
| author | Christophe Simonis <chs@odoo.com> | 2019-09-13 18:07:59 +0200 |
|---|---|---|
| committer | Christophe Simonis <chs@odoo.com> | 2019-09-13 18:07:59 +0200 |
| commit | 6c948c36bbf72dd896e0bff03aa7fbddadcbb0cd (patch) | |
| tree | f8620905c011735d8a3c340c46d1417a54a75972 /addons/web/static/tests/fields | |
| parent | 48503fcf08eac6fed12e080d4f501f9bbc8d257d (diff) | |
| parent | 197474e5b9ad43ab2d587a98136a1a809ce9a2e7 (diff) | |
[MERGE] forward port branch saas-12.5 up to 197474e5b9a
Diffstat (limited to 'addons/web/static/tests/fields')
6 files changed, 171 insertions, 220 deletions
diff --git a/addons/web/static/tests/fields/basic_fields_tests.js b/addons/web/static/tests/fields/basic_fields_tests.js index a67d4e19cbc..eca412c036a 100644 --- a/addons/web/static/tests/fields/basic_fields_tests.js +++ b/addons/web/static/tests/fields/basic_fields_tests.js @@ -1,6 +1,7 @@ odoo.define('web.basic_fields_tests', function (require) { "use strict"; +var ajax = require('web.ajax'); var basicFields = require('web.basic_fields'); var concurrency = require('web.concurrency'); var config = require('web.config'); @@ -13,7 +14,6 @@ var testUtils = require('web.test_utils'); var field_registry = require('web.field_registry'); var createView = testUtils.createView; -var createView = testUtils.createView; var DebouncedField = basicFields.DebouncedField; var JournalDashboardGraph = basicFields.JournalDashboardGraph; var _t = core._t; @@ -124,6 +124,19 @@ QUnit.module('basic_fields', { position: "after", }] }, + "ir.translation": { + fields: { + lang_code: {type: "char"}, + value: {type: "char"}, + res_id: {type: "integer"} + }, + records: [{ + id: 99, + res_id: 37, + value: '', + lang_code: 'en_US' + }] + }, }; } }, function () { @@ -1059,7 +1072,7 @@ QUnit.module('basic_fields', { }); QUnit.test('char field translatable', async function (assert) { - assert.expect(3); + assert.expect(4); this.data.partner.fields.foo.translate = true; @@ -1081,7 +1094,13 @@ QUnit.module('basic_fields', { mockRPC: function (route, args) { if (route === "/web/dataset/call_button" && args.method === 'translate_fields') { assert.deepEqual(args.args, ["partner",1,"foo"], 'should call "call_button" route'); - return Promise.resolve(); + return Promise.resolve({ + domain: [], + context: {search_default_name: 'partnes,foo'}, + }); + } + if (route === "/web/dataset/call_kw/res.lang/get_installed") { + return Promise.resolve([["en_US"], ["fr_BE"]]); } return this._super.apply(this, arguments); }, @@ -1089,10 +1108,27 @@ QUnit.module('basic_fields', { await 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"); + assert.strictEqual($button.text(), 'EN', 'the button should have as test the current language'); await testUtils.dom.click($button); + await testUtils.nextTick(); + + assert.containsOnce($(document), '.modal', 'a translate modal should be visible'); + form.destroy(); - form = await createView({ + _t.database.multi_lang = multiLang; + }); + + QUnit.test('char field translatable in create mode', async function (assert) { + assert.expect(1); + + this.data.partner.fields.foo.translate = true; + + var multiLang = _t.database.multi_lang; + _t.database.multi_lang = true; + + + var form = await createView({ View: FormView, model: 'partner', data: this.data, @@ -1104,8 +1140,8 @@ QUnit.module('basic_fields', { '</sheet>' + '</form>', }); - $button = form.$('input[type="text"].o_field_char + .o_field_translate'); - assert.strictEqual($button.length, 0, "should not have a translate button in create mode"); + var $button = form.$('input[type="text"].o_field_char + .o_field_translate'); + assert.strictEqual($button.length, 1, "should have a translate button in create mode"); form.destroy(); _t.database.multi_lang = multiLang; @@ -1716,7 +1752,13 @@ QUnit.module('basic_fields', { mockRPC: function (route, args) { if (route === "/web/dataset/call_button" && args.method === 'translate_fields') { assert.deepEqual(args.args, ["partner",1,"txt"], 'should call "call_button" route'); - return Promise.resolve(); + return Promise.resolve({ + domain: [], + context: {search_default_name: 'partnes,foo'}, + }); + } + if (route === "/web/dataset/call_kw/res.lang/get_installed") { + return Promise.resolve([["en_US"], ["fr_BE"]]); } return this._super.apply(this, arguments); }, @@ -1725,9 +1767,19 @@ QUnit.module('basic_fields', { var $button = form.$('textarea + .o_field_translate'); assert.strictEqual($button.length, 1, "should have a translate button"); await testUtils.dom.click($button); + assert.containsOnce($(document), '.modal', 'there should be a translation modal'); form.destroy(); + _t.database.multi_lang = multiLang; + }); + + QUnit.test('text field translatable in create mode', async function (assert) { + assert.expect(1); + + this.data.partner.fields.txt.translate = true; - form = await createView({ + var multiLang = _t.database.multi_lang; + _t.database.multi_lang = true; + var form = await createView({ View: FormView, model: 'partner', data: this.data, @@ -1739,8 +1791,8 @@ QUnit.module('basic_fields', { '</sheet>' + '</form>', }); - $button = form.$('textarea + .o_field_translate'); - assert.strictEqual($button.length, 0, "should not have a translate button in create mode"); + var $button = form.$('textarea + .o_field_translate'); + assert.strictEqual($button.length, 1, "should have a translate button in create mode"); form.destroy(); _t.database.multi_lang = multiLang; @@ -2796,8 +2848,32 @@ QUnit.module('basic_fields', { form.destroy(); }); - QUnit.test('date field should remove the date if the date is not valid', async function (assert) { - assert.expect(1); + QUnit.test('date field: set an invalid date when the field is already set', async function (assert) { + assert.expect(2); + + var form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + arch: '<form string="Partners"><field name="date"/></form>', + res_id: 1, + viewOptions: { + mode: 'edit', + }, + }); + + var $input = form.$('.o_field_widget[name=date] input'); + + assert.strictEqual($input.val(), "02/03/2017"); + + $input.val('mmmh').trigger('change'); + assert.strictEqual($input.val(), "02/03/2017", "should have reset the original value"); + + form.destroy(); + }); + + QUnit.test('date field: set an invalid date when the field is not set yet', async function (assert) { + assert.expect(2); var form = await createView({ View: FormView, @@ -2805,13 +2881,18 @@ QUnit.module('basic_fields', { data: this.data, arch: '<form string="Partners"><field name="date"/></form>', res_id: 4, + viewOptions: { + mode: 'edit', + }, }); - // switch to edit mode - await testUtils.form.clickEdit(form); - // set an invalid date + var $input = form.$('.o_field_widget[name=date] input'); + + assert.strictEqual($input.text(), ""); + $input.val('mmmh').trigger('change'); assert.strictEqual($input.text(), "", "The date field should be empty"); + form.destroy(); }); @@ -2967,17 +3048,17 @@ QUnit.module('basic_fields', { // switch to edit mode await testUtils.form.clickEdit(form); // open datepicker and select another value - 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)')); + await testUtils.dom.openDatepicker(form.$('.o_datepicker')); + await testUtils.dom.click($('.bootstrap-datetimepicker-widget .picker-switch').first()); + await testUtils.dom.click($('.bootstrap-datetimepicker-widget .picker-switch:eq(1)')); + await testUtils.dom.click($('.bootstrap-datetimepicker-widget .year').eq(11)); + await testUtils.dom.click($('.bootstrap-datetimepicker-widget .month').eq(11)); + await 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"); - testUtils.fields.editSelect(form.$('.o_field_widget[name=date] input'), ''); // remove the value + await 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"); @@ -3100,7 +3181,7 @@ QUnit.module('basic_fields', { assert.strictEqual(form.$('.o_datepicker_input').val(), '02/03/2017', 'the date should be correct in edit mode'); - testUtils.fields.editAndTrigger(form.$('.o_datepicker_input'), '', ['input', 'change', 'focusout']); + await testUtils.fields.editAndTrigger(form.$('.o_datepicker_input'), '', ['input', 'change', 'focusout']); assert.strictEqual(form.$('.o_datepicker_input').val(), '', 'should have correctly removed the value'); @@ -5817,7 +5898,11 @@ QUnit.module('basic_fields', { form.destroy(); }); - QUnit.module('FieldColor'); + QUnit.module('FieldColor', { + before: function () { + return ajax.loadXML('/web/static/src/xml/colorpicker_dialog.xml', core.qweb); + }, + }); QUnit.test('Field Color: default widget state', async function (assert) { assert.expect(3); @@ -5837,7 +5922,6 @@ QUnit.module('basic_fields', { }); await testUtils.dom.click(form.$('.o_field_color')); - await testUtils.nextTick(); assert.containsOnce($, '.modal'); assert.containsNone($('.modal'), '.o_opacity_slider', "Opacity slider should not be present"); diff --git a/addons/web/static/tests/fields/relational_fields/field_many2many_tests.js b/addons/web/static/tests/fields/relational_fields/field_many2many_tests.js index ab80fd59983..db0fb3632d3 100644 --- a/addons/web/static/tests/fields/relational_fields/field_many2many_tests.js +++ b/addons/web/static/tests/fields/relational_fields/field_many2many_tests.js @@ -116,7 +116,7 @@ QUnit.module('fields', {}, function () { QUnit.module('FieldMany2Many'); QUnit.test('many2many kanban: edition', async function (assert) { - assert.expect(32); + assert.expect(33); this.data.partner.records[0].timmy = [12, 14]; this.data.partner_type.records.push({ id: 15, display_name: "red", color: 6 }); @@ -250,6 +250,7 @@ QUnit.module('fields', {}, function () { assert.strictEqual($('.modal .modal-footer .o_btn_remove').length, 1, 'There should be a modal having Remove Button'); await testUtils.dom.click($('.modal .modal-footer .o_btn_remove')); + assert.containsNone($('.o_modal'), "modal should have been closed"); assert.strictEqual(form.$('.o_kanban_record:not(.o_kanban_ghost)').length, 5, 'should contain 5 records'); assert.ok(!form.$('.o_kanban_record:contains(silver)').length, diff --git a/addons/web/static/tests/fields/relational_fields/field_one2many_tests.js b/addons/web/static/tests/fields/relational_fields/field_one2many_tests.js index eb4cd9986cc..35b4be9f25e 100644 --- a/addons/web/static/tests/fields/relational_fields/field_one2many_tests.js +++ b/addons/web/static/tests/fields/relational_fields/field_one2many_tests.js @@ -2255,7 +2255,7 @@ QUnit.module('fields', {}, function () { }); QUnit.test('one2many kanban: edition', async function (assert) { - assert.expect(17); + assert.expect(23); this.data.partner.records[0].p = [2]; var form = await createView({ @@ -2286,6 +2286,22 @@ QUnit.module('fields', {}, function () { '</field>' + '</form>', res_id: 1, + mockRPC: function (route, args) { + if (route === '/web/dataset/call_kw/partner/write') { + var commands = args.args[1].p; + assert.strictEqual(commands.length, 2, + 'should have generated two commands'); + assert.strictEqual(commands[0][0], 0, + 'generated command should be ADD WITH VALUES'); + assert.strictEqual(commands[0][2].display_name, "new subrecord 3", + 'value of newly created subrecord should be "new subrecord 3"'); + assert.strictEqual(commands[1][0], 2, + 'generated command should be REMOVE AND DELETE'); + assert.strictEqual(commands[1][1], 2, + 'deleted record id should be 2'); + } + return this._super.apply(this, arguments); + }, }); assert.ok(!form.$('.o_kanban_view .delete_icon').length, @@ -2341,6 +2357,7 @@ QUnit.module('fields', {}, function () { assert.strictEqual($('.modal .modal-footer .o_btn_remove').length, 1, 'There should be a modal having Remove Button'); await testUtils.dom.click($('.modal .modal-footer .o_btn_remove')); + assert.containsNone($('.o_modal'), "modal should have been closed"); assert.strictEqual(form.$('.o_kanban_record:not(.o_kanban_ghost)').length, 3, 'should contain 3 records'); await testUtils.dom.click(form.$('.o_kanban_view .delete_icon:first()')); @@ -2349,6 +2366,9 @@ QUnit.module('fields', {}, function () { 'should contain 1 records'); assert.strictEqual(form.$('.o_kanban_record span:first').text(), 'new subrecord 3', 'the remaining subrecord should be "new subrecord 3"'); + + // save and check that the correct command has been generated + await testUtils.form.clickSave(form); form.destroy(); }); @@ -6611,7 +6631,7 @@ QUnit.module('fields', {}, function () { await testUtils.dom.click(form.$('.o_field_x2many_list_row_add a')); prom = testUtils.makeTestPromise(); - testUtils.fields.editAndTrigger(form.$('.o_field_widget[name=int_field]'), '44', + await testUtils.fields.editAndTrigger(form.$('.o_field_widget[name=int_field]'), '44', ['input', { type: 'keydown', which: $.ui.keyCode.TAB }]); prom.resolve(); await testUtils.nextTick(); diff --git a/addons/web/static/tests/fields/relational_fields_mobile_tests.js b/addons/web/static/tests/fields/relational_fields_mobile_tests.js deleted file mode 100644 index 640a9298368..00000000000 --- a/addons/web/static/tests/fields/relational_fields_mobile_tests.js +++ /dev/null @@ -1,179 +0,0 @@ -odoo.define('web.relational_fields_tests', function (require) { -"use strict"; - -var FormView = require('web.FormView'); -var testUtils = require('web.test_utils'); - -var createView = testUtils.createView; - -QUnit.module('fields', {}, function () { - -QUnit.module('relational_fields', { - beforeEach: function () { - this.data = { - partner: { - fields: { - display_name: { string: "Displayed name", type: "char" }, - foo: {string: "Foo", type: "char", default: "My little Foo Value"}, - bar: {string: "Bar", type: "boolean", default: true}, - int_field: {string: "int_field", type: "integer", sortable: true}, - qux: {string: "Qux", type: "float", digits: [16,1] }, - p: {string: "one2many field", type: "one2many", relation: 'partner', relation_field: 'trululu'}, - trululu: {string: "Trululu", type: "many2one", relation: 'partner'}, - partner_ids: {string: "many2many field", type: "many2many", relation: 'partner'}, - }, - records: [{ - id: 1, - display_name: "first record", - bar: true, - foo: "yop", - int_field: 10, - qux: 0.44, - p: [], - trululu: 4, - }, { - id: 2, - display_name: "second record", - bar: true, - foo: "blip", - int_field: 9, - qux: 13, - p: [], - trululu: 1, - }, { - id: 4, - display_name: "aaa", - bar: false, - }], - onchanges: {}, - }, - }; - } -}, function () { - - QUnit.module('FieldOne2Many'); - - QUnit.test('one2many kanban: deletion in mobile', async function (assert) { - assert.expect(9); - - this.data.partner.records[0].p = [1, 2]; - var form = await createView({ - View: FormView, - model: 'partner', - data: this.data, - arch: '<form string="Partners">' + - '<field name="p">' + - '<kanban>' + - '<templates>' + - '<t t-name="kanban-box">' + - '<div class="oe_kanban_global_click">' + - '<field name="display_name"/>' + - '</div>' + - '</t>' + - '</templates>' + - '</kanban>' + - '<form string="Partners">' + - '<field name="display_name"/>' + - '</form>' + - '</field>' + - '</form>', - res_id: 1, - mockRPC: function (route, args) { - if (route === '/web/dataset/call_kw/partner/write') { - var commands = args.args[1].p; - assert.strictEqual(commands.length, 2, - 'should have generated two commands'); - assert.ok(commands[0][0] === 4 && commands[0][1] === 2, - 'should have generated the command 2 (DELETE) with id 1'); - assert.ok(commands[1][0] === 2 && commands[1][1] === 1, - 'should have generated the command 2 (DELETE) with id 2'); - } - return this._super.apply(this, arguments); - }, - }); - - assert.containsNone(form, '.o_field_one2many .o-kanban-button-new', - '"Create" button should not be visible in readonly'); - - await testUtils.form.clickEdit(form); - - assert.containsOnce(form, '.o_field_one2many .o-kanban-button-new', - '"Create" button should be visible in edit'); - assert.strictEqual(form.$('.o_kanban_record:not(.o_kanban_ghost)').length, 2, - "should have 2 records"); - - // open and delete record - await testUtils.dom.click(form.$('.oe_kanban_global_click').first()); - assert.strictEqual($('.modal .modal-footer .o_btn_remove').length, 1, - 'there should be a Remove button in the modal footer'); - await testUtils.dom.click($('.modal .modal-footer .o_btn_remove')); - assert.strictEqual($('.o_modal').length, 0, "there shoul be no more modal"); - assert.strictEqual(form.$('.o_kanban_record:not(.o_kanban_ghost)').length, 1, - 'should contain 1 records'); - - // save and check that the correct command has been generated - await testUtils.form.clickSave(form); - form.destroy(); - }); - - QUnit.module('FieldMany2Many'); - - QUnit.test('many2many kanban: deletion in mobile', async function (assert) { - assert.expect(8); - this.data.partner.records[0].partner_ids = [2, 4]; - var form = await createView({ - View: FormView, - model: 'partner', - data: this.data, - arch: '<form string="Partners">' + - '<field name="display_name"/>' + - '<field name="partner_ids">' + - '<kanban>' + - '<field name="display_name"/>' + - '<templates>' + - '<t t-name="kanban-box">' + - '<div class="oe_kanban_global_click">' + - '<span><t t-esc="record.display_name.value"/></span>' + - '</div>' + - '</t>' + - '</templates>' + - '</kanban>' + - '<form string="Partners">' + - '<field name="display_name"/>' + - '</form>' + - '</field>' + - '</form>', - res_id: 1, - mockRPC: function (route, args) { - if (route === '/web/dataset/call_kw/partner/write') { - var commands = args.args[1].partner_ids; - assert.strictEqual(commands.length, 1, - 'should have generated one commands'); - assert.deepEqual(commands[0], [6, false, [4]] , - 'should properly write ids'); - } - return this._super.apply(this, arguments); - }, - }); - assert.containsNone(form.$('.o_field_many2many .o-kanban-button-new'), - '"Add" button should not be visible in readonly'); - await testUtils.form.clickEdit(form); - assert.containsOnce(form, '.o_field_many2many .o-kanban-button-new', - '"Add" button should be visible in edit'); - assert.containsN(form, '.o_kanban_record:not(.o_kanban_ghost)', 2, - "should have 2 records"); - // open and delete record - await testUtils.dom.click(form.$('.oe_kanban_global_click').first()); - assert.strictEqual($('.modal .modal-footer .o_btn_remove').length, 1, - 'there should be a modal having "Remove" Button'); - await testUtils.dom.click($('.modal .modal-footer .o_btn_remove')); - assert.containsNone($('.o_modal'), "modal should have been closed"); - assert.containsOnce(form, '.o_kanban_record:not(.o_kanban_ghost)', - 'should contain 1 records'); - // save and check that the correct command has been generated - await testUtils.form.clickSave(form); - form.destroy(); - }); -}); -}); -}); diff --git a/addons/web/static/tests/fields/relational_fields_tests.js b/addons/web/static/tests/fields/relational_fields_tests.js index 7284b9099d8..7f3f54e3ad7 100644 --- a/addons/web/static/tests/fields/relational_fields_tests.js +++ b/addons/web/static/tests/fields/relational_fields_tests.js @@ -1191,7 +1191,7 @@ QUnit.module('relational_fields', { }); QUnit.test('required selection widget should not have blank option', async function (assert) { - assert.expect(3); + assert.expect(12); this.data.partner.fields.feedback_value = { type: "selection", @@ -1212,15 +1212,38 @@ QUnit.module('relational_fields', { }); await testUtils.form.clickEdit(form); - assert.strictEqual(form.$('.o_field_widget[name=color]')[0].options.length, 3, - "non required selection field must have 3 options 1 blank option and 2 value options"); - assert.strictEqual(form.$('.o_field_widget[name=feedback_value]')[0].options.length, 2, - "should have only 2 options without blank option"); + + var $colorField = form.$('.o_field_widget[name=color]'); + assert.containsN($colorField, 'option', 3, "Three options in non required field"); + + assert.hasAttrValue($colorField.find('option:first()'), 'style', "", + "Should not have display=none"); + assert.hasAttrValue($colorField.find('option:eq(1)'), 'style', "", + "Should not have display=none"); + assert.hasAttrValue($colorField.find('option:eq(2)'), 'style', "", + "Should not have display=none"); + + const $requiredSelect = form.$('.o_field_widget[name=feedback_value]'); + + assert.containsN($requiredSelect, 'option', 3, "Three options in required field"); + assert.hasAttrValue($requiredSelect.find('option:first()'), 'style', "display: none", + "Should have display=none"); + assert.hasAttrValue($requiredSelect.find('option:eq(1)'), 'style', "", + "Should not have display=none"); + assert.hasAttrValue($requiredSelect.find('option:eq(2)'), 'style', "", + "Should not have display=none"); // change value to update widget modifier values - await testUtils.fields.editSelect(form.$('.o_field_widget[name=feedback_value]'), '"bad"'); - assert.strictEqual(form.$('.o_field_widget[name=color]')[0].options.length, 2, - "should have only 2 options"); + await testUtils.fields.editSelect($requiredSelect, '"bad"'); + $colorField = form.$('.o_field_widget[name=color]'); + + assert.containsN($colorField, 'option', 3, "Three options in required field"); + assert.hasAttrValue($colorField.find('option:first()'), 'style', "display: none", + "Should have display=none"); + assert.hasAttrValue($colorField.find('option:eq(1)'), 'style', "", + "Should not have display=none"); + assert.hasAttrValue($colorField.find('option:eq(2)'), 'style', "", + "Should not have display=none"); form.destroy(); }); diff --git a/addons/web/static/tests/fields/signature.js b/addons/web/static/tests/fields/signature.js index fc85832da15..fcc3b67074f 100644 --- a/addons/web/static/tests/fields/signature.js +++ b/addons/web/static/tests/fields/signature.js @@ -1,6 +1,8 @@ odoo.define('web.signature_field_tests', function (require) { "use strict"; +var ajax = require('web.ajax'); +var core = require('web.core'); var FormView = require('web.FormView'); var testUtils = require('web.test_utils'); @@ -37,7 +39,11 @@ QUnit.module('signature', { } }, function () { - QUnit.module('Signature Field'); + QUnit.module('Signature Field', { + before: function () { + return ajax.loadXML('/web/static/src/xml/name_and_signature.xml', core.qweb); + }, + }); QUnit.test('Set simple field in "full_name" node option', async function (assert) { assert.expect(3); @@ -65,8 +71,6 @@ QUnit.module('signature', { "should have a valid signature widget"); // Click on the widget to open signature modal await testUtils.dom.click(form.$('div[name=sign] div.o_signature')); - await testUtils.nextTick(); // dialog xmlDependencies load -- await testUtils.nextTick(); // name_and_signature xmlDependencies load assert.strictEqual($('.modal .modal-body a.o_web_sign_auto_button').length, 1, 'should open a modal with "Auto" button'); assert.strictEqual($('.modal .modal-body .o_web_sign_name_input').val(), "Pop's Chock'lit", @@ -101,8 +105,6 @@ QUnit.module('signature', { "should have a valid signature widget"); // Click on the widget to open signature modal await testUtils.dom.click(form.$('div[name=sign] div.o_signature')); - await testUtils.nextTick(); // dialog xmlDependencies load -- await testUtils.nextTick(); // name_and_signature xmlDependencies load assert.strictEqual($('.modal .modal-body a.o_web_sign_auto_button').length, 1, 'should open a modal with "Auto" button'); assert.strictEqual($('.modal .modal-body .o_web_sign_name_input').val(), "Veggie Burger", |
