@@ -15,12 +15,18 @@ from test_cart import RegistrationCartTestCase
UTC = pytz.timezone('UTC')
class InvoiceTestCase(RegistrationCartTestCase):
def _invoice_containing_prod_1(self, qty=1):
cart = TestingCartController.for_user(self.USER_1)
cart.add_to_cart(self.PROD_1, qty)
return TestingInvoiceController.for_cart(self.reget(cart.cart))
def test_create_invoice(self):
current_cart = TestingCartController.for_user(self.USER_1)
# Should be able to create an invoice after the product is added
current_cart.add_to_cart(self.PROD_1, 1)
invoice_1 = TestingInvoiceController.for_cart(current_cart.cart)
@@ -51,16 +57,13 @@ class InvoiceTestCase(RegistrationCartTestCase):
# Invoice should have a value equal to cost of PROD_1 and PROD_2
self.assertEqual(
self.PROD_1.price + self.PROD_2.price,
invoice_2.invoice.value)
def test_invoice_controller_for_id_works(self):
invoice = TestingInvoiceController.for_cart(current_cart.cart)
invoice = self._invoice_containing_prod_1(1)
id_ = invoice.invoice.id
invoice1 = TestingInvoiceController.for_id(id_)
invoice2 = TestingInvoiceController.for_id(str(id_))
@@ -79,27 +82,25 @@ class InvoiceTestCase(RegistrationCartTestCase):
# Now try to invoice the first user
with self.assertRaises(ValidationError):
TestingInvoiceController.for_cart(current_cart.cart)
def test_paying_invoice_makes_new_cart(self):
invoice.pay("A payment!", invoice.invoice.value)
# This payment is for the correct amount invoice should be paid.
self.assertTrue(invoice.invoice.is_paid)
# Cart should not be active
self.assertFalse(invoice.invoice.cart.active)
# Asking for a cart should generate a new one
new_cart = TestingCartController.for_user(self.USER_1)
self.assertNotEqual(current_cart.cart, new_cart.cart)
self.assertNotEqual(invoice.invoice.cart, new_cart.cart)
def test_invoice_includes_discounts(self):
voucher = inventory.Voucher.objects.create(
recipient="Voucher recipient",
code="VOUCHER",
limit=1
@@ -178,54 +179,38 @@ class InvoiceTestCase(RegistrationCartTestCase):
# Viewing invoice_2's invoice should *not* show it as void
invoice_2_new = TestingInvoiceController(invoice_2.invoice)
self.assertFalse(invoice_2_new.invoice.is_void)
def test_voiding_invoice_creates_new_invoice(self):
invoice_1 = self._invoice_containing_prod_1(1)
self.assertFalse(invoice_1.invoice.is_void)
invoice_1.void()
invoice_2 = TestingInvoiceController.for_cart(current_cart.cart)
invoice_2 = TestingInvoiceController.for_cart(invoice_1.invoice.cart)
self.assertNotEqual(invoice_1.invoice, invoice_2.invoice)
def test_cannot_pay_void_invoice(self):
invoice_1.validate_allowed_to_pay()
def test_cannot_void_paid_invoice(self):
invoice.pay("Reference", invoice.invoice.value)
invoice.void()
def test_cannot_void_partially_paid_invoice(self):
invoice.pay("Reference", invoice.invoice.value - 1)
self.assertTrue(invoice.invoice.is_unpaid)
@@ -244,16 +229,13 @@ class InvoiceTestCase(RegistrationCartTestCase):
cart.add_to_cart(self.PROD_1, 1)
invoice.validate_allowed_to_pay()
def test_overpaid_invoice_results_in_credit_note(self):
invoice = TestingInvoiceController.for_cart(self.reget(cart.cart))
# Invoice is overpaid by 1 unit
to_pay = invoice.invoice.value + 1
invoice.pay("Reference", to_pay)
# The total paid should be equal to the value of the invoice only
@@ -265,16 +247,13 @@ class InvoiceTestCase(RegistrationCartTestCase):
invoice=invoice.invoice,
)
self.assertEqual(1, credit_notes.count())
self.assertEqual(to_pay - invoice.invoice.value, credit_notes[0].value)
def test_full_paid_invoice_does_not_generate_credit_note(self):
# Invoice is paid evenly
self.assertEqual(invoice.invoice.value, invoice.total_payments())
@@ -284,16 +263,13 @@ class InvoiceTestCase(RegistrationCartTestCase):
credit_notes = commerce.CreditNote.objects.filter(
self.assertEqual(0, credit_notes.count())
def test_refund_partially_paid_invoice_generates_correct_credit_note(self):
# Invoice is underpaid by 1 unit
to_pay = invoice.invoice.value - 1
invoice.refund()
@@ -306,16 +282,13 @@ class InvoiceTestCase(RegistrationCartTestCase):
self.assertEqual(to_pay, credit_notes[0].value)
def test_refund_fully_paid_invoice_generates_correct_credit_note(self):
to_pay = invoice.invoice.value
@@ -329,16 +302,13 @@ class InvoiceTestCase(RegistrationCartTestCase):
def test_apply_credit_note_pays_invoice(self):
@@ -360,16 +330,13 @@ class InvoiceTestCase(RegistrationCartTestCase):
self.assertTrue(invoice2.invoice.is_paid)
# That invoice should not show up as unclaimed any more
self.assertEquals(0, commerce.CreditNote.unclaimed().count())
def test_apply_credit_note_generates_new_credit_note_if_overpaying(self):
cart.add_to_cart(self.PROD_1, 2)
invoice = self._invoice_containing_prod_1(2)
@@ -402,58 +369,46 @@ class InvoiceTestCase(RegistrationCartTestCase):
self.assertEquals(
invoice.invoice.value - invoice2.invoice.value,
credit_note2.value,
def test_cannot_apply_credit_note_on_invalid_invoices(self):
# There should be one credit note generated out of the invoice.
credit_note = commerce.CreditNote.objects.get(invoice=invoice.invoice)
cn = TestingCreditNoteController(credit_note)
# Create a new cart with invoice, pay it
invoice_2 = TestingInvoiceController.for_cart(self.reget(cart.cart))
invoice_2 = self._invoice_containing_prod_1(1)
invoice_2.pay("LOL", invoice_2.invoice.value)
# Cannot pay paid invoice
cn.apply_to_invoice(invoice_2.invoice)
invoice_2.refund()
# Cannot pay refunded invoice
# Create a new cart with invoice
invoice_2.void()
# Cannot pay void invoice
def test_cannot_apply_a_refunded_credit_note(self):
@@ -476,16 +431,13 @@ class InvoiceTestCase(RegistrationCartTestCase):
# Cannot pay with this credit note.
def test_cannot_refund_an_applied_credit_note(self):