diff options
| author | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
|---|---|---|
| committer | stephanchrst <stephanchrst@gmail.com> | 2022-05-10 21:51:50 +0700 |
| commit | 3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch) | |
| tree | a44932296ef4a9b71d5f010906253d8c53727726 /addons/stock/static/tests | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/stock/static/tests')
4 files changed, 532 insertions, 0 deletions
diff --git a/addons/stock/static/tests/popover_widget_tests.js b/addons/stock/static/tests/popover_widget_tests.js new file mode 100644 index 00000000..dff13d60 --- /dev/null +++ b/addons/stock/static/tests/popover_widget_tests.js @@ -0,0 +1,53 @@ +odoo.define('stock.popover_widget_tests', function (require) { +"use strict"; + +var testUtils = require('web.test_utils'); +var FormView = require('web.FormView'); +var createView = testUtils.createView; + +QUnit.module('widgets', {}, function () { +QUnit.module('ModelFieldSelector', { + beforeEach: function () { + this.data = { + partner: { + fields: { + json_data: {string: " ", type: "char"}, + }, + records: [ + {id:1, json_data:'{"color": "text-danger", "msg": "var that = self // why not?", "title": "JS Master"}'} + ] + } + }; + }, +}, function () { + QUnit.test("Test creation/usage popover widget form", async function (assert) { + assert.expect(6); + + var form = await createView({ + View: FormView, + model: 'partner', + data: this.data, + arch:'<form string="Partners">' + + '<field name="json_data" widget="popover_widget"/>' + + '</form>', + res_id: 1 + }); + + var $popover = $('div.popover'); + assert.strictEqual($popover.length, 0, "Shouldn't have a popover container in DOM"); + + var $popoverButton = form.$('a.fa.fa-info-circle.text-danger'); + assert.strictEqual($popoverButton.length, 1, "Should have a popover icon/button in red"); + assert.strictEqual($popoverButton.prop('special_click'), true, "Special click properpy should be activated"); + await testUtils.dom.triggerEvents($popoverButton, ['focus']); + $popover = $('div.popover'); + assert.strictEqual($popover.length, 1, "Should have a popover container in DOM"); + assert.strictEqual($popover.html().includes("var that = self // why not?"), true, "The message should be in DOM"); + assert.strictEqual($popover.html().includes("JS Master"), true, "The title should be in DOM"); + + form.destroy(); + }); +}); +}); + +}); diff --git a/addons/stock/static/tests/singleton_list_tests.js b/addons/stock/static/tests/singleton_list_tests.js new file mode 100644 index 00000000..aad90a29 --- /dev/null +++ b/addons/stock/static/tests/singleton_list_tests.js @@ -0,0 +1,305 @@ +odoo.define('web.singleton_list_tests', function (require) { +"use strict"; + +var SingletonListView = require('stock.SingletonListView'); +var testUtils = require('web.test_utils'); + +var createView = testUtils.createView; + + +QUnit.module('Views', { + beforeEach: function () { + this.data = { + person: { + fields: { + name: {string: "Name", type: "char"}, + age: {string: "Age", type: "integer"}, + job: {string: "Profession", type: "char"}, + }, + records: [ + {id: 1, name: 'Daniel Fortesque', age: 32, job: 'Soldier'}, + {id: 2, name: 'Samuel Oak', age: 64, job: 'Professor'}, + {id: 3, name: 'Leto II Atreides', age: 128, job: 'Emperor'}, + ] + }, + }; + this.mockRPC = function (route, args) { + if (route === '/web/dataset/call_kw/person/create') { + var name = args.args[0].name; + var age = args.args[0].age; + var job = args.args[0].job; + for (var d of this.data.person.records) { + if (d.name === name) { + d.age = age; + d.job = job; + return Promise.resolve(d.id); + } + } + } + return this._super.apply(this, arguments); + }; + } +}, function () { + + QUnit.module('SingletonListView'); + + QUnit.test('Create new record correctly', async function (assert) { + assert.expect(2); + + var list = await createView({ + View: SingletonListView, + model: 'person', + data: this.data, + arch: '<tree editable="top" js_class="singleton_list">'+ + '<field name="name"/>'+ + '<field name="age"/>'+ + '</tree>', + mockRPC: this.mockRPC, + }); + // Checks we have initially 3 records + assert.containsN(list, '.o_data_row', 3, "should have 3 records"); + + // Creates a new line... + await testUtils.dom.click($('.o_list_button_add')); + // ... and fills fields with new values + var $input = $('.o_selected_row input[name=name]'); + await testUtils.fields.editInput($input, 'Bilou'); + await testUtils.fields.triggerKeydown($input, 'tab'); + + $input = $('.o_selected_row input[name=age]'); + await testUtils.fields.editInput($input, '24'); + await testUtils.fields.triggerKeydown($input, 'enter'); + await testUtils.dom.click($('.o_list_button_save')); + + // Checks new record is in the list + assert.containsN(list, '.o_data_row', 4, "should now have 4 records"); + list.destroy(); + }); + + QUnit.test('Don\'t duplicate record', async function (assert) { + assert.expect(3); + + var list = await createView({ + View: SingletonListView, + model: 'person', + data: this.data, + arch: '<tree editable="top" js_class="singleton_list">'+ + '<field name="name"/>'+ + '<field name="age"/>'+ + '</tree>', + mockRPC: this.mockRPC, + }); + // Checks we have initially 3 records + assert.containsN(list, '.o_data_row', 3, "should have 3 records"); + + // Creates a new line... + await testUtils.dom.click($('.o_list_button_add')); + // ... and fills fields with already existing value + var $input = $('.o_selected_row input[name=name]'); + var name = 'Samuel Oak'; + await testUtils.fields.editInput($input, name); + await testUtils.fields.triggerKeydown($input, 'tab'); + + $input = $('.o_selected_row input[name=age]'); + var age = '72'; + await testUtils.fields.editInput($input, age); + await testUtils.fields.triggerKeydown($input, 'enter'); + + // Checks we have still only 3 records... + assert.containsN(list, '.o_data_row', 3, "should still have 3 records"); + // ... and verify modification was occured. + var nameField = list.$('td[title="' + name + '"]'); + var ageField = nameField.parent().find('.o_list_number'); + assert.strictEqual(ageField.text(), age, "The age field must be updated"); + list.destroy(); + }); + + QUnit.test('Don\'t raise error when trying to create duplicate line', async function (assert) { + assert.expect(3); + /* In some condition, a list editable with the `singletonlist` js_class + can try to select a record at a line who isn't the same place anymore. + In this case, the list can try to find the id of an undefined record. + This test just insures we don't raise a traceback in this case. + */ + var list = await createView({ + View: SingletonListView, + model: 'person', + data: { + person: { + fields: { + name: {string: "Name", type: "char"}, + age: {string: "Age", type: "integer"}, + }, + records: [ + {id: 1, name: 'Bobby B. Bop', age: 18}, + ] + } + }, + arch: '<tree editable="top" js_class="singleton_list">'+ + '<field name="name"/>'+ + '<field name="age"/>'+ + '</tree>', + mockRPC: this.mockRPC, + }); + // Checks we have initially 1 record + assert.containsN(list, '.o_data_row', 1, "should have 1 records"); + + // Creates a new line... + await testUtils.dom.click($('.o_list_button_add')); + // ... and fills fields with already existing value + var $input = $('.o_selected_row input[name=name]'); + var name = 'Bobby B. Bop'; + await testUtils.fields.editInput($input, name); + await testUtils.fields.triggerKeydown($input, 'tab'); + + $input = $('.o_selected_row input[name=age]'); + var age = '22'; + await testUtils.fields.editInput($input, age); + // This operation causes list'll try to select undefined record. + await testUtils.fields.triggerKeydown($input, 'enter'); + + // Checks we have still only 1 record... + assert.containsN(list, '.o_data_row', 1, "should now have 1 records"); + // ... and verify modification was occured. + var nameField = list.$('td[title="' + name + '"]'); + var ageField = nameField.parent().find('.o_list_number'); + assert.strictEqual(ageField.text(), age, "The age field must be updated"); + list.destroy(); + }); + + QUnit.test('Refresh the list only when needed', async function (assert) { + assert.expect(3); + + var refresh_count = 0; + var list = await createView({ + View: SingletonListView, + model: 'person', + data: this.data, + arch: '<tree editable="top" js_class="singleton_list">'+ + '<field name="name"/>'+ + '<field name="age"/>'+ + '</tree>', + mockRPC: this.mockRPC, + }); + list.realReload = list.reload; + list.reload = function () { + refresh_count++; + return this.realReload(); + }; + // Modify Record + await testUtils.dom.click(list.$('.o_data_row:nth-child(2) > .o_list_number')); + var $input = $('.o_selected_row input[name=age]'); + await testUtils.fields.editInput($input, '70'); + await testUtils.fields.triggerKeydown($input, 'enter'); + await testUtils.dom.click($('.o_list_button_save')); + assert.strictEqual(refresh_count, 0, "don't refresh when edit existing line"); + + // Add existing record + await testUtils.dom.click($('.o_list_button_add')); + $input = $('.o_selected_row input[name=name]'); + await testUtils.fields.editInput($input, 'Leto II Atreides'); + await testUtils.fields.triggerKeydown($input, 'tab'); + $input = $('.o_selected_row input[name=age]'); + await testUtils.fields.editInput($input, '800'); + await testUtils.dom.click($('.o_list_button_save')); + assert.strictEqual(refresh_count, 1, "refresh after tried to create an existing record"); + + // Add new record + await testUtils.dom.click($('.o_list_button_add')); + $input = $('.o_selected_row input[name=name]'); + await testUtils.fields.editInput($input, 'Valentin Cognito'); + await testUtils.fields.triggerKeydown($input, 'tab'); + $input = $('.o_selected_row input[name=age]'); + await testUtils.fields.editInput($input, '37'); + await testUtils.fields.triggerKeydown($input, 'enter'); + await testUtils.dom.click($('.o_list_button_save')); + assert.strictEqual(refresh_count, 1, "don't refresh when create entirely new record"); + + list.destroy(); + }); + + QUnit.test('Work in grouped list', async function (assert) { + assert.expect(6); + + var refresh_count = 0; + var list = await createView({ + View: SingletonListView, + model: 'person', + data: this.data, + arch: '<tree editable="top" js_class="singleton_list">'+ + '<field name="name"/>'+ + '<field name="age"/>'+ + '<field name="job"/>'+ + '</tree>', + mockRPC: this.mockRPC, + groupBy: ['job'], + }); + list.realReload = list.reload; + list.reload = function () { + refresh_count++; + return this.realReload(); + }; + // Opens 'Professor' group + await testUtils.dom.click(list.$('.o_group_header:nth-child(2)')); + + // Creates a new record... + await testUtils.dom.click(list.$('.o_add_record_row a')); + var $input = $('.o_selected_row input[name=name]'); + await testUtils.fields.editInput($input, 'Del Tutorial'); + await testUtils.fields.triggerKeydown($input, 'tab'); + $input = $('.o_selected_row input[name=age]'); + await testUtils.fields.editInput($input, '32'); + await testUtils.fields.triggerKeydown($input, 'tab'); + await testUtils.dom.click($('.o_list_button_save')); + // ... then checks the list didn't refresh + assert.strictEqual(refresh_count, 0, + "don't refresh when creating new record"); + + // Creates an existing record in same group... + await testUtils.dom.click(list.$('.o_add_record_row a')); + var $input = $('.o_selected_row input[name=name]'); + await testUtils.fields.editInput($input, 'Samuel Oak'); + await testUtils.dom.click($('.o_list_button_save')); + // ... then checks the list has been refreshed + assert.strictEqual(refresh_count, 1, + "refresh when try to create an existing record"); + + // Creates an existing but not displayed record... + await testUtils.dom.click(list.$('.o_add_record_row a')); + var $input = $('.o_selected_row input[name=name]'); + await testUtils.fields.editInput($input, 'Daniel Fortesque'); + await testUtils.fields.triggerKeydown($input, 'tab'); + $input = $('.o_selected_row input[name=age]'); + await testUtils.fields.editInput($input, '55'); + await testUtils.fields.triggerKeydown($input, 'tab'); + $input = $('.o_selected_row input[name=job]'); + await testUtils.fields.editInput($input, 'Soldier'); + await testUtils.dom.click($('.o_list_button_save')); + // .. then checks the list didn't refresh + assert.strictEqual(refresh_count, 1, + "don't refresh when creating an existing record but this record " + + "isn't present in the view"); + + // Opens 'Soldier' group + await testUtils.dom.click(list.$('.o_group_header:nth-child(1)').first()); + // Checks the record has been correctly updated + var ageCell = $('tr.o_data_row td.o_list_number').first(); + assert.strictEqual(ageCell.text(), "55", + "age of the record must be updated"); + // Edits the freshly created record... + await testUtils.dom.click(list.$('tr.o_data_row td.o_list_number').eq(1)); + $input = $('.o_selected_row input[name=age]'); + await testUtils.fields.editInput($input, '66'); + await testUtils.dom.click($('.o_list_button_save')); + // ... then checks the list and data have been refreshed + assert.strictEqual(refresh_count, 2, + "refresh when try to create an existing record present in the view"); + ageCell = $('tr.o_data_row td.o_list_number').first(); + assert.strictEqual(ageCell.text(), "66", + "age of the record must be updated"); + + list.destroy(); + }); +}); + +}); diff --git a/addons/stock/static/tests/stock_traceability_report_backend_tests.js b/addons/stock/static/tests/stock_traceability_report_backend_tests.js new file mode 100644 index 00000000..5ab69403 --- /dev/null +++ b/addons/stock/static/tests/stock_traceability_report_backend_tests.js @@ -0,0 +1,151 @@ +odoo.define('stock.stock_traceability_report_backend_tests', function (require) { + "use strict"; + + const ControlPanel = require('web.ControlPanel'); + const dom = require('web.dom'); + const StockReportGeneric = require('stock.stock_report_generic'); + const testUtils = require('web.test_utils'); + + const { createActionManager, dom: domUtils } = testUtils; + + /** + * Helper function to instantiate a stock report action. + * @param {Object} params + * @param {Object} params.action + * @param {boolean} [params.debug] + * @returns {Promise<StockReportGeneric>} + */ + async function createStockReportAction(params) { + const parent = await testUtils.createParent(params); + const report = new StockReportGeneric(parent, params.action); + const target = testUtils.prepareTarget(params.debug); + + const _destroy = report.destroy; + report.destroy = function () { + report.destroy = _destroy; + parent.destroy(); + }; + const fragment = document.createDocumentFragment(); + await report.appendTo(fragment); + dom.prepend(target, fragment, { + callbacks: [{ widget: report }], + in_DOM: true, + }); + // Wait for the ReportWidget to be appended + await testUtils.nextTick(); + + return report; + } + + QUnit.module('Stock', {}, function () { + QUnit.module('Traceability report'); + + QUnit.test("Rendering with no lines", async function (assert) { + assert.expect(1); + + const template = ` + <div class="container-fluid o_stock_reports_page o_stock_reports_no_print"> + <div class="o_stock_reports_table table-responsive"> + <span class="text-center"> + <h1>No operation made on this lot.</h1> + </span> + </div> + </div>`; + const report = await createStockReportAction({ + action: { + context: {}, + params: {}, + }, + data: { + 'stock.traceability.report': { + fields: {}, + get_html: () => ({ html: template }), + }, + }, + }); + + // HTML content is nested in a div inside of the content + assert.strictEqual(report.el.querySelector('.o_content > div').innerHTML, template, + "Displayed template should match"); + + report.destroy(); + }); + + QUnit.test("mounted is called once when returning on 'Stock report' from breadcrumb", async assert => { + // This test can be removed as soon as we don't mix legacy and owl layers anymore. + assert.expect(7); + + let mountCount = 0; + + ControlPanel.patch('test.ControlPanel', T => { + class ControlPanelPatchTest extends T { + mounted() { + mountCount = mountCount + 1; + this.__uniqueId = mountCount; + assert.step(`mounted ${this.__uniqueId}`); + super.mounted(...arguments); + } + willUnmount() { + assert.step(`willUnmount ${this.__uniqueId}`); + super.mounted(...arguments); + } + } + return ControlPanelPatchTest; + }); + + const actionManager = await createActionManager({ + actions: [ + { + id: 42, + name: "Stock report", + tag: 'stock_report_generic', + type: 'ir.actions.client', + context: {}, + params: {}, + }, + ], + archs: { + 'partner,false,form': '<form><field name="display_name"/></form>', + 'partner,false,search': '<search></search>', + }, + data: { + partner: { + fields: { + display_name: { string: "Displayed name", type: "char" }, + }, + records: [ + {id: 1, display_name: "Genda Swami"}, + ], + }, + }, + mockRPC: function (route) { + if (route === '/web/dataset/call_kw/stock.traceability.report/get_html') { + return Promise.resolve({ + html: '<a class="o_stock_reports_web_action" href="#" data-active-id="1" data-res-model="partner">Go to form view</a>', + }); + } + return this._super.apply(this, arguments); + }, + intercepts: { + do_action: ev => actionManager.doAction(ev.data.action, ev.data.options), + }, + }); + + await actionManager.doAction(42); + await domUtils.click(actionManager.$('.o_stock_reports_web_action')); + await domUtils.click(actionManager.$('.breadcrumb-item:first')); + actionManager.destroy(); + + assert.verifySteps([ + 'mounted 1', + 'willUnmount 1', + 'mounted 2', + 'willUnmount 2', + 'mounted 3', + 'willUnmount 3', + ]); + + ControlPanel.unpatch('test.ControlPanel'); + }); + }); +}); diff --git a/addons/stock/static/tests/tours/stock_report_tests.js b/addons/stock/static/tests/tours/stock_report_tests.js new file mode 100644 index 00000000..c757390f --- /dev/null +++ b/addons/stock/static/tests/tours/stock_report_tests.js @@ -0,0 +1,23 @@ +odoo.define('stock.reports.setup.tour', function (require) { + "use strict"; + + const tour = require('web_tour.tour'); + + tour.register('test_stock_route_diagram_report', { + test: true, + }, [ + { + trigger: '.o_kanban_record', + extra_trigger:'.breadcrumb', + }, + { + trigger: '.nav-item > a:contains("Inventory")', + }, + { + trigger: '.btn[id="stock.view_diagram_button"]', + }, + { + trigger: 'iframe .o_report_stock_rule', + }, + ]); +}); |
