import datetime from decimal import Decimal as D from django.test import TestCase from oscar.apps.payment.models import Bankcard, Source from oscar.core.compat import get_user_model from oscar.test import factories class TestBankcard(TestCase): def test_obfuscates_number_before_saving(self): bankcard = Bankcard(number="1000011100000004") bankcard.prepare_for_save() self.assertEqual("XXXX-XXXX-XXXX-0004", bankcard.number) def test_determines_bankcard_type(self): bankcard = Bankcard(number="5500000000000004") self.assertEqual("Mastercard", bankcard.card_type) def test_provides_start_month_property(self): start = datetime.date(day=1, month=1, year=2010) bankcard = Bankcard(start_date=start) self.assertEqual("01/10", bankcard.start_month()) def test_provides_end_month_property(self): end = datetime.date(day=1, month=1, year=2010) bankcard = Bankcard(expiry_date=end) self.assertEqual("01/10", bankcard.expiry_month()) def test_bankcard_card_correct_save(self): # issue #1486 user_klass = get_user_model() user = user_klass.objects.create_user('_', 'a@a.com', 'pwd') end = datetime.date(day=1, month=1, year=2010) bankcard = Bankcard.objects.create( user=user, number="5500000000000004", expiry_date=end) saved_bankcard = Bankcard.objects.get(id=bankcard.id) self.assertEqual('Mastercard', saved_bankcard.card_type) def test_cardtype_persists_after_save(self): user = factories.UserFactory() end = datetime.date(day=1, month=1, year=2010) bankcard = Bankcard( user=user, number="5500000000000004", expiry_date=end) self.assertEqual('Mastercard', bankcard.card_type) bankcard.save() self.assertEqual('Mastercard', bankcard.card_type) reloaded_bankcard = Bankcard.objects.get(id=bankcard.id) self.assertEqual('Mastercard', reloaded_bankcard.card_type) class TestSource(TestCase): def test_calculates_initial_balance_correctly(self): source = Source(amount_allocated=D('100')) self.assertEqual(D('100'), source.balance) def test_calculates_balance_correctly(self): source = Source( amount_allocated=D('100'), amount_debited=D('80'), amount_refunded=D('20')) self.assertEqual( D('100') - D('80') + D('20'), source.balance) def test_calculates_amount_for_refund_correctly(self): source = Source( amount_allocated=D('100'), amount_debited=D('80'), amount_refunded=D('20')) self.assertEqual( D('80') - D('20'), source.amount_available_for_refund) class TestAPaymentSource(TestCase): def setUp(self): order = factories.create_order() self.source = factories.SourceFactory(order=order) def test_allocation_doesnt_error(self): self.source.allocate(D('100.00')) def test_debit_doesnt_error(self): self.source.allocate(D('100.00')) self.source.debit(D('80.00')) def test_full_debit_doesnt_error(self): self.source.allocate(D('100.00')) self.source.debit() self.assertEqual(D('0.00'), self.source.balance) def test_refund_doesnt_error(self): self.source.allocate(D('100.00')) self.source.debit(D('80.00')) self.source.refund(D('50.00'))