Projet

Général

Profil

0001-expose-transaction-capabilities-32969.patch

Emmanuel Cazenave, 14 mai 2019 16:35

Télécharger (8,35 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      |  8 ++++++++
 eopayment/paybox.py        | 11 ++++++++++-
 eopayment/systempayv2.py   | 12 +++++++++++-
 tests/test_base_payment.py | 30 +++++++++++++++++++++++++++++-
 tests/test_paybox.py       | 30 ++++++++++++++++++++++++++++++
 tests/test_systempayv2.py  | 20 ++++++++++++++++++++
 6 files changed, 108 insertions(+), 3 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_parameters(self, scope='global'):
197
        res = []
198
        for param in self.backend.description.get('parameters', []):
199
            if param.get('scope', 'global') != scope:
200
                continue
201
            res.append(param)
202
        return res
eopayment/paybox.py
247 247
                'required': False,
248 248
                'choices': PAYMENT_MODES.keys()
249 249
            },
250
            {
251
                'name': 'manual_validation',
252
                'caption': _('Validation manuelle'),
253
                'type': bool,
254
                'default': False,
255
                'scope': 'transaction'
256
            }
250 257
        ]
251 258
    }
252 259

  
253
    def request(self, amount, email, name=None, orderid=None, **kwargs):
260
    def request(self, amount, email, name=None, orderid=None, manual_validation=None, **kwargs):
254 261
        d = OrderedDict()
255 262
        d['PBX_SITE'] = force_text(self.site)
256 263
        d['PBX_RANG'] = force_text(self.rang).strip()[-2:]
......
283 290
        if capture_day:
284 291
            d['PBX_DIFF'] = capture_day.zfill(2)
285 292
        d['PBX_AUTOSEULE'] = PAYMENT_MODES[self.capture_mode]
293
        if manual_validation:
294
            d['PBX_AUTOSEULE'] = PAYMENT_MODES['AUTHOR_CAPTURE']
286 295
        if automatic_return_url:
287 296
            d['PBX_REPONDRE_A'] = force_text(automatic_return_url)
288 297
        d = d.items()
eopayment/systempayv2.py
246 246
            {'name': 'secret_production',
247 247
                'caption': _(u'Secret pour la configuration de PRODUCTION'),
248 248
                'validation': lambda value: str.isdigit(value), },
249
            {
250
                'name': 'manual_validation',
251
                'caption': _('Validation manuelle'),
252
                'type': bool,
253
                'default': False,
254
                'scope': 'transaction'
255
            }
249 256
        ]
250 257
    }
251 258

  
......
267 274
        options = add_vads(options)
268 275
        self.options = options
269 276

  
277

  
270 278
    def request(self, amount, name=None, first_name=None, last_name=None,
271 279
                address=None, email=None, phone=None, orderid=None, info1=None,
272
                info2=None, info3=None, next_url=None, **kwargs):
280
                info2=None, info3=None, next_url=None, manual_validation=None, **kwargs):
273 281
        '''
274 282
           Create the URL string to send a request to SystemPay
275 283
        '''
......
338 346
        capture_day = fields.pop('capture_day')
339 347
        if capture_day:
340 348
            fields['vads_capture_delay'] = capture_day
349
        if manual_validation:
350
            fields['vads_validation_mode'] = '1'
341 351
        check_vads(fields)
342 352
        fields[SIGNATURE] = force_text(self.signature(fields))
343 353
        self.logger.debug('%s request contains fields: %s', __name__, fields)
tests/test_base_payment.py
14 14
            'parameters': [
15 15
                {
16 16
                    'name': 'capture_day',
17
                }
17
                },
18
                {
19
                    'name': 'manual_validation',
20
                    'caption': 'Validation manuelle',
21
                    'type': bool,
22
                    'default': False,
23
                    'scope': 'transaction'
24
                },
25
                {
26
                    'name': 'global_param',
27
                    'caption': 'Global Param',
28
                    'type': bool,
29
                    'default': False,
30
                    'scope': 'global'
31
                },
32

  
18 33
            ]
19 34
        }
20 35

  
......
64 79
        # converted to Europe/Paris it is already 2018-10-03
65 80
        # so 2018-10-03 for capture_date is invalid
66 81
        payment.request(amount=12.2, capture_date=capture_date)
82

  
83

  
84
def test_get_parameters(monkeypatch):
85
    _, payment = do_mock_backend(monkeypatch)
86

  
87
    global_parameters = payment.get_parameters()
88
    assert len(global_parameters) == 2
89
    assert global_parameters[0]['name'] == 'capture_day'
90
    assert global_parameters[1]['name'] == 'global_param'
91

  
92
    transaction_parameters = payment.get_parameters(scope='transaction')
93
    assert len(transaction_parameters) == 1
94
    assert transaction_parameters[0]['name'] == 'manual_validation'
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_request_manual_validation(self):
258
        params = BACKEND_PARAMS.copy()
259
        time = '2018-08-21T10:26:32+02:00'
260
        email = 'user@entrouvert.com'
261
        order_id = '20180821'
262
        transaction = '1234'
263
        amount = '42.99'
264

  
265
        backend = eopayment.Payment('paybox', params)
266

  
267
        transaction_id, kind, what = backend.request(
268
                Decimal(amount), email=email, orderid=order_id,
269
                transaction_id=transaction, time=time)
270
        root = ET.fromstring(str(what))
271
        form_params = dict((
272
            (node.attrib['name'], node.attrib['value']) for node in root
273
            if node.attrib['type'] == 'hidden'))
274
        self.assertIn('PBX_AUTOSEULE', form_params)
275
        self.assertEqual(form_params['PBX_AUTOSEULE'], 'N')
276

  
277
        transaction_id, kind, what = backend.request(
278
                Decimal(amount), email=email, orderid=order_id,
279
                transaction_id=transaction, time=time, manual_validation=True)
280
        root = ET.fromstring(str(what))
281
        form_params = dict((
282
            (node.attrib['name'], node.attrib['value']) for node in root
283
            if node.attrib['type'] == 'hidden'))
284
        self.assertIn('PBX_AUTOSEULE', form_params)
285
        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_manual_validation():
104
    params = {
105
        'secret_test': u'1122334455667788',
106
        'vads_site_id': u'12345678',
107
        'vads_ctx_mode': u'TEST',
108
    }
109
    data = {
110
        'amount': 15.24, 'orderid': '654321', 'first_name': u'John',
111
        'last_name': u'Doe'
112
    }
113

  
114
    backend = eopayment.Payment('systempayv2', params)
115
    transaction_id, f, form = backend.request(**data.copy())
116
    assert get_field(form, 'vads_validation_mode')['value'] == ''
117

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