Procházet zdrojové kódy

Deleted datacash code as it has its own repository now

master
David Winterbottom před 13 roky
rodič
revize
33f8868fcb

+ 0
- 0
oscar/apps/payment/datacash/__init__.py Zobrazit soubor


+ 0
- 39
oscar/apps/payment/datacash/abstract_models.py Zobrazit soubor

@@ -1,39 +0,0 @@
1
-import re
2
-
3
-from django.db import models
4
-
5
-
6
-class AbstractOrderTransaction(models.Model):
7
-    
8
-    # We track link with basket for audit
9
-    basket = models.ForeignKey('basket.Basket', null=True)
10
-    
11
-    # Note we don't use a foreign key as the order hasn't been created
12
-    # by the time the transaction takes place
13
-    order_number = models.CharField(max_length=128, db_index=True)
14
-    
15
-    # The 'method' of the transaction - one of 'auth', 'pre', 'cancel', ...
16
-    method = models.CharField(max_length=12)
17
-    amount = models.DecimalField(decimal_places=2, max_digits=12)
18
-    merchant_ref = models.CharField(max_length=128)
19
-    
20
-    # Response fields
21
-    datacash_ref = models.CharField(max_length=128)
22
-    auth_code = models.CharField(max_length=128, blank=True, null=True)
23
-    status = models.PositiveIntegerField()
24
-    reason = models.CharField(max_length=255)
25
-    
26
-    # Store full XML for debugging purposes
27
-    request_xml = models.TextField()
28
-    response_xml = models.TextField()
29
-    
30
-    date = models.DateTimeField(auto_now_add=True)
31
-    
32
-    class Meta:
33
-        abstract = True
34
-        
35
-    def save(self, *args, **kwargs):
36
-        if not self.pk:
37
-            reg_ex = re.compile(r'\d{12}')
38
-            self.request_xml = reg_ex.sub('XXXXXXXXXXXX', self.request_xml)
39
-        super(AbstractOrderTransaction, self).save(*args, **kwargs)

+ 0
- 7
oscar/apps/payment/datacash/models.py Zobrazit soubor

@@ -1,7 +0,0 @@
1
-from django.db import models
2
-
3
-from oscar.apps.payment.datacash.abstract_models import AbstractOrderTransaction
4
-
5
-
6
-class OrderTransaction(AbstractOrderTransaction):
7
-    pass

+ 0
- 91
oscar/apps/payment/datacash/tests.py Zobrazit soubor

@@ -1,91 +0,0 @@
1
-from decimal import Decimal as D
2
-from xml.dom.minidom import parseString
3
-import datetime
4
-
5
-from django.test import TestCase
6
-from django.conf import settings
7
-
8
-from oscar.apps.payment.datacash.models import OrderTransaction
9
-from oscar.apps.payment.datacash.utils import Gateway, Facade
10
-from oscar.apps.payment.utils import Bankcard
11
-
12
-
13
-class OrderTransactionTests(TestCase):
14
-    
15
-    def test_cc_numbers_are_not_saved(self):
16
-        
17
-        request_xml = """<?xml version="1.0" encoding="UTF-8" ?>
18
-<Request>
19
-    <Authentication>
20
-        <client>99000001</client>
21
-        <password>boomboom</password>
22
-    </Authentication>
23
-    <Transaction>
24
-    <CardTxn>
25
-        <Card>
26
-            <pan>1000011100000004</pan>
27
-            <expirydate>04/06</expirydate>
28
-            <startdate>01/04</startdate>
29
-        </Card>
30
-        <method>auth</method>
31
-    </CardTxn>
32
-    <TxnDetails>
33
-        <merchantreference>1000001</merchantreference>
34
-        <amount currency="GBP">95.99</amount>
35
-    </TxnDetails>
36
-    </Transaction>
37
-</Request>"""
38
-
39
-        response_xml = """<?xml version="1.0" encoding="UTF-8" ?>
40
-<Response>
41
-    <CardTxn>
42
-        <authcode>060642</authcode>
43
-        <card_scheme>Switch</card_scheme>
44
-        <country>United Kingdom</country>
45
-        <issuer>HSBC</issuer>
46
-    </CardTxn>
47
-    <datacash_reference>3000000088888888</datacash_reference>
48
-    <merchantreference>1000001</merchantreference>
49
-    <mode>LIVE</mode>
50
-    <reason>ACCEPTED</reason>
51
-    <status>1</status>
52
-    <time>1071567305</time>
53
-</Response>"""
54
-        
55
-        txn = OrderTransaction.objects.create(order_number='1000',
56
-                                              method='auth',
57
-                                              datacash_ref='3000000088888888',
58
-                                              merchant_ref='1000001',
59
-                                              amount=D('95.99'),
60
-                                              status=1,
61
-                                              reason='ACCEPTED',
62
-                                              request_xml=request_xml,
63
-                                              response_xml=response_xml)
64
-        doc = parseString(txn.request_xml)
65
-        element = doc.getElementsByTagName('pan')[0]
66
-        self.assertEqual('XXXXXXXXXXXX0004', element.firstChild.data)
67
-        
68
-        
69
-class IntegrationTests(TestCase):
70
-    
71
-    def _test_for_smoke(self):
72
-        gateway = Gateway(settings.DATACASH_CLIENT, 
73
-                          settings.DATACASH_PASSWORD,
74
-                          host=settings.DATACASH_HOST)
75
-        response = gateway.auth(card_number='1000011000000005',
76
-                                expiry_date='01/13',
77
-                                amount=D('50.00'),
78
-                                currency='GBP',
79
-                                merchant_reference='123456_%s' % datetime.datetime.now().microsecond)
80
-        print response
81
-        
82
-    def _test_adapter(self):
83
-        bankcard = Bankcard(card_number='1000011000000005', expiry_date='01/13')
84
-    
85
-        dc_facade = Facade()
86
-        reference = dc_facade.debit('102910', D('23.00'), bankcard)
87
-        print reference
88
-        
89
-        OrderTransaction.objects.get(order_number='102910')
90
-        
91
-    

+ 0
- 245
oscar/apps/payment/datacash/utils.py Zobrazit soubor

@@ -1,245 +0,0 @@
1
-import datetime
2
-from xml.dom.minidom import Document, parseString
3
-import httplib
4
-import urllib
5
-
6
-from django.conf import settings
7
-from django.db import transaction
8
-from django.utils.translation import ugettext_lazy as _
9
-from django.core.mail import mail_admins
10
-
11
-from oscar.core.loading import import_module
12
-import_module('payment.datacash.models', ['OrderTransaction'], locals())
13
-import_module('payment.exceptions', ['TransactionDeclined', 'GatewayError', 
14
-                                     'InvalidGatewayRequestError'], locals())
15
-
16
-# Status codes
17
-ACCEPTED, DECLINED, INVALID_CREDENTIALS = '1', '7', '10'
18
-
19
-
20
-class Gateway(object):
21
-
22
-    def __init__(self, client, password, host, cv2avs=False):
23
-        self._client = client
24
-        self._password = password
25
-        self._host = host
26
-        
27
-        # Fraud settings
28
-        self._cv2avs = cv2avs
29
-
30
-    def do_request(self, request_xml):
31
-        # Need to fill in HTTP request here
32
-        conn = httplib.HTTPSConnection(self._host, 443, timeout=30)
33
-        headers = {"Content-type": "application/xml",
34
-                   "Accept": ""}
35
-        conn.request("POST", "/Transaction", request_xml, headers)
36
-        response = conn.getresponse()
37
-        response_xml = response.read()
38
-        if response.status != httplib.OK:
39
-            raise GatewayError("Unable to communicate with payment gateway (code: %s, response: %s)" % (response.status, response_xml))
40
-        conn.close()
41
-        
42
-        # Save response XML
43
-        self._last_response_xml = response_xml
44
-        return response_xml
45
-
46
-    def _build_request_xml(self, method_name, **kwargs):
47
-        """
48
-        Builds the XML for a 'initial' transaction
49
-        """
50
-        doc = Document()
51
-        req = self._create_element(doc, doc, 'Request')
52
-        
53
-        # Authentication
54
-        auth = self._create_element(doc, req, 'Authentication')
55
-        self._create_element(doc, auth, 'client', self._client)
56
-        self._create_element(doc, auth, 'password', self._password)
57
-            
58
-        # Transaction    
59
-        txn = self._create_element(doc, req, 'Transaction') 
60
-        
61
-        # CardTxn
62
-        if 'card_number' in kwargs:
63
-            card_txn = self._create_element(doc, txn, 'CardTxn')
64
-            self._create_element(doc, card_txn, 'method', method_name)
65
-            
66
-            card = self._create_element(doc, card_txn, 'Card')
67
-            self._create_element(doc, card, 'pan', kwargs['card_number'])
68
-            self._create_element(doc, card, 'expirydate', kwargs['expiry_date'])
69
-            
70
-            if 'start_date' in kwargs:
71
-                self._create_element(doc, card, 'startdate', kwargs['start_date'])
72
-            
73
-            if 'issue_number' in kwargs:
74
-                self._create_element(doc, card, 'issuenumber', kwargs['issue_number'])
75
-          
76
-            if 'auth_code' in kwargs:
77
-                self._create_element(doc, card, 'authcode', kwargs['auth_code'])
78
-                
79
-            if self._cv2avs:
80
-                self._add_cv2avs_elements(doc, card, kwargs) 
81
-        
82
-        # HistoricTxn
83
-        if 'txn_reference' in kwargs:
84
-            historic_txn = self._create_element(doc, txn, 'HistoricTxn')
85
-            self._create_element(doc, historic_txn, 'reference', kwargs['txn_reference'])
86
-            self._create_element(doc, historic_txn, 'method', method_name)
87
-            if 'auth_code' in kwargs:
88
-                self._create_element(doc, historic_txn, 'authcode', kwargs['auth_code'])
89
-        
90
-        # TxnDetails
91
-        if 'amount' in kwargs:
92
-            txn_details = self._create_element(doc, txn, 'TxnDetails')
93
-            if 'merchant_reference' in kwargs:
94
-                self._create_element(doc, txn_details, 'merchantreference', kwargs['merchant_reference'])
95
-            self._create_element(doc, txn_details, 'amount', str(kwargs['amount']), {'currency': kwargs['currency']})
96
-        
97
-        # Save XML for later retrieval
98
-        self._last_request_xml = doc.toxml()
99
-        
100
-        return self.do_request(doc.toxml())
101
-
102
-    def _add_cv2avs_elements(self, doc, card, kwargs):
103
-        cv2avs = self._create_element(doc, card, 'Cv2Avs')
104
-        if 'ccv' in kwargs:
105
-            self._create_element(doc, cv2avs, 'cv2', kwargs['ccv'])
106
-
107
-    def _create_element(self, doc, parent, tag, value=None, attributes=None):
108
-        """
109
-        Creates an XML element
110
-        """
111
-        ele = doc.createElement(tag)
112
-        parent.appendChild(ele)
113
-        if value:
114
-            text = doc.createTextNode(value)
115
-            ele.appendChild(text)
116
-        if attributes:
117
-            [ele.setAttribute(k, v) for k,v in attributes.items()]
118
-        return ele
119
-    
120
-    def _get_element_text(self, doc, tag):
121
-        try:
122
-            ele = doc.getElementsByTagName(tag)[0]
123
-        except IndexError:
124
-            return None
125
-        return ele.firstChild.data
126
-
127
-    def _build_response_dict(self, response_xml, extra_elements=None):
128
-        doc = parseString(response_xml)
129
-        response = {'status': int(self._get_element_text(doc, 'status')),
130
-                    'datacash_reference': self._get_element_text(doc, 'datacash_reference'),
131
-                    'merchant_reference': self._get_element_text(doc, 'merchantreference'),
132
-                    'reason': self._get_element_text(doc, 'reason')}
133
-        if extra_elements:
134
-            for tag, key in extra_elements.items():
135
-                response[key] = self._get_element_text(doc, tag)
136
-        return response
137
-
138
-    # API
139
-
140
-    def auth(self, **kwargs):
141
-        """
142
-        Performs an 'auth' request, which is to debit the money immediately
143
-        as a one-off transaction.
144
-        
145
-        Note that currency should be ISO 4217 Alphabetic format.
146
-        """ 
147
-        self._check_kwargs(kwargs, ['amount', 'currency', 'card_number', 'expiry_date', 'merchant_reference'])
148
-        response_xml = self._build_request_xml('auth', **kwargs)
149
-        return self._build_response_dict(response_xml, {'authcode': 'auth_code'})
150
-        
151
-    def pre(self, **kwargs):
152
-        """
153
-        Performs an 'pre' request, which is to ring-fence the requested money
154
-        so it can be fulfilled at a later time.
155
-        """ 
156
-        self._check_kwargs(kwargs, ['amount', 'currency', 'card_number', 'expiry_date', 'merchant_reference'])
157
-        response_xml = self._build_request_xml('pre', **kwargs)
158
-        return self._build_response_dict(response_xml, {'authcode': 'auth_code'})
159
-
160
-    def refund(self, **kwargs):
161
-        self._check_kwargs(kwargs, ['amount', 'currency', 'card_number', 'expiry_date', 'merchant_reference'])
162
-        response_xml = self._build_request_xml('refund', **kwargs)
163
-        return self._build_response_dict(response_xml, {'authcode': 'auth_code'})
164
-        
165
-    def erp(self, **kwargs):
166
-        self._check_kwargs(kwargs, ['amount', 'currency', 'card_number', 'expiry_date', 'merchant_reference'])
167
-        response_xml = self._build_request_xml('erp', **kwargs)
168
-        return self._build_response_dict(response_xml, {'authcode': 'auth_code'})
169
-        
170
-    # "Historic" transaction types    
171
-        
172
-    def cancel(self, txn_reference): 
173
-        response_xml = self._build_request_xml('cancel', txn_reference=txn_reference)
174
-        return self._build_response_dict(response_xml)
175
-    
176
-    def fulfil(self, **kwargs):
177
-        self._check_kwargs(kwargs, ['amount', 'currency', 'txn_reference', 'auth_code'])
178
-        response_xml = self._build_request_xml('fulfil', **kwargs)
179
-        return self._build_response_dict(response_xml)
180
-    
181
-    def txn_refund(self, **kwargs):
182
-        self._check_kwargs(kwargs, ['amount', 'currency', 'txn_reference'])
183
-        response_xml = self._build_request_xml('txn_refund', **kwargs)
184
-        return self._build_response_dict(response_xml)
185
-    
186
-    def last_request_xml(self):
187
-        return self._last_request_xml
188
-    
189
-    def last_response_xml(self):
190
-        return self._last_response_xml
191
-    
192
-    def _check_kwargs(self, kwargs, required_keys):
193
-        for key in required_keys:
194
-            if key not in kwargs:
195
-                raise RuntimeError('You must provide a "%s" argument' % key)
196
-
197
-
198
-class Facade(object):
199
-    """
200
-    Responsible for dealing with oscar objects
201
-    """
202
-    
203
-    def __init__(self):
204
-        self.gateway = Gateway(settings.DATACASH_CLIENT, settings.DATACASH_PASSWORD, settings.DATACASH_HOST)
205
-    
206
-    def debit(self, order_number, amount, bankcard, basket, billing_address=None):
207
-        with transaction.commit_on_success():
208
-            response = self.gateway.auth(card_number=bankcard.card_number,
209
-                                         expiry_date=bankcard.expiry_date,
210
-                                         amount=amount,
211
-                                         currency='GBP',
212
-                                         merchant_reference=self.generate_merchant_reference(order_number),
213
-                                         ccv=bankcard.ccv)
214
-            
215
-            # Create transaction model irrespective of whether transaction was successful or not
216
-            txn = OrderTransaction.objects.create(order_number=order_number,
217
-                                                  basket=basket,
218
-                                                  method='auth',
219
-                                                  datacash_ref=response['datacash_reference'],
220
-                                                  merchant_ref=response['merchant_reference'],
221
-                                                  amount=amount,
222
-                                                  auth_code=response['auth_code'],
223
-                                                  status=int(response['status']),
224
-                                                  reason=response['reason'],
225
-                                                  request_xml=self.gateway.last_request_xml(),
226
-                                                  response_xml=self.gateway.last_response_xml())
227
-        
228
-        # Test if response is successful
229
-        if response['status'] == INVALID_CREDENTIALS:
230
-            # This needs to notify the administrators straight away
231
-            import pprint
232
-            msg = "Order #%s:\n%s" % (order_number, pprint.pprint(response))
233
-            mail_admins("Datacash credentials are not valid", msg)
234
-            raise InvalidGatewayRequestError("Unable to communicate with payment gateway, please try again later")
235
-        
236
-        if response['status'] == DECLINED:
237
-            raise TransactionDeclined("Your bank declined this transaction, please check your details and try again")
238
-        
239
-        return response['datacash_reference']
240
-        
241
-    def generate_merchant_reference(self, order_number):
242
-        return '%s_%s' % (order_number, datetime.datetime.now().microsecond)
243
-        
244
-        
245
-

+ 0
- 2
oscar/apps/payment/tests/__init__.py Zobrazit soubor

@@ -1,4 +1,2 @@
1 1
 from oscar.apps.payment.tests.main import *
2
-from oscar.apps.payment.tests.datacash_requests import *
3
-from oscar.apps.payment.tests.datacash_responses import *
4 2
 

+ 0
- 240
oscar/apps/payment/tests/datacash_requests.py Zobrazit soubor

@@ -1,240 +0,0 @@
1
-import mock
2
-from decimal import Decimal as D
3
-from xml.dom.minidom import parseString
4
-
5
-from django.test import TestCase
6
-
7
-from oscar.apps.payment.datacash.utils import Gateway
8
-
9
-
10
-class TransactionMixin(object):
11
-    
12
-    def init_gateway(self, **kwargs):
13
-        self.gateway = Gateway(client="DUMMY", password="123456", host="dummyhost.com", **kwargs)
14
-        self.transport = mock.Mock()
15
-        self.gateway.do_request = self.transport
16
-        
17
-        # Set a default success response
18
-        response_xml = """<?xml version="1.0" encoding="UTF-8" ?>
19
-<Response>
20
-    <CardTxn>
21
-        <authcode>060642</authcode>
22
-        <card_scheme>Switch</card_scheme>
23
-        <country>United Kingdom</country>
24
-        <issuer>HSBC</issuer>
25
-    </CardTxn>
26
-    <datacash_reference>3000000088888888</datacash_reference>
27
-    <merchantreference>1000001</merchantreference>
28
-    <mode>LIVE</mode>
29
-    <reason>ACCEPTED</reason>
30
-    <status>1</status>
31
-    <time>1071567305</time>
32
-</Response>"""
33
-        self.transport.return_value = response_xml
34
-    
35
-    def assertXmlTagValue(self, tag_name, value):
36
-        request_xml = self.transport.call_args[0][0]
37
-        doc = parseString(request_xml)
38
-        try:
39
-            tag = doc.getElementsByTagName(tag_name)[0]
40
-            self.assertEquals(value, tag.firstChild.data)
41
-        except IndexError:
42
-            self.fail("Tag '%s' not found\n%s" % (tag_name, request_xml))
43
-    
44
-    def make_request(self, **kwargs):
45
-        """
46
-        Needs to be implemented by subclass.
47
-        """
48
-        pass
49
-            
50
-    def assertXmlTagAttributeValue(self, tag_name, attribute, value):
51
-        request_xml = self.transport.call_args[0][0]
52
-        doc = parseString(request_xml)
53
-        try:
54
-            tag = doc.getElementsByTagName(tag_name)[0]
55
-            self.assertEquals(value, tag.attributes[attribute].value)
56
-        except IndexError:
57
-            self.fail("Tag '%s' not found\n%s" % (tag_name, request_xml))
58
-    
59
-    def test_request_includes_credentials(self):
60
-        self.make_request()
61
-        self.assertTrue(self.transport.called)
62
-        self.assertXmlTagValue('client', 'DUMMY')
63
-        self.assertXmlTagValue('password', '123456')
64
-
65
-
66
-class InitialTransactionMixin(TransactionMixin):
67
-    
68
-    def test_request_includes_merchant_reference(self):   
69
-        self.make_request()
70
-        self.assertXmlTagValue('merchantreference', '123123')
71
-        
72
-    def test_request_includes_amount_and_currency(self):   
73
-        self.make_request()
74
-        self.assertXmlTagValue('amount', '12.99')
75
-        self.assertXmlTagAttributeValue('amount', 'currency', 'GBP')
76
-        
77
-    def test_request_can_include_authcode(self):
78
-        self.make_request(auth_code='334455')    
79
-        self.assertXmlTagValue('authcode', '334455')
80
-    
81
-    def test_request_includes_card_details(self):   
82
-        self.make_request(start_date='01/10')
83
-        self.assertXmlTagValue('pan', '1000010000000007')
84
-        self.assertXmlTagValue('startdate', '01/10')
85
-        self.assertXmlTagValue('expirydate', '01/12')
86
-        
87
-    def test_request_can_include_issue_number(self):
88
-        self.make_request(issue_number='03')    
89
-        self.assertXmlTagValue('issuenumber', '03')    
90
-
91
-
92
-class AuthTransactionTests(TestCase, InitialTransactionMixin):
93
-    
94
-    def setUp(self):
95
-        self.init_gateway()
96
-    
97
-    def make_request(self, **kwargs):
98
-        self.gateway.auth(card_number='1000010000000007', 
99
-                          expiry_date='01/12',
100
-                          merchant_reference='123123',
101
-                          currency='GBP',
102
-                          amount=D('12.99'),
103
-                          **kwargs)
104
-        
105
-    def test_request_includes_method(self):
106
-        self.make_request()    
107
-        self.assertXmlTagValue('method', 'auth')
108
-    
109
-    
110
-class PreTransactionTests(TestCase, InitialTransactionMixin):
111
-    
112
-    def setUp(self):
113
-        self.init_gateway()
114
-    
115
-    def make_request(self, **kwargs):
116
-        self.gateway.pre(card_number='1000010000000007', 
117
-                         expiry_date='01/12',
118
-                         merchant_reference='123123',
119
-                         currency='GBP',
120
-                         amount=D('12.99'),
121
-                         **kwargs)    
122
-        
123
-    def test_request_includes_method(self):
124
-        self.make_request()    
125
-        self.assertXmlTagValue('method', 'pre')
126
-        
127
-        
128
-class RefundTransactionTests(TestCase, InitialTransactionMixin):
129
-    
130
-    def setUp(self):
131
-        self.init_gateway()
132
-    
133
-    def make_request(self, **kwargs):
134
-        self.gateway.refund(card_number='1000010000000007', 
135
-                            expiry_date='01/12',
136
-                            merchant_reference='123123',
137
-                            currency='GBP',
138
-                            amount=D('12.99'),
139
-                            **kwargs)    
140
-        
141
-    def test_request_includes_method(self):
142
-        self.make_request()    
143
-        self.assertXmlTagValue('method', 'refund')
144
-    
145
-    
146
-class ErpTransactionTests(TestCase, InitialTransactionMixin):
147
-    
148
-    def setUp(self):
149
-        self.init_gateway()
150
-    
151
-    def make_request(self, **kwargs):
152
-        self.gateway.erp(card_number='1000010000000007', 
153
-                         expiry_date='01/12',
154
-                         merchant_reference='123123',
155
-                         currency='GBP',
156
-                         amount=D('12.99'),
157
-                         **kwargs)    
158
-        
159
-    def test_request_includes_method(self):
160
-        self.make_request()    
161
-        self.assertXmlTagValue('method', 'erp')    
162
-    
163
-    
164
-class CancelTransactionTests(TestCase, TransactionMixin):
165
-    
166
-    def setUp(self):
167
-        self.init_gateway()
168
-    
169
-    def make_request(self, **kwargs):
170
-        self.gateway.cancel(txn_reference='12312333444')
171
-        
172
-    def test_request_includes_method(self):
173
-        self.make_request()    
174
-        self.assertXmlTagValue('method', 'cancel') 
175
-        
176
-    def test_request_includes_reference(self):
177
-        self.make_request()    
178
-        self.assertXmlTagValue('reference', '12312333444') 
179
-        
180
-        
181
-class FulfilTransactionTests(TestCase, TransactionMixin):
182
-    
183
-    def setUp(self):
184
-        self.init_gateway()
185
-    
186
-    def make_request(self, **kwargs):
187
-        self.gateway.fulfil(currency='GBP',
188
-                            amount=D('12.99'),
189
-                            txn_reference='12312333444',
190
-                            auth_code='123444')
191
-        
192
-    def test_request_includes_method(self):
193
-        self.make_request()    
194
-        self.assertXmlTagValue('method', 'fulfil')   
195
-        
196
-    def test_request_includes_reference(self):
197
-        self.make_request()    
198
-        self.assertXmlTagValue('reference', '12312333444') 
199
-        
200
-    def test_request_includes_authcode(self):
201
-        self.make_request()    
202
-        self.assertXmlTagValue('authcode', '123444') 
203
-        
204
-        
205
-class TxnRefundTransactionTests(TestCase, TransactionMixin):
206
-    
207
-    def setUp(self):
208
-        self.init_gateway()
209
-    
210
-    def make_request(self, **kwargs):
211
-        self.gateway.txn_refund(currency='GBP',
212
-                                amount=D('12.99'),
213
-                                txn_reference='12312333444')
214
-        
215
-    def test_request_includes_method(self):
216
-        self.make_request()    
217
-        self.assertXmlTagValue('method', 'txn_refund')   
218
-        
219
-    def test_request_includes_reference(self):
220
-        self.make_request()    
221
-        self.assertXmlTagValue('reference', '12312333444') 
222
-        
223
-        
224
-class Av2CVsTests(TestCase, TransactionMixin):
225
-    
226
-    def setUp(self):
227
-        self.init_gateway(cv2avs=True)
228
-    
229
-    def make_request(self, **kwargs):
230
-        self.gateway.auth(card_number='1000010000000007', 
231
-                          expiry_date='01/12',
232
-                          merchant_reference='123123',
233
-                          currency='GBP',
234
-                          amount=D('12.99'),
235
-                          ccv='234')
236
-        
237
-    def test_ccv_element_in_request(self):
238
-        self.make_request()
239
-        self.assertXmlTagValue('cv2', '234') 
240
-    

+ 0
- 128
oscar/apps/payment/tests/datacash_responses.py Zobrazit soubor

@@ -1,128 +0,0 @@
1
-import mock
2
-from decimal import Decimal as D
3
-from xml.dom.minidom import parseString
4
-
5
-from django.test import TestCase
6
-
7
-from oscar.apps.payment.datacash.utils import Gateway
8
-
9
-
10
-class AuthResponseHandlingTests(TestCase):
11
-    
12
-    success_response_xml = """<?xml version="1.0" encoding="UTF-8" ?>
13
-<Response>
14
-    <CardTxn>
15
-        <authcode>060642</authcode>
16
-        <card_scheme>Switch</card_scheme>
17
-        <country>United Kingdom</country>
18
-        <issuer>HSBC</issuer>
19
-    </CardTxn>
20
-    <datacash_reference>3000000088888888</datacash_reference>
21
-    <merchantreference>1000001</merchantreference>
22
-    <mode>LIVE</mode>
23
-    <reason>ACCEPTED</reason>
24
-    <status>1</status>
25
-    <time>1071567305</time>
26
-</Response>"""
27
-    
28
-    def setUp(self):
29
-        self.gateway = Gateway(client="DUMMY", password="123456", host="dummyhost.com",)
30
-        self.gateway.do_request = mock.Mock()
31
-    
32
-    def test_success_auth_response(self):
33
-        self.gateway.do_request.return_value = self.success_response_xml
34
-        response = self.gateway.auth(card_number='1000010000000007', 
35
-                                     expiry_date='01/12',
36
-                                     merchant_reference='1000001',
37
-                                     currency='GBP',
38
-                                     amount=D('12.99'))
39
-        self.assertEquals(1, response['status'])
40
-        self.assertEquals('3000000088888888', response['datacash_reference'])
41
-        self.assertEquals('1000001', response['merchant_reference'])
42
-        self.assertEquals('060642', response['auth_code'])
43
-        self.assertEquals('ACCEPTED', response['reason'])
44
-        
45
-    def test_success_pre_response(self):
46
-        self.gateway.do_request.return_value = self.success_response_xml
47
-        response = self.gateway.pre(card_number='1000010000000007', 
48
-                                     expiry_date='01/12',
49
-                                     merchant_reference='1000001',
50
-                                     currency='GBP',
51
-                                     amount=D('12.99'))
52
-        self.assertEquals(1, response['status'])
53
-        self.assertEquals('3000000088888888', response['datacash_reference'])
54
-        self.assertEquals('1000001', response['merchant_reference'])
55
-        self.assertEquals('060642', response['auth_code'])
56
-        self.assertEquals('ACCEPTED', response['reason'])
57
-        
58
-    def test_declined_auth_response(self):
59
-        response_xml = """<?xml version="1.0" encoding="UTF-8" ?>
60
-<Response>
61
-    <CardTxn>
62
-        <authcode>DECLINED</authcode>
63
-        <card_scheme>Mastercard</card_scheme>
64
-        <country>United Kingdom</country>
65
-    </CardTxn>
66
-    <datacash_reference>4400200045583767</datacash_reference>
67
-    <merchantreference>AA004630</merchantreference>
68
-    <mode>TEST</mode>
69
-    <reason>DECLINED</reason>
70
-    <status>7</status>
71
-    <time>1169223906</time>
72
-</Response>"""
73
-        self.gateway.do_request.return_value = response_xml
74
-        response = self.gateway.auth(card_number='1000010000000007', 
75
-                                     expiry_date='01/12',
76
-                                     merchant_reference='1000001',
77
-                                     currency='GBP',
78
-                                     amount=D('12.99'))
79
-        self.assertEquals(7, response['status'])
80
-        self.assertEquals('4400200045583767', response['datacash_reference'])
81
-        self.assertEquals('AA004630', response['merchant_reference'])
82
-        self.assertEquals('DECLINED', response['auth_code'])
83
-        self.assertEquals('DECLINED', response['reason'])
84
-
85
-    def test_successful_cancel_response(self):
86
-        response_xml = """<?xml version="1.0" encoding="UTF-8" ?>
87
-<Response>
88
-    <datacash_reference>4900200000000001</datacash_reference>
89
-    <merchantreference>4900200000000001</merchantreference>
90
-    <mode>TEST</mode>
91
-    <reason>CANCELLED OK</reason>
92
-    <status>1</status>
93
-    <time>1151567456</time>
94
-</Response>"""
95
-        self.gateway.do_request.return_value = response_xml
96
-        response = self.gateway.cancel(txn_reference='4900200000000001')
97
-        self.assertEquals(1, response['status'])
98
-        self.assertEquals('4900200000000001', response['datacash_reference'])
99
-        self.assertEquals('4900200000000001', response['merchant_reference'])
100
-        self.assertEquals('CANCELLED OK', response['reason'])
101
-        
102
-    def test_successful_fulfil_response(self):
103
-        response_xml = """<?xml version="1.0" encoding="UTF-8" ?>
104
-<Response>
105
-    <datacash_reference>3900200000000001</datacash_reference>
106
-    <merchantreference>3900200000000001</merchantreference>
107
-    <mode>LIVE</mode>
108
-    <reason>FULFILLED OK</reason>
109
-    <status>1</status>
110
-    <time>1071567356</time>
111
-</Response>
112
-"""
113
-        self.gateway.do_request.return_value = response_xml
114
-        response = self.gateway.fulfil(txn_reference='3900200000000001', 
115
-                                     merchant_reference='1000001',
116
-                                     currency='GBP',
117
-                                     amount=D('12.99'),
118
-                                     auth_code='asdf')
119
-        self.assertEquals(1, response['status'])
120
-        self.assertEquals('3900200000000001', response['datacash_reference'])
121
-        self.assertEquals('3900200000000001', response['merchant_reference'])
122
-        self.assertEquals('FULFILLED OK', response['reason'])
123
-
124
-
125
-
126
-        
127
-    
128
- 

+ 0
- 1
run_tests.py Zobrazit soubor

@@ -35,7 +35,6 @@ if not settings.configured:
35 35
                 'oscar.apps.catalogue.reviews',
36 36
                 'oscar.apps.basket',
37 37
                 'oscar.apps.payment',
38
-                'oscar.apps.payment.datacash',
39 38
                 'oscar.apps.offer',
40 39
                 'oscar.apps.address',
41 40
                 'oscar.apps.partner',

Načítá se…
Zrušit
Uložit