Sfoglia il codice sorgente

Ensure a Bankcard's type isn't lost after saving

Before this change, the type of a bankcard would be clobbered by saving
and reloading.

Fixes #1486, #1487
master
Sergey Maranchuk 11 anni fa
parent
commit
1e829b18d8

+ 6
- 3
oscar/apps/payment/abstract_models.py Vedi File

273
         self.issue_number = kwargs.pop('issue_number', None)
273
         self.issue_number = kwargs.pop('issue_number', None)
274
         self.ccv = kwargs.pop('ccv', None)
274
         self.ccv = kwargs.pop('ccv', None)
275
         super(AbstractBankcard, self).__init__(*args, **kwargs)
275
         super(AbstractBankcard, self).__init__(*args, **kwargs)
276
-        self.card_type = bankcards.bankcard_type(self.number)
277
-        if self.card_type is None:
278
-            self.card_type = 'Unknown card type'
276
+
277
+        # Initialise the card-type
278
+        if self.id is None:
279
+            self.card_type = bankcards.bankcard_type(self.number)
280
+            if self.card_type is None:
281
+                self.card_type = 'Unknown card type'
279
 
282
 
280
     class Meta:
283
     class Meta:
281
         abstract = True
284
         abstract = True

+ 18
- 0
tests/integration/payment/model_tests.py Vedi File

1
 from decimal import Decimal as D
1
 from decimal import Decimal as D
2
+import datetime
2
 
3
 
3
 from django.test import TestCase
4
 from django.test import TestCase
4
 from django_dynamic_fixture import G
5
 from django_dynamic_fixture import G
5
 
6
 
6
 from oscar.test import factories
7
 from oscar.test import factories
7
 from oscar.apps.payment import models
8
 from oscar.apps.payment import models
9
+from oscar.apps.payment.models import Bankcard
8
 
10
 
9
 
11
 
10
 class TestAPaymentSource(TestCase):
12
 class TestAPaymentSource(TestCase):
31
         self.source.allocate(D('100.00'))
33
         self.source.allocate(D('100.00'))
32
         self.source.debit(D('80.00'))
34
         self.source.debit(D('80.00'))
33
         self.source.refund(D('50.00'))
35
         self.source.refund(D('50.00'))
36
+
37
+
38
+class TestBankcard(TestCase):
39
+
40
+    def test_cardtype_persists_after_save(self):
41
+        user = factories.UserFactory()
42
+        end = datetime.date(day=1, month=1, year=2010)
43
+        bankcard = Bankcard(
44
+            user=user, number="5500000000000004", expiry_date=end)
45
+        self.assertEqual('Mastercard', bankcard.card_type)
46
+
47
+        bankcard.save()
48
+        self.assertEqual('Mastercard', bankcard.card_type)
49
+
50
+        reloaded_bankcard = Bankcard.objects.get(id=bankcard.id)
51
+        self.assertEqual('Mastercard', reloaded_bankcard.card_type)

+ 11
- 0
tests/unit/payment/model_tests.py Vedi File

3
 
3
 
4
 from django.test import TestCase
4
 from django.test import TestCase
5
 
5
 
6
+from oscar.core.compat import get_user_model
6
 from oscar.apps.payment.models import Bankcard, Source
7
 from oscar.apps.payment.models import Bankcard, Source
7
 
8
 
8
 
9
 
27
         bankcard = Bankcard(expiry_date=end)
28
         bankcard = Bankcard(expiry_date=end)
28
         self.assertEqual("01/10", bankcard.expiry_month())
29
         self.assertEqual("01/10", bankcard.expiry_month())
29
 
30
 
31
+    def test_bankcard_card_correct_save(self):
32
+        # issue #1486
33
+        user_klass = get_user_model()
34
+        user = user_klass.objects.create_user('_', 'a@a.com', 'pwd')
35
+        end = datetime.date(day=1, month=1, year=2010)
36
+        bankcard = Bankcard.objects.create(
37
+            user=user, number="5500000000000004", expiry_date=end)
38
+        saved_bankcard = Bankcard.objects.get(id=bankcard.id)
39
+        self.assertEqual('Mastercard', saved_bankcard.card_type)
40
+
30
 
41
 
31
 class TestSource(TestCase):
42
 class TestSource(TestCase):
32
 
43
 

Loading…
Annulla
Salva