Commit ac036da2 by Clinton Blackburn

Merge pull request #420 from edx/multi-tenancy/order-site-from-basket

Setting order site from basket site
parents ff2c224e 84e8ec2a
"""Test Order Utility classes """
from django.test import override_settings
from oscar.core.loading import get_class
from oscar.test.factories import create_basket as oscar_create_basket
from oscar.test.newfactories import BasketFactory
from ecommerce.extensions.fulfillment.status import ORDER
from ecommerce.tests.factories import SiteConfigurationFactory
from ecommerce.tests.testcases import TestCase
NoShippingRequired = get_class('shipping.methods', 'NoShippingRequired')
OrderCreator = get_class('order.utils', 'OrderCreator')
OrderNumberGenerator = get_class('order.utils', 'OrderNumberGenerator')
OrderTotalCalculator = get_class('checkout.calculators', 'OrderTotalCalculator')
class UtilsTest(TestCase):
......@@ -34,3 +40,51 @@ class UtilsTest(TestCase):
self.assertEqual(first_basket_id, first_basket.id)
self.assertEqual(second_basket_id, second_basket.id)
class OrderCreatorTests(TestCase):
order_creator = OrderCreator()
def setUp(self):
super(OrderCreatorTests, self).setUp()
self.user = self.create_user()
def create_order_model(self, basket):
""" Call the create_order_model method to create an Order from the given Basket. """
shipping_method = NoShippingRequired()
shipping_charge = shipping_method.calculate(basket)
total = OrderTotalCalculator().calculate(basket, shipping_charge)
return self.order_creator.create_order_model(self.user, basket, None, shipping_method, shipping_charge,
None, total, basket.order_number, ORDER.OPEN)
def create_basket(self, site):
""" Returns a new Basket with the specified Site. """
basket = oscar_create_basket()
basket.site = site
basket.save()
return basket
def test_create_order_model_default_site(self):
"""
Verify the create_order_model method associates the order with the default site
if the basket does not have a site set.
"""
# Create a basket without a site
basket = self.create_basket(None)
# Ensure the order's site is set to the default site
order = self.create_order_model(basket)
self.assertEqual(order.site, self.site)
def test_create_order_model_basket_site(self):
""" Verify the create_order_model method associates the order with the basket's site. """
# Create a non-default site
site_configuration = SiteConfigurationFactory(site__domain='star.fake', partner__name='star')
site = site_configuration.site
# Associate the basket with the non-default site
basket = self.create_basket(site)
# Ensure the order has the non-default site
order = self.create_order_model(basket)
self.assertEqual(order.site, site)
"""Order Utility Classes. """
from __future__ import unicode_literals
from django.conf import settings
from oscar.apps.order.utils import OrderCreator as OscarOrderCreator
class OrderNumberGenerator(object):
......@@ -42,3 +43,23 @@ class OrderNumberGenerator(object):
basket_id = order_id - self.OFFSET
return basket_id
class OrderCreator(OscarOrderCreator):
def create_order_model(self, user, basket, shipping_address, shipping_method, shipping_charge, billing_address,
total, order_number, status, **extra_order_fields):
"""
Create an order model.
This override ensures the order's site is set to that of the basket. If the basket has no site, the default
site is used. The site value can be overridden by setting the `site` kwarg.
"""
# Pull the order's site from the basket, if the basket has a site and
# a site is not already being explicitly set.
if basket.site and 'site' not in extra_order_fields:
extra_order_fields['site'] = basket.site
return super(OrderCreator, self).create_order_model(
user, basket, shipping_address, shipping_method, shipping_charge, billing_address, total, order_number,
status, **extra_order_fields)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment