lingo: don't fail on payment if error occured on remote item (#49863)

This commit is contained in:
Lauréline Guérin 2021-01-08 11:29:32 +01:00
parent 469818dd3c
commit 7d61835c25
No known key found for this signature in database
GPG Key ID: 1FAB9B9B4F93D473
2 changed files with 47 additions and 4 deletions

View File

@ -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.'))

View File

@ -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 '<h2>Technical error: impossible to retrieve invoices.</h2>' 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')