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/purchase_product_matrix/static/tests | |
| parent | 0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff) | |
initial commit 2
Diffstat (limited to 'addons/purchase_product_matrix/static/tests')
| -rw-r--r-- | addons/purchase_product_matrix/static/tests/section_and_note_widget_tests.js | 260 | ||||
| -rw-r--r-- | addons/purchase_product_matrix/static/tests/tours/purchase_product_matrix_tour.js | 111 |
2 files changed, 371 insertions, 0 deletions
diff --git a/addons/purchase_product_matrix/static/tests/section_and_note_widget_tests.js b/addons/purchase_product_matrix/static/tests/section_and_note_widget_tests.js new file mode 100644 index 00000000..7dfc29e6 --- /dev/null +++ b/addons/purchase_product_matrix/static/tests/section_and_note_widget_tests.js @@ -0,0 +1,260 @@ +odoo.define('purchase_product_matrix.section_and_note_widget_tests', function (require) { +"use strict"; + +var FormView = require('web.FormView'); +var testUtils = require('web.test_utils'); +var createView = testUtils.createView; + +function getGrid(product) { + return JSON.stringify({ + header: [{name: product.name}, {name: "M"}, {name: "L"}], + matrix: [[ + {name: "Men"}, + {ptav_ids: [10, 13], qty: 0, is_possible_combination: true}, + {ptav_ids: [11, 13], qty: 0, is_possible_combination: true}, + ], [ + {name: "Women"}, + {ptav_ids: [10, 14], qty: 0, is_possible_combination: true}, + {ptav_ids: [11, 14], qty: 0, is_possible_combination: true}, + ]], + }); +} + +QUnit.module('section_and_note: purchase_product_matrix', { + beforeEach: function () { + this.data = { + purchase_order: { + fields: { + order_line_ids: { + string: "Lines", + type: 'one2many', + relation: 'order_line', + relation_field: 'order_id', + }, + grid: {string: "Grid", type: 'char'}, + grid_product_tmpl_id: {string: "Grid Product", type: 'many2one', relation: 'product'}, + }, + onchanges: { + grid_product_tmpl_id: (obj) => { + const product = this.data.product.records.find((p) => { + return p.id === obj.grid_product_tmpl_id; + }); + obj.grid = product ? getGrid(product) : false; + }, + grid: () => {}, + }, + }, + order_line: { + fields: { + order_id: {string: "Invoice", type: 'many2one', relation: 'invoice'}, + product_template_id: {string: "Product", type: 'many2one', relation: 'product'}, + }, + }, + product: { + fields: { + name: {string: "Name", type: 'char'}, + }, + records: [ + {id: 1, name: 'A configurable product'}, + ], + }, + }; + }, +}, function () { + QUnit.test('can configure a product with the matrix', async function (assert) { + assert.expect(4); + + var form = await createView({ + View: FormView, + model: 'purchase_order', + data: this.data, + arch: `<form> + <field name="grid" invisible="1"/> + <field name="grid_product_tmpl_id" invisible="1"/> + <field name="order_line_ids" widget="section_and_note_one2many"> + <tree editable="bottom"> + <field name="product_template_id" widget="matrix_configurator"/> + </tree> + </field> + </form>`, + mockRPC: function (route, args) { + if (args.method === 'onchange' && args.args[2] === 'grid') { + // should trigger an onchange on the grid field and let the + // business logic create rows according to the matrix content + assert.deepEqual(args.args[1].grid, JSON.stringify({ + changes: [{qty: 2, ptav_ids: [10, 13]}, {qty: 3, ptav_ids: [11, 14]}], + product_template_id: 1, + })); + } + if (args.method === 'get_single_product_variant') { + assert.strictEqual(args.args[0], 1); + return Promise.resolve({mode: 'matrix'}); + } + return this._super.apply(this, arguments); + }, + }); + + await testUtils.dom.click('.o_field_x2many_list_row_add a'); + await testUtils.fields.many2one.searchAndClickItem("product_template_id", {item: 'configurable'}); + + assert.containsOnce(document.body, '.modal .o_product_variant_matrix'); + const $matrix = $('.modal .o_product_variant_matrix'); + assert.strictEqual($matrix.text().replace(/[\n\r\s\u00a0]+/g, ' '), + ' A configurable product M L Men Women '); + + // select 2 M-Men and 3 L-Women + await testUtils.fields.editInput($matrix.find('.o_matrix_input[ptav_ids="10,13"]'), '2'); + await testUtils.fields.editInput($matrix.find('.o_matrix_input[ptav_ids="11,14"]'), '3'); + await testUtils.dom.click($('.modal .modal-footer .btn-primary')); + + form.destroy(); + }); + + QUnit.test('can open the matrix twice with 2 different products', async function (assert) { + assert.expect(5); + + this.data.product.records.push({ id: 101, name: "Product A" }); + this.data.product.records.push({ id: 102, name: "Product B" }); + + const form = await createView({ + View: FormView, + model: 'purchase_order', + data: this.data, + arch: `<form> + <field name="grid" invisible="1"/> + <field name="grid_product_tmpl_id" invisible="1"/> + <field name="order_line_ids" widget="section_and_note_one2many"> + <tree editable="bottom"> + <field name="product_template_id" widget="matrix_configurator"/> + </tree> + </field> + </form>`, + mockRPC: function (route, args) { + if (args.method === 'onchange' && args.args[2] === 'grid') { + // should trigger an onchange on the grid field and let the + // business logic create rows according to the matrix content + assert.deepEqual(args.args[1].grid, JSON.stringify({ + changes: [{qty: 2, ptav_ids: [10, 13]}, {qty: 3, ptav_ids: [11, 14]}], + product_template_id: 102, + })); + } + if (args.method === 'get_single_product_variant') { + return Promise.resolve({mode: 'matrix'}); + } + return this._super.apply(this, arguments); + }, + }); + + // open the matrix with "Product A" and close it + await testUtils.dom.click('.o_field_x2many_list_row_add a'); + await testUtils.fields.many2one.searchAndClickItem("product_template_id", {item: 'Product A'}); + + assert.containsOnce(document.body, '.modal .o_product_variant_matrix'); + let $matrix = $('.modal .o_product_variant_matrix'); + assert.strictEqual($matrix.text().replace(/[\n\r\s\u00a0]+/g, ' '), + ' Product A M L Men Women '); + + await testUtils.dom.click($('.modal .modal-footer .btn-secondary')); // close + + // re-open the matrix with "Product B" + await testUtils.dom.click('.o_field_x2many_list_row_add a'); + await testUtils.fields.many2one.searchAndClickItem("product_template_id", {item: 'Product B'}); + + assert.containsOnce(document.body, '.modal .o_product_variant_matrix'); + $matrix = $('.modal .o_product_variant_matrix'); + assert.strictEqual($matrix.text().replace(/[\n\r\s\u00a0]+/g, ' '), + ' Product B M L Men Women '); + + // select 2 M-Men and 3 L-Women + await testUtils.fields.editInput($matrix.find('.o_matrix_input[ptav_ids="10,13"]'), '2'); + await testUtils.fields.editInput($matrix.find('.o_matrix_input[ptav_ids="11,14"]'), '3'); + await testUtils.dom.click($('.modal .modal-footer .btn-primary')); + + form.destroy(); + }); + + QUnit.test('_onTemplateChange is executed after product template quick create', async function (assert) { + assert.expect(1); + + let created_product_template; + + const form = await createView({ + View: FormView, + model: 'purchase_order', + data: this.data, + arch: `<form> + <field name="order_line_ids" widget="section_and_note_one2many"> + <tree editable="bottom"> + <field name="product_template_id" widget="matrix_configurator"/> + </tree> + </field> + </form>`, + async mockRPC(route, args) { + if (route === '/web/dataset/call_kw/product.template/get_single_product_variant') { + assert.strictEqual(args.args[0], created_product_template[0]); + } + + const result = await this._super(...arguments); + if (args.method === 'name_create') { + created_product_template = result; + } + return result; + }, + }); + + await testUtils.dom.click('.o_field_x2many_list_row_add a'); + await testUtils.fields.many2one.searchAndClickItem("product_template_id", {search: 'new product'}); + + form.destroy(); + }); + + QUnit.test('drag and drop rows containing matrix_configurator many2one', async function (assert) { + assert.expect(4); + + this.data.order_line.fields.sequence = {string: "Sequence", type: 'number'}; + this.data.order_line.fields.order_id.relation = 'purchase_order'; + this.data.purchase_order.records = [ + {id: 1, order_line_ids: [1, 2]} + ]; + this.data.order_line.records = [ + {id: 1, sequence: 4, product_template_id: 1, order_id: 1}, + {id: 2, sequence: 14, product_template_id: 2, order_id: 1}, + ]; + this.data.product.records.push( + {id: 1, name: "Chair"}, + {id: 2, name: "Table"} + ); + + const form = await createView({ + View: FormView, + model: 'purchase_order', + data: this.data, + arch: `<form> + <field name="order_line_ids" widget="section_and_note_one2many"> + <tree editable="bottom"> + <field name="sequence" widget="handle"/> + <field name="product_template_id" widget="matrix_configurator"/> + </tree> + </field> + </form>`, + res_id: 1, + viewOptions: { + mode: 'edit', + }, + }); + + assert.containsN(form, '.o_data_row', 2); + assert.strictEqual(form.$('.o_data_row').text(), 'ChairTable'); + assert.containsN(form, '.o_data_row .o_row_handle', 2); + + // move first row below second + const $firstHandle = form.$('.o_data_row:nth(0) .o_row_handle'); + const $secondHandle = form.$('.o_data_row:nth(1) .o_row_handle'); + await testUtils.dom.dragAndDrop($firstHandle, $secondHandle); + + assert.strictEqual(form.$('.o_data_row').text(), 'TableChair'); + + form.destroy(); + }); +}); +}); diff --git a/addons/purchase_product_matrix/static/tests/tours/purchase_product_matrix_tour.js b/addons/purchase_product_matrix/static/tests/tours/purchase_product_matrix_tour.js new file mode 100644 index 00000000..010c0b18 --- /dev/null +++ b/addons/purchase_product_matrix/static/tests/tours/purchase_product_matrix_tour.js @@ -0,0 +1,111 @@ +odoo.define('purchase_product_matrix.purchase_matrix_tour', function (require) { +"use strict"; + +var tour = require('web_tour.tour'); + +tour.register('purchase_matrix_tour', { + url: "/web", + test: true, +}, [tour.stepUtils.showAppsMenuItem(), { + trigger: '.o_app[data-menu-xmlid="purchase.menu_purchase_root"]', +}, { + trigger: ".o_list_button_add", + extra_trigger: ".o_purchase_order" +}, { + trigger: "a:contains('Add a product')" +}, { + trigger: 'div[name="product_template_id"] input', + run: function () { + var $input = $('div[name="product_template_id"] input'); + $input.click(); + $input.val('Matrix'); + var keyDownEvent = jQuery.Event("keydown"); + keyDownEvent.which = 42; + $input.trigger(keyDownEvent); + } +}, { + trigger: 'ul.ui-autocomplete a:contains("Matrix")', + run: 'click' +}, { + trigger: '.o_product_variant_matrix', + run: function () { + // fill the whole matrix with 1's + $('.o_matrix_input').val(1); + } +}, { + trigger: 'span:contains("Confirm")', + run: 'click' +}, { + trigger: ".o_form_editable .o_field_many2one[name='partner_id'] input", + extra_trigger: ".o_purchase_order", + run: 'text Agrolait' +}, { + trigger: ".ui-menu-item > a", + auto: true, + in_modal: false, +}, { + trigger: '.o_form_button_save:contains("Save")', + run: 'click' // SAVE Sales Order. +}, +// Open the matrix through the pencil button next to the product in line edit mode. +{ + trigger: '.o_form_button_edit:contains("Edit")', + run: 'click' // Edit Sales Order. +}, { + trigger: 'span:contains("Matrix (PAV11, PAV22, PAV31)\nPA4: PAV41")', + extra_trigger: '.o_form_editable', + run: 'click' +}, { + trigger: '.o_edit_product_configuration', + run: 'click' // edit the matrix +}, { + trigger: '.o_product_variant_matrix', + run: function () { + // update some of the matrix values. + $('.o_matrix_input').slice(8, 16).val(4); + } // set the qty to 4 for half of the matrix products. +}, { + trigger: 'span:contains("Confirm")', + run: 'click' // apply the matrix +}, { + trigger: '.o_form_button_save:contains("Save")', + extra_trigger: '.o_field_cell.o_data_cell.o_list_number:contains("4.00")', + run: 'click' // SAVE Sales Order, after matrix has been applied (extra_trigger). +}, { + trigger: '.o_form_button_edit:contains("Edit")', + run: 'click' // Edit Sales Order. +}, +// Ensures the matrix is opened with the values, when adding the same product. +{ + trigger: "a:contains('Add a product')" +}, { + trigger: 'div[name="product_template_id"] input', + run: function () { + var $input = $('div[name="product_template_id"] input'); + $input.click(); + $input.val('Matrix'); + var keyDownEvent = jQuery.Event("keydown"); + keyDownEvent.which = 42; + $input.trigger(keyDownEvent); + } +}, { + trigger: 'ul.ui-autocomplete a:contains("Matrix")', + run: 'click' +}, { + trigger: "input[value='4']", + run: function () { + // update some values of the matrix + $("input[value='4']").slice(0, 4).val(8.2); + } +}, { + trigger: 'span:contains("Confirm")', + run: 'click' // apply the matrix +}, { + trigger: '.o_form_button_save:contains("Save")', + extra_trigger: '.o_field_cell.o_data_cell.o_list_number:contains("8.20")', + run: 'click' // SAVE Sales Order, after matrix has been applied (extra_trigger). +}, +]); + + +}); |
