summaryrefslogtreecommitdiff
path: root/addons/repair/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/repair/tests
parent0a15094050bfde69a06d6eff798e9a8ddf2b8c21 (diff)
initial commit 2
Diffstat (limited to 'addons/repair/tests')
-rw-r--r--addons/repair/tests/__init__.py4
-rw-r--r--addons/repair/tests/test_repair.py323
2 files changed, 327 insertions, 0 deletions
diff --git a/addons/repair/tests/__init__.py b/addons/repair/tests/__init__.py
new file mode 100644
index 00000000..19767c49
--- /dev/null
+++ b/addons/repair/tests/__init__.py
@@ -0,0 +1,4 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+
+from . import test_repair
diff --git a/addons/repair/tests/test_repair.py b/addons/repair/tests/test_repair.py
new file mode 100644
index 00000000..ec7ef4f5
--- /dev/null
+++ b/addons/repair/tests/test_repair.py
@@ -0,0 +1,323 @@
+# -*- coding: utf-8 -*-
+# Part of Odoo. See LICENSE file for full copyright and licensing details.
+from odoo.addons.account.tests.common import AccountTestInvoicingCommon
+from odoo.tests import tagged, Form
+
+
+@tagged('post_install', '-at_install')
+class TestRepair(AccountTestInvoicingCommon):
+
+ @classmethod
+ def setUpClass(cls, chart_template_ref=None):
+ super().setUpClass(chart_template_ref=chart_template_ref)
+
+ # Partners
+ cls.res_partner_1 = cls.env['res.partner'].create({'name': 'Wood Corner'})
+ cls.res_partner_address_1 = cls.env['res.partner'].create({'name': 'Willie Burke', 'parent_id': cls.res_partner_1.id})
+ cls.res_partner_12 = cls.env['res.partner'].create({'name': 'Partner 12'})
+
+ # Products
+ cls.product_product_3 = cls.env['product.product'].create({'name': 'Desk Combination'})
+ cls.product_product_11 = cls.env['product.product'].create({'name': 'Conference Chair'})
+ cls.product_product_5 = cls.env['product.product'].create({'name': 'Product 5'})
+ cls.product_product_6 = cls.env['product.product'].create({'name': 'Large Cabinet'})
+ cls.product_product_12 = cls.env['product.product'].create({'name': 'Office Chair Black'})
+ cls.product_product_13 = cls.env['product.product'].create({'name': 'Corner Desk Left Sit'})
+ cls.product_product_2 = cls.env['product.product'].create({'name': 'Virtual Home Staging'})
+ cls.product_service_order_repair = cls.env['product.product'].create({
+ 'name': 'Repair Services',
+ 'type': 'service',
+ })
+
+ # Location
+ cls.stock_warehouse = cls.env['stock.warehouse'].search([('company_id', '=', cls.env.company.id)], limit=1)
+ cls.stock_location_14 = cls.env['stock.location'].create({
+ 'name': 'Shelf 2',
+ 'location_id': cls.stock_warehouse.lot_stock_id.id,
+ })
+
+ # Repair Orders
+ cls.repair1 = cls.env['repair.order'].create({
+ 'address_id': cls.res_partner_address_1.id,
+ 'guarantee_limit': '2019-01-01',
+ 'invoice_method': 'none',
+ 'user_id': False,
+ 'product_id': cls.product_product_3.id,
+ 'product_uom': cls.env.ref('uom.product_uom_unit').id,
+ 'partner_invoice_id': cls.res_partner_address_1.id,
+ 'location_id': cls.stock_warehouse.lot_stock_id.id,
+ 'operations': [
+ (0, 0, {
+ 'location_dest_id': cls.product_product_11.property_stock_production.id,
+ 'location_id': cls.stock_warehouse.lot_stock_id.id,
+ 'name': cls.product_product_11.get_product_multiline_description_sale(),
+ 'product_id': cls.product_product_11.id,
+ 'product_uom': cls.env.ref('uom.product_uom_unit').id,
+ 'product_uom_qty': 1.0,
+ 'price_unit': 50.0,
+ 'state': 'draft',
+ 'type': 'add',
+ 'company_id': cls.env.company.id,
+ })
+ ],
+ 'fees_lines': [
+ (0, 0, {
+ 'name': cls.product_service_order_repair.get_product_multiline_description_sale(),
+ 'product_id': cls.product_service_order_repair.id,
+ 'product_uom_qty': 1.0,
+ 'product_uom': cls.env.ref('uom.product_uom_unit').id,
+ 'price_unit': 50.0,
+ 'company_id': cls.env.company.id,
+ })
+ ],
+ 'partner_id': cls.res_partner_12.id,
+ })
+
+ cls.repair0 = cls.env['repair.order'].create({
+ 'product_id': cls.product_product_5.id,
+ 'product_uom': cls.env.ref('uom.product_uom_unit').id,
+ 'address_id': cls.res_partner_address_1.id,
+ 'guarantee_limit': '2019-01-01',
+ 'invoice_method': 'after_repair',
+ 'user_id': False,
+ 'partner_invoice_id': cls.res_partner_address_1.id,
+ 'location_id': cls.stock_warehouse.lot_stock_id.id,
+ 'operations': [
+ (0, 0, {
+ 'location_dest_id': cls.product_product_12.property_stock_production.id,
+ 'location_id': cls.stock_warehouse.lot_stock_id.id,
+ 'name': cls.product_product_12.get_product_multiline_description_sale(),
+ 'price_unit': 50.0,
+ 'product_id': cls.product_product_12.id,
+ 'product_uom': cls.env.ref('uom.product_uom_unit').id,
+ 'product_uom_qty': 1.0,
+ 'state': 'draft',
+ 'type': 'add',
+ 'company_id': cls.env.company.id,
+ })
+ ],
+ 'fees_lines': [
+ (0, 0, {
+ 'name': cls.product_service_order_repair.get_product_multiline_description_sale(),
+ 'product_id': cls.product_service_order_repair.id,
+ 'product_uom_qty': 1.0,
+ 'product_uom': cls.env.ref('uom.product_uom_unit').id,
+ 'price_unit': 50.0,
+ 'company_id': cls.env.company.id,
+ })
+ ],
+ 'partner_id': cls.res_partner_12.id,
+ })
+
+ cls.repair2 = cls.env['repair.order'].create({
+ 'product_id': cls.product_product_6.id,
+ 'product_uom': cls.env.ref('uom.product_uom_unit').id,
+ 'address_id': cls.res_partner_address_1.id,
+ 'guarantee_limit': '2019-01-01',
+ 'invoice_method': 'b4repair',
+ 'user_id': False,
+ 'partner_invoice_id': cls.res_partner_address_1.id,
+ 'location_id': cls.stock_location_14.id,
+ 'operations': [
+ (0, 0, {
+ 'location_dest_id': cls.product_product_13.property_stock_production.id,
+ 'location_id': cls.stock_warehouse.lot_stock_id.id,
+ 'name': cls.product_product_13.get_product_multiline_description_sale(),
+ 'price_unit': 50.0,
+ 'product_id': cls.product_product_13.id,
+ 'product_uom': cls.env.ref('uom.product_uom_unit').id,
+ 'product_uom_qty': 1.0,
+ 'state': 'draft',
+ 'type': 'add',
+ 'company_id': cls.env.company.id,
+ })
+ ],
+ 'fees_lines': [
+ (0, 0, {
+ 'name': cls.product_service_order_repair.get_product_multiline_description_sale(),
+ 'product_id': cls.product_service_order_repair.id,
+ 'product_uom_qty': 1.0,
+ 'product_uom': cls.env.ref('uom.product_uom_unit').id,
+ 'price_unit': 50.0,
+ 'company_id': cls.env.company.id,
+ })
+ ],
+ 'partner_id': cls.res_partner_12.id,
+ })
+
+ cls.env.user.groups_id |= cls.env.ref('stock.group_stock_user')
+
+ def _create_simple_repair_order(self, invoice_method):
+ product_to_repair = self.product_product_5
+ partner = self.res_partner_address_1
+ return self.env['repair.order'].create({
+ 'product_id': product_to_repair.id,
+ 'product_uom': product_to_repair.uom_id.id,
+ 'address_id': partner.id,
+ 'guarantee_limit': '2019-01-01',
+ 'invoice_method': invoice_method,
+ 'partner_invoice_id': partner.id,
+ 'location_id': self.stock_warehouse.lot_stock_id.id,
+ 'partner_id': self.res_partner_12.id
+ })
+
+ def _create_simple_operation(self, repair_id=False, qty=0.0, price_unit=0.0):
+ product_to_add = self.product_product_5
+ return self.env['repair.line'].create({
+ 'name': 'Add The product',
+ 'type': 'add',
+ 'product_id': product_to_add.id,
+ 'product_uom_qty': qty,
+ 'product_uom': product_to_add.uom_id.id,
+ 'price_unit': price_unit,
+ 'repair_id': repair_id,
+ 'location_id': self.stock_warehouse.lot_stock_id.id,
+ 'location_dest_id': product_to_add.property_stock_production.id,
+ 'company_id': self.env.company.id,
+ })
+
+ def _create_simple_fee(self, repair_id=False, qty=0.0, price_unit=0.0):
+ product_service = self.product_product_2
+ return self.env['repair.fee'].create({
+ 'name': 'PC Assemble + Custom (PC on Demand)',
+ 'product_id': product_service.id,
+ 'product_uom_qty': qty,
+ 'product_uom': product_service.uom_id.id,
+ 'price_unit': price_unit,
+ 'repair_id': repair_id,
+ 'company_id': self.env.company.id,
+ })
+
+ def test_00_repair_afterinv(self):
+ repair = self._create_simple_repair_order('after_repair')
+ self._create_simple_operation(repair_id=repair.id, qty=1.0, price_unit=50.0)
+ # I confirm Repair order taking Invoice Method 'After Repair'.
+ repair.action_repair_confirm()
+
+ # I check the state is in "Confirmed".
+ self.assertEqual(repair.state, "confirmed", 'Repair order should be in "Confirmed" state.')
+ repair.action_repair_start()
+
+ # I check the state is in "Under Repair".
+ self.assertEqual(repair.state, "under_repair", 'Repair order should be in "Under_repair" state.')
+
+ # Repairing process for product is in Done state and I end Repair process by clicking on "End Repair" button.
+ repair.action_repair_end()
+
+ # I define Invoice Method 'After Repair' option in this Repair order.so I create invoice by clicking on "Make Invoice" wizard.
+ make_invoice = self.env['repair.order.make_invoice'].create({
+ 'group': True})
+ # I click on "Create Invoice" button of this wizard to make invoice.
+ context = {
+ "active_model": 'repair_order',
+ "active_ids": [repair.id],
+ "active_id": repair.id
+ }
+ make_invoice.with_context(context).make_invoices()
+
+ # I check that invoice is created for this Repair order.
+ self.assertEqual(len(repair.invoice_id), 1, "No invoice exists for this repair order")
+ self.assertEqual(len(repair.move_id.move_line_ids[0].consume_line_ids), 1, "Consume lines should be set")
+
+ def test_01_repair_b4inv(self):
+ repair = self._create_simple_repair_order('b4repair')
+ # I confirm Repair order for Invoice Method 'Before Repair'.
+ repair.action_repair_confirm()
+
+ # I click on "Create Invoice" button of this wizard to make invoice.
+ repair.action_repair_invoice_create()
+
+ # I check that invoice is created for this Repair order.
+ self.assertEqual(len(repair.invoice_id), 1, "No invoice exists for this repair order")
+
+ def test_02_repair_noneinv(self):
+ repair = self._create_simple_repair_order('none')
+
+ # Add a new fee line
+ self._create_simple_fee(repair_id=repair.id, qty=1.0, price_unit=12.0)
+
+ self.assertEqual(repair.amount_total, 12, "Amount_total should be 12")
+ # Add new operation line
+ self._create_simple_operation(repair_id=repair.id, qty=1.0, price_unit=14.0)
+
+ self.assertEqual(repair.amount_total, 26, "Amount_total should be 26")
+
+ # I confirm Repair order for Invoice Method 'No Invoice'.
+ repair.action_repair_confirm()
+
+ # I start the repairing process by clicking on "Start Repair" button for Invoice Method 'No Invoice'.
+ repair.action_repair_start()
+
+ # I check its state which is in "Under Repair".
+ self.assertEqual(repair.state, "under_repair", 'Repair order should be in "Under_repair" state.')
+
+ # Repairing process for product is in Done state and I end this process by clicking on "End Repair" button.
+ repair.action_repair_end()
+
+ self.assertEqual(repair.move_id.location_id.id, self.stock_warehouse.lot_stock_id.id,
+ 'Repaired product was taken in the wrong location')
+ self.assertEqual(repair.move_id.location_dest_id.id, self.stock_warehouse.lot_stock_id.id,
+ 'Repaired product went to the wrong location')
+ self.assertEqual(repair.operations.move_id.location_id.id, self.stock_warehouse.lot_stock_id.id,
+ 'Consumed product was taken in the wrong location')
+ self.assertEqual(repair.operations.move_id.location_dest_id.id, self.product_product_5.property_stock_production.id,
+ 'Consumed product went to the wrong location')
+
+ # I define Invoice Method 'No Invoice' option in this repair order.
+ # So, I check that Invoice has not been created for this repair order.
+ self.assertNotEqual(len(repair.invoice_id), 1, "Invoice should not exist for this repair order")
+
+ def test_repair_state(self):
+ repair = self._create_simple_repair_order('b4repair')
+ repair.action_repair_confirm()
+ repair.action_repair_invoice_create()
+ repair.invoice_id.unlink()
+ # Repair order state should be changed to 2binvoiced so that new invoice can be created
+ self.assertEqual(repair.state, '2binvoiced', 'Repair order should be in 2binvoiced state, if invoice is deleted.')
+ repair.action_repair_invoice_create()
+ repair.action_repair_cancel()
+ # Repair order and linked invoice both should be cancelled.
+ self.assertEqual(repair.state, 'cancel', 'Repair order should be in cancel state.')
+ self.assertEqual(repair.invoice_id.state, 'cancel', 'Invoice should be in cancel state.')
+ repair.action_repair_cancel_draft()
+ # Linked invoice should be unlinked
+ self.assertEqual(len(repair.invoice_id), 0, "No invoice should be exists for this repair order")
+
+ def test_03_repair_multicompany(self):
+ """ This test ensures that the correct taxes are selected when the user fills in the RO form """
+
+ company01 = self.env.company
+ company02 = self.env['res.company'].create({
+ 'name': 'SuperCompany',
+ })
+
+ tax01 = self.env["account.tax"].create({
+ "name": "C01 Tax",
+ "amount": "0.00",
+ "company_id": company01.id
+ })
+ tax02 = self.env["account.tax"].create({
+ "name": "C02 Tax",
+ "amount": "0.00",
+ "company_id": company02.id
+ })
+
+ super_product = self.env['product.template'].create({
+ "name": "SuperProduct",
+ "taxes_id": [(4, tax01.id), (4, tax02.id)],
+ })
+ super_variant = super_product.product_variant_id
+ self.assertEqual(super_variant.taxes_id, tax01 | tax02)
+
+ ro_form = Form(self.env['repair.order'])
+ ro_form.product_id = super_variant
+ ro_form.partner_id = company01.partner_id
+ with ro_form.operations.new() as ro_line:
+ ro_line.product_id = super_variant
+ with ro_form.fees_lines.new() as fee_line:
+ fee_line.product_id = super_variant
+ repair_order = ro_form.save()
+
+ # tax02 should not be present since it belongs to the second company.
+ self.assertEqual(repair_order.operations.tax_id, tax01)
+ self.assertEqual(repair_order.fees_lines.tax_id, tax01)