Beispiel #1
0
    def handle_payment(self, order_number, total, **kwargs):
        # Make request to DataCash - if there any problems (eg bankcard
        # not valid / request refused by bank) then an exception would be
        # raised and handled)
        facade = Facade()

        # Use The3rdMan - so build a dict of data to pass
        # email = None
        # if not self.request.user.is_authenticated():
        #     email = self.checkout_session.get_guest_email()
        # fraud_data = the3rdman.build_data_dict(
        #     request=self.request,
        #     email=email,
        #     order_number=order_number,
        #     shipping_address=kwargs['shipping_address'])

        # We're not using 3rd-man by default
        bankcard = kwargs['bankcard_form'].bankcard
        datacash_ref = facade.pre_authorise(order_number, total.incl_tax,
                                            bankcard)

        # Request was successful - record the "payment source".  As this
        # request was a 'pre-auth', we set the 'amount_allocated' - if we had
        # performed an 'auth' request, then we would set 'amount_debited'.
        source_type, _ = SourceType.objects.get_or_create(name='Datacash')
        source = Source(source_type=source_type,
                        currency=settings.DATACASH_CURRENCY,
                        amount_allocated=total.incl_tax,
                        reference=datacash_ref)
        self.add_payment_source(source)

        # Also record payment event
        self.add_payment_event('pre-auth', total.incl_tax)
    def handle_payment(self, order_number, total, **kwargs):
        # Make request to DataCash - if there any problems (eg bankcard
        # not valid / request refused by bank) then an exception would be
        # raised and handled)
        facade = Facade()

        # Use The3rdMan - so build a dict of data to pass
        # email = None
        # if not self.request.user.is_authenticated():
        #     email = self.checkout_session.get_guest_email()
        # fraud_data = the3rdman.build_data_dict(
        #     request=self.request,
        #     email=email,
        #     order_number=order_number,
        #     shipping_address=kwargs['shipping_address'])

        # We're not using 3rd-man by default
        bankcard = kwargs['bankcard_form'].bankcard
        datacash_ref = facade.pre_authorise(
            order_number, total.incl_tax, bankcard)

        # Request was successful - record the "payment source".  As this
        # request was a 'pre-auth', we set the 'amount_allocated' - if we had
        # performed an 'auth' request, then we would set 'amount_debited'.
        source_type, _ = SourceType.objects.get_or_create(name='Datacash')
        source = Source(source_type=source_type,
                        currency=settings.DATACASH_CURRENCY,
                        amount_allocated=total.incl_tax,
                        reference=datacash_ref)
        self.add_payment_source(source)

        # Also record payment event
        self.add_payment_event('pre-auth', total.incl_tax)
Beispiel #3
0
    def handle_payment(self, order_number, total_incl_tax, **kwargs):
        # Make request to DataCash - if there any problems (eg bankcard
        # not valid / request refused by bank) then an exception would be
        # raised ahd handled)
        facade = Facade()
        datacash_ref = facade.pre_authorise(order_number, total_incl_tax,
                                            kwargs['bankcard'])

        # Request was successful - record the "payment source".  As this
        # request was a 'pre-auth', we set the 'amount_allocated' - if we had
        # performed an 'auth' request, then we would set 'amount_debited'.
        source_type, _ = SourceType.objects.get_or_create(name='Datacash')
        source = Source(source_type=source_type,
                        currency=settings.DATACASH_CURRENCY,
                        amount_allocated=total_incl_tax,
                        reference=datacash_ref)
        self.add_payment_source(source)

        # Also record payment event
        self.add_payment_event('pre-auth', total_incl_tax)
Beispiel #4
0
    def handle_payment(self, order_number, total_incl_tax, **kwargs):
        # Make request to DataCash - if there any problems (eg bankcard
        # not valid / request refused by bank) then an exception would be
        # raised ahd handled)
        facade = Facade()
        datacash_ref = facade.pre_authorise(
            order_number, total_incl_tax, kwargs['bankcard'])

        # Request was successful - record the "payment source".  As this
        # request was a 'pre-auth', we set the 'amount_allocated' - if we had
        # performed an 'auth' request, then we would set 'amount_debited'.
        source_type, _ = SourceType.objects.get_or_create(name='Datacash')
        source = Source(source_type=source_type,
                        currency=settings.DATACASH_CURRENCY,
                        amount_allocated=total_incl_tax,
                        reference=datacash_ref)
        self.add_payment_source(source)

        # Also record payment event
        self.add_payment_event('pre-auth', total_incl_tax)
 def setUp(self):
     self.facade = Facade()
class FacadeTests(TestCase, XmlTestingMixin):

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

    def test_unicode_handling(self):
        self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        card = Bankcard(card_number='1000350000000007', expiry_date='10/13', cvv='345')
        self.facade.pre_authorise(
            '1234', D('10.00'), card,
            the3rdman_data={
                'customer_info': {
                    'surname': u'Smörgåsbord'
                }
            })

    def test_second_fulfill_has_merchant_ref(self):
        # Initial pre-auth
        self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        ref = self.facade.pre_authorise('1234', D('100.00'), card)
        txn = OrderTransaction.objects.get(datacash_reference=ref)

        # First fulfill
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=fixtures.SAMPLE_SUCCESSFUL_FULFILL_RESPONSE)
        self.facade.fulfill_transaction('1234', D('50.00'),
                                        txn.datacash_reference, txn.auth_code)

        self.facade.fulfill_transaction('1234', D('40.00'),
                                        txn.datacash_reference, txn.auth_code)
        fulfill_txn = OrderTransaction.objects.get(
            order_number='1234',
            amount=D('40.00')
        )
        self.assertTrue('merchantreference' in fulfill_txn.request_xml)

    def test_zero_amount_for_pre_raises_exception(self):
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        with self.assertRaises(UnableToTakePayment):
            self.facade.pre_authorise('1234', D('0.00'), card)

    def test_zero_amount_for_auth_raises_exception(self):
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        with self.assertRaises(UnableToTakePayment):
            self.facade.authorise('1234', D('0.00'), card)

    def test_auth_request_creates_txn_model(self):
        self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        self.facade.authorise('100001', D('123.22'), card)
        txn = OrderTransaction.objects.filter(order_number='100001')[0]
        self.assertEquals('auth', txn.method)
        self.assertEquals(D('123.22'), txn.amount)
        self.assertTrue(len(txn.request_xml) > 0)
        self.assertTrue(len(txn.response_xml) > 0)

    def test_auth_request_with_integer_cvv(self):
        self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        card = Bankcard('1000350000000007', '10/13', cvv=345)
        self.facade.authorise('100001', D('123.22'), card)

    def test_pre_request_creates_txn_model(self):
        self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        self.facade.pre_authorise('100001', D('123.22'), card)
        txn = OrderTransaction.objects.filter(order_number='100001')[0]
        self.assertEquals('pre', txn.method)
        self.assertEquals(D('123.22'), txn.amount)
        self.assertTrue(len(txn.request_xml) > 0)
        self.assertTrue(len(txn.response_xml) > 0)

    def test_pre_request_uses_billing_address_fields(self):
        mock = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        self.facade.gateway._fetch_response_xml = mock
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        address = MockBillingAddress(line1='1 Egg Street',
                                     line2='Farmville',
                                     line4='Greater London',
                                     postcode='N1 8RT')
        self.facade.pre_authorise('100001', D('123.22'), card,
                                  billing_address=address)
        request_xml = mock.call_args[0][0]
        self.assertXmlElementEquals(request_xml, '1 Egg Street',
                                    'Request.Transaction.CardTxn.Card.Cv2Avs.street_address1')
        self.assertXmlElementEquals(request_xml, 'Farmville',
                                    'Request.Transaction.CardTxn.Card.Cv2Avs.street_address2')
        self.assertXmlElementEquals(request_xml, 'N1 8RT',
                                    'Request.Transaction.CardTxn.Card.Cv2Avs.postcode')

    def test_auth_request_uses_billing_address_fields(self):
        mock = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        self.facade.gateway._fetch_response_xml = mock
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        address = MockBillingAddress(line1='1 Egg Street',
                                     line2='Farmville',
                                     line4='Greater London',
                                     postcode='N1 8RT')
        self.facade.authorise('100001', D('123.22'), card, billing_address=address)
        request_xml = mock.call_args[0][0]
        self.assertXmlElementEquals(request_xml, '1 Egg Street',
                                    'Request.Transaction.CardTxn.Card.Cv2Avs.street_address1')
        self.assertXmlElementEquals(request_xml, 'Farmville',
                                    'Request.Transaction.CardTxn.Card.Cv2Avs.street_address2')
        self.assertXmlElementEquals(request_xml, 'N1 8RT',
                                    'Request.Transaction.CardTxn.Card.Cv2Avs.postcode')

    def test_refund_request_doesnt_include_currency_attribute(self):
        mock = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        self.facade.gateway._fetch_response_xml = mock
        self.facade.refund_transaction('100001', D('123.22'),
                                       txn_reference='12345')
        request_xml = mock.call_args[0][0]
        self.assertTrue('currency' not in request_xml)

    def test_auth_request_returns_datacash_ref(self):
        self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        ref = self.facade.authorise('100001', D('123.22'), card)
        self.assertEquals('3000000088888888', ref)

    def test_auth_request_using_previous_txn_ref(self):
        self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        ref = self.facade.authorise('100001', D('123.22'), txn_reference='3000000088888888')
        self.assertEquals('3000000088888888', ref)

    def test_refund_request(self):
        self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        ref = self.facade.refund('100005', D('123.22'), card)
        txn = OrderTransaction.objects.filter(order_number='100005')[0]
        self.assertEquals('refund', txn.method)

    def test_pre_auth_using_history_txn(self):
        self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        ref = self.facade.pre_authorise('100001', D('123.22'), txn_reference='3000000088888888')
        self.assertEquals('3000000088888888', ref)

    def test_refund_using_historic_txn(self):
        self.facade.gateway._fetch_response_xml = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        ref = self.facade.refund('100001', D('123.22'), txn_reference='3000000088888888')
        self.assertEquals('3000000088888888', ref)

    def test_refund_without_source_raises_exception(self):
        with self.assertRaises(ValueError):
            ref = self.facade.refund('100001', D('123.22'))

    def test_pre_auth_without_source_raises_exception(self):
        with self.assertRaises(ValueError):
            ref = self.facade.pre_authorise('100001', D('123.22'))

    def test_auth_without_source_raises_exception(self):
        with self.assertRaises(ValueError):
            ref = self.facade.authorise('100001', D('123.22'))

    def test_successful_cancel_request(self):
        response_xml = """<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <datacash_reference>4900200000000001</datacash_reference>
    <merchantreference>4900200000000001</merchantreference>
    <mode>TEST</mode>
    <reason>CANCELLED OK</reason>
    <status>1</status>
    <time>1151567456</time>
</Response>"""
        self.facade.gateway._fetch_response_xml = Mock(return_value=response_xml)
        ref = self.facade.cancel_transaction('100001', '3000000088888888')
        self.assertEquals('4900200000000001', ref)

    def test_successful_fulfill_request(self):
        response_xml = """<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <datacash_reference>3900200000000001</datacash_reference>
    <merchantreference>3900200000000001</merchantreference>
    <mode>LIVE</mode>
    <reason>FULFILLED OK</reason>
    <status>1</status>
    <time>1071567356</time>
</Response>"""
        self.facade.gateway._fetch_response_xml = Mock(return_value=response_xml)
        self.facade.fulfill_transaction('100002', D('45.00'), '3000000088888888', '1234')
        txn = OrderTransaction.objects.filter(order_number='100002')[0]
        self.assertEquals('fulfill', txn.method)

    def test_successful_refund_request(self):
        response_xml = """<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <datacash_reference>4000000088889999</datacash_reference>
    <HistoricTxn>
        <authcode>896876</authcode>
    </HistoricTxn>
    <merchantreference>4100000088888888</merchantreference>
    <mode>LIVE</mode>
    <reason>ACCEPTED</reason>
    <status>1</status>
    <time>1071567375</time>
</Response>"""
        self.facade.gateway._fetch_response_xml = Mock(return_value=response_xml)
        self.facade.refund_transaction('100003', D('45.00'), '3000000088888888')
        txn = OrderTransaction.objects.filter(order_number='100003')[0]
        self.assertEquals('txn_refund', txn.method)

    def test_transaction_declined_exception_raised_for_decline(self):
        response_xml = """<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <CardTxn>
        <authcode>DECLINED</authcode>
        <card_scheme>Mastercard</card_scheme>
        <country>United Kingdom</country>
    </CardTxn>
    <datacash_reference>4400200045583767</datacash_reference>
    <merchantreference>AA004630</merchantreference>
    <mode>TEST</mode>
    <reason>DECLINED</reason>
    <status>7</status>
    <time>1169223906</time>
</Response>"""
        self.facade.gateway._fetch_response_xml = Mock(return_value=response_xml)
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        with self.assertRaises(UnableToTakePayment):
            self.facade.pre_authorise('100001', D('123.22'), card)

    def test_invalid_request_exception_raised_for_error(self):
        response_xml = """<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <datacash_reference>21859999000005679</datacash_reference>
    <information>This vTID is not configured to process pre-registered card transactions.</information>
    <merchantreference>123403</merchantreference>
    <reason>Prereg: Merchant Not Subscribed</reason>
    <status>251</status>
    <time>1074692433</time>
</Response>"""
        self.facade.gateway._fetch_response_xml = Mock(return_value=response_xml)
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        with self.assertRaises(InvalidGatewayRequestError):
            self.facade.pre_authorise('100001', D('123.22'), card)
Beispiel #7
0
 def setUp(self):
     self.facade = Facade()
Beispiel #8
0
class FacadeTests(TestCase, XmlTestingMixin):
    def setUp(self):
        self.facade = Facade()

    def test_unicode_handling(self):
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=fixtures.SAMPLE_RESPONSE)
        card = Bankcard(card_number='1000350000000007',
                        expiry_date='10/13',
                        cvv='345')
        self.facade.pre_authorise(
            '1234',
            D('10.00'),
            card,
            the3rdman_data={'customer_info': {
                'surname': u'Smörgåsbord'
            }})

    def test_second_fulfill_has_merchant_ref(self):
        # Initial pre-auth
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=fixtures.SAMPLE_RESPONSE)
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        ref = self.facade.pre_authorise('1234', D('100.00'), card)
        txn = OrderTransaction.objects.get(datacash_reference=ref)

        # First fulfill
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=fixtures.SAMPLE_SUCCESSFUL_FULFILL_RESPONSE)
        self.facade.fulfill_transaction('1234', D('50.00'),
                                        txn.datacash_reference, txn.auth_code)

        self.facade.fulfill_transaction('1234', D('40.00'),
                                        txn.datacash_reference, txn.auth_code)
        fulfill_txn = OrderTransaction.objects.get(order_number='1234',
                                                   amount=D('40.00'))
        self.assertTrue('merchantreference' in fulfill_txn.request_xml)

    def test_zero_amount_for_pre_raises_exception(self):
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        with self.assertRaises(UnableToTakePayment):
            self.facade.pre_authorise('1234', D('0.00'), card)

    def test_zero_amount_for_auth_raises_exception(self):
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        with self.assertRaises(UnableToTakePayment):
            self.facade.authorise('1234', D('0.00'), card)

    def test_auth_request_creates_txn_model(self):
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=fixtures.SAMPLE_RESPONSE)
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        self.facade.authorise('100001', D('123.22'), card)
        txn = OrderTransaction.objects.filter(order_number='100001')[0]
        self.assertEquals('auth', txn.method)
        self.assertEquals(D('123.22'), txn.amount)
        self.assertTrue(len(txn.request_xml) > 0)
        self.assertTrue(len(txn.response_xml) > 0)

    def test_auth_request_with_integer_cvv(self):
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=fixtures.SAMPLE_RESPONSE)
        card = Bankcard('1000350000000007', '10/13', cvv=345)
        self.facade.authorise('100001', D('123.22'), card)

    def test_pre_request_creates_txn_model(self):
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=fixtures.SAMPLE_RESPONSE)
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        self.facade.pre_authorise('100001', D('123.22'), card)
        txn = OrderTransaction.objects.filter(order_number='100001')[0]
        self.assertEquals('pre', txn.method)
        self.assertEquals(D('123.22'), txn.amount)
        self.assertTrue(len(txn.request_xml) > 0)
        self.assertTrue(len(txn.response_xml) > 0)

    def test_pre_request_uses_billing_address_fields(self):
        mock = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        self.facade.gateway._fetch_response_xml = mock
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        address = MockBillingAddress(line1='1 Egg Street',
                                     line2='Farmville',
                                     line4='Greater London',
                                     postcode='N1 8RT')
        self.facade.pre_authorise('100001',
                                  D('123.22'),
                                  card,
                                  billing_address=address)
        request_xml = mock.call_args[0][0]
        self.assertXmlElementEquals(
            request_xml, '1 Egg Street',
            'Request.Transaction.CardTxn.Card.Cv2Avs.street_address1')
        self.assertXmlElementEquals(
            request_xml, 'Farmville',
            'Request.Transaction.CardTxn.Card.Cv2Avs.street_address2')
        self.assertXmlElementEquals(
            request_xml, 'N1 8RT',
            'Request.Transaction.CardTxn.Card.Cv2Avs.postcode')

    def test_auth_request_uses_billing_address_fields(self):
        mock = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        self.facade.gateway._fetch_response_xml = mock
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        address = MockBillingAddress(line1='1 Egg Street',
                                     line2='Farmville',
                                     line4='Greater London',
                                     postcode='N1 8RT')
        self.facade.authorise('100001',
                              D('123.22'),
                              card,
                              billing_address=address)
        request_xml = mock.call_args[0][0]
        self.assertXmlElementEquals(
            request_xml, '1 Egg Street',
            'Request.Transaction.CardTxn.Card.Cv2Avs.street_address1')
        self.assertXmlElementEquals(
            request_xml, 'Farmville',
            'Request.Transaction.CardTxn.Card.Cv2Avs.street_address2')
        self.assertXmlElementEquals(
            request_xml, 'N1 8RT',
            'Request.Transaction.CardTxn.Card.Cv2Avs.postcode')

    def test_refund_request_doesnt_include_currency_attribute(self):
        mock = Mock(return_value=fixtures.SAMPLE_RESPONSE)
        self.facade.gateway._fetch_response_xml = mock
        self.facade.refund_transaction('100001',
                                       D('123.22'),
                                       txn_reference='12345')
        request_xml = mock.call_args[0][0]
        self.assertTrue('currency' not in request_xml)

    def test_auth_request_returns_datacash_ref(self):
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=fixtures.SAMPLE_RESPONSE)
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        ref = self.facade.authorise('100001', D('123.22'), card)
        self.assertEquals('3000000088888888', ref)

    def test_auth_request_using_previous_txn_ref(self):
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=fixtures.SAMPLE_RESPONSE)
        ref = self.facade.authorise('100001',
                                    D('123.22'),
                                    txn_reference='3000000088888888')
        self.assertEquals('3000000088888888', ref)

    def test_refund_request(self):
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=fixtures.SAMPLE_RESPONSE)
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        ref = self.facade.refund('100005', D('123.22'), card)
        txn = OrderTransaction.objects.filter(order_number='100005')[0]
        self.assertEquals('refund', txn.method)

    def test_pre_auth_using_history_txn(self):
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=fixtures.SAMPLE_RESPONSE)
        ref = self.facade.pre_authorise('100001',
                                        D('123.22'),
                                        txn_reference='3000000088888888')
        self.assertEquals('3000000088888888', ref)

    def test_refund_using_historic_txn(self):
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=fixtures.SAMPLE_RESPONSE)
        ref = self.facade.refund('100001',
                                 D('123.22'),
                                 txn_reference='3000000088888888')
        self.assertEquals('3000000088888888', ref)

    def test_refund_without_source_raises_exception(self):
        with self.assertRaises(ValueError):
            ref = self.facade.refund('100001', D('123.22'))

    def test_pre_auth_without_source_raises_exception(self):
        with self.assertRaises(ValueError):
            ref = self.facade.pre_authorise('100001', D('123.22'))

    def test_auth_without_source_raises_exception(self):
        with self.assertRaises(ValueError):
            ref = self.facade.authorise('100001', D('123.22'))

    def test_successful_cancel_request(self):
        response_xml = """<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <datacash_reference>4900200000000001</datacash_reference>
    <merchantreference>4900200000000001</merchantreference>
    <mode>TEST</mode>
    <reason>CANCELLED OK</reason>
    <status>1</status>
    <time>1151567456</time>
</Response>"""
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=response_xml)
        ref = self.facade.cancel_transaction('100001', '3000000088888888')
        self.assertEquals('4900200000000001', ref)

    def test_successful_fulfill_request(self):
        response_xml = """<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <datacash_reference>3900200000000001</datacash_reference>
    <merchantreference>3900200000000001</merchantreference>
    <mode>LIVE</mode>
    <reason>FULFILLED OK</reason>
    <status>1</status>
    <time>1071567356</time>
</Response>"""
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=response_xml)
        self.facade.fulfill_transaction('100002', D('45.00'),
                                        '3000000088888888', '1234')
        txn = OrderTransaction.objects.filter(order_number='100002')[0]
        self.assertEquals('fulfill', txn.method)

    def test_successful_refund_request(self):
        response_xml = """<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <datacash_reference>4000000088889999</datacash_reference>
    <HistoricTxn>
        <authcode>896876</authcode>
    </HistoricTxn>
    <merchantreference>4100000088888888</merchantreference>
    <mode>LIVE</mode>
    <reason>ACCEPTED</reason>
    <status>1</status>
    <time>1071567375</time>
</Response>"""
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=response_xml)
        self.facade.refund_transaction('100003', D('45.00'),
                                       '3000000088888888')
        txn = OrderTransaction.objects.filter(order_number='100003')[0]
        self.assertEquals('txn_refund', txn.method)

    def test_transaction_declined_exception_raised_for_decline(self):
        response_xml = """<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <CardTxn>
        <authcode>DECLINED</authcode>
        <card_scheme>Mastercard</card_scheme>
        <country>United Kingdom</country>
    </CardTxn>
    <datacash_reference>4400200045583767</datacash_reference>
    <merchantreference>AA004630</merchantreference>
    <mode>TEST</mode>
    <reason>DECLINED</reason>
    <status>7</status>
    <time>1169223906</time>
</Response>"""
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=response_xml)
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        with self.assertRaises(UnableToTakePayment):
            self.facade.pre_authorise('100001', D('123.22'), card)

    def test_invalid_request_exception_raised_for_error(self):
        response_xml = """<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <datacash_reference>21859999000005679</datacash_reference>
    <information>This vTID is not configured to process pre-registered card transactions.</information>
    <merchantreference>123403</merchantreference>
    <reason>Prereg: Merchant Not Subscribed</reason>
    <status>251</status>
    <time>1074692433</time>
</Response>"""
        self.facade.gateway._fetch_response_xml = Mock(
            return_value=response_xml)
        card = Bankcard('1000350000000007', '10/13', cvv='345')
        with self.assertRaises(InvalidGatewayRequestError):
            self.facade.pre_authorise('100001', D('123.22'), card)