class FacadeTests(TestCase, XmlTestingMixin):
    def setUp(self):
        self.facade = Facade()

    def test_zero_amount_raises_exception(self):
        card = Bankcard(card_number=CARD_VISA,
                        expiry_date='1015',
                        name="Frankie",
                        cvv="123",
                        start_date="1010")
        with self.assertRaises(UnableToTakePayment):
            self.facade.authorise('1000', 0, card)

    def test_zero_amount_for_complete_raises_exception(self):
        with self.assertRaises(UnableToTakePayment):
            self.facade.complete('1000', 0, '1234')

    def test_zero_amount_for_purchase_raises_exception(self):
        with self.assertRaises(UnableToTakePayment):
            self.facade.purchase('1000', 0)

    def test_purchase_without_billing_id_or_card_raises_exception(self):
        with self.assertRaises(ValueError):
            self.facade.purchase('1000', 1.23)

    def test_zero_amount_for_refund_raises_exception(self):
        with self.assertRaises(UnableToTakePayment):
            self.facade.refund('1000', 0, '1234')

    def test_merchant_reference_format(self):
        merchant_ref = self.facade._get_merchant_reference('1000', AUTH)
        self.assertRegexpMatches(merchant_ref, r'^\d+_[A-Z]+_\d+_\d{4}$')
class FacadeTests(TestCase, XmlTestingMixin):

    def setUp(self):
        self.facade = Facade()

    def test_zero_amount_raises_exception(self):
        card = Bankcard(card_number=CARD_VISA,
                        expiry_date='1015',
                        name="Frankie", cvv="123",
                        start_date="1010")
        with self.assertRaises(UnableToTakePayment):
            self.facade.authorise('1000', 0, card)

    def test_zero_amount_for_complete_raises_exception(self):
        with self.assertRaises(UnableToTakePayment):
            self.facade.complete('1000', 0, '1234')

    def test_zero_amount_for_purchase_raises_exception(self):
        with self.assertRaises(UnableToTakePayment):
            self.facade.purchase('1000', 0)

    def test_purchase_without_billing_id_or_card_raises_exception(self):
        with self.assertRaises(ValueError):
            self.facade.purchase('1000', 1.23)

    def test_zero_amount_for_refund_raises_exception(self):
        with self.assertRaises(UnableToTakePayment):
            self.facade.refund('1000', 0, '1234')

    def test_merchant_reference_format(self):
        merchant_ref = self.facade._get_merchant_reference('1000', AUTH)
        self.assertRegexpMatches(merchant_ref, r'^\d+_[A-Z]+_\d+_\d{4}$')