summaryrefslogtreecommitdiff
path: root/addons/stock/static/tests
diff options
context:
space:
mode:
authorstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
committerstephanchrst <stephanchrst@gmail.com>2022-05-10 21:51:50 +0700
commit3751379f1e9a4c215fb6eb898b4ccc67659b9ace (patch)
treea44932296ef4a9b71d5f010906253d8c53727726 /addons/stock/static/tests
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/stock/static/tests')
-rw-r--r--addons/stock/static/tests/popover_widget_tests.js53
-rw-r--r--addons/stock/static/tests/singleton_list_tests.js305
-rw-r--r--addons/stock/static/tests/stock_traceability_report_backend_tests.js151
-rw-r--r--addons/stock/static/tests/tours/stock_report_tests.js23
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',
+ },
+ ]);
+});