From 72d4e2e7598c545781a0bcf659fbcf6966568d2a Mon Sep 17 00:00:00 2001 From: "Adrien Guilliams (adgu)" Date: Mon, 6 Nov 2023 12:50:45 +0000 Subject: [PATCH] [FIX] pos*: fix test without demo data pos*: pos_online_payment, pos_sale, pos_self_order Prior to this commit, different tests were using the demo data to run which was causing problems when the demo data were not installed. In this commit, we add products, categories, floor, table, etc. at the setup of the test so that the test can run without demo data. X-original-commit: 6ef51b11f7f67a1f17225541cb2341a178a98aad Part-of: odoo/odoo#142212 --- addons/point_of_sale/models/pos_config.py | 12 +-- .../app/utils/input_popups/number_popup.js | 5 +- .../static/tests/tours/Chrome.tour.js | 2 +- .../static/tests/tours/PaymentScreen.tour.js | 4 +- .../static/tests/tours/ProductScreen.tour.js | 6 +- .../static/tests/tours/ReceiptScreen.tour.js | 20 ++--- .../static/tests/tours/TicketScreen.tour.js | 24 ++--- addons/point_of_sale/tests/common.py | 7 ++ .../tests/common_setup_methods.py | 14 ++- addons/point_of_sale/tests/test_frontend.py | 59 ++++++------ .../pos_online_payment/tests/test_frontend.py | 15 ++++ .../tests/tours/SplitBillScreen.tour.js | 4 +- addons/pos_restaurant/tests/test_frontend.py | 60 +++++++------ addons/pos_sale/tests/test_pos_sale_report.py | 10 +-- .../tests/tours/test_self_order_combo.js | 12 +-- .../tests/self_order_common_test.py | 89 ++++++++++++++++++- .../tests/test_self_order_combo.py | 9 ++ 17 files changed, 243 insertions(+), 109 deletions(-) diff --git a/addons/point_of_sale/models/pos_config.py b/addons/point_of_sale/models/pos_config.py index 0c49288f271..201d280d722 100644 --- a/addons/point_of_sale/models/pos_config.py +++ b/addons/point_of_sale/models/pos_config.py @@ -303,12 +303,12 @@ class PosConfig(models.Model): if pm.journal_id and pm.journal_id.currency_id and pm.journal_id.currency_id != config.currency_id: raise ValidationError(_("All payment methods must be in the same currency as the Sales Journal or the company currency if that is not set.")) - if any(self.available_pricelist_ids.mapped(lambda pricelist: pricelist.currency_id != self.currency_id)): - raise ValidationError(_("All available pricelists must be in the same currency as the company or" - " as the Sales Journal set on this point of sale if you use" - " the Accounting application.")) - if self.invoice_journal_id.currency_id and self.invoice_journal_id.currency_id != self.currency_id: - raise ValidationError(_("The invoice journal must be in the same currency as the Sales Journal or the company currency if that is not set.")) + if config.use_pricelist and config.pricelist_id and any(config.available_pricelist_ids.mapped(lambda pricelist: pricelist.currency_id != config.currency_id)): + raise ValidationError(_("All available pricelists must be in the same currency as the company or" + " as the Sales Journal set on this point of sale if you use" + " the Accounting application.")) + if config.invoice_journal_id.currency_id and config.invoice_journal_id.currency_id != config.currency_id: + raise ValidationError(_("The invoice journal must be in the same currency as the Sales Journal or the company currency if that is not set.")) @api.constrains('iface_start_categ_id', 'iface_available_categ_ids') def _check_start_categ(self): diff --git a/addons/point_of_sale/static/src/app/utils/input_popups/number_popup.js b/addons/point_of_sale/static/src/app/utils/input_popups/number_popup.js index d3888ed0bc0..b84a9c57930 100644 --- a/addons/point_of_sale/static/src/app/utils/input_popups/number_popup.js +++ b/addons/point_of_sale/static/src/app/utils/input_popups/number_popup.js @@ -63,6 +63,9 @@ export class NumberPopup extends AbstractAwaitablePopup { this.inputRef.el.focus(); } } + get decimalSeparator() { + return this.env.services.localization.decimalPoint; + } getNumpadButtons() { const { isPassword, cheap } = this.props; return [ @@ -80,7 +83,7 @@ export class NumberPopup extends AbstractAwaitablePopup { ...(!isPassword ? [{ value: "-" }] : []), { value: "Delete", text: "C" }, { value: "0" }, - ...(!isPassword ? [{ value: this.env.services.localization.decimalPoint }] : []), + ...(!isPassword ? [{ value: this.decimalSeparator }] : []), { value: "Backspace", text: "⌫" }, ]; } diff --git a/addons/point_of_sale/static/tests/tours/Chrome.tour.js b/addons/point_of_sale/static/tests/tours/Chrome.tour.js index f7ae240c362..77e4b45d096 100644 --- a/addons/point_of_sale/static/tests/tours/Chrome.tour.js +++ b/addons/point_of_sale/static/tests/tours/Chrome.tour.js @@ -111,7 +111,7 @@ registry.category("web_tour.tours").add("ChromeTour", { // Invoice an order ProductScreen.addOrderline("Whiteboard Pen", "5", "6"), ProductScreen.clickPartnerButton(), - ProductScreen.clickCustomer("Nicole Ford"), + ProductScreen.clickCustomer("Partner Test 1"), ProductScreen.clickPayButton(), PaymentScreen.clickPaymentMethod("Bank"), PaymentScreen.clickInvoiceButton(), diff --git a/addons/point_of_sale/static/tests/tours/PaymentScreen.tour.js b/addons/point_of_sale/static/tests/tours/PaymentScreen.tour.js index eda01657989..ac7052a67d6 100644 --- a/addons/point_of_sale/static/tests/tours/PaymentScreen.tour.js +++ b/addons/point_of_sale/static/tests/tours/PaymentScreen.tour.js @@ -217,7 +217,7 @@ registry.category("web_tour.tours").add("PaymentScreenRoundingHalfUpCashAndBank" ProductScreen.clickHomeCategory(), ProductScreen.addOrderline("Product Test 40", "1"), ProductScreen.clickPartnerButton(), - ProductScreen.clickCustomer("Nicole Ford"), + ProductScreen.clickCustomer("Partner Test 1"), ProductScreen.clickPayButton(), PaymentScreen.totalIs("40.00"), @@ -238,7 +238,7 @@ registry.category("web_tour.tours").add("PaymentScreenRoundingHalfUpCashAndBank" ProductScreen.clickHomeCategory(), ProductScreen.addOrderline("Product Test 41", "1"), ProductScreen.clickPartnerButton(), - ProductScreen.clickCustomer("Nicole Ford"), + ProductScreen.clickCustomer("Partner Test 1"), ProductScreen.clickPayButton(), PaymentScreen.totalIs("41.00"), diff --git a/addons/point_of_sale/static/tests/tours/ProductScreen.tour.js b/addons/point_of_sale/static/tests/tours/ProductScreen.tour.js index 6849289a4b6..c51be9d00ef 100644 --- a/addons/point_of_sale/static/tests/tours/ProductScreen.tour.js +++ b/addons/point_of_sale/static/tests/tours/ProductScreen.tour.js @@ -62,13 +62,13 @@ registry.category("web_tour.tours").add("ProductScreenTour", { ProductScreen.orderIsEmpty(), // Check different subcategories - ProductScreen.clickSubcategory("Desks"), + ProductScreen.clickSubcategory("Desk test"), ProductScreen.productIsDisplayed("Desk Pad"), ProductScreen.clickHomeCategory(), - ProductScreen.clickSubcategory("Misc"), + ProductScreen.clickSubcategory("Misc test"), ProductScreen.productIsDisplayed("Whiteboard Pen"), ProductScreen.clickHomeCategory(), - ProductScreen.clickSubcategory("Chairs"), + ProductScreen.clickSubcategory("Chair test"), ProductScreen.productIsDisplayed("Letter Tray"), ProductScreen.clickHomeCategory(), diff --git a/addons/point_of_sale/static/tests/tours/ReceiptScreen.tour.js b/addons/point_of_sale/static/tests/tours/ReceiptScreen.tour.js index 24c22230b62..d2db1d25a41 100644 --- a/addons/point_of_sale/static/tests/tours/ReceiptScreen.tour.js +++ b/addons/point_of_sale/static/tests/tours/ReceiptScreen.tour.js @@ -115,18 +115,18 @@ registry.category("web_tour.tours").add("OrderPaidInCash", { ].flat(), }); -registry - .category("web_tour.tours") - .add("ReceiptTrackingMethodTour", { - test: true, - url: "/pos/ui", - steps: () => [ +registry.category("web_tour.tours").add("ReceiptTrackingMethodTour", { + test: true, + url: "/pos/ui", + steps: () => + [ + ProductScreen.confirmOpeningPopup(), ProductScreen.clickHomeCategory(), - ProductScreen.clickDisplayedProduct('Product A'), - ProductScreen.enterLotNumber('123456789'), + ProductScreen.clickDisplayedProduct("Product A"), + ProductScreen.enterLotNumber("123456789"), ProductScreen.clickPayButton(), - PaymentScreen.clickPaymentMethod('Cash'), + PaymentScreen.clickPaymentMethod("Cash"), PaymentScreen.clickValidate(), ReceiptScreen.trackingMethodIsLot(), ].flat(), - }); +}); diff --git a/addons/point_of_sale/static/tests/tours/TicketScreen.tour.js b/addons/point_of_sale/static/tests/tours/TicketScreen.tour.js index 42738bd2589..ed6a936fca2 100644 --- a/addons/point_of_sale/static/tests/tours/TicketScreen.tour.js +++ b/addons/point_of_sale/static/tests/tours/TicketScreen.tour.js @@ -40,19 +40,19 @@ registry.category("web_tour.tours").add("TicketScreenTour", { TicketScreen.clickDiscard(), ProductScreen.addOrderline("Desk Pad", "1", "2"), ProductScreen.clickPartnerButton(), - ProductScreen.clickCustomer("Nicole Ford"), + ProductScreen.clickCustomer("Partner Test 1"), Chrome.clickMenuButton(), Chrome.clickTicketButton(), - TicketScreen.nthRowContains(2, "Nicole Ford", false), + TicketScreen.nthRowContains(2, "Partner Test 1", false), TicketScreen.clickNewTicket(), ProductScreen.addOrderline("Desk Pad", "1", "3"), ProductScreen.clickPartnerButton(), - ProductScreen.clickCustomer("Brandon Freeman"), + ProductScreen.clickCustomer("Partner Test 2"), ProductScreen.clickPayButton(), PaymentScreen.isShown(), Chrome.clickMenuButton(), Chrome.clickTicketButton(), - TicketScreen.nthRowContains(3, "Brandon Freeman", false), + TicketScreen.nthRowContains(3, "Partner Test 2", false), TicketScreen.clickNewTicket(), ProductScreen.addOrderline("Desk Pad", "2", "4"), ProductScreen.clickPayButton(), @@ -70,12 +70,12 @@ registry.category("web_tour.tours").add("TicketScreenTour", { TicketScreen.nthRowContains(2, "Ongoing"), TicketScreen.selectFilter("All active orders"), TicketScreen.nthRowContains(4, "Receipt"), - TicketScreen.search("Customer", "Nicole"), - TicketScreen.nthRowContains(2, "Nicole", false), - TicketScreen.search("Customer", "Brandon"), - TicketScreen.nthRowContains(2, "Brandon", false), TicketScreen.search("Receipt Number", "-0005"), TicketScreen.nthRowContains(2, "Receipt"), + TicketScreen.search("Customer", "Partner Test 1"), + TicketScreen.nthRowContains(2, "Partner Test 1", false), + TicketScreen.search("Customer", "Partner Test 2"), + TicketScreen.nthRowContains(2, "Partner Test 2", false), // Close the TicketScreen to see the current order which is in ReceiptScreen. // This is just to remove the search string in the search bar. TicketScreen.clickDiscard(), @@ -103,7 +103,7 @@ registry.category("web_tour.tours").add("TicketScreenTour", { Chrome.clickMenuButton(), Chrome.clickTicketButton(), TicketScreen.selectFilter("Paid"), - TicketScreen.nthRowContains(2, "Brandon Freeman", false), + TicketScreen.nthRowContains(2, "Partner Test 2", false), TicketScreen.nthRowContains(3, "-0005"), // Invoice order TicketScreen.selectOrder("-0005"), @@ -111,10 +111,10 @@ registry.category("web_tour.tours").add("TicketScreenTour", { TicketScreen.clickControlButton("Invoice"), Chrome.confirmPopup(), PartnerListScreen.isShown(), - PartnerListScreen.clickPartner("Colleen Diaz"), + PartnerListScreen.clickPartner("Partner Test 3"), TicketScreen.invoicePrinted(), TicketScreen.clickBackToMainTicketScreen(), - TicketScreen.partnerIs("Colleen Diaz"), + TicketScreen.partnerIs("Partner Test 3"), // Reprint receipt TicketScreen.clickControlButton("Print Receipt"), ReceiptScreen.isShown(), @@ -130,7 +130,7 @@ registry.category("web_tour.tours").add("TicketScreenTour", { // Filter should be automatically 'Paid'. TicketScreen.filterIs("Paid"), TicketScreen.selectOrder("-0005"), - TicketScreen.partnerIs("Colleen Diaz"), + TicketScreen.partnerIs("Partner Test 3"), inLeftSide(Order.hasLine({ productName: "Desk Pad", withClass: ".selected" })), ProductScreen.pressNumpad("3"), // Error should show because 2 is more than the number diff --git a/addons/point_of_sale/tests/common.py b/addons/point_of_sale/tests/common.py index 89968ecc386..9a5b39580a4 100644 --- a/addons/point_of_sale/tests/common.py +++ b/addons/point_of_sale/tests/common.py @@ -11,6 +11,13 @@ import logging _logger = logging.getLogger(__name__) +def archive_products(env): + # Archive all existing product to avoid noise during the tours + all_pos_product = env['product.product'].search([('available_in_pos', '=', True)]) + discount = env.ref('point_of_sale.product_product_consumable') + tip = env.ref('point_of_sale.product_product_tip') + (all_pos_product - discount - tip)._write({'active': False}) + class TestPointOfSaleCommon(ValuationReconciliationTestCommon): @classmethod diff --git a/addons/point_of_sale/tests/common_setup_methods.py b/addons/point_of_sale/tests/common_setup_methods.py index 04234adc60a..1fbb78eea4e 100644 --- a/addons/point_of_sale/tests/common_setup_methods.py +++ b/addons/point_of_sale/tests/common_setup_methods.py @@ -77,7 +77,7 @@ def setup_pos_combo_items(self): } ) - desk_accessories_combo = self.env["pos.combo"].create( + self.desk_accessories_combo = self.env["pos.combo"].create( { "name": "Desk Accessories Combo", "combo_line_ids": [ @@ -128,7 +128,7 @@ def setup_pos_combo_items(self): } ) - desks_combo = self.env["pos.combo"].create( + self.desks_combo = self.env["pos.combo"].create( { "name": "Desks Combo", "combo_line_ids": [ @@ -188,7 +188,7 @@ def setup_pos_combo_items(self): } ) - chairs_combo = self.env["pos.combo"].create( + self.chairs_combo = self.env["pos.combo"].create( { "name": "Chairs Combo", "combo_line_ids": [ @@ -206,19 +206,17 @@ def setup_pos_combo_items(self): ) # Create Office Combo - office_combo = self.env["product.product"].create( + self.office_combo = self.env["product.product"].create( { "available_in_pos": True, "list_price": 40, "name": "Office Combo", "type": "combo", - "categ_id": self.env.ref("product.product_category_5").id, + "categ_id": self.env.ref("product.product_category_1").id, "uom_id": self.env.ref("uom.product_uom_unit").id, "uom_po_id": self.env.ref("uom.product_uom_unit").id, "combo_ids": [ - (6, 0, [desks_combo.id, chairs_combo.id, desk_accessories_combo.id]) + (6, 0, [self.desks_combo.id, self.chairs_combo.id, self.desk_accessories_combo.id]) ], } ) - - return office_combo diff --git a/addons/point_of_sale/tests/test_frontend.py b/addons/point_of_sale/tests/test_frontend.py index 103220dc83c..0a249d271a6 100644 --- a/addons/point_of_sale/tests/test_frontend.py +++ b/addons/point_of_sale/tests/test_frontend.py @@ -7,6 +7,7 @@ from odoo.tools import DEFAULT_SERVER_DATE_FORMAT from odoo.addons.account.tests.common import AccountTestInvoicingHttpCommon from odoo.addons.point_of_sale.tests.common_setup_methods import setup_pos_combo_items from datetime import date, timedelta +from odoo.addons.point_of_sale.tests.common import archive_products import odoo.tests @@ -89,20 +90,19 @@ class TestPointOfSaleHttpCommon(AccountTestInvoicingHttpCommon): 'sequence': 10, }) - # Archive all existing product to avoid noise during the tours - all_pos_product = env['product.product'].search([('available_in_pos', '=', True)]) - discount = env.ref('point_of_sale.product_product_consumable') + archive_products(env) + cls.tip = env.ref('point_of_sale.product_product_tip') - (all_pos_product - discount - cls.tip)._write({'active': False}) - # In DESKS categ: Desk Pad - pos_categ_desks = env.ref('point_of_sale.pos_category_desks') - - # In DESKS categ: Whiteboard Pen - pos_categ_misc = env.ref('point_of_sale.pos_category_miscellaneous') - - # In CHAIR categ: Letter Tray - pos_categ_chairs = env.ref('point_of_sale.pos_category_chairs') + pos_desk_misc_test = env['pos.category'].create({ + 'name': 'Misc test', + }) + pos_cat_chair_test = env['pos.category'].create({ + 'name': 'Chair test', + }) + pos_cat_desk_test = env['pos.category'].create({ + 'name': 'Desk test', + }) # test an extra price on an attribute cls.whiteboard_pen = env['product.product'].create({ @@ -112,7 +112,7 @@ class TestPointOfSaleHttpCommon(AccountTestInvoicingHttpCommon): 'taxes_id': False, 'weight': 0.01, 'to_weight': True, - 'pos_categ_ids': [(4, pos_categ_misc.id)], + 'pos_categ_ids': [(4, pos_desk_misc_test.id)], }) cls.wall_shelf = env['product.product'].create({ 'name': 'Wall Shelf Unit', @@ -146,14 +146,14 @@ class TestPointOfSaleHttpCommon(AccountTestInvoicingHttpCommon): 'available_in_pos': True, 'list_price': 1.98, 'taxes_id': False, - 'pos_categ_ids': [(4, pos_categ_desks.id)], + 'pos_categ_ids': [(4, pos_cat_desk_test.id)], }) cls.letter_tray = env['product.product'].create({ 'name': 'Letter Tray', 'available_in_pos': True, 'list_price': 4.80, 'taxes_id': False, - 'pos_categ_ids': [(4, pos_categ_chairs.id)], + 'pos_categ_ids': [(4, pos_cat_chair_test.id)], }) cls.desk_organizer = env['product.product'].create({ 'name': 'Desk Organizer', @@ -505,6 +505,11 @@ class TestPointOfSaleHttpCommon(AccountTestInvoicingHttpCommon): 'available_pricelist_ids': [(4, pricelist.id) for pricelist in all_pricelists], }) + # Set customers + cls.partner_test_1 = cls.env['res.partner'].create({'name': 'Partner Test 1'}) + cls.partner_test_2 = cls.env['res.partner'].create({'name': 'Partner Test 2'}) + cls.partner_test_3 = cls.env['res.partner'].create({'name': 'Partner Test 3'}) + # Change the default sale pricelist of customers, # so the js tests can expect deterministically this pricelist when selecting a customer. env['ir.property']._set_default("property_product_pricelist", "res.partner", public_pricelist, main_company) @@ -747,8 +752,8 @@ class TestUi(TestPointOfSaleHttpCommon): 'only_round_cash_method': True }) - self.main_pos_config.open_ui() - self.start_tour("/pos/ui?config_id=%d" % self.main_pos_config.id, 'PaymentScreenRoundingHalfUpCashAndBank', login="accountman") + self.main_pos_config.with_user(self.pos_user).open_ui() + self.start_tour("/pos/ui?config_id=%d" % self.main_pos_config.id, 'PaymentScreenRoundingHalfUpCashAndBank', login="pos_user") invoiced_orders = self.env['pos.order'].search([('state', '=', 'invoiced')]) self.assertEqual(len(invoiced_orders), 2, 'There should be 2 invoiced orders.') @@ -867,8 +872,8 @@ class TestUi(TestPointOfSaleHttpCommon): self.start_tour("/pos/ui?config_id=%d" % self.main_pos_config.id, 'ReceiptScreenDiscountWithPricelistTour', login="pos_user") def test_07_pos_combo(self): - combo_product = setup_pos_combo_items(self) - combo_product.write({'lst_price': 50}) + setup_pos_combo_items(self) + self.office_combo.write({'lst_price': 50}) self.main_pos_config.with_user(self.pos_user).open_ui() self.start_tour(f"/pos/ui?config_id={self.main_pos_config.id}", 'PosComboPriceTaxIncludedTour', login="pos_user") order = self.env['pos.order'].search([]) @@ -977,8 +982,8 @@ class TestUi(TestPointOfSaleHttpCommon): 'barcode': '3760171283370', }) - self.main_pos_config.open_ui() - self.start_tour("/pos/ui?config_id=%d" % self.main_pos_config.id, 'GS1BarcodeScanningTour', login="accountman") + self.main_pos_config.with_user(self.pos_user).open_ui() + self.start_tour("/pos/ui?config_id=%d" % self.main_pos_config.id, 'GS1BarcodeScanningTour', login="pos_user") def test_refund_order_with_fp_tax_included(self): #create a tax of 15% tax included @@ -1020,8 +1025,8 @@ class TestUi(TestPointOfSaleHttpCommon): 'tax_regime_selection': True, }) - self.main_pos_config.open_ui() - self.start_tour("/pos/ui?config_id=%d" % self.main_pos_config.id, 'FiscalPositionNoTaxRefund', login="accountman") + self.main_pos_config.with_user(self.pos_user).open_ui() + self.start_tour("/pos/ui?config_id=%d" % self.main_pos_config.id, 'FiscalPositionNoTaxRefund', login="pos_user") def test_lot_refund(self): @@ -1033,8 +1038,8 @@ class TestUi(TestPointOfSaleHttpCommon): 'available_in_pos': True, }) - self.main_pos_config.open_ui() - self.start_tour("/pos/ui?config_id=%d" % self.main_pos_config.id, 'LotRefundTour', login="accountman") + self.main_pos_config.with_user(self.pos_user).open_ui() + self.start_tour("/pos/ui?config_id=%d" % self.main_pos_config.id, 'LotRefundTour', login="pos_user") def test_receipt_tracking_method(self): self.product_a = self.env['product.product'].create({ @@ -1044,8 +1049,8 @@ class TestUi(TestPointOfSaleHttpCommon): 'categ_id': self.env.ref('product.product_category_all').id, 'available_in_pos': True, }) - self.main_pos_config.open_ui() - self.start_tour("/pos/ui?config_id=%d" % self.main_pos_config.id, 'ReceiptTrackingMethodTour', login="accountman") + self.main_pos_config.with_user(self.pos_user).open_ui() + self.start_tour("/pos/ui?config_id=%d" % self.main_pos_config.id, 'ReceiptTrackingMethodTour', login="pos_user") def test_limited_product_pricelist_loading(self): self.env['ir.config_parameter'].sudo().set_param('point_of_sale.limited_product_count', '1') diff --git a/addons/pos_online_payment/tests/test_frontend.py b/addons/pos_online_payment/tests/test_frontend.py index 095ed62c459..119b0be0e8e 100644 --- a/addons/pos_online_payment/tests/test_frontend.py +++ b/addons/pos_online_payment/tests/test_frontend.py @@ -10,6 +10,7 @@ from odoo.addons.pos_online_payment.models.pos_order import PosOrder from odoo.addons.pos_online_payment.tests.online_payment_common import OnlinePaymentCommon from odoo.addons.account.models.account_payment_method import AccountPaymentMethod from odoo.osv.expression import AND +from odoo.addons.point_of_sale.tests.common import archive_products import odoo.tests @@ -108,6 +109,20 @@ class TestUi(AccountTestInvoicingCommon, OnlinePaymentCommon): cls.pos_user.partner_id.email = 'pos_op_user@test.com' # End of code from addons/point_of_sale/tests/test_frontend.py + archive_products(cls.env) + + pos_categ_misc = cls.env['pos.category'].create({ + 'name': 'Miscellaneous', + }) + cls.letter_tray = cls.env['product.product'].create({ + 'name': 'Letter Tray', + 'type': 'product', + 'available_in_pos': True, + 'list_price': 4.8, + 'taxes_id': False, + 'pos_categ_ids': [(4, pos_categ_misc.id)], + }) + # Code from addons/account_payment/tests/common.py @classmethod def _prepare_provider(cls, provider_code='none', company=None, update_values=None): diff --git a/addons/pos_restaurant/static/tests/tours/SplitBillScreen.tour.js b/addons/pos_restaurant/static/tests/tours/SplitBillScreen.tour.js index 5822d93b436..eac289cb80d 100644 --- a/addons/pos_restaurant/static/tests/tours/SplitBillScreen.tour.js +++ b/addons/pos_restaurant/static/tests/tours/SplitBillScreen.tour.js @@ -170,7 +170,7 @@ registry.category("web_tour.tours").add("SplitBillScreenTour4PosCombo", { ...SplitBillScreen.orderlineHas("Combo Product 4", "1", "0"), ...SplitBillScreen.orderlineHas("Combo Product 7", "1", "0"), - ...SplitBillScreen.subtotalIs("54.13"), + ...SplitBillScreen.subtotalIs("53.80"), ...SplitBillScreen.clickPay(), ...PaymentScreen.clickPaymentMethod("Bank"), ...PaymentScreen.clickValidate(), @@ -186,6 +186,6 @@ registry.category("web_tour.tours").add("SplitBillScreenTour4PosCombo", { ...ProductScreen.selectedOrderlineHas("Combo Product 4", "1.0", "14.66", "Office Combo"), ...ProductScreen.clickOrderline("Combo Product 7"), ...ProductScreen.selectedOrderlineHas("Combo Product 7", "1.0", "22.00", "Office Combo"), - ...ProductScreen.totalAmountIs("45.86"), + ...ProductScreen.totalAmountIs("45.53"), ], }); diff --git a/addons/pos_restaurant/tests/test_frontend.py b/addons/pos_restaurant/tests/test_frontend.py index 78f686399cc..cfafdd7e260 100644 --- a/addons/pos_restaurant/tests/test_frontend.py +++ b/addons/pos_restaurant/tests/test_frontend.py @@ -3,16 +3,14 @@ import odoo.tests from odoo.addons.point_of_sale.tests.common_setup_methods import setup_pos_combo_items +from odoo.addons.point_of_sale.tests.common import archive_products @odoo.tests.tagged('post_install', '-at_install') class TestFrontend(odoo.tests.HttpCase): def setUp(self): super().setUp() self.env = self.env(user=self.env.ref('base.user_admin')) - self.env.ref('base.user_demo').write({ - 'groups_id': [(4, self.env.ref('point_of_sale.group_pos_manager').id)], - }) - + archive_products(self.env) account_obj = self.env['account.account'] account_receivable = account_obj.create({'code': 'X1012', @@ -174,35 +172,46 @@ class TestFrontend(odoo.tests.HttpCase): self.pos_config = pos_config + self.pos_admin = self.env['res.users'].create({ + 'name': 'A powerfull PoS man!', + 'login': 'pos_admin', + 'password': 'pos_admin', + 'groups_id': [ + (4, self.env.ref('base.group_user').id), + (4, self.env.ref('point_of_sale.group_pos_manager').id), + ], + }) + self.pos_admin.partner_id.email = 'pos_admin@test.com' + def test_01_pos_restaurant(self): - self.pos_config.with_user(self.env.ref('base.user_demo')).open_ui() + self.pos_config.with_user(self.pos_admin).open_ui() - self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'pos_restaurant_sync', login="demo") + self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'pos_restaurant_sync', login="pos_admin") self.assertEqual(1, self.env['pos.order'].search_count([('amount_total', '=', 4.4), ('state', '=', 'draft')])) self.assertEqual(1, self.env['pos.order'].search_count([('amount_total', '=', 4.4), ('state', '=', 'paid')])) - self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'pos_restaurant_sync_second_login', login="demo") + self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'pos_restaurant_sync_second_login', login="pos_admin") self.assertEqual(0, self.env['pos.order'].search_count([('amount_total', '=', 4.4), ('state', '=', 'draft')])) self.assertEqual(1, self.env['pos.order'].search_count([('amount_total', '=', 2.2), ('state', '=', 'draft')])) self.assertEqual(2, self.env['pos.order'].search_count([('amount_total', '=', 4.4), ('state', '=', 'paid')])) def test_02_others(self): - self.pos_config.with_user(self.env.ref('base.user_demo')).open_ui() - self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'SplitBillScreenTour', login="demo") - self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'ControlButtonsTour', login="demo") - self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'FloorScreenTour', login="demo") + self.pos_config.with_user(self.pos_admin).open_ui() + self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'SplitBillScreenTour', login="pos_admin") + self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'ControlButtonsTour', login="pos_admin") + self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'FloorScreenTour', login="pos_admin") def test_04_ticket_screen(self): - self.pos_config.with_user(self.env.ref('base.user_demo')).open_ui() - self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'PosResTicketScreenTour', login="demo") + self.pos_config.with_user(self.pos_admin).open_ui() + self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'PosResTicketScreenTour', login="pos_admin") def test_05_tip_screen(self): self.pos_config.write({'set_tip_after_payment': True, 'iface_tipproduct': True, 'tip_product_id': self.env.ref('point_of_sale.product_product_tip')}) - self.pos_config.with_user(self.env.ref('base.user_demo')).open_ui() - self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'PosResTipScreenTour', login="demo") + self.pos_config.with_user(self.pos_admin).open_ui() + self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'PosResTipScreenTour', login="pos_admin") order1 = self.env['pos.order'].search([('pos_reference', 'ilike', '%-0001')], limit=1, order='id desc') order2 = self.env['pos.order'].search([('pos_reference', 'ilike', '%-0002')], limit=1, order='id desc') @@ -217,19 +226,20 @@ class TestFrontend(odoo.tests.HttpCase): self.assertTrue(order5.is_tipped and order5.tip_amount == 0.00) def test_06_split_bill_screen(self): - self.pos_config.with_user(self.env.ref('base.user_demo')).open_ui() - self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'SplitBillScreenTour2', login="demo") + self.pos_config.with_user(self.pos_admin).open_ui() + self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'SplitBillScreenTour2', login="pos_admin") def test_07_split_bill_screen(self): - self.pos_config.with_user(self.env.ref('base.user_demo')).open_ui() - self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'SplitBillScreenTour3', login="demo") + self.pos_config.with_user(self.pos_admin).open_ui() + self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'SplitBillScreenTour3', login="pos_admin") def test_08_refund_stay_current_table(self): - self.pos_config.with_user(self.env.ref('base.user_demo')).open_ui() - self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'RefundStayCurrentTableTour', login="demo") + + self.pos_config.with_user(self.pos_admin).open_ui() + self.start_tour("/pos/ui?config_id=%d" % self.pos_config.id, 'RefundStayCurrentTableTour', login="pos_admin") def test_09_combo_split_bill(self): - combo_product = setup_pos_combo_items(self) - combo_product.write({'lst_price': 40}) - self.pos_config.with_user(self.env.ref('base.user_demo')).open_ui() - self.start_tour(f"/pos/ui?config_id={self.pos_config.id}", 'SplitBillScreenTour4PosCombo', login="demo") + setup_pos_combo_items(self) + self.office_combo.write({'lst_price': 40}) + self.pos_config.with_user(self.pos_admin).open_ui() + self.start_tour(f"/pos/ui?config_id={self.pos_config.id}", 'SplitBillScreenTour4PosCombo', login="pos_admin") diff --git a/addons/pos_sale/tests/test_pos_sale_report.py b/addons/pos_sale/tests/test_pos_sale_report.py index a9e5464bcff..17f9a1d0686 100644 --- a/addons/pos_sale/tests/test_pos_sale_report.py +++ b/addons/pos_sale/tests/test_pos_sale_report.py @@ -84,19 +84,19 @@ class TestPoSSaleReport(TestPoSCommon): def test_different_shipping_address(self): product_0 = self.create_product('Product 0', self.categ_basic, 0.0, 0.0) sale_order = self.env['sale.order'].create({ - 'partner_id': self.env.ref('base.res_partner_1').id, - 'partner_shipping_id': self.env.ref('base.res_partner_2').id, + 'partner_id': self.customer.id, + 'partner_shipping_id': self.other_customer.id, 'order_line': [(0, 0, { 'product_id': product_0.id, })], }) self.open_new_session() - data = self.create_ui_order_data([(product_0, 1)], self.env.ref('base.res_partner_1'), True) + data = self.create_ui_order_data([(product_0, 1)], self.customer, True) data['data']['lines'][0][2]['sale_order_origin_id'] = sale_order.read()[0] data['data']['lines'][0][2]['sale_order_line_id'] = sale_order.order_line[0].read()[0] order_ids = self.env['pos.order'].create_from_ui([data]) move_id = self.env['account.move'].browse(order_ids[0]['account_move']) - self.assertEqual(move_id.partner_id.id, self.env.ref('base.res_partner_1').id) - self.assertEqual(move_id.partner_shipping_id.id, self.env.ref('base.res_partner_2').id) + self.assertEqual(move_id.partner_id.id, self.customer.id) + self.assertEqual(move_id.partner_shipping_id.id, self.other_customer.id) diff --git a/addons/pos_self_order/static/tests/tours/test_self_order_combo.js b/addons/pos_self_order/static/tests/tours/test_self_order_combo.js index 9f9195cf601..0ba48cda5c5 100644 --- a/addons/pos_self_order/static/tests/tours/test_self_order_combo.js +++ b/addons/pos_self_order/static/tests/tours/test_self_order_combo.js @@ -9,7 +9,7 @@ registry.category("web_tour.tours").add("self_combo_selector", { test: true, steps: () => [ Utils.clickBtn("Order Now"), - ProductPage.clickProduct("Office combo"), + ProductPage.clickProduct("Office Combo"), ...ProductPage.setupCombo([ { product: "Desk Organizer", @@ -19,16 +19,16 @@ registry.category("web_tour.tours").add("self_combo_selector", { ], }, { - product: "Desk Combination", + product: "Combo Product 5", attributes: [], }, { - product: "Office Chair Black", + product: "Combo Product 8", attributes: [], }, ]), Utils.clickBtn("Order"), - ...CartPage.checkCombo("Office combo", [ + ...CartPage.checkCombo("Office Combo", [ { product: "Desk Organizer", attributes: [ @@ -37,11 +37,11 @@ registry.category("web_tour.tours").add("self_combo_selector", { ], }, { - product: "Desk Combination", + product: "Combo Product 5", attributes: [], }, { - product: "Office Chair Black", + product: "Combo Product 8", attributes: [], }, ]), diff --git a/addons/pos_self_order/tests/self_order_common_test.py b/addons/pos_self_order/tests/self_order_common_test.py index c61e027885f..f96009fa213 100644 --- a/addons/pos_self_order/tests/self_order_common_test.py +++ b/addons/pos_self_order/tests/self_order_common_test.py @@ -4,7 +4,7 @@ import odoo.tests from odoo import Command - +from odoo.addons.point_of_sale.tests.common import archive_products @odoo.tests.tagged("post_install", "-at_install") class SelfOrderCommonTest(odoo.tests.HttpCase): @@ -14,6 +14,7 @@ class SelfOrderCommonTest(odoo.tests.HttpCase): @classmethod def setUpClass(cls): super().setUpClass() + archive_products(cls.env) cls.pos_user = cls.env['res.users'].create({ 'name': 'POS User', 'login': 'pos_user', @@ -33,6 +34,76 @@ class SelfOrderCommonTest(odoo.tests.HttpCase): ], }) + pos_categ_misc = cls.env['pos.category'].create({ + 'name': 'Miscellaneous', + }) + + cls.cola = cls.env['product.product'].create({ + 'name': 'Coca-Cola', + 'type': 'product', + 'list_price': 2.2, + 'taxes_id': False, + 'available_in_pos': True, + 'pos_categ_ids': [(4, pos_categ_misc.id)], + }) + cls.fanta = cls.env['product.product'].create({ + 'name': 'Fanta', + 'type': 'product', + 'list_price': 2.2, + 'taxes_id': False, + 'available_in_pos': True, + 'pos_categ_ids': [(4, pos_categ_misc.id)], + }) + + #desk organizer + cls.desk_organizer = cls.env['product.product'].create({ + 'name': 'Desk Organizer', + 'available_in_pos': True, + 'list_price': 5.10, + 'pos_categ_ids': [(4, pos_categ_misc.id)], + }) + desk_size_attribute = cls.env['product.attribute'].create({ + 'name': 'Size', + 'display_type': 'radio', + 'create_variant': 'no_variant', + }) + desk_size_s = cls.env['product.attribute.value'].create({ + 'name': 'S', + 'attribute_id': desk_size_attribute.id, + }) + desk_size_m = cls.env['product.attribute.value'].create({ + 'name': 'M', + 'attribute_id': desk_size_attribute.id, + }) + desk_size_l = cls.env['product.attribute.value'].create({ + 'name': 'L', + 'attribute_id': desk_size_attribute.id, + }) + cls.env['product.template.attribute.line'].create({ + 'product_tmpl_id': cls.desk_organizer.product_tmpl_id.id, + 'attribute_id': desk_size_attribute.id, + 'value_ids': [(6, 0, [desk_size_s.id, desk_size_m.id, desk_size_l.id])] + }) + desk_fabrics_attribute = cls.env['product.attribute'].create({ + 'name': 'Fabric', + 'display_type': 'select', + 'create_variant': 'no_variant', + }) + desk_fabrics_leather = cls.env['product.attribute.value'].create({ + 'name': 'Leather', + 'attribute_id': desk_fabrics_attribute.id, + }) + desk_fabrics_other = cls.env['product.attribute.value'].create({ + 'name': 'Custom', + 'attribute_id': desk_fabrics_attribute.id, + 'is_custom': True, + }) + cls.env['product.template.attribute.line'].create({ + 'product_tmpl_id': cls.desk_organizer.product_tmpl_id.id, + 'attribute_id': desk_fabrics_attribute.id, + 'value_ids': [(6, 0, [desk_fabrics_leather.id, desk_fabrics_other.id])] + }) + def _add_tax_to_product_from_different_company(self): new_company = self.env['res.company'].create({ 'name': 'Test Company', @@ -85,6 +156,22 @@ class SelfOrderCommonTest(odoo.tests.HttpCase): } ) + # We need a table and a floor to be able to do some tours when we do not have demo data. + # and thus no floors. + self.pos_main_floor = self.env['restaurant.floor'].create({ + 'name': 'Main Floor Test', + 'pos_config_ids': [(4, self.pos_config.id)], + }) + + self.pos_table_1 = self.env['restaurant.table'].create({ + 'name': '1', + 'floor_id': self.pos_main_floor.id, + 'seats': 4, + 'shape': 'square', + 'position_h': 150, + 'position_v': 100, + }) + # we need a default tax fixed at 15% to all product because in the test prices are based on this tax. # some time with the localization this may not be the case. So we force it. self.env["product.product"].search([]).taxes_id = self.default_tax15 diff --git a/addons/pos_self_order/tests/test_self_order_combo.py b/addons/pos_self_order/tests/test_self_order_combo.py index 4bcf3ae95f3..5acae8009e9 100644 --- a/addons/pos_self_order/tests/test_self_order_combo.py +++ b/addons/pos_self_order/tests/test_self_order_combo.py @@ -3,11 +3,20 @@ import odoo.tests from odoo.addons.pos_self_order.tests.self_order_common_test import SelfOrderCommonTest +from odoo.addons.point_of_sale.tests.common_setup_methods import setup_pos_combo_items @odoo.tests.tagged("post_install", "-at_install") class TestSelfOrderCombo(SelfOrderCommonTest): def test_self_order_combo(self): + setup_pos_combo_items(self) + desk_organizer_with_attributes_combo_line = self.env["pos.combo.line"].create( + { + "product_id": self.desk_organizer.id, + "combo_price": 0, + } + ) + self.desk_accessories_combo.combo_line_ids += desk_organizer_with_attributes_combo_line self.pos_config.write({ 'self_ordering_default_user_id': self.pos_admin.id, 'self_ordering_takeaway': False,