Преглед на файлове

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
         self._lines = None
73
         self._lines = None
74
         self.offer_applications = results.OfferApplications()
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
     @property
87
     @property
77
     def has_strategy(self):
88
     def has_strategy(self):
78
         return hasattr(self, '_strategy')
89
         return hasattr(self, '_strategy')
92
 
103
 
93
     strategy = property(_get_strategy, _set_strategy)
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
     def all_lines(self):
106
     def all_lines(self):
103
         """
107
         """
104
         Return a cached set of basket lines.
108
         Return a cached set of basket lines.
190
             line.save()
194
             line.save()
191
         self.reset_offer_applications()
195
         self.reset_offer_applications()
192
     add_product.alters_data = True
196
     add_product.alters_data = True
193
-
194
     add = add_product
197
     add = add_product
195
 
198
 
196
     def applied_offers(self):
199
     def applied_offers(self):
450
 
453
 
451
     @property
454
     @property
452
     def contains_a_voucher(self):
455
     def contains_a_voucher(self):
456
+        if not self.id:
457
+            return False
453
         return self.vouchers.all().count() > 0
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
     def can_be_edited(self):
465
     def can_be_edited(self):
460
         """
466
         """
461
         Test if a basket can be edited
467
         Test if a basket can be edited
462
         """
468
         """
463
         return self.status in self.editable_statuses
469
         return self.status in self.editable_statuses
464
 
470
 
471
+    # =============
472
+    # Query methods
473
+    # =============
474
+
465
     def contains_voucher(self, code):
475
     def contains_voucher(self, code):
466
         """
476
         """
467
         Test whether the basket contains a voucher with a given code
477
         Test whether the basket contains a voucher with a given code
468
         """
478
         """
479
+        if not self.id:
480
+            return False
469
         try:
481
         try:
470
             self.vouchers.get(code=code)
482
             self.vouchers.get(code=code)
471
         except ObjectDoesNotExist:
483
         except ObjectDoesNotExist:
494
         except ObjectDoesNotExist:
506
         except ObjectDoesNotExist:
495
             return 0
507
             return 0
496
 
508
 
497
-    def is_submitted(self):
498
-        return self.status == self.SUBMITTED
499
 
509
 
500
 
510
 
501
 class AbstractLine(models.Model):
511
 class AbstractLine(models.Model):
560
         """
570
         """
561
         Saves a line or deletes if the quantity is 0
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
             raise PermissionDenied(
574
             raise PermissionDenied(
565
                 _("You cannot modify a %s basket") % (
575
                 _("You cannot modify a %s basket") % (
566
                     self.basket.status.lower(),))
576
                     self.basket.status.lower(),))

+ 0
- 0
tests/integration/basket/__init__.py Целия файл


+ 120
- 0
tests/integration/basket/model_tests.py Целия файл

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 Целия файл

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 Целия файл

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 Целия файл

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
-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…
Отказ
Запис