diff --git a/addons/repair/tests/test_repair.py b/addons/repair/tests/test_repair.py index 2a2e5f53f77..2a412a660df 100644 --- a/addons/repair/tests/test_repair.py +++ b/addons/repair/tests/test_repair.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +from datetime import datetime + from odoo.addons.account.tests.account_test_classes import AccountingTestCase from odoo.tests import tagged @@ -34,20 +36,60 @@ class TestRepair(AccountingTestCase): 'email': 'repair_manager@yourcompany.com', 'groups_id': [(6, 0, [self.res_group_manager.id])]}) - def test_00_repair_afterinv(self): + def _create_simple_repair_order(self, invoice_method): + product_to_repair = self.env.ref('product.product_product_5') + partner = self.env.ref('base.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': datetime.today().strftime('%Y-%m-%d'), + 'invoice_method': invoice_method, + 'partner_invoice_id': partner.id, + 'location_id': self.env.ref('stock.stock_location_stock').id, + 'partner_id': self.env.ref('base.res_partner_12').id + }) + def _create_simple_operation(self, repair_id=False, qty=0.0, price_unit=0.0): + product_to_add = self.env.ref('product.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.env.ref('stock.stock_location_stock').id, + 'location_dest_id': self.env.ref('stock.location_production').id, + }) + + def _create_simple_fee(self, repair_id=False, qty=0.0, price_unit=0.0): + product_service = self.env.ref('product.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, + }) + + 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'. - self.repair_r0.sudo(self.res_repair_user.id).action_repair_confirm() + repair.sudo(self.res_repair_user.id).action_repair_confirm() # I check the state is in "Confirmed". - self.assertEqual(self.repair_r0.state, "confirmed", 'Repair order should be in "Confirmed" state.') - self.repair_r0.action_repair_start() + 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(self.repair_r0.state, "under_repair", 'Repair order should be in "Under_repair" state.') + 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. - self.repair_r0.action_repair_end() + 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.RepairMakeInvoice.create({ @@ -55,66 +97,59 @@ class TestRepair(AccountingTestCase): # I click on "Create Invoice" button of this wizard to make invoice. context = { "active_model": 'repair_order', - "active_ids": [self.repair_r0.id], - "active_id": self.repair_r0.id + "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(self.repair_r0.invoice_id), 1, "No invoice exists for this repair order") - self.assertEqual(len(self.repair_r0.move_id.move_line_ids[0].consume_line_ids), 1, "Consume lines should be set") - - def test_01_epair_b4inv(self): + 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'. - self.repair_r2.sudo(self.res_repair_user.id).action_repair_confirm() + repair.sudo(self.res_repair_user.id).action_repair_confirm() # I click on "Create Invoice" button of this wizard to make invoice. - self.repair_r2.action_repair_invoice_create() + repair.action_repair_invoice_create() # I check that invoice is created for this Repair order. - self.assertEqual(len(self.repair_r2.invoice_id), 1, "No invoice exists for this repair order") - - # I start the Repairing process by clicking on "Start Repair" button. - self.repair_r2.action_repair_start() - - # Repairing process for this product is in Done state and I end this process by clicking on "End Repair" button for Invoice Method 'Before Repair'. - self.repair_r2.action_repair_end() + 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'. - self.repair_r1.sudo(self.res_repair_user.id).action_repair_confirm() + repair.sudo(self.res_repair_user.id).action_repair_confirm() # I start the repairing process by clicking on "Start Repair" button for Invoice Method 'No Invoice'. - self.repair_r1.action_repair_start() + repair.action_repair_start() # I check its state which is in "Under Repair". - self.assertEqual(self.repair_r1.state, "under_repair", 'Repair order should be in "Under_repair" state.') + 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. - self.repair_r1.action_repair_end() + repair.action_repair_end() + + self.assertEqual(repair.move_id.location_id.id, self.env.ref('stock.stock_location_stock').id, + 'Repaired product was taken in the wrong location') + self.assertEqual(repair.move_id.location_dest_id.id, self.env.ref('stock.stock_location_stock').id, + 'Repaired product went to the wrong location') + self.assertEqual(repair.operations.move_id.location_id.id, self.env.ref('stock.stock_location_stock').id, + 'Consumed product was taken in the wrong location') + self.assertEqual(repair.operations.move_id.location_dest_id.id, self.env.ref('stock.location_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(self.repair_r1.invoice_id), 1, "Invoice should not exist for this repair order") - - def test_03_repair_fee(self): - # I check the total amount of repair_r1 is 100 - self.assertEqual(self.repair_r1.amount_total, 100, "Amount_total should be 100") - - # I add a new fee line - - product_assembly = self.env.ref('product.product_product_5') - product_uom_hour = self.env.ref('product.product_uom_hour') - self.RepairFee = self.env['repair.fee'] - - self.RepairFee.create({ - 'name': 'PC Assemble + Custom (PC on Demand)', - 'product_id': product_assembly.id, - 'product_uom_qty': 1.0, - 'product_uom': product_uom_hour.id, - 'price_unit': 12.0, - 'repair_id': self.repair_r1.id}) - # I check the total amount of repair_r1 is now 112 - self.assertEqual(self.repair_r1.amount_total, 112, "Amount_total should be 100") + self.assertNotEqual(len(repair.invoice_id), 1, "Invoice should not exist for this repair order")