From 7d61835c255f80f62c97aff8993cfe93a7b01ee0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Laur=C3=A9line=20Gu=C3=A9rin?= Date: Fri, 8 Jan 2021 11:29:32 +0100 Subject: [PATCH] lingo: don't fail on payment if error occured on remote item (#49863) --- combo/apps/lingo/views.py | 15 +++++++++---- tests/test_lingo_remote_regie.py | 36 ++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/combo/apps/lingo/views.py b/combo/apps/lingo/views.py index 124d01bc..6957c1b2 100644 --- a/combo/apps/lingo/views.py +++ b/combo/apps/lingo/views.py @@ -466,10 +466,17 @@ class PayView(PayMixin, View): remote_items = [] items = [] if regie_id and Regie.objects.get(pk=regie_id).is_remote(): - regie = Regie.objects.get(pk=regie_id) - # get all items data from regie webservice - for item_id in request.POST.getlist('item'): - remote_items.append(regie.get_invoice(user, item_id)) + try: + regie = Regie.objects.get(pk=regie_id) + # get all items data from regie webservice + for item_id in request.POST.getlist('item'): + remote_items.append(regie.get_invoice(user, item_id)) + except (requests.exceptions.RequestException, RemoteInvoiceException): + messages.error(request, _(u'Technical error: impossible to retrieve invoices.')) + return HttpResponseRedirect(next_url) + except ObjectDoesNotExist: + messages.error(request, _(u'No invoice was found.')) + return HttpResponseRedirect(next_url) else: if user is None: messages.error(request, _(u'Payment requires to be logged in.')) diff --git a/tests/test_lingo_remote_regie.py b/tests/test_lingo_remote_regie.py index 0fa2e8ae..e710d55b 100644 --- a/tests/test_lingo_remote_regie.py +++ b/tests/test_lingo_remote_regie.py @@ -416,6 +416,42 @@ def test_remote_item_failure(mock_get, app, remote_regie): mock_resp = Response() mock_resp.status_code = 404 mock_get.return_value = mock_resp + resp = app.get('/lingo/item/%s/%s/' % (remote_regie.id, encrypt_id)) + assert '

Technical error: impossible to retrieve invoices.

' in resp.text + + +@mock.patch('combo.apps.lingo.models.Regie.pay_invoice') +@mock.patch('combo.apps.lingo.models.requests.get') +def test_pay_remote_item_failure(mock_get, mock_pay_invoice, app, remote_regie): + encrypt_id = aes_hex_encrypt(settings.SECRET_KEY, force_bytes('F201601')) + mock_json = mock.Mock(status_code=200) + mock_json.json.return_value = {'err': 0, 'data': INVOICES[0]} + mock_get.return_value = mock_json + mock_pay_invoice.return_value = mock.Mock(status_code=200) + url = '/lingo/item/%s/%s/' % (remote_regie.id, encrypt_id) + resp = app.get(url) + + form = resp.form + + mock_json = mock.Mock() + mock_json.json.return_value = {'err': 1} + mock_get.return_value = mock_json + resp = form.submit().follow() + assert 'Technical error: impossible to retrieve invoices.' in app.session['_messages'] + + mock_json.json.return_value = {'err': 0} + resp = form.submit().follow() + assert 'No invoice was found.' in app.session['_messages'] + + mock_get.side_effect = ConnectionError('where is my hostname?') + resp = form.submit().follow() + assert 'Technical error: impossible to retrieve invoices.' in app.session['_messages'] + + mock_resp = Response() + mock_resp.status_code = 404 + mock_get.return_value = mock_resp + resp = form.submit().follow() + assert 'Technical error: impossible to retrieve invoices.' in app.session['_messages'] @mock.patch('combo.apps.lingo.models.requests.get')