Projet

Général

Profil

0001-expose-transaction-capabilities-32969.patch

Emmanuel Cazenave, 10 mai 2019 17:04

Télécharger (7,99 ko)

Voir les différences:

Subject: [PATCH] expose transaction capabilities (#32969)

And implement the first one, manual validation for
systempayv2 and paybox.
 eopayment/__init__.py     |  3 +++
 eopayment/common.py       |  2 ++
 eopayment/paybox.py       | 16 +++++++++++++-
 eopayment/systempayv2.py  | 17 ++++++++++++++-
 tests/test_paybox.py      | 44 +++++++++++++++++++++++++++++++++++++++
 tests/test_systempayv2.py | 38 +++++++++++++++++++++++++++++++++
 6 files changed, 118 insertions(+), 2 deletions(-)
eopayment/__init__.py
192 192
           - bank_data -- the transaction dictionary received from the bank
193 193
        '''
194 194
        return self.backend.validate(amount, bank_data, **kwargs)
195

  
196
    def get_capabilities(self):
197
        return self.backend.capabilities
eopayment/common.py
120 120
    PATH = '/tmp'
121 121
    BANK_ID = '__bank_id'
122 122

  
123
    capabilities = {}
124

  
123 125
    def __init__(self, options, logger=None):
124 126
        self.logger = logger or logging.getLogger(self.__class__.__module__)
125 127
        self.logger.debug('initializing with options %s', options)
eopayment/paybox.py
250 250
        ]
251 251
    }
252 252

  
253
    def request(self, amount, email, name=None, orderid=None, **kwargs):
253
    capabilities = {
254
            'params':
255
            [
256
                {
257
                    'name': 'manual_validation',
258
                    'label': _('Validation manuelle'),
259
                    'type': 'bool',
260
                    'default': False
261
                }
262
            ]
263
        }
264

  
265
    def request(self, amount, email, name=None, orderid=None, manual_validation=None, **kwargs):
254 266
        d = OrderedDict()
255 267
        d['PBX_SITE'] = force_text(self.site)
256 268
        d['PBX_RANG'] = force_text(self.rang).strip()[-2:]
......
283 295
        if capture_day:
284 296
            d['PBX_DIFF'] = capture_day.zfill(2)
285 297
        d['PBX_AUTOSEULE'] = PAYMENT_MODES[self.capture_mode]
298
        if manual_validation:
299
            d['PBX_AUTOSEULE'] = PAYMENT_MODES['AUTHOR_CAPTURE']
286 300
        if automatic_return_url:
287 301
            d['PBX_REPONDRE_A'] = force_text(automatic_return_url)
288 302
        d = d.items()
eopayment/systempayv2.py
262 262
             'max_length': parameter.max_length}
263 263
        description['parameters'].append(x)
264 264

  
265
        capabilities = {
266
            'params':
267
            [
268
                {
269
                    'name': 'manual_validation',
270
                    'label': _('Validation manuelle'),
271
                    'type': 'bool',
272
                    'default': False
273
                }
274
            ]
275
        }
276

  
265 277
    def __init__(self, options, logger=None):
266 278
        super(Payment, self).__init__(options, logger=logger)
267 279
        options = add_vads(options)
268 280
        self.options = options
269 281

  
282

  
270 283
    def request(self, amount, name=None, first_name=None, last_name=None,
271 284
                address=None, email=None, phone=None, orderid=None, info1=None,
272
                info2=None, info3=None, next_url=None, **kwargs):
285
                info2=None, info3=None, next_url=None, manual_validation=None, **kwargs):
273 286
        '''
274 287
           Create the URL string to send a request to SystemPay
275 288
        '''
......
338 351
        capture_day = fields.pop('capture_day')
339 352
        if capture_day:
340 353
            fields['vads_capture_delay'] = capture_day
354
        if manual_validation:
355
            fields['vads_validation_mode'] = '1'
341 356
        check_vads(fields)
342 357
        fields[SIGNATURE] = force_text(self.signature(fields))
343 358
        self.logger.debug('%s request contains fields: %s', __name__, fields)
tests/test_paybox.py
253 253
z0Dkz0NjxvU+5WzQZh9Uuxr/egRCwV4NMRWqu0zaVVioeBvl4/5CWm4f4/1L9+0m
254 254
FBFKOZhgBJnkC+l6+XhT4aYWKaQ4ocmOMV92yjeXTE4='''
255 255
        self.assertTrue(paybox.verify(data, base64.b64decode(sig64), key=pkey))
256

  
257
    def test_capabilities(self):
258
        params = BACKEND_PARAMS.copy()
259

  
260
        backend = eopayment.Payment('paybox', params)
261
        capabilities = backend.get_capabilities()
262
        params = capabilities['params']
263
        assert len(params) == 1
264

  
265
        param = params[0]
266
        assert param['name'] == 'manual_validation'
267
        assert param['label'] == 'Validation manuelle'
268
        assert param['type'] == 'bool'
269
        assert param['default'] is False
270

  
271
    def test_request_manual_validation(self):
272
        params = BACKEND_PARAMS.copy()
273
        time = '2018-08-21T10:26:32+02:00'
274
        email = 'user@entrouvert.com'
275
        order_id = '20180821'
276
        transaction = '1234'
277
        amount = '42.99'
278

  
279
        backend = eopayment.Payment('paybox', params)
280

  
281
        transaction_id, kind, what = backend.request(
282
                Decimal(amount), email=email, orderid=order_id,
283
                transaction_id=transaction, time=time)
284
        root = ET.fromstring(str(what))
285
        form_params = dict((
286
            (node.attrib['name'], node.attrib['value']) for node in root
287
            if node.attrib['type'] == 'hidden'))
288
        self.assertIn('PBX_AUTOSEULE', form_params)
289
        self.assertEqual(form_params['PBX_AUTOSEULE'], 'N')
290

  
291
        transaction_id, kind, what = backend.request(
292
                Decimal(amount), email=email, orderid=order_id,
293
                transaction_id=transaction, time=time, manual_validation=True)
294
        root = ET.fromstring(str(what))
295
        form_params = dict((
296
            (node.attrib['name'], node.attrib['value']) for node in root
297
            if node.attrib['type'] == 'hidden'))
298
        self.assertIn('PBX_AUTOSEULE', form_params)
299
        self.assertEqual(form_params['PBX_AUTOSEULE'], 'O')
tests/test_systempayv2.py
98 98
    data['capture_date'] = (datetime.now().date() + timedelta(days=4))
99 99
    transaction_id, f, form = p.request(**data)
100 100
    assert get_field(form, 'vads_capture_delay')['value'] == '4'
101

  
102

  
103
def test_capabilities():
104
    params = {
105
        'secret_test': u'1122334455667788',
106
        'vads_site_id': u'12345678',
107
        'vads_ctx_mode': u'TEST',
108
    }
109
    backend = eopayment.Payment('systempayv2', params)
110
    capabilities = backend.get_capabilities()
111
    params = capabilities['params']
112
    assert len(params) == 1
113

  
114
    param = params[0]
115
    assert param['name'] == 'manual_validation'
116
    assert param['label'] == 'Validation manuelle'
117
    assert param['type'] == 'bool'
118
    assert param['default'] is False
119

  
120

  
121
def test_manual_validation():
122
    params = {
123
        'secret_test': u'1122334455667788',
124
        'vads_site_id': u'12345678',
125
        'vads_ctx_mode': u'TEST',
126
    }
127
    data = {
128
        'amount': 15.24, 'orderid': '654321', 'first_name': u'John',
129
        'last_name': u'Doe'
130
    }
131

  
132
    backend = eopayment.Payment('systempayv2', params)
133
    transaction_id, f, form = backend.request(**data.copy())
134
    assert get_field(form, 'vads_validation_mode')['value'] == ''
135

  
136
    data['manual_validation'] = True
137
    transaction_id, f, form = backend.request(**data.copy())
138
    assert get_field(form, 'vads_validation_mode')['value'] == '1'
101
-