forked from Mapan/odoo17e
239 lines
11 KiB
Python
239 lines
11 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
|
import logging
|
|
import re
|
|
from odoo.exceptions import UserError
|
|
from odoo.tests.common import TransactionCase, tagged, Form
|
|
|
|
|
|
_logger = logging.getLogger(__name__)
|
|
country_unavailable_msg = 'USPS temporary unavailable in %s, test aborted.'
|
|
country_unavailable_re = re.compile(
|
|
r'No services available\.\n'
|
|
r'At this time, all mail services to (\w+) are not available\.')
|
|
|
|
|
|
@tagged('-standard', 'external')
|
|
class TestDeliveryUSPS(TransactionCase):
|
|
|
|
def setUp(self):
|
|
super(TestDeliveryUSPS, self).setUp()
|
|
|
|
self.iPadMini = self.env.ref('product.product_product_6')
|
|
|
|
# Add a full address to "Your Company"
|
|
self.your_company = self.env.ref('base.main_partner')
|
|
self.your_company.write({'country_id': self.env.ref('base.us').id,
|
|
'state_id': self.env.ref('base.state_us_5').id,
|
|
'city': 'San Francisco',
|
|
'street': '51 Federal Street',
|
|
'zip': '94107',
|
|
'phone': 9874582356})
|
|
self.agrolait = self.env.ref('base.res_partner_2')
|
|
self.agrolait.write({'street': "rue des Bourlottes, 9",
|
|
'street2': "",
|
|
'city': "Ramillies",
|
|
'zip': 1367,
|
|
'state_id': False,
|
|
'country_id': self.env.ref('base.be').id})
|
|
self.think_big_system = self.env.ref('base.res_partner_18')
|
|
self.think_big_system.write({'phone': 3132223456,
|
|
'street': '1 Infinite Loop',
|
|
'street2': 'Tower 2',
|
|
'city': 'Cupertino',
|
|
'state_id': self.env.ref('base.state_us_13').id,
|
|
'country_id': self.env.ref('base.us').id,
|
|
'zip': '95014-2083'})
|
|
# additional test address for Canada
|
|
self.quebec = self.env.ref('base.state_ca_qc')
|
|
self.montreal = self.env['res.partner'].create({'name': 'Vieux-Port de Montreal',
|
|
'street': '333 Rue de la Commune O',
|
|
'city': 'Montreal',
|
|
'zip': 'H2Y2E2',
|
|
'state_id': self.quebec.id,
|
|
'country_id': self.env.ref('base.ca').id})
|
|
self.stock_location = self.env.ref('stock.stock_location_stock')
|
|
self.customer_location = self.env.ref('stock.stock_location_customers')
|
|
self.uom_unit = self.env.ref('uom.product_uom_unit')
|
|
|
|
def test_01_usps_basic_us_domestic_flow(self):
|
|
SaleOrder = self.env['sale.order']
|
|
|
|
sol_vals = {'product_id': self.iPadMini.id,
|
|
'name': "[A1232] Large Cabinet",
|
|
'product_uom': self.env.ref('uom.product_uom_unit').id,
|
|
'product_uom_qty': 1.0,
|
|
'price_unit': self.iPadMini.lst_price}
|
|
|
|
so_vals = {'partner_id': self.think_big_system.id,
|
|
'order_line': [(0, None, sol_vals)]}
|
|
|
|
sale_order = SaleOrder.create(so_vals)
|
|
# I add 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.env.ref('delivery_usps.delivery_carrier_usps_domestic').id,
|
|
}))
|
|
choose_delivery_carrier = delivery_wizard.save()
|
|
try:
|
|
choose_delivery_carrier.update_price()
|
|
except UserError as exc:
|
|
m = country_unavailable_re.search(exc.args[0])
|
|
if m:
|
|
_logger.warning(country_unavailable_msg, m.group(1))
|
|
return
|
|
raise
|
|
self.assertGreater(choose_delivery_carrier.delivery_price, 0.0, "USPS 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, "USPS did not return any tracking number")
|
|
self.assertGreater(picking.carrier_price, 0.0, "USPS 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_usps_basic_international_flow(self):
|
|
SaleOrder = self.env['sale.order']
|
|
|
|
sol_vals = {'product_id': self.iPadMini.id,
|
|
'name': "[A1232] Large Cabinet",
|
|
'product_uom': self.env.ref('uom.product_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 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.env.ref('delivery_usps.delivery_carrier_usps_international').id,
|
|
}))
|
|
choose_delivery_carrier = delivery_wizard.save()
|
|
try:
|
|
choose_delivery_carrier.update_price()
|
|
except UserError as exc:
|
|
m = country_unavailable_re.search(exc.args[0])
|
|
if m:
|
|
_logger.warning(country_unavailable_msg, m.group(1))
|
|
return
|
|
raise
|
|
self.assertGreater(choose_delivery_carrier.delivery_price, 0.0, "USPS 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, "USPS did not return any tracking number")
|
|
self.assertGreater(picking.carrier_price, 0.0, "USPS 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_usps_ship_to_canada_flow(self):
|
|
SaleOrder = self.env['sale.order']
|
|
|
|
sol_vals = {'product_id': self.iPadMini.id,
|
|
'name': "[A1232] Large Cabinet",
|
|
'product_uom': self.env.ref('uom.product_uom_unit').id,
|
|
'product_uom_qty': 1.0,
|
|
'price_unit': self.iPadMini.lst_price}
|
|
|
|
so_vals = {'partner_id': self.montreal.id,
|
|
'order_line': [(0, None, sol_vals)]}
|
|
|
|
sale_order = SaleOrder.create(so_vals)
|
|
# I add 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.env.ref('delivery_usps.delivery_carrier_usps_international').id,
|
|
}))
|
|
choose_delivery_carrier = delivery_wizard.save()
|
|
try:
|
|
choose_delivery_carrier.update_price()
|
|
except UserError as exc:
|
|
m = country_unavailable_re.search(exc.args[0])
|
|
if m:
|
|
_logger.warning(country_unavailable_msg, m.group(1))
|
|
return
|
|
raise
|
|
self.assertGreater(choose_delivery_carrier.delivery_price, 0.0, "USPS 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 Sale 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, "USPS did not return any tracking number")
|
|
self.assertGreater(picking.carrier_price, 0.0, "USPS 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_usps_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.agrolait.id,
|
|
'carrier_id': self.env.ref('delivery_usps.delivery_carrier_usps_international').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
|
|
|
|
try:
|
|
delivery_order.button_validate()
|
|
except UserError as exc:
|
|
m = country_unavailable_re.search(exc.args[0])
|
|
if m:
|
|
_logger.warning(country_unavailable_msg, m.group(1))
|
|
return
|
|
raise
|
|
self.assertEqual(delivery_order.state, 'done', 'Shipment state should be done.')
|