Skip to content

Commit 2e52ff1

Browse files
committed
2.16.0
1 parent d1d4b5f commit 2e52ff1

File tree

10 files changed

+177
-7
lines changed

10 files changed

+177
-7
lines changed

CHANGELOG.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## 2.16.0
2+
3+
* Additional card information, such as prepaid, debit, commercial, Durbin regulated, healthcare, and payroll, are returned on credit card responses
4+
* Allows transactions to be specified as recurring
5+
16
## 2.15.0
27

38
* Adds prepaid attribute to credit cards (possible values of: Yes, No, Unknown)

braintree/credit_card.py

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,66 @@ class CustomerLocation(object):
8484
International = "international"
8585
US = "us"
8686

87+
class Commercial(object):
88+
"""
89+
Constants representing the three states for the commercial attribute
90+
91+
* braintree.CreditCard.Commercial.Yes
92+
* braintree.CreditCard.Commercial.No
93+
* braintree.CreditCard.Commercial.Unknown
94+
"""
95+
Yes = "Yes"
96+
No = "No"
97+
Unknown = "Unknown"
98+
99+
class DurbinRegulated(object):
100+
"""
101+
Constants representing the three states for the durbin_regulated attribute
102+
103+
* braintree.CreditCard.DurbinRegulated.Yes
104+
* braintree.CreditCard.DurbinRegulated.No
105+
* braintree.CreditCard.DurbinRegulated.Unknown
106+
"""
107+
Yes = "Yes"
108+
No = "No"
109+
Unknown = "Unknown"
110+
111+
class Debit(object):
112+
"""
113+
Constants representing the three states for the debit attribute
114+
115+
* braintree.CreditCard.Debit.Yes
116+
* braintree.CreditCard.Debit.No
117+
* braintree.CreditCard.Debit.Unknown
118+
"""
119+
Yes = "Yes"
120+
No = "No"
121+
Unknown = "Unknown"
122+
123+
class Healthcare(object):
124+
"""
125+
Constants representing the three states for the healthcare attribute
126+
127+
* braintree.CreditCard.Healthcare.Yes
128+
* braintree.CreditCard.Healthcare.No
129+
* braintree.CreditCard.Healthcare.Unknown
130+
"""
131+
Yes = "Yes"
132+
No = "No"
133+
Unknown = "Unknown"
134+
135+
class Payroll(object):
136+
"""
137+
Constants representing the three states for the payroll attribute
138+
139+
* braintree.CreditCard.Payroll.Yes
140+
* braintree.CreditCard.Payroll.No
141+
* braintree.CreditCard.Payroll.Unknown
142+
"""
143+
Yes = "Yes"
144+
No = "No"
145+
Unknown = "Unknown"
146+
87147
class Prepaid(object):
88148
"""
89149
Constants representing the three states for the prepaid attribute

braintree/test/__init__.py

Whitespace-only changes.
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
class CreditCardNumbers(object):
2+
class CardTypeIndicators(object):
3+
Commercial = "4111111111131010"
4+
DurbinRegulated = "4111161010101010"
5+
Debit = "4117101010101010"
6+
Healthcare = "4111111510101010"
7+
Payroll = "4111111114101010"
8+
Prepaid = "4111111111111210"
9+
10+
No = "4111111111310101"
11+
Unknown = "4111111111112101"

braintree/transaction.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,7 @@ def clone_signature():
322322
@staticmethod
323323
def create_signature():
324324
return [
325-
"amount", "customer_id", "merchant_account_id", "order_id", "payment_method_token", "purchase_order_number", "shipping_address_id", "tax_amount", "tax_exempt", "type",
325+
"amount", "customer_id", "merchant_account_id", "order_id", "payment_method_token", "purchase_order_number", "recurring", "shipping_address_id", "tax_amount", "tax_exempt", "type",
326326
{
327327
"credit_card": [
328328
"token", "cardholder_name", "cvv", "expiration_date", "expiration_month", "expiration_year", "number"

braintree/version.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
Version = "2.15.0"
1+
Version = "2.16.0"

setup.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
author="Braintree",
88
author_email="[email protected]",
99
url="https://www.braintreepayments.com/docs/python",
10-
packages=["braintree", "braintree.exceptions", "braintree.util", "braintree.util.http_strategy"],
10+
packages=["braintree", "braintree.exceptions", "braintree.util", "braintree.test", "braintree.util.http_strategy"],
1111
package_data={"braintree": ["ssl/*"]},
1212
install_requires=["requests>=0.11.1,<1.0"],
1313
zip_safe=False

tests/integration/test_credit_card.py

Lines changed: 79 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
from tests.test_helper import *
2+
from braintree.test.credit_card_numbers import CreditCardNumbers
23

34
class TestCreditCard(unittest.TestCase):
45
def test_create_adds_credit_card_to_existing_customer(self):
@@ -860,11 +861,76 @@ def test_expiring_between(self):
860861

861862
self.assertEquals(set(['2010']), TestHelper.unique([credit_card.expiration_year for credit_card in collection.items]))
862863

864+
def test_commercial_card(self):
865+
customer = Customer.create().customer
866+
result = CreditCard.create({
867+
"customer_id": customer.id,
868+
"number": CreditCardNumbers.CardTypeIndicators.Commercial,
869+
"expiration_date": "05/2014",
870+
"options": {"verify_card": True}
871+
})
872+
873+
credit_card = result.credit_card
874+
875+
self.assertEquals(CreditCard.Commercial.Yes, credit_card.commercial)
876+
877+
def test_durbin_regulated_card(self):
878+
customer = Customer.create().customer
879+
result = CreditCard.create({
880+
"customer_id": customer.id,
881+
"number": CreditCardNumbers.CardTypeIndicators.DurbinRegulated,
882+
"expiration_date": "05/2014",
883+
"options": {"verify_card": True}
884+
})
885+
886+
credit_card = result.credit_card
887+
888+
self.assertEquals(CreditCard.DurbinRegulated.Yes, credit_card.durbin_regulated)
889+
890+
def test_debit_card(self):
891+
customer = Customer.create().customer
892+
result = CreditCard.create({
893+
"customer_id": customer.id,
894+
"number": CreditCardNumbers.CardTypeIndicators.Debit,
895+
"expiration_date": "05/2014",
896+
"options": {"verify_card": True}
897+
})
898+
899+
credit_card = result.credit_card
900+
901+
self.assertEquals(CreditCard.Debit.Yes, credit_card.debit)
902+
903+
def test_healthcare_card(self):
904+
customer = Customer.create().customer
905+
result = CreditCard.create({
906+
"customer_id": customer.id,
907+
"number": CreditCardNumbers.CardTypeIndicators.Healthcare,
908+
"expiration_date": "05/2014",
909+
"options": {"verify_card": True}
910+
})
911+
912+
credit_card = result.credit_card
913+
914+
self.assertEquals(CreditCard.Healthcare.Yes, credit_card.healthcare)
915+
916+
def test_payroll_card(self):
917+
customer = Customer.create().customer
918+
result = CreditCard.create({
919+
"customer_id": customer.id,
920+
"number": CreditCardNumbers.CardTypeIndicators.Payroll,
921+
"expiration_date": "05/2014",
922+
"options": {"verify_card": True}
923+
})
924+
925+
credit_card = result.credit_card
926+
927+
self.assertEquals(CreditCard.Payroll.Yes, credit_card.payroll)
928+
863929
def test_prepaid_card(self):
864930
customer = Customer.create().customer
865931
result = CreditCard.create({
866932
"customer_id": customer.id,
867-
"number": "4500600000000061",
933+
"number": CreditCardNumbers.CardTypeIndicators.Prepaid,
868934
"expiration_date": "05/2014",
869935
"options": {"verify_card": True}
870936
})
@@ -877,25 +943,34 @@ def test_all_negative_card_type_identifiers(self):
877943
customer = Customer.create().customer
878944
result = CreditCard.create({
879945
"customer_id": customer.id,
880-
"number": "4111111111111111",
946+
"number": CreditCardNumbers.CardTypeIndicators.No,
881947
"expiration_date": "05/2014",
882948
"options": {"verify_card": True}
883949
})
884950

885951
credit_card = result.credit_card
886952

953+
self.assertEquals(CreditCard.Debit.No, credit_card.debit)
954+
self.assertEquals(CreditCard.DurbinRegulated.No, credit_card.durbin_regulated)
887955
self.assertEquals(CreditCard.Prepaid.No, credit_card.prepaid)
956+
self.assertEquals(CreditCard.Payroll.No, credit_card.payroll)
957+
self.assertEquals(CreditCard.Commercial.No, credit_card.commercial)
958+
self.assertEquals(CreditCard.Healthcare.No, credit_card.healthcare)
888959

889960
def test_card_without_card_type_identifiers(self):
890961
customer = Customer.create().customer
891962
result = CreditCard.create({
892963
"customer_id": customer.id,
893-
"number": "378282246310005",
964+
"number": CreditCardNumbers.CardTypeIndicators.Unknown,
894965
"expiration_date": "05/2014",
895966
"options": {"verify_card": True}
896967
})
897968

898969
credit_card = result.credit_card
899970

971+
self.assertEquals(CreditCard.Debit.Unknown, credit_card.debit)
972+
self.assertEquals(CreditCard.DurbinRegulated.Unknown, credit_card.durbin_regulated)
900973
self.assertEquals(CreditCard.Prepaid.Unknown, credit_card.prepaid)
901-
974+
self.assertEquals(CreditCard.Payroll.Unknown, credit_card.payroll)
975+
self.assertEquals(CreditCard.Commercial.Unknown, credit_card.commercial)
976+
self.assertEquals(CreditCard.Healthcare.Unknown, credit_card.healthcare)

tests/integration/test_transaction.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,6 +456,24 @@ def test_validation_error_on_invalid_custom_fields(self):
456456
result.errors.for_object("transaction").on("custom_fields")[0].code
457457
)
458458

459+
def test_create_can_set_recurring_flag(self):
460+
result = Transaction.sale({
461+
"amount": "100",
462+
"customer": {
463+
"first_name": "Adam",
464+
"last_name": "Williams"
465+
},
466+
"credit_card": {
467+
"number": "4111111111111111",
468+
"expiration_date": "05/2009"
469+
},
470+
"recurring": True
471+
})
472+
473+
self.assertTrue(result.is_success)
474+
transaction = result.transaction
475+
self.assertEquals(True, transaction.recurring)
476+
459477
def test_create_can_store_customer_and_credit_card_in_the_vault(self):
460478
result = Transaction.sale({
461479
"amount": "100",

tests/unit/test_credit_card.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,3 +81,4 @@ def test_finding_empty_id_raises_not_found_exception(self):
8181
self.assertTrue(False)
8282
except NotFoundError, e:
8383
self.assertTrue(True)
84+

0 commit comments

Comments
 (0)