Browse Source

Added some more tests for the OrderCreator

master
David Winterbottom 14 years ago
parent
commit
b7d3e37fd3
3 changed files with 87 additions and 16 deletions
  1. 10
    10
      oscar/apps/checkout/views.py
  2. 56
    3
      oscar/apps/order/tests.py
  3. 21
    3
      oscar/apps/order/utils.py

+ 10
- 10
oscar/apps/checkout/views.py View File

@@ -396,16 +396,16 @@ class OrderPlacementMixin(CheckoutSessionMixin):
396 396
             status = self.get_initial_order_status(basket)
397 397
         else:
398 398
             status = kwargs.pop('status')
399
-        order = OrderCreator().place_order(self.request.user, 
400
-                                         basket, 
401
-                                         shipping_address, 
402
-                                         shipping_method, 
403
-                                         billing_address,
404
-                                         total_incl_tax,
405
-                                         total_excl_tax,
406
-                                         order_number,
407
-                                         status,
408
-                                         **kwargs)
399
+        order = OrderCreator().place_order(basket=basket, 
400
+                                           total_incl_tax=total_incl_tax,
401
+                                           total_excl_tax=total_excl_tax,
402
+                                           user=self.request.user, 
403
+                                           shipping_method=shipping_method, 
404
+                                           shipping_address=shipping_address, 
405
+                                           billing_address=billing_address,
406
+                                           order_number=order_number,
407
+                                           status=status,
408
+                                           **kwargs)
409 409
         self.save_payment_details(order)
410 410
         return order
411 411
     

+ 56
- 3
oscar/apps/order/tests.py View File

@@ -1,13 +1,16 @@
1
-from decimal import Decimal
1
+from decimal import Decimal as D
2 2
 import hashlib
3 3
 
4 4
 from django.test import TestCase
5 5
 from django.conf import settings
6
+from mock import Mock
6 7
 
7 8
 from oscar.apps.address.models import Country
8 9
 from oscar.apps.basket.models import Basket
9 10
 from oscar.apps.order.models import ShippingAddress, Order, Line, ShippingEvent, ShippingEventType, ShippingEventQuantity
10
-from oscar.test.helpers import create_order
11
+from oscar.test.helpers import create_order, create_product
12
+from oscar.apps.order.utils import OrderCreator
13
+from oscar.apps.shipping.methods import Free
11 14
 
12 15
 ORDER_PLACED = 'order_placed'
13 16
 
@@ -134,4 +137,54 @@ class ShippingEventQuantityTest(TestCase):
134 137
         event_quantity = ShippingEventQuantity.objects.create(event=event, line=self.line)
135 138
         self.assertEquals(self.line.quantity, event_quantity.quantity)
136 139
     
137
-   
140
+   
141
+class OrderCreatorTests(TestCase):
142
+
143
+    def setUp(self):
144
+        self.creator = OrderCreator()
145
+        self.basket = Basket.objects.create()
146
+
147
+    def tearDown(self):
148
+        Order.objects.all().delete()
149
+
150
+    def test_exception_raised_when_empty_basket_passed(self):
151
+        with self.assertRaises(ValueError):
152
+            self.creator.place_order(basket=self.basket)
153
+
154
+    def test_order_models_are_created(self):
155
+        self.basket.add_product(create_product(price=D('12.00')))
156
+        self.creator.place_order(basket=self.basket, order_number='1234')
157
+        order = Order.objects.get(number='1234')
158
+        lines = order.lines.all()
159
+        self.assertEqual(1, len(lines))
160
+
161
+    def test_status_is_saved_if_passed(self):
162
+        self.basket.add_product(create_product(price=D('12.00')))
163
+        self.creator.place_order(basket=self.basket, order_number='1234', status='Active')
164
+        order = Order.objects.get(number='1234')
165
+        self.assertEqual('Active', order.status)
166
+
167
+    def test_shipping_is_free_by_default(self):
168
+        self.basket.add_product(create_product(price=D('12.00')))
169
+        self.creator.place_order(basket=self.basket, order_number='1234')
170
+        order = Order.objects.get(number='1234')
171
+        self.assertEqual(order.total_incl_tax, self.basket.total_incl_tax)
172
+        self.assertEqual(order.total_excl_tax, self.basket.total_excl_tax)
173
+
174
+    def test_basket_totals_are_used_by_default(self):
175
+        self.basket.add_product(create_product(price=D('12.00')))
176
+        method = Mock()
177
+        method.basket_charge_incl_tax = Mock(return_value=D('2.00'))
178
+        method.basket_charge_excl_tax = Mock(return_value=D('2.00'))
179
+
180
+        self.creator.place_order(basket=self.basket, order_number='1234', shipping_method=method)
181
+        order = Order.objects.get(number='1234')
182
+        self.assertEqual(order.total_incl_tax, self.basket.total_incl_tax + D('2.00'))
183
+        self.assertEqual(order.total_excl_tax, self.basket.total_excl_tax + D('2.00'))
184
+        
185
+    def test_exception_raised_if_duplicate_number_passed(self):
186
+        self.basket.add_product(create_product(price=D('12.00')))
187
+        self.creator.place_order(basket=self.basket, order_number='1234')
188
+        with self.assertRaises(ValueError):
189
+            self.creator.place_order(basket=self.basket, order_number='1234')
190
+

+ 21
- 3
oscar/apps/order/utils.py View File

@@ -1,5 +1,6 @@
1 1
 from django.contrib.sites.models import Site
2 2
 
3
+from oscar.apps.shipping.methods import Free
3 4
 from oscar.core.loading import import_module
4 5
 import_module('order.models', ['ShippingAddress', 'Order', 'Line', 
5 6
                                'LinePrice', 'LineAttribute', 'OrderDiscount'], locals())
@@ -26,16 +27,33 @@ class OrderCreator(object):
26 27
     Places the order by writing out the various models
27 28
     """
28 29
     
29
-    def place_order(self, user, basket, shipping_address, shipping_method, 
30
-                    billing_address, total_incl_tax, total_excl_tax, 
31
-                    order_number=None, status=None, **kwargs):
30
+    def place_order(self, basket, total_incl_tax=None, total_excl_tax=None,
31
+                    user=None, shipping_method=None, shipping_address=None,
32
+                    billing_address=None, order_number=None, status=None, **kwargs):
32 33
         """
33 34
         Placing an order involves creating all the relevant models based on the
34 35
         basket and session data.
35 36
         """
37
+        # Only a basket instance is required to place an order - everything else can be set
38
+        # to defaults
39
+        if basket.is_empty:
40
+            raise ValueError("Empty baskets cannot be submitted")
41
+        if not shipping_method:
42
+            shipping_method = Free()
43
+        if total_incl_tax is None or total_excl_tax is None:
44
+            total_incl_tax = basket.total_incl_tax + shipping_method.basket_charge_incl_tax()
45
+            total_excl_tax = basket.total_excl_tax + shipping_method.basket_charge_excl_tax()
36 46
         if not order_number:
37 47
             generator = OrderNumberGenerator()
38 48
             order_number = generator.order_number(basket)
49
+        try:
50
+            Order._default_manager.get(number=order_number)
51
+        except Order.DoesNotExist:
52
+            pass
53
+        else:
54
+            raise ValueError("There is already an order with number %s" % order_number)
55
+        
56
+        # Ok - everything seems to be in order, let's place the order
39 57
         order = self.create_order_model(user, basket, shipping_address, 
40 58
                                         shipping_method, billing_address, total_incl_tax, 
41 59
                                         total_excl_tax, order_number, status, **kwargs)

Loading…
Cancel
Save