mirror of
https://github.com/bringout/oca-ocb-sale.git
synced 2026-04-27 16:51:59 +02:00
Initial commit: Sale packages
This commit is contained in:
commit
14e3d26998
6469 changed files with 2479670 additions and 0 deletions
|
|
@ -0,0 +1,8 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from . import test_express_checkout_flows
|
||||
from . import test_ui
|
||||
from . import test_controller
|
||||
from . import test_sale_order
|
||||
from . import test_website_sale_controller
|
||||
|
|
@ -0,0 +1,149 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from unittest.mock import patch
|
||||
|
||||
from odoo.exceptions import UserError, ValidationError
|
||||
from odoo.fields import Command
|
||||
from odoo.tests import tagged
|
||||
|
||||
from odoo.addons.payment.tests.common import PaymentCommon
|
||||
from odoo.addons.sale.tests.common import SaleCommon
|
||||
from odoo.addons.website_sale_delivery.controllers.main import WebsiteSaleDelivery, PaymentPortalDelivery
|
||||
from odoo.addons.website.tools import MockRequest
|
||||
|
||||
@tagged('post_install', '-at_install')
|
||||
class TestWebsiteSaleDeliveryController(PaymentCommon, SaleCommon):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.website = self.env.ref('website.default_website')
|
||||
self.Controller = WebsiteSaleDelivery()
|
||||
|
||||
# test that changing the carrier while there is a pending transaction raises an error
|
||||
def test_controller_change_carrier_when_transaction(self):
|
||||
with MockRequest(self.env, website=self.website):
|
||||
order = self.website.sale_get_order(force_create=True)
|
||||
order.transaction_ids = self._create_transaction(flow='redirect', state='pending')
|
||||
with self.assertRaises(UserError):
|
||||
with patch(
|
||||
'odoo.addons.website_sale.models.website.Website.sale_get_order',
|
||||
return_value=order,
|
||||
): # Patch to retrieve the order even if it is linked to a pending transaction.
|
||||
self.Controller.update_eshop_carrier(carrier_id=1)
|
||||
|
||||
# test that changing the carrier while there is a draft transaction doesn't raise an error
|
||||
def test_controller_change_carrier_when_draft_transaction(self):
|
||||
with MockRequest(self.env, website=self.website):
|
||||
order = self.website.sale_get_order(force_create=True)
|
||||
order.transaction_ids = self._create_transaction(flow='redirect', state='draft')
|
||||
self.Controller.update_eshop_carrier(carrier_id=1)
|
||||
|
||||
def test_address_states(self):
|
||||
US = self.env.ref('base.us')
|
||||
MX = self.env.ref('base.mx')
|
||||
|
||||
# Set all carriers to mexico
|
||||
self.env['delivery.carrier'].sudo().search([('website_published', '=', True)]).country_ids = [(6, 0, [MX.id])]
|
||||
|
||||
# Create a new carrier to only one state in mexico
|
||||
self.env['delivery.carrier'].create({
|
||||
'name': "One_state",
|
||||
'product_id': self.env['product.product'].create({'name': "delivery product"}).id,
|
||||
'website_published': True,
|
||||
'country_ids': [(6, 0, [MX.id])],
|
||||
'state_ids': [(6, 0, [MX.state_ids.ids[0]])]
|
||||
})
|
||||
|
||||
country_info = self.Controller.country_infos(country=MX, mode="shipping")
|
||||
self.assertEqual(len(country_info['states']), len(MX.state_ids))
|
||||
|
||||
country_info = self.Controller.country_infos(country=US, mode="shipping")
|
||||
self.assertEqual(len(country_info['states']), 0)
|
||||
|
||||
def test_available_methods(self):
|
||||
self.env['delivery.carrier'].search([]).action_archive()
|
||||
self.product_delivery_poste = self.env['product.product'].create({
|
||||
'name': 'The Poste',
|
||||
'type': 'service',
|
||||
'categ_id': self.env.ref('delivery.product_category_deliveries').id,
|
||||
'sale_ok': False,
|
||||
'purchase_ok': False,
|
||||
'list_price': 20.0,
|
||||
})
|
||||
self.env['delivery.carrier'].create([
|
||||
{
|
||||
'name': 'Over 300',
|
||||
'delivery_type': 'base_on_rule',
|
||||
'product_id': self.product_delivery_poste.id,
|
||||
'website_published': True,
|
||||
'price_rule_ids': [
|
||||
Command.create({
|
||||
'operator': '>=',
|
||||
'max_value': 300,
|
||||
'variable': 'price',
|
||||
}),
|
||||
],
|
||||
}, {
|
||||
'name': 'Under 300',
|
||||
'delivery_type': 'base_on_rule',
|
||||
'product_id': self.product_delivery_poste.id,
|
||||
'website_published': True,
|
||||
'price_rule_ids': [
|
||||
Command.create({
|
||||
'operator': '<',
|
||||
'max_value': 300,
|
||||
'variable': 'price',
|
||||
}),
|
||||
],
|
||||
}, {
|
||||
'name': 'No rules',
|
||||
'delivery_type': 'base_on_rule',
|
||||
'product_id': self.product_delivery_poste.id,
|
||||
'website_published': True,
|
||||
}, {
|
||||
'name': 'Fixed',
|
||||
'product_id': self.product_delivery_poste.id,
|
||||
'website_published': True,
|
||||
},
|
||||
])
|
||||
|
||||
self.assertEqual(self.empty_order._get_delivery_methods().mapped('name'), ['Under 300', 'Fixed'])
|
||||
|
||||
def test_validate_payment_with_no_available_delivery_method(self):
|
||||
"""
|
||||
An error should be raised if you try to validate an order with a storable
|
||||
product without any delivery method available
|
||||
"""
|
||||
storable_product = self.env['product.product'].create({
|
||||
'name': 'Storable Product',
|
||||
'sale_ok': True,
|
||||
'type': 'product',
|
||||
'website_published': True,
|
||||
})
|
||||
carriers = self.env['delivery.carrier'].search([])
|
||||
carriers.write({'website_published': False})
|
||||
|
||||
with MockRequest(self.env, website=self.website):
|
||||
self.website.sale_get_order(force_create=True)
|
||||
self.Controller.cart_update_json(product_id=storable_product.id, add_qty=1)
|
||||
with self.assertRaises(ValidationError):
|
||||
self.Controller.shop_payment_validate()
|
||||
|
||||
def test_check_order_delivery_before_payment(self):
|
||||
product = self.env['product.product'].create({
|
||||
'name': 'Test Product',
|
||||
'sale_ok': True,
|
||||
'website_published': True,
|
||||
'lst_price': 1000.0,
|
||||
'standard_price': 800.0,
|
||||
})
|
||||
website = self.website.with_user(self.public_user)
|
||||
with MockRequest(product.with_user(self.public_user).env, website=website):
|
||||
sale_order = self.env['sale.order'].create({
|
||||
'partner_id': self.public_user.id,
|
||||
'order_line': [Command.create({'product_id': product.id})],
|
||||
'access_token': 'test_token',
|
||||
})
|
||||
# Try processing payment with a storable product and no carrier_id
|
||||
with self.assertRaises(ValidationError):
|
||||
PaymentPortalDelivery().shop_payment_transaction(sale_order.id, sale_order.access_token)
|
||||
|
|
@ -0,0 +1,387 @@
|
|||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
import json
|
||||
from uuid import uuid4
|
||||
from unittest.mock import Mock, patch
|
||||
from werkzeug import urls
|
||||
|
||||
from odoo import Command
|
||||
from odoo.http import root
|
||||
from odoo.tests import tagged
|
||||
|
||||
from odoo.addons.base.tests.common import HttpCaseWithUserDemo
|
||||
from odoo.addons.website_sale_delivery.controllers.main import WebsiteSaleDelivery as WebsiteSaleDeliveryController
|
||||
|
||||
|
||||
@tagged('post_install', '-at_install')
|
||||
class TestWebsiteSaleDeliveryExpressCheckoutFlows(HttpCaseWithUserDemo):
|
||||
""" The goal of this method class is to test the address management on
|
||||
express checkout.
|
||||
"""
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
cls.website = cls.env.ref('website.default_website')
|
||||
cls.country_id = cls.env.ref('base.be').id
|
||||
cls.sale_order = cls.env['sale.order'].create({
|
||||
'partner_id': cls.website.user_id.partner_id.id,
|
||||
'website_id': cls.website.id,
|
||||
'order_line': [Command.create({
|
||||
'product_id': cls.env['product.product'].create({
|
||||
'name': 'Product A',
|
||||
'list_price': 100,
|
||||
'website_published': True,
|
||||
'sale_ok': True}).id,
|
||||
'name': 'Product A',
|
||||
})]
|
||||
})
|
||||
cls.rate_shipment_result = {
|
||||
'success': True,
|
||||
'price': 5.0,
|
||||
'warning_message': '',
|
||||
}
|
||||
cls.express_checkout_billing_values = {
|
||||
'name': 'Express Checkout Partner',
|
||||
'email': 'express@check.out',
|
||||
'phone': '0000000000',
|
||||
'street': 'ooo',
|
||||
'street2': 'ppp',
|
||||
'city': 'ooo',
|
||||
'zip': '1200',
|
||||
'country': 'US',
|
||||
'state': 'AL',
|
||||
}
|
||||
cls.express_checkout_shipping_values = {
|
||||
'name': 'Express Checkout Shipping Partner',
|
||||
'email': 'express_shipping@check.out',
|
||||
'phone': '1111111111',
|
||||
'street': 'ooo shipping',
|
||||
'street2': 'ppp shipping',
|
||||
'city': 'ooo shipping',
|
||||
'zip': '25781',
|
||||
'country': 'US',
|
||||
'state': 'WA',
|
||||
}
|
||||
cls.express_checkout_anonymized_shipping_values = {
|
||||
'city': 'ooo shipping',
|
||||
'zip': '25781',
|
||||
'country': 'US',
|
||||
'state': 'WA',
|
||||
}
|
||||
cls.express_checkout_anonymized_shipping_values_2 = {
|
||||
'city': 'ooo shipping 2',
|
||||
'zip': '91200',
|
||||
'country': 'US',
|
||||
'state': 'AL',
|
||||
}
|
||||
# Ensure demo user address exists and is valid
|
||||
cls.user_demo.write({
|
||||
'street': "215 Vine St",
|
||||
'city': "Scranton",
|
||||
'zip': "18503",
|
||||
'country_id': cls.env.ref('base.us').id,
|
||||
'state_id': cls.env.ref('base.state_us_39').id,
|
||||
})
|
||||
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
self.express_checkout_demo_shipping_values = {
|
||||
'name': self.user_demo.partner_id.name,
|
||||
'email': self.user_demo.partner_id.email,
|
||||
'phone': self.user_demo.partner_id.phone,
|
||||
'street': self.user_demo.partner_id.street,
|
||||
'street2': self.user_demo.partner_id.street2,
|
||||
'city': self.user_demo.partner_id.city,
|
||||
'zip': self.user_demo.partner_id.zip,
|
||||
'country': self.user_demo.partner_id.country_id.code,
|
||||
'state': self.user_demo.partner_id.state_id.code,
|
||||
}
|
||||
self.express_checkout_anonymized_demo_shipping_values = {
|
||||
'city': self.user_demo.partner_id.city,
|
||||
'zip': self.user_demo.partner_id.zip,
|
||||
'country': self.user_demo.partner_id.country_id.code,
|
||||
'state': self.user_demo.partner_id.state_id.code,
|
||||
}
|
||||
self.express_checkout_demo_shipping_values_2 = {
|
||||
'name': 'Express Checkout Shipping Partner',
|
||||
'email': 'express_shipping@check.out',
|
||||
'phone': '1111111111',
|
||||
'street': 'ooo shipping',
|
||||
'street2': 'ppp shipping',
|
||||
'city': self.user_demo.partner_id.city,
|
||||
'zip': self.user_demo.partner_id.zip,
|
||||
'country': self.user_demo.partner_id.country_id.code,
|
||||
'state': self.user_demo.partner_id.state_id.code,
|
||||
}
|
||||
|
||||
def assertPartnerShippingValues(self, partner, shipping_values):
|
||||
for key, expected in shipping_values.items():
|
||||
if key in ('state', 'country'):
|
||||
value = partner[f'{key}_id'].code
|
||||
else:
|
||||
value = partner[key]
|
||||
self.assertEqual(value, expected, "Shipping value should match")
|
||||
if partner.state_id:
|
||||
self.assertEqual(
|
||||
partner.state_id.country_id,
|
||||
partner.country_id,
|
||||
"Partner's state should be within partner's country",
|
||||
)
|
||||
|
||||
def _make_json_rpc_request(self, url, data=None):
|
||||
""" Make a JSON-RPC request to the provided URL.
|
||||
|
||||
:param str url: The URL to make the request to
|
||||
:param dict data: The data to be send in the request body in JSON-RPC 2.0 format
|
||||
:return dict: The result of the JSON-RPC request
|
||||
"""
|
||||
rpc_request = {
|
||||
"jsonrpc": "2.0",
|
||||
"method": "call",
|
||||
"id": str(uuid4()),
|
||||
"params": data,
|
||||
}
|
||||
|
||||
result = self.url_open(
|
||||
url,
|
||||
data=json.dumps(rpc_request).encode(),
|
||||
headers={"Content-Type": "application/json"},
|
||||
timeout=None,
|
||||
)
|
||||
|
||||
if not result.ok:
|
||||
return {}
|
||||
|
||||
return result.json().get("result", {})
|
||||
|
||||
def test_express_checkout_public_user_shipping_address_change(self):
|
||||
""" Test that when using express checkout as a public user and selecting a shipping address,
|
||||
a new partner is created if the partner of the SO is the public partner.
|
||||
"""
|
||||
session = self.authenticate(None, None)
|
||||
session['sale_order_id'] = self.sale_order.id
|
||||
root.session_store.save(session)
|
||||
with patch(
|
||||
'odoo.addons.delivery.models.delivery_carrier.DeliveryCarrier.rate_shipment',
|
||||
return_value=self.rate_shipment_result
|
||||
):
|
||||
self._make_json_rpc_request(
|
||||
urls.url_join(
|
||||
self.base_url(), WebsiteSaleDeliveryController._express_checkout_shipping_route
|
||||
), data={
|
||||
'partial_shipping_address': dict(self.express_checkout_anonymized_shipping_values)
|
||||
}
|
||||
)
|
||||
new_partner = self.sale_order.partner_shipping_id
|
||||
self.assertNotEqual(new_partner, self.website.user_id.partner_id)
|
||||
self.assertTrue(new_partner.name.endswith(self.sale_order.name))
|
||||
self.assertPartnerShippingValues(
|
||||
new_partner,
|
||||
self.express_checkout_anonymized_shipping_values,
|
||||
)
|
||||
|
||||
def test_express_checkout_public_user_shipping_address_change_twice(self):
|
||||
""" Test that when using express checkout as a public user and selecting a shipping address
|
||||
more than once, a new partner is created if the partner of the SO is the public partner
|
||||
(only creates one new partner that is updated).
|
||||
"""
|
||||
session = self.authenticate(None, None)
|
||||
session['sale_order_id'] = self.sale_order.id
|
||||
root.session_store.save(session)
|
||||
with patch(
|
||||
'odoo.addons.delivery.models.delivery_carrier.DeliveryCarrier.rate_shipment',
|
||||
return_value=self.rate_shipment_result
|
||||
):
|
||||
self._make_json_rpc_request(
|
||||
urls.url_join(
|
||||
self.base_url(), WebsiteSaleDeliveryController._express_checkout_shipping_route
|
||||
), data={
|
||||
'partial_shipping_address': dict(self.express_checkout_anonymized_shipping_values)
|
||||
}
|
||||
)
|
||||
new_partner = self.sale_order.partner_shipping_id
|
||||
self._make_json_rpc_request(
|
||||
urls.url_join(
|
||||
self.base_url(), WebsiteSaleDeliveryController._express_checkout_shipping_route
|
||||
), data={
|
||||
'partial_shipping_address': dict(self.express_checkout_anonymized_shipping_values_2)
|
||||
}
|
||||
)
|
||||
self.assertEqual(new_partner.id, self.sale_order.partner_shipping_id.id)
|
||||
self.assertPartnerShippingValues(
|
||||
new_partner,
|
||||
self.express_checkout_anonymized_shipping_values_2,
|
||||
)
|
||||
|
||||
def test_express_checkout_registered_user_exisiting_shipping_address_change(self):
|
||||
""" Test that when using express checkout as a registered user and selecting an exisiting
|
||||
shipping address, the existing partner (the one of the so) is reused.
|
||||
"""
|
||||
self.sale_order.partner_id = self.user_demo.partner_id.id
|
||||
session = self.authenticate(self.user_demo.login, self.user_demo.login)
|
||||
session['sale_order_id'] = self.sale_order.id
|
||||
root.session_store.save(session)
|
||||
with patch(
|
||||
'odoo.addons.delivery.models.delivery_carrier.DeliveryCarrier.rate_shipment',
|
||||
return_value=self.rate_shipment_result
|
||||
):
|
||||
self._make_json_rpc_request(
|
||||
urls.url_join(
|
||||
self.base_url(), WebsiteSaleDeliveryController._express_checkout_shipping_route
|
||||
), data={
|
||||
'partial_shipping_address': dict(self.express_checkout_anonymized_shipping_values)
|
||||
}
|
||||
)
|
||||
self.assertEqual(self.sale_order.partner_id.id, self.user_demo.partner_id.id)
|
||||
|
||||
def test_express_checkout_registered_user_new_shipping_address_change(self):
|
||||
""" Test that when using express checkout as a registered user and selecting a new shipping
|
||||
address, a new partner is created if the partner of the SO or his children are different
|
||||
than the delivery information received.
|
||||
"""
|
||||
self.sale_order.partner_id = self.user_demo.partner_id.id
|
||||
session = self.authenticate(self.user_demo.login, self.user_demo.login)
|
||||
session['sale_order_id'] = self.sale_order.id
|
||||
root.session_store.save(session)
|
||||
with patch(
|
||||
'odoo.addons.delivery.models.delivery_carrier.DeliveryCarrier.rate_shipment',
|
||||
return_value=self.rate_shipment_result
|
||||
):
|
||||
self._make_json_rpc_request(
|
||||
urls.url_join(
|
||||
self.base_url(), WebsiteSaleDeliveryController._express_checkout_shipping_route
|
||||
), data={
|
||||
'partial_shipping_address': dict(self.express_checkout_anonymized_shipping_values)
|
||||
}
|
||||
)
|
||||
new_partner = self.sale_order.partner_shipping_id
|
||||
self.assertEqual(self.sale_order.partner_id.id, self.user_demo.partner_id.id)
|
||||
self.assertNotEqual(new_partner.id, self.user_demo.partner_id.id)
|
||||
self.assertTrue(new_partner.name.endswith(self.sale_order.name))
|
||||
self.assertPartnerShippingValues(
|
||||
new_partner,
|
||||
self.express_checkout_anonymized_shipping_values,
|
||||
)
|
||||
|
||||
def test_express_checkout_registered_user_new_shipping_address_change_twice(self):
|
||||
""" Test that when using express checkout as a registered user and selecting a new
|
||||
shipping address more than once, a new partner is created if the partner of the SO is
|
||||
the public partner (only creates one new partner that is updated).
|
||||
"""
|
||||
self.sale_order.partner_id = self.user_demo.partner_id.id
|
||||
session = self.authenticate(self.user_demo.login, self.user_demo.login)
|
||||
session['sale_order_id'] = self.sale_order.id
|
||||
root.session_store.save(session)
|
||||
with patch(
|
||||
'odoo.addons.delivery.models.delivery_carrier.DeliveryCarrier.rate_shipment',
|
||||
return_value=self.rate_shipment_result
|
||||
):
|
||||
self._make_json_rpc_request(
|
||||
urls.url_join(
|
||||
self.base_url(), WebsiteSaleDeliveryController._express_checkout_shipping_route
|
||||
), data={
|
||||
'partial_shipping_address': dict(self.express_checkout_anonymized_shipping_values)
|
||||
}
|
||||
)
|
||||
new_partner = self.sale_order.partner_shipping_id
|
||||
self._make_json_rpc_request(
|
||||
urls.url_join(
|
||||
self.base_url(), WebsiteSaleDeliveryController._express_checkout_shipping_route
|
||||
), data={
|
||||
'partial_shipping_address': dict(self.express_checkout_anonymized_shipping_values_2)
|
||||
}
|
||||
)
|
||||
self.assertEqual(new_partner.id, self.sale_order.partner_shipping_id.id)
|
||||
self.assertPartnerShippingValues(
|
||||
new_partner,
|
||||
self.express_checkout_anonymized_shipping_values_2
|
||||
)
|
||||
|
||||
def test_express_checkout_partial_delivery_address_context_key(self):
|
||||
""" Test that when using express checkout with only partial delivery information,
|
||||
`express_checkout_partial_delivery_address` context key is in the context.
|
||||
"""
|
||||
delivery_carrier_mock = Mock()
|
||||
delivery_carrier_mock.rate_shipment = Mock(
|
||||
# Since we didn't mock the product ids for the mocked carrier, we return an unsuccessful
|
||||
# response to skip the part where the product ids are checked on the carrier.
|
||||
return_value=dict(self.rate_shipment_result, **{'success': False})
|
||||
)
|
||||
|
||||
WebsiteSaleDeliveryController._get_rate(
|
||||
delivery_carrier_mock, self.sale_order, is_express_checkout_flow=True
|
||||
)
|
||||
sale_order = delivery_carrier_mock.rate_shipment.call_args[0][0]
|
||||
self.assertTrue(sale_order._context.get('express_checkout_partial_delivery_address'))
|
||||
|
||||
def test_express_checkout_registered_user_with_shipping_option(self):
|
||||
""" Test that when you use the express checkout as a registered user and the shipping
|
||||
address sent by the express checkout form exactly matches to one of the addresses linked
|
||||
to this user in odoo, we do not create a new partner and reuse the existing one.
|
||||
"""
|
||||
self.sale_order.partner_id = self.user_demo.partner_id.id
|
||||
session = self.authenticate(self.user_demo.login, self.user_demo.login)
|
||||
session['sale_order_id'] = self.sale_order.id
|
||||
root.session_store.save(session)
|
||||
with patch(
|
||||
'odoo.addons.delivery.models.delivery_carrier.DeliveryCarrier.rate_shipment',
|
||||
return_value=self.rate_shipment_result
|
||||
):
|
||||
shipping_options = self._make_json_rpc_request(
|
||||
urls.url_join(
|
||||
self.base_url(), WebsiteSaleDeliveryController._express_checkout_shipping_route
|
||||
), data={
|
||||
'partial_shipping_address': dict(self.express_checkout_anonymized_demo_shipping_values)
|
||||
}
|
||||
)
|
||||
self.assertEqual(self.sale_order.partner_id.id, self.user_demo.partner_id.id)
|
||||
|
||||
self._make_json_rpc_request(urls.url_join(self.base_url(), '/shop/express'), data={
|
||||
'billing_address': dict(self.express_checkout_billing_values),
|
||||
'shipping_address': dict(self.express_checkout_demo_shipping_values),
|
||||
'shipping_option': shipping_options[0],
|
||||
})
|
||||
self.assertEqual(self.sale_order.partner_id.id, self.user_demo.partner_id.id)
|
||||
|
||||
def test_express_checkout_registered_user_with_shipping_option_new_address(self):
|
||||
""" Test that when you use the express checkout as a registered user and the shipping
|
||||
address sent by the express checkout form doesn't exist in odoo, we create a new partner.
|
||||
"""
|
||||
self.sale_order.partner_id = self.user_demo.partner_id.id
|
||||
session = self.authenticate(self.user_demo.login, self.user_demo.login)
|
||||
session['sale_order_id'] = self.sale_order.id
|
||||
root.session_store.save(session)
|
||||
with patch(
|
||||
'odoo.addons.delivery.models.delivery_carrier.DeliveryCarrier.rate_shipment',
|
||||
return_value=self.rate_shipment_result
|
||||
):
|
||||
# Won't create a new partner because the partial information are the same the an
|
||||
# exisiting partner linked to the SO
|
||||
shipping_options = self._make_json_rpc_request(
|
||||
urls.url_join(
|
||||
self.base_url(), WebsiteSaleDeliveryController._express_checkout_shipping_route
|
||||
), data={
|
||||
'partial_shipping_address': dict(self.express_checkout_anonymized_demo_shipping_values)
|
||||
}
|
||||
)
|
||||
self.assertEqual(self.sale_order.partner_shipping_id, self.user_demo.partner_id)
|
||||
|
||||
# Will create a new partner because the complete shipping information are different than
|
||||
# the partner actually selected.
|
||||
self._make_json_rpc_request(
|
||||
urls.url_join(
|
||||
self.base_url(),
|
||||
WebsiteSaleDeliveryController._express_checkout_route
|
||||
), data={
|
||||
'billing_address': dict(self.express_checkout_billing_values),
|
||||
'shipping_address': dict(self.express_checkout_demo_shipping_values_2),
|
||||
'shipping_option': shipping_options[0],
|
||||
}
|
||||
)
|
||||
self.assertNotEqual(
|
||||
self.sale_order.partner_shipping_id.id, self.user_demo.partner_id.id
|
||||
)
|
||||
self.assertFalse(
|
||||
self.sale_order.partner_shipping_id.name.endswith(self.sale_order.name)
|
||||
)
|
||||
|
|
@ -0,0 +1,59 @@
|
|||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo import Command
|
||||
from odoo.tests import tagged
|
||||
|
||||
from odoo.addons.sale.tests.common import SaleCommon
|
||||
|
||||
|
||||
@tagged('post_install', '-at_install')
|
||||
class TestSaleOrder(SaleCommon):
|
||||
|
||||
def test_delivery_methods_match_order_company(self):
|
||||
company_1 = self.env['res.company'].create({'name': 'Test Company 1'})
|
||||
company_2 = self.env['res.company'].create({'name': 'Test Company 2'})
|
||||
product_delivery_1 = self.env['product.product'].create(
|
||||
{
|
||||
'name': 'Delivery Product 1',
|
||||
'type': 'service',
|
||||
'company_id': company_1.id,
|
||||
}
|
||||
)
|
||||
product_delivery_2 = self.env['product.product'].create(
|
||||
{
|
||||
'name': 'Delivery Product 2',
|
||||
'type': 'service',
|
||||
'company_id': company_2.id,
|
||||
}
|
||||
)
|
||||
delivery_1 = self.env['delivery.carrier'].create(
|
||||
{
|
||||
'name': 'Delivery 1',
|
||||
'delivery_type': 'fixed',
|
||||
'product_id': product_delivery_1.id,
|
||||
'is_published': True,
|
||||
}
|
||||
)
|
||||
delivery_2 = self.env['delivery.carrier'].create(
|
||||
{
|
||||
'name': 'Delivery 2',
|
||||
'delivery_type': 'fixed',
|
||||
'product_id': product_delivery_2.id,
|
||||
'is_published': True,
|
||||
}
|
||||
)
|
||||
sale_order = self.env['sale.order'].create(
|
||||
{
|
||||
'partner_id': self.partner.id,
|
||||
'company_id': company_1.id,
|
||||
'order_line': [
|
||||
Command.create(
|
||||
{
|
||||
'product_id': self.product.id,
|
||||
}
|
||||
)],
|
||||
}
|
||||
)
|
||||
available_dms = sale_order._get_delivery_methods()
|
||||
self.assertIn(delivery_1, available_dms)
|
||||
self.assertNotIn(delivery_2, available_dms)
|
||||
|
|
@ -0,0 +1,73 @@
|
|||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
import odoo.tests
|
||||
|
||||
|
||||
@odoo.tests.tagged('post_install', '-at_install')
|
||||
class TestUi(odoo.tests.HttpCase):
|
||||
|
||||
def test_01_free_delivery_when_exceed_threshold(self):
|
||||
if not self.env['ir.module.module']._get('payment_custom').state == 'installed':
|
||||
return self.skipTest('The payment_custom module is not installed thus the tour cannot be tested.')
|
||||
|
||||
# Avoid Shipping/Billing address page
|
||||
self.env.ref('base.partner_admin').write({
|
||||
'street': '215 Vine St',
|
||||
'city': 'Scranton',
|
||||
'zip': '18503',
|
||||
'country_id': self.env.ref('base.us').id,
|
||||
'state_id': self.env.ref('base.state_us_39').id,
|
||||
'phone': '+1 555-555-5555',
|
||||
'email': 'admin@yourcompany.example.com',
|
||||
})
|
||||
|
||||
office_chair = self.env['product.product'].create({
|
||||
'name': 'Office Chair Black TEST',
|
||||
'list_price': 12.50,
|
||||
})
|
||||
self.env.ref("delivery.free_delivery_carrier").write({
|
||||
'name': 'Delivery Now Free Over 10',
|
||||
'fixed_price': 2,
|
||||
'free_over': True,
|
||||
'amount': 10,
|
||||
})
|
||||
self.product_delivery_poste = self.env['product.product'].create({
|
||||
'name': 'The Poste',
|
||||
'type': 'service',
|
||||
'categ_id': self.env.ref('delivery.product_category_deliveries').id,
|
||||
'sale_ok': False,
|
||||
'purchase_ok': False,
|
||||
'list_price': 20.0,
|
||||
})
|
||||
self.carrier = self.env['delivery.carrier'].create({
|
||||
'name': 'The Poste',
|
||||
'sequence': 9999, # ensure last to load price async
|
||||
'fixed_price': 20.0,
|
||||
'delivery_type': 'base_on_rule',
|
||||
'product_id': self.product_delivery_poste.id,
|
||||
'website_published': True,
|
||||
})
|
||||
self.env['delivery.price.rule'].create([{
|
||||
'carrier_id': self.carrier.id,
|
||||
'max_value': 5,
|
||||
'list_base_price': 20,
|
||||
}, {
|
||||
'carrier_id': self.carrier.id,
|
||||
'operator': '>=',
|
||||
'max_value': 5,
|
||||
'list_base_price': 50,
|
||||
}, {
|
||||
'carrier_id': self.carrier.id,
|
||||
'operator': '>=',
|
||||
'max_value': 300,
|
||||
'variable': 'price',
|
||||
'list_base_price': 0,
|
||||
}])
|
||||
|
||||
self.env['account.journal'].create({'name': 'Cash - Test', 'type': 'cash', 'code': 'CASH - Test'})
|
||||
|
||||
# Ensure "Wire Transfer" is the default provider.
|
||||
# Providers are sorted by state, showing `test` providers first (don't ask why).
|
||||
self.env.ref("payment.payment_provider_transfer").write({"state": "test"})
|
||||
|
||||
self.start_tour("/", 'check_free_delivery', login="admin")
|
||||
|
|
@ -0,0 +1,70 @@
|
|||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from odoo.fields import Command
|
||||
from odoo.tests import tagged
|
||||
|
||||
from odoo.addons.website_sale.tests.test_sale_process import TestWebsiteSaleCheckoutAddress
|
||||
from odoo.addons.website_sale_delivery.controllers.main import WebsiteSaleDelivery
|
||||
from odoo.addons.website.tools import MockRequest
|
||||
|
||||
|
||||
@tagged('post_install', '-at_install')
|
||||
class TestWebsiteSaleController(TestWebsiteSaleCheckoutAddress):
|
||||
def setUp(self):
|
||||
super().setUp()
|
||||
|
||||
def test_carrier_update_on_shop_payment(self):
|
||||
""" Test that a correct carrier is set on SO on shop/payment when partner_shipping_id is
|
||||
changed. """
|
||||
|
||||
# Unpublish all carriers.
|
||||
self.env['delivery.carrier'].search([]).website_published = False
|
||||
|
||||
country_be = self.env.ref('base.be')
|
||||
country_fr = self.env.ref('base.fr')
|
||||
|
||||
# Create a delivery product.
|
||||
self.product_delivery_poste = self.env['product.product'].create({
|
||||
'name': 'The Poste',
|
||||
'type': 'service',
|
||||
'categ_id': self.env.ref('delivery.product_category_deliveries').id,
|
||||
'sale_ok': False,
|
||||
'purchase_ok': False,
|
||||
})
|
||||
|
||||
# Create a carrier which ships only to Belgium.
|
||||
carrier_be = self.env['delivery.carrier'].create([{
|
||||
'name': 'Fixed BE',
|
||||
'product_id': self.product_delivery_poste.id,
|
||||
'country_ids': [Command.set([country_be.id])],
|
||||
'website_published': True,
|
||||
}])
|
||||
|
||||
# Create a carrier which ships only to France.
|
||||
carrier_fr = self.env['delivery.carrier'].create([{
|
||||
'name': 'Fixed FR',
|
||||
'product_id': self.product_delivery_poste.id,
|
||||
'country_ids': [Command.set([country_fr.id])],
|
||||
'website_published': True,
|
||||
}])
|
||||
|
||||
# Create partner_shipping_id with BE country.
|
||||
p = self.env.user.partner_id
|
||||
so = self._create_so(p.id)
|
||||
so.partner_shipping_id = self.env['res.partner'].create({
|
||||
'name': 'a res.partner address',
|
||||
'email': 'email@email.email',
|
||||
'street': 'ooo',
|
||||
'city': 'ooo',
|
||||
'zip': '1200',
|
||||
'country_id': country_be.id,
|
||||
'parent_id': p.id,
|
||||
'type': 'delivery',
|
||||
})
|
||||
so.set_delivery_line(carrier_be, carrier_be.fixed_price)
|
||||
with MockRequest(self.env, website=self.website, sale_order_id=so.id):
|
||||
# Change the country of the partner_shipping_id.
|
||||
so.partner_shipping_id.country_id = country_fr
|
||||
WebsiteSaleDelivery().shop_payment()
|
||||
# Check that a carrier is updated.
|
||||
self.assertEqual(so.carrier_id, carrier_fr)
|
||||
Loading…
Add table
Add a link
Reference in a new issue