瀏覽代碼

Reorganise payment tests

master
David Winterbottom 12 年之前
父節點
當前提交
f9799d5029

+ 46
- 0
oscar/apps/payment/bankcards.py 查看文件

@@ -0,0 +1,46 @@
1
+VISA, MASTERCARD, AMEX, MAESTRO, DISCOVER = (
2
+    'Visa', 'Mastercard', 'American Express', 'Maestro', 'Discover')
3
+
4
+
5
+def bankcard_type(number):
6
+    """
7
+    Return the type of a bankcard based on its number.
8
+    """
9
+    number = str(number)
10
+    if len(number) == 13:
11
+        if number[0] == "4":
12
+            return VISA
13
+    elif len(number) == 14:
14
+        if number[:2] == "36":
15
+            return MASTERCARD
16
+    elif len(number) == 15:
17
+        if number[:2] in ("34", "37"):
18
+            return AMEX
19
+    elif len(number) == 16:
20
+        if number[:4] == "6011":
21
+            return DISCOVER
22
+        if number[:2] in ("51", "52", "53", "54", "55"):
23
+            return MASTERCARD
24
+        if number[0] == "4":
25
+            return VISA
26
+    return None
27
+
28
+
29
+def luhn(card_number):
30
+    """
31
+    Test whether a bankcard number passes the Luhn algorithm.
32
+    """
33
+    card_number = str(card_number)
34
+    sum = 0
35
+    num_digits = len(card_number)
36
+    odd_even = num_digits & 1
37
+
38
+    for i in range(0, num_digits):
39
+        digit = int(card_number[i])
40
+        if not ((i & 1) ^ odd_even):
41
+            digit = digit * 2
42
+        if digit > 9:
43
+            digit = digit - 9
44
+        sum = sum + digit
45
+
46
+    return (sum % 10) == 0

+ 4
- 49
oscar/apps/payment/forms.py 查看文件

@@ -5,61 +5,16 @@ import re
5 5
 from django import forms
6 6
 from django.db.models import get_model
7 7
 from django.utils.translation import ugettext_lazy as _
8
-from oscar.apps.address.forms import AbstractAddressForm
9 8
 
9
+from oscar.apps.address.forms import AbstractAddressForm
10 10
 from oscar.core.loading import get_class
11
+from . import bankcards
11 12
 
12 13
 Country = get_model('address', 'Country')
13 14
 BillingAddress = get_model('order', 'BillingAddress')
14 15
 BankcardModel = get_model('payment', 'Bankcard')
15 16
 Bankcard = get_class('payment.utils', 'Bankcard')
16 17
 
17
-VISA, MASTERCARD, AMEX, MAESTRO, DISCOVER = ('Visa', 'Mastercard', 'American Express', 'Maestro', 'Discover')
18
-
19
-
20
-def bankcard_type(number):
21
-    u"""
22
-    Returns the type of a bankcard based on its number.
23
-    """
24
-    number = str(number)
25
-    if len(number) == 13:
26
-        if number[0] == "4":
27
-            return VISA
28
-    elif len(number) == 14:
29
-        if number[:2] == "36":
30
-            return MASTERCARD
31
-    elif len(number) == 15:
32
-        if number[:2] in ("34", "37"):
33
-            return AMEX
34
-    elif len(number) == 16:
35
-        if number[:4] == "6011":
36
-            return DISCOVER
37
-        if number[:2] in ("51", "52", "53", "54", "55"):
38
-            return MASTERCARD
39
-        if number[0] == "4":
40
-            return VISA
41
-    return None
42
-
43
-
44
-def luhn(card_number):
45
-    u"""
46
-    Tests whether a bankcard number passes the Luhn algorithm.
47
-    """
48
-    card_number = str(card_number)
49
-    sum = 0
50
-    num_digits = len(card_number)
51
-    odd_even = num_digits & 1
52
-
53
-    for i in range(0, num_digits):
54
-        digit = int(card_number[i])
55
-        if not (( i & 1 ) ^ odd_even ):
56
-            digit = digit * 2
57
-        if digit > 9:
58
-            digit = digit - 9
59
-        sum = sum + digit
60
-
61
-    return (sum % 10) == 0
62
-
63 18
 
64 19
 class BankcardNumberField(forms.CharField):
65 20
 
@@ -69,7 +24,7 @@ class BankcardNumberField(forms.CharField):
69 24
         non_decimal = re.compile(r'\D+')
70 25
         value = non_decimal.sub('', value.strip())
71 26
 
72
-        if value and not luhn(value):
27
+        if value and not bankcards.luhn(value):
73 28
             raise forms.ValidationError(_("Please enter a valid credit card number."))
74 29
         return super(BankcardNumberField, self).clean(value)
75 30
 
@@ -239,4 +194,4 @@ class BillingAddressForm(AbstractAddressForm):
239 194
 
240 195
     class Meta:
241 196
         model = BillingAddress
242
-        exclude = ('search_text',)
197
+        exclude = ('search_text',)

+ 0
- 0
tests/integration/payment/__init__.py 查看文件


+ 0
- 0
tests/unit/payment/__init__.py 查看文件


+ 46
- 0
tests/unit/payment/bankcard_tests.py 查看文件

@@ -0,0 +1,46 @@
1
+import nose.tools
2
+
3
+from oscar.apps.payment import bankcards
4
+
5
+
6
+fixture_data = {
7
+    bankcards.VISA: ('4111111111111111',),
8
+    bankcards.MASTERCARD: ('5500000000000004',),
9
+    bankcards.DISCOVER: ('6011000000000004',),
10
+    bankcards.AMEX: ('340000000000009',),
11
+}
12
+
13
+
14
+def test_bankcard_type_sniffing():
15
+
16
+    def compare(number, type):
17
+        nose.tools.eq_(bankcards.bankcard_type(number), type)
18
+
19
+    for bankcard_type, numbers in fixture_data.items():
20
+        for number in numbers:
21
+            yield compare, number, bankcard_type
22
+
23
+
24
+valid_numbers = [
25
+    '4111111111111111',
26
+    '5500000000000004',
27
+    '6011000000000004',
28
+    '340000000000009']
29
+
30
+invalid_numbers = [
31
+    '4111111111111110',
32
+    '5500000000000009',
33
+    '6011000000000000',
34
+    '340000000000005']
35
+
36
+
37
+def test_luhn_check():
38
+    def is_valid(n):
39
+        assert bankcards.luhn(n) is True
40
+    for number in valid_numbers:
41
+        yield is_valid, number
42
+
43
+    def is_not_valid(n):
44
+        assert bankcards.luhn(n) is False
45
+    for number in invalid_numbers:
46
+        yield is_not_valid, number

+ 12
- 0
tests/unit/payment/form_tests.py 查看文件

@@ -0,0 +1,12 @@
1
+from django.test import TestCase
2
+
3
+from oscar.apps.payment import forms
4
+
5
+
6
+class BankcardNumberFieldTest(TestCase):
7
+
8
+    def setUp(self):
9
+        self.field = forms.BankcardNumberField()
10
+
11
+    def test_spaces_are_stipped(self):
12
+        self.assertEquals('4111111111111111', self.field.clean('  4111 1111 1111 1111'))

+ 11
- 0
tests/unit/payment/model_tests.py 查看文件

@@ -0,0 +1,11 @@
1
+from django.test import TestCase
2
+
3
+from oscar.apps.payment.models import Bankcard
4
+
5
+
6
+class TestBankcard(TestCase):
7
+
8
+    def test_get_obfuscated_number(self):
9
+        bankcard = Bankcard(number="1000011100000004")
10
+        self.assertEquals("XXXX-XXXX-XXXX-0004",
11
+                          bankcard._get_obfuscated_number())

+ 0
- 69
tests/unit/payment_tests.py 查看文件

@@ -1,69 +0,0 @@
1
-import datetime
2
-
3
-from django.test import TestCase
4
-from django.contrib.auth.models import User
5
-
6
-from oscar.apps.payment.models import Bankcard
7
-from oscar.apps.payment.forms import (bankcard_type, VISA, MASTERCARD, AMEX, DISCOVER, 
8
-                                      BankcardNumberField, BankcardExpiryMonthField, luhn)
9
-
10
-
11
-class BankcardTest(TestCase):
12
-    
13
-    def test_get_obfuscated_number(self):
14
-        bankcard = Bankcard(name="David Winterbottom", number="1000011100000004")
15
-        self.assertEquals("XXXX-XXXX-XXXX-0004", bankcard._get_obfuscated_number())
16
-    
17
-    def test_number_is_anonymised_when_saving(self):
18
-        user = User.objects.create(username='Dummy user')
19
-        expiry_date = datetime.date(year=2012, month=02, day=12)
20
-        bankcard = Bankcard.objects.create(name="David Winterbottom", number="1000011100000004", user=user, expiry_date=expiry_date)
21
-        self.assertEquals("XXXX-XXXX-XXXX-0004", bankcard.number)
22
-
23
-
24
-class BankcardTypeTest(TestCase):
25
-    
26
-    fixture_data = {
27
-        VISA: ('4111111111111111',),
28
-        MASTERCARD: ('5500000000000004',),
29
-        DISCOVER: ('6011000000000004',),
30
-        AMEX: ('340000000000009',),
31
-    }
32
-    
33
-    def test_bankcard_type_sniffer(self):
34
-        for type, numbers in self.fixture_data.items():
35
-            for n in numbers:
36
-                self.assertEquals(type, bankcard_type(n), "%s is a %s" % (n, type))
37
-        
38
-
39
-class BankcardNumberFieldTest(TestCase):
40
-    
41
-    def setUp(self):
42
-        self.f = BankcardNumberField()
43
-        
44
-    def test_spaces_are_stipped(self):
45
-        self.assertEquals('4111111111111111', self.f.clean('  4111 1111 1111 1111'))
46
-        
47
-
48
-class LuhnTest(TestCase):
49
-    
50
-    valid_numbers = ['4111111111111111',
51
-                     '5500000000000004',
52
-                     '6011000000000004',
53
-                     '340000000000009']
54
-    
55
-    # Tweaked versions of above valid numbers
56
-    invalid_numbers = ['4111111111111110',
57
-                     '5500000000000009',
58
-                     '6011000000000000',
59
-                     '340000000000005']
60
-    
61
-    def test_valid_numbers_pass(self):
62
-        for number in self.valid_numbers:
63
-            self.assertTrue(luhn(number))
64
-            
65
-    def test_invalid_numbers_fail(self):
66
-        for number in self.invalid_numbers:
67
-            self.assertFalse(luhn(number))
68
-    
69
-    

Loading…
取消
儲存