# -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. from contextlib import contextmanager from unittest.mock import Mock, patch from odoo.tests.common import TransactionCase, tagged, Form @tagged('-standard', 'external') class TestDeliveryDHL(TransactionCase): def setUp(self): super(TestDeliveryDHL, self).setUp() self.iPadMini = self.env['product.product'].create({ 'name': 'Ipad Mini', 'weight': 0.01, }) self.large_desk = self.env['product.product'].create({ 'name': 'Large Desk', 'weight': 0.01, }) self.uom_unit = self.env.ref('uom.product_uom_unit') self.your_company = self.env.ref('base.main_partner') self.your_company.write({ 'street': "Rue du Laid Burniat 5", 'street2': "", 'city': "Ottignies-Louvain-la-Neuve", 'zip': 1348, 'state_id': False, 'country_id': self.env.ref('base.be').id, 'phone': '+1 555-555-5555', }) self.agrolait = self.env['res.partner'].create({ 'name': 'Agrolait', 'phone': '(603)-996-3829', 'street': "rue des Bourlottes, 9", 'street2': "", 'city': "Ramillies", 'zip': 1367, 'state_id': False, 'country_id': self.env.ref('base.be').id, }) self.delta_pc = self.env['res.partner'].create({ 'name': 'Delta PC', 'phone': '(803)-873-6126', 'street': "1515 Main Street", 'street2': "", 'city': "Columbia", 'zip': 29201, 'state_id': self.env.ref('base.state_us_41').id, 'country_id': self.env.ref('base.us').id, }) self.stock_location = self.env.ref('stock.stock_location_stock') self.customer_location = self.env.ref('stock.stock_location_customers') self.delivery_carrier_dhl_eu_dom = self.env.ref('delivery_dhl.delivery_carrier_dhl_eu_dom', raise_if_not_found=False) if not self.delivery_carrier_dhl_eu_dom: product_dhl = self.env['product.product'].create({ "name": 'DHL EU', "default_code": 'Delivery_014', "type": 'service', "categ_id": self.env.ref('delivery.product_category_deliveries').id, "sale_ok": False, "purchase_ok": False, "list_price": 0.0, "invoice_policy": 'order', }) self.delivery_carrier_dhl_eu_dom = self.env['delivery.carrier'].create({ "name": 'DHL EU', "product_id": product_dhl.id, "delivery_type": 'dhl', "dhl_product_code": 'N', "dhl_SiteID": 'v62_X4e7G4Ww0y', "dhl_password": '7UvboGP0tD', "dhl_account_number": '272699353', "dhl_default_package_type_id": self.env.ref('delivery_dhl.dhl_packaging_BOX').id, }) self.delivery_carrier_dhl_eu_intl = self.env.ref('delivery_dhl.delivery_carrier_dhl_eu_intl', raise_if_not_found=False) if not self.delivery_carrier_dhl_eu_intl: product_dhl = self.env['product.product'].create({ "name": 'DHL EU International', "default_code": 'Delivery_015', "type": 'service', "categ_id": self.env.ref('delivery.product_category_deliveries').id, "sale_ok": False, "purchase_ok": False, "list_price": 0.0, "invoice_policy": 'order', }) self.delivery_carrier_dhl_eu_intl = self.env['delivery.carrier'].create({ "name": 'DHL EU International', "product_id": product_dhl.id, "delivery_type": 'dhl', "dhl_product_code": 'D', "dhl_SiteID": 'v62_X4e7G4Ww0y', "dhl_password": '7UvboGP0tD', "dhl_account_number": '272699353', "dhl_default_package_type_id": self.env.ref('delivery_dhl.dhl_packaging_BOX').id, }) def wiz_put_in_pack(self, picking): """ Helper to use the 'choose.delivery.package' wizard in order to call the 'action_put_in_pack' method. """ wiz_action = picking.action_put_in_pack() self.assertEqual(wiz_action['res_model'], 'choose.delivery.package', 'Wrong wizard returned') wiz = Form(self.env[wiz_action['res_model']].with_context(wiz_action['context']).create({ 'delivery_package_type_id': picking.carrier_id.dhl_default_package_type_id.id })) choose_delivery_carrier = wiz.save() choose_delivery_carrier.action_put_in_pack() def test_01_dhl_basic_be_domestic_flow(self): SaleOrder = self.env['sale.order'] sol_vals = {'product_id': self.iPadMini.id, 'name': "[A1232] Large Cabinet", 'product_uom': self.uom_unit.id, 'product_uom_qty': 1.0, 'price_unit': self.iPadMini.lst_price} so_vals = {'partner_id': self.agrolait.id, 'order_line': [(0, None, sol_vals)]} sale_order = SaleOrder.create(so_vals) # I add free delivery cost in Sales order delivery_wizard = Form(self.env['choose.delivery.carrier'].with_context({ 'default_order_id': sale_order.id, 'default_carrier_id': self.delivery_carrier_dhl_eu_dom.id })) choose_delivery_carrier = delivery_wizard.save() choose_delivery_carrier.update_price() # DHL test server will return 0.0... # self.assertGreater(sale_order.delivery_price, 0.0, "DHL delivery cost for this SO has not been correctly estimated.") choose_delivery_carrier.button_confirm() sale_order.action_confirm() self.assertEqual(len(sale_order.picking_ids), 1, "The Sales Order did not generate a picking.") picking = sale_order.picking_ids[0] picking.move_ids[0].picked = True self.assertEqual(picking.carrier_id.id, sale_order.carrier_id.id, "Carrier is not the same on Picking and on SO.") picking.move_ids[0].quantity = 1.0 self.assertGreater(picking.shipping_weight, 0.0, "Picking weight should be positive.") picking._action_done() self.assertIsNot(picking.carrier_tracking_ref, False, "DHL did not return any tracking number") # self.assertGreater(picking.carrier_price, 0.0, "DHL carrying price is probably incorrect") picking.cancel_shipment() self.assertFalse(picking.carrier_tracking_ref, "Carrier Tracking code has not been properly deleted") self.assertEqual(picking.carrier_price, 0.0, "Carrier price has not been properly deleted") def test_02_dhl_basic_international_flow(self): SaleOrder = self.env['sale.order'] sol_vals = {'product_id': self.iPadMini.id, 'name': "[A1232] Large Cabinet", 'product_uom': self.uom_unit.id, 'product_uom_qty': 1.0, 'price_unit': self.iPadMini.lst_price} so_vals = {'partner_id': self.delta_pc.id, 'carrier_id': self.delivery_carrier_dhl_eu_intl.id, 'order_line': [(0, None, sol_vals)]} sale_order = SaleOrder.create(so_vals) # I add free delivery cost in Sales order delivery_wizard = Form(self.env['choose.delivery.carrier'].with_context({ 'default_order_id': sale_order.id, 'default_carrier_id': self.delivery_carrier_dhl_eu_intl.id })) choose_delivery_carrier = delivery_wizard.save() choose_delivery_carrier.update_price() # DHL test server will return 0.0... # self.assertGreater(sale_order.delivery_price, 0.0, "DHL delivery cost for this SO has not been correctly estimated.") choose_delivery_carrier.button_confirm() sale_order.action_confirm() self.assertEqual(len(sale_order.picking_ids), 1, "The Sales Order did not generate a picking.") picking = sale_order.picking_ids[0] self.assertEqual(picking.carrier_id.id, sale_order.carrier_id.id, "Carrier is not the same on Picking and on SO.") picking.move_ids[0].quantity = 1.0 picking.move_ids[0].picked = True self.assertGreater(picking.shipping_weight, 0.0, "Picking weight should be positive.") picking._action_done() self.assertIsNot(picking.carrier_tracking_ref, False, "DHL did not return any tracking number") # self.assertGreater(picking.carrier_price, 0.0, "DHL carrying price is probably incorrect") picking.cancel_shipment() self.assertFalse(picking.carrier_tracking_ref, "Carrier Tracking code has not been properly deleted") self.assertEqual(picking.carrier_price, 0.0, "Carrier price has not been properly deleted") def test_03_dhl_multipackage_international_flow(self): SaleOrder = self.env['sale.order'] sol_1_vals = {'product_id': self.iPadMini.id, 'name': "[A1232] Large Cabinet", 'product_uom': self.uom_unit.id, 'product_uom_qty': 1.0, 'price_unit': self.iPadMini.lst_price} sol_2_vals = {'product_id': self.large_desk.id, 'name': "[A1090] Large Desk", 'product_uom': self.uom_unit.id, 'product_uom_qty': 1.0, 'price_unit': self.large_desk.lst_price} so_vals = {'partner_id': self.delta_pc.id, 'carrier_id': self.delivery_carrier_dhl_eu_intl.id, 'order_line': [(0, None, sol_1_vals), (0, None, sol_2_vals)]} sale_order = SaleOrder.create(so_vals) # I add free delivery cost in Sales order delivery_wizard = Form(self.env['choose.delivery.carrier'].with_context({ 'default_order_id': sale_order.id, 'default_carrier_id': self.delivery_carrier_dhl_eu_intl.id })) choose_delivery_carrier = delivery_wizard.save() choose_delivery_carrier.update_price() # DHL test server will return 0.0... # self.assertGreater(sale_order.delivery_price, 0.0, "DHL delivery cost for this SO has not been correctly estimated.") choose_delivery_carrier.button_confirm() sale_order.action_confirm() self.assertEqual(len(sale_order.picking_ids), 1, "The Sales Order did not generate a picking.") picking = sale_order.picking_ids[0] self.assertEqual(picking.carrier_id.id, sale_order.carrier_id.id, "Carrier is not the same on Picking and on SO.") move0 = picking.move_ids[0] move0.quantity = 1.0 move0.picked = True self.wiz_put_in_pack(picking) move1 = picking.move_ids[1] move1.quantity = 1.0 move1.picked = True self.wiz_put_in_pack(picking) self.assertEqual(len(picking.move_line_ids.mapped('result_package_id')), 2, "2 Packages should have been created at this point") self.assertGreater(picking.shipping_weight, 0.0, "Picking weight should be positive.") picking._action_done() self.assertIsNot(picking.carrier_tracking_ref, False, "DHL did not return any tracking number") # self.assertGreater(picking.carrier_price, 0.0, "DHL carrying price is probably incorrect") picking.cancel_shipment() self.assertFalse(picking.carrier_tracking_ref, "Carrier Tracking code has not been properly deleted") self.assertEqual(picking.carrier_price, 0.0, "Carrier price has not been properly deleted") def test_04_dhl_flow_from_delivery_order(self): StockPicking = self.env['stock.picking'] order1_vals = { 'product_id': self.iPadMini.id, 'name': "[A1232] iPad Mini", 'product_uom': self.uom_unit.id, 'product_uom_qty': 1.0, 'location_id': self.stock_location.id, 'location_dest_id': self.customer_location.id} do_vals = {'partner_id': self.delta_pc.id, 'carrier_id': self.delivery_carrier_dhl_eu_intl.id, 'location_id': self.stock_location.id, 'location_dest_id': self.customer_location.id, 'picking_type_id': self.env.ref('stock.picking_type_out').id, 'state': 'draft', 'move_ids_without_package': [(0, None, order1_vals)]} delivery_order = StockPicking.create(do_vals) self.assertEqual(delivery_order.state, 'draft', 'Shipment state should be draft.') delivery_order.action_confirm() self.assertEqual(delivery_order.state, 'assigned', 'Shipment state should be ready(assigned).') delivery_order.move_ids_without_package.quantity = 1.0 delivery_order.button_validate() self.assertEqual(delivery_order.state, 'done', 'Shipment state should be done.') @tagged('standard', '-external') class TestMockedDeliveryDHL(TestDeliveryDHL): @contextmanager def patch_dhl_requests(self): """ Mock context for requests to the DHL API. """ class MockedSession: def __init__(self, *args, **kwargs): self.headers = dict() def mount(self, *args, **kwargs): return None def close(self, *args, **kwargs): return None def post(self, *args, **kwargs): response = Mock() if b'