Преглед изворни кода

Basket tests house-keeping

- Restructure into unit and integration tests.
- Add more tests for the various basket properties.
master
David Winterbottom пре 12 година
родитељ
комит
fc40d0e287

+ 24
- 14
oscar/apps/basket/abstract_models.py Прегледај датотеку

@@ -73,6 +73,17 @@ class AbstractBasket(models.Model):
73 73
         self._lines = None
74 74
         self.offer_applications = results.OfferApplications()
75 75
 
76
+    def __unicode__(self):
77
+        return _(
78
+            u"%(status)s basket (owner: %(owner)s, lines: %(num_lines)d)") % {
79
+                'status': self.status,
80
+                'owner': self.owner,
81
+                'num_lines': self.num_lines}
82
+
83
+    # ========
84
+    # Strategy
85
+    # ========
86
+
76 87
     @property
77 88
     def has_strategy(self):
78 89
         return hasattr(self, '_strategy')
@@ -92,13 +103,6 @@ class AbstractBasket(models.Model):
92 103
 
93 104
     strategy = property(_get_strategy, _set_strategy)
94 105
 
95
-    def __unicode__(self):
96
-        return _(
97
-            u"%(status)s basket (owner: %(owner)s, lines: %(num_lines)d)") % {
98
-                'status': self.status,
99
-                'owner': self.owner,
100
-                'num_lines': self.num_lines}
101
-
102 106
     def all_lines(self):
103 107
         """
104 108
         Return a cached set of basket lines.
@@ -190,7 +194,6 @@ class AbstractBasket(models.Model):
190 194
             line.save()
191 195
         self.reset_offer_applications()
192 196
     add_product.alters_data = True
193
-
194 197
     add = add_product
195 198
 
196 199
     def applied_offers(self):
@@ -450,22 +453,31 @@ class AbstractBasket(models.Model):
450 453
 
451 454
     @property
452 455
     def contains_a_voucher(self):
456
+        if not self.id:
457
+            return False
453 458
         return self.vouchers.all().count() > 0
454 459
 
455
-    # =============
456
-    # Query methods
457
-    # =============
460
+    @property
461
+    def is_submitted(self):
462
+        return self.status == self.SUBMITTED
458 463
 
464
+    @property
459 465
     def can_be_edited(self):
460 466
         """
461 467
         Test if a basket can be edited
462 468
         """
463 469
         return self.status in self.editable_statuses
464 470
 
471
+    # =============
472
+    # Query methods
473
+    # =============
474
+
465 475
     def contains_voucher(self, code):
466 476
         """
467 477
         Test whether the basket contains a voucher with a given code
468 478
         """
479
+        if not self.id:
480
+            return False
469 481
         try:
470 482
             self.vouchers.get(code=code)
471 483
         except ObjectDoesNotExist:
@@ -494,8 +506,6 @@ class AbstractBasket(models.Model):
494 506
         except ObjectDoesNotExist:
495 507
             return 0
496 508
 
497
-    def is_submitted(self):
498
-        return self.status == self.SUBMITTED
499 509
 
500 510
 
501 511
 class AbstractLine(models.Model):
@@ -560,7 +570,7 @@ class AbstractLine(models.Model):
560 570
         """
561 571
         Saves a line or deletes if the quantity is 0
562 572
         """
563
-        if not self.basket.can_be_edited():
573
+        if not self.basket.can_be_edited:
564 574
             raise PermissionDenied(
565 575
                 _("You cannot modify a %s basket") % (
566 576
                     self.basket.status.lower(),))

+ 0
- 0
tests/integration/basket/__init__.py Прегледај датотеку


+ 120
- 0
tests/integration/basket/model_tests.py Прегледај датотеку

@@ -0,0 +1,120 @@
1
+from decimal import Decimal as D
2
+
3
+from django.test import TestCase
4
+
5
+from oscar.apps.basket.models import Basket
6
+from oscar.apps.partner import strategy
7
+from oscar.test import factories
8
+from oscar.apps.catalogue.models import Option
9
+
10
+
11
+class TestAddingAProductToABasket(TestCase):
12
+
13
+    def setUp(self):
14
+        self.basket = Basket()
15
+        self.basket.strategy = strategy.Default()
16
+        self.product = factories.create_product()
17
+        self.record = factories.create_stockrecord(
18
+            self.product, price_excl_tax=D('10.00'))
19
+        self.stockinfo = factories.create_stockinfo(self.record)
20
+        self.basket.add(self.product, self.stockinfo)
21
+
22
+    def test_creates_a_line(self):
23
+        self.assertEqual(1, self.basket.num_lines)
24
+
25
+    def test_sets_line_prices(self):
26
+        line = self.basket.lines.all()[0]
27
+        self.assertEqual(line.price_incl_tax, self.stockinfo.price.incl_tax)
28
+        self.assertEqual(line.price_excl_tax, self.stockinfo.price.excl_tax)
29
+
30
+
31
+class TestANonEmptyBasket(TestCase):
32
+
33
+    def setUp(self):
34
+        self.basket = Basket()
35
+        self.basket.strategy = strategy.Default()
36
+        self.product = factories.create_product()
37
+        self.record = factories.create_stockrecord(
38
+            self.product, price_excl_tax=D('10.00'))
39
+        self.stockinfo = factories.create_stockinfo(self.record)
40
+        self.basket.add(self.product, self.stockinfo, 10)
41
+
42
+    def test_can_be_flushed(self):
43
+        self.basket.flush()
44
+        self.assertEqual(self.basket.num_items, 0)
45
+
46
+    def test_returns_correct_product_quantity(self):
47
+        self.assertEqual(10, self.basket.product_quantity(
48
+            self.product))
49
+
50
+    def test_returns_correct_line_quantity_for_existing_product_and_stockrecord(self):
51
+        self.assertEqual(10, self.basket.line_quantity(
52
+            self.product, self.record))
53
+
54
+    def test_returns_zero_line_quantity_for_alternative_stockrecord(self):
55
+        record = factories.create_stockrecord(
56
+            self.product, price_excl_tax=D('5.00'))
57
+        self.assertEqual(0, self.basket.line_quantity(
58
+            self.product, record))
59
+
60
+    def test_returns_zero_line_quantity_for_missing_product_and_stockrecord(self):
61
+        product = factories.create_product()
62
+        record = factories.create_stockrecord(
63
+            product, price_excl_tax=D('5.00'))
64
+        self.assertEqual(0, self.basket.line_quantity(
65
+            product, record))
66
+
67
+    def test_returns_correct_quantity_for_existing_product_and_stockrecord_and_options(self):
68
+        product = factories.create_product()
69
+        record = factories.create_stockrecord(
70
+            product, price_excl_tax=D('5.00'))
71
+        stockinfo = factories.create_stockinfo(record)
72
+        option = Option.objects.create(name="Message")
73
+        options = [{"option": option, "value": "2"}]
74
+
75
+        self.basket.add(product, stockinfo, options=options)
76
+        self.assertEqual(0, self.basket.line_quantity(
77
+            product, record))
78
+        self.assertEqual(1, self.basket.line_quantity(
79
+            product, record, options))
80
+
81
+
82
+class TestMergingTwoBaskets(TestCase):
83
+
84
+    def setUp(self):
85
+        self.product = factories.create_product()
86
+        self.record = factories.create_stockrecord(
87
+            self.product, price_excl_tax=D('10.00'))
88
+        self.stockinfo = factories.create_stockinfo(self.record)
89
+
90
+        self.main_basket = Basket()
91
+        self.main_basket.strategy = strategy.Default()
92
+        self.main_basket.add(self.product, self.stockinfo,
93
+                             quantity=2)
94
+
95
+        self.merge_basket = Basket()
96
+        self.merge_basket.strategy = strategy.Default()
97
+        self.merge_basket.add(self.product, self.stockinfo,
98
+                              quantity=1)
99
+
100
+        self.main_basket.merge(self.merge_basket)
101
+
102
+    def test_doesnt_sum_quantities(self):
103
+        self.assertEquals(1, self.main_basket.num_lines)
104
+
105
+    def test_changes_status_of_merge_basket(self):
106
+        self.assertEquals(Basket.MERGED, self.merge_basket.status)
107
+
108
+
109
+class TestASubmittedBasket(TestCase):
110
+
111
+    def setUp(self):
112
+        self.basket = Basket()
113
+        self.basket.strategy = strategy.Default()
114
+        self.basket.submit()
115
+
116
+    def test_has_correct_status(self):
117
+        self.assertTrue(self.basket.is_submitted)
118
+
119
+    def test_can_be_edited(self):
120
+        self.assertFalse(self.basket.can_be_edited)

+ 0
- 0
tests/unit/basket/__init__.py Прегледај датотеку


+ 23
- 0
tests/unit/basket/middleware_tests.py Прегледај датотеку

@@ -0,0 +1,23 @@
1
+from django.test import TestCase
2
+from django.test.client import RequestFactory
3
+from django.contrib.auth.models import AnonymousUser
4
+
5
+from oscar.apps.basket import middleware
6
+
7
+
8
+class TestBasketMiddleware(TestCase):
9
+
10
+    def setUp(self):
11
+        self.middleware = middleware.BasketMiddleware()
12
+        self.request = RequestFactory().get('/')
13
+        self.request.user = AnonymousUser()
14
+        self.middleware.process_request(self.request)
15
+
16
+    def test_basket_is_attached_to_request(self):
17
+        self.assertTrue(hasattr(self.request, 'basket'))
18
+
19
+    def test_strategy_is_attached_to_basket(self):
20
+        self.assertTrue(hasattr(self.request.basket, 'strategy'))
21
+
22
+    def test_strategy_is_attached_to_request(self):
23
+        self.assertTrue(hasattr(self.request, 'strategy'))

+ 32
- 0
tests/unit/basket/model_tests.py Прегледај датотеку

@@ -0,0 +1,32 @@
1
+from django.test import TestCase
2
+
3
+from oscar.apps.basket.models import Basket
4
+from oscar.apps.partner import strategy
5
+
6
+
7
+class TestANewBasket(TestCase):
8
+
9
+    def setUp(self):
10
+        self.basket = Basket()
11
+        self.basket.strategy = strategy.Default()
12
+
13
+    def test_has_zero_lines(self):
14
+        self.assertEqual(0, self.basket.num_lines)
15
+
16
+    def test_has_zero_items(self):
17
+        self.assertEqual(0, self.basket.num_items)
18
+
19
+    def test_doesnt_contain_vouchers(self):
20
+        self.assertFalse(self.basket.contains_a_voucher)
21
+
22
+    def test_can_be_edited(self):
23
+        self.assertTrue(self.basket.can_be_edited)
24
+
25
+    def test_is_empty(self):
26
+        self.assertTrue(self.basket.is_empty)
27
+
28
+    def test_is_not_submitted(self):
29
+        self.assertFalse(self.basket.is_submitted)
30
+
31
+    def test_has_no_applied_offers(self):
32
+        self.assertEquals({}, self.basket.applied_offers())

+ 27
- 0
tests/unit/basket/report_tests.py Прегледај датотеку

@@ -0,0 +1,27 @@
1
+import datetime
2
+
3
+from django.test import TestCase
4
+
5
+from oscar.apps.basket.reports import (
6
+    OpenBasketReportGenerator, SubmittedBasketReportGenerator)
7
+
8
+
9
+class TestBasketReports(TestCase):
10
+
11
+    def test_open_report_doesnt_error(self):
12
+        data = {
13
+            'start_date': datetime.date(2012, 5, 1),
14
+            'end_date': datetime.date(2012, 5, 17),
15
+            'formatter': 'CSV'
16
+        }
17
+        generator = OpenBasketReportGenerator(**data)
18
+        generator.generate()
19
+
20
+    def test_submitted_report_doesnt_error(self):
21
+        data = {
22
+            'start_date': datetime.date(2012, 5, 1),
23
+            'end_date': datetime.date(2012, 5, 17),
24
+            'formatter': 'CSV'
25
+        }
26
+        generator = SubmittedBasketReportGenerator(**data)
27
+        generator.generate()

+ 0
- 112
tests/unit/basket_tests.py Прегледај датотеку

@@ -1,112 +0,0 @@
1
-import datetime
2
-from decimal import Decimal as D
3
-
4
-from django.test import TestCase
5
-from django.test.client import RequestFactory
6
-from django.contrib.auth.models import AnonymousUser
7
-
8
-from oscar.apps.basket.models import Basket
9
-from oscar.apps.basket.middleware import BasketMiddleware
10
-from oscar.apps.partner import strategy
11
-from oscar.test import factories
12
-from oscar.apps.basket.reports import (
13
-    OpenBasketReportGenerator, SubmittedBasketReportGenerator)
14
-from oscar.apps.catalogue.models import Option
15
-
16
-
17
-class TestABasket(TestCase):
18
-
19
-    def setUp(self):
20
-        self.basket = Basket()
21
-        self.basket.strategy = strategy.Default()
22
-        self.product = factories.create_product()
23
-        self.record = factories.create_stockrecord(
24
-            self.product, price_excl_tax=D('10.00'))
25
-        self.stockinfo = factories.create_stockinfo(self.record)
26
-
27
-    def test_an_empty_basket_has_zero_lines(self):
28
-        self.assertEqual(0, self.basket.num_lines)
29
-
30
-    def test_new_baskets_are_empty(self):
31
-        self.assertTrue(self.basket.is_empty)
32
-
33
-    def test_adding_product_creates_line(self):
34
-        self.basket.add_product(self.product, self.stockinfo)
35
-        self.assertEqual(1, self.basket.num_lines)
36
-
37
-    def test_adding_multiproduct_line_returns_correct_number_of_items(self):
38
-        self.basket.add_product(self.product, self.stockinfo, 10)
39
-        self.assertEqual(self.basket.num_items, 10)
40
-        self.assertEqual(self.basket.num_lines, 1)
41
-
42
-    def test_add_product_creates_line(self):
43
-        self.basket.add_product(self.product, self.stockinfo)
44
-        self.assertTrue(self.basket.num_lines == 1)
45
-
46
-    def test_add_product_sets_line_prices(self):
47
-        self.basket.add_product(self.product, self.stockinfo)
48
-        basket_line = self.basket.lines.all()[0]
49
-        self.assertEqual(basket_line.price_incl_tax, D('10.00'))
50
-        self.assertEqual(basket_line.price_excl_tax, D('10.00'))
51
-
52
-    def test_flushing_basket_removes_all_lines(self):
53
-        self.basket.add_product(self.product, self.stockinfo, 10)
54
-        self.assertEqual(self.basket.num_items, 10)
55
-        self.basket.flush()
56
-        self.assertEqual(self.basket.num_items, 0)
57
-
58
-    def test_returns_correct_quantity_for_missing_product(self):
59
-        self.assertEqual(0, self.basket.line_quantity(
60
-            self.product, self.record))
61
-
62
-    def test_returns_correct_quantity_for_existing_product(self):
63
-        self.basket.add_product(self.product, self.stockinfo)
64
-        self.assertEqual(1, self.basket.line_quantity(
65
-            self.product, self.record))
66
-
67
-    def test_returns_correct_quantity_for_existing_product_with_options(self):
68
-        option = Option.objects.create(name="Message")
69
-        options = [{"option": option, "value": "2"}]
70
-        self.basket.add_product(self.product, self.stockinfo, options=options)
71
-        self.assertEqual(0, self.basket.line_quantity(
72
-            self.product, self.record))
73
-        self.assertEqual(1, self.basket.line_quantity(
74
-            self.product, self.record, options))
75
-        self.assertEqual(1, self.basket.product_quantity(self.product))
76
-
77
-    def test_has_method_to_test_if_submitted(self):
78
-        self.basket.set_as_submitted()
79
-        self.assertTrue(self.basket.is_submitted())
80
-
81
-
82
-class TestBasketMiddleware(TestCase):
83
-
84
-    def setUp(self):
85
-        self.middleware = BasketMiddleware()
86
-
87
-    def test_basket_is_attached_to_request(self):
88
-        request = RequestFactory().get('/')
89
-        request.user = AnonymousUser()
90
-        self.middleware.process_request(request)
91
-        self.assertTrue(hasattr(request, 'basket'))
92
-
93
-
94
-class TestBasketReports(TestCase):
95
-
96
-    def test_open_report_doesnt_error(self):
97
-        data = {
98
-            'start_date': datetime.date(2012, 5, 1),
99
-            'end_date': datetime.date(2012, 5, 17),
100
-            'formatter': 'CSV'
101
-        }
102
-        generator = OpenBasketReportGenerator(**data)
103
-        generator.generate()
104
-
105
-    def test_submitted_report_doesnt_error(self):
106
-        data = {
107
-            'start_date': datetime.date(2012, 5, 1),
108
-            'end_date': datetime.date(2012, 5, 17),
109
-            'formatter': 'CSV'
110
-        }
111
-        generator = SubmittedBasketReportGenerator(**data)
112
-        generator.generate()

Loading…
Откажи
Сачувај