ref(piaf): enleve du crappy code de test-a-la-rache; ajoute du meilleur code de test

master
François Poulain 2018-09-24 21:51:49 +02:00 commité par François Poulain
Parent b573f329c1
révision 41a4e04ea7
5 fichiers modifiés avec 38 ajouts et 192 suppressions

Voir le fichier

@ -98,8 +98,6 @@ class TipiPaiement(models.Model):
'mel': self.email,
'montant': '{}'.format(int(self.amount*100)),
}
# FIXME: to be removed
params['urlcl'] = 'http://apps.villedeviolaines.fr/piaf/paid_invoice'
r = Request('GET', url, params=params)
return r.prepare().url

Voir le fichier

@ -16,11 +16,12 @@
import re
import logging
from datetime import datetime
from bs4 import BeautifulSoup as bs
from urllib.parse import urlparse, parse_qs
from django.test import TestCase, Client
from django.urls import reverse
from django.test.utils import override_settings
from django.core import mail
from piaf.base import resthys, models
@ -162,21 +163,25 @@ class PrepareInvoice(TestCase):
models.Abuse.objects.all().delete()
class ForbidUnpayInvoice(TestCase):
def setUp(self):
self.client = Client()
def test_forbid_unpay_invoice(self):
response = self.client.post(
reverse('retrieve_invoice'),
{'numero': '54', 'nom': 'Isabelle Merignac'},
follow=True,
)
response = self.client.get(reverse('unpay_invoice'))
self.assertEqual(response.status_code, 404)
def get_paiement_post_data(content):
url = re.search(
r"'(http://www.jepaiemesserviceslocaux.dgfip.finances.gouv[^']+)'",
content,
re.MULTILINE
).group(1)
qs = parse_qs(urlparse(url).query)
data = dict([
[k, v[0]]
for k, v in qs.items() if k in
['numcli', 'exer', 'refdet', 'objet', 'saisie', 'mel', 'montant']
])
data['resultrans'] = 'P'
data['numauto'] = '420042'
data['dattrans'] = datetime.now().strftime('%d%m%Y')
data['heurtrans'] = datetime.now().strftime('%H%M')
return data
@override_settings(DEBUG=True)
class PayInvoice(TestCase):
def setUp(self):
self.client = Client()
@ -198,16 +203,9 @@ class PayInvoice(TestCase):
)
self.assertContains(response, 'Payer la facture')
self.before = self.clean_timestamp(response.content.decode())
data = dict([
(i.get('name'), i.get('value'))
for i in
bs(response.content, 'html.parser')
.find("form", id="payment_ko")
.find_all('input')
])
data['saisie'] = 'T'
data = get_paiement_post_data(response.content.decode())
data['resultrans'] = 'R'
data.pop('csrfmiddlewaretoken', None)
response = self.tipi_client.post(
reverse('paid_invoice'),
@ -220,17 +218,7 @@ class PayInvoice(TestCase):
self.assertContains(response, 'Paiement refusé')
self.assertContains(response, 'Payer la facture')
data = dict([
(i.get('name'), i.get('value'))
for i in
bs(response.content, 'html.parser')
.find("form", id="payment_ok")
.find("div")
.find_all('input')
])
data['saisie'] = 'T'
data['resultrans'] = 'P'
data.pop('csrfmiddlewaretoken', None)
data = get_paiement_post_data(response.content.decode())
response = self.tipi_client.post(
reverse('paid_invoice'),
@ -243,7 +231,8 @@ class PayInvoice(TestCase):
self.assertContains(response, 'Paiement reçu')
self.assertContains(response, 'Facture payée')
self.client.get(reverse('unpay_invoice'))
resthys.put('unpay/54', data={})
response = self.client.get(reverse('prepare_invoice'))
response = self.client.get(reverse('prepare_invoice'))
self.assertContains(response, 'Payer la facture')
@ -257,18 +246,12 @@ class PayInvoice(TestCase):
self.assertEqual(self.before, self.after)
def tearDown(self):
response = self.client.post(
reverse('retrieve_invoice'),
{'numero': '54', 'nom': 'Isabelle Merignac'},
follow=True,
)
self.client.get(reverse('unpay_invoice'))
self.assertEqual(response.status_code, 200)
resthys.put('unpay/54', data={})
resthys.put('individus/53', data={'email': 'merigmarc@test.com'})
# flush messages
response = self.client.get(reverse('prepare_invoice'))
self.client.get(reverse('home'))
@override_settings(DEBUG=True)
class PayMergedInvoice(TestCase):
def setUp(self):
self.client = Client()
@ -297,16 +280,8 @@ class PayMergedInvoice(TestCase):
self.assertContains(response, 'Payer les factures (176,00')
self.before = self.clean_timestamp(response.content.decode())
data = dict([
(i.get('name'), i.get('value'))
for i in
bs(response.content, 'html.parser')
.find("form", id="payment_ko")
.find_all('input')
])
data['saisie'] = 'T'
data = get_paiement_post_data(response.content.decode())
data['resultrans'] = 'R'
data.pop('csrfmiddlewaretoken', None)
response = self.tipi_client.post(
reverse('paid_invoice'),
@ -319,17 +294,7 @@ class PayMergedInvoice(TestCase):
self.assertContains(response, 'Paiement refusé')
self.assertContains(response, 'Payer les factures (176,00')
data = dict([
(i.get('name'), i.get('value'))
for i in
bs(response.content, 'html.parser')
.find("form", id="payment_ok")
.find("div")
.find_all('input')
])
data['saisie'] = 'T'
data['resultrans'] = 'P'
data.pop('csrfmiddlewaretoken', None)
data = get_paiement_post_data(response.content.decode())
response = self.tipi_client.post(
reverse('paid_invoice'),
@ -342,7 +307,9 @@ class PayMergedInvoice(TestCase):
self.assertContains(response, 'Paiement reçu')
self.assertContains(response, 'Factures payées (176,00')
self.client.get(reverse('unpay_invoice'))
resthys.put('unpay/34', data={})
resthys.put('unpay/53', data={})
response = self.client.get(reverse('prepare_merged_invoices'))
response = self.client.get(reverse('prepare_merged_invoices'))
self.assertContains(response, 'Payer les factures (176,00')
@ -356,32 +323,13 @@ class PayMergedInvoice(TestCase):
self.assertMultiLineEqual(self.before, self.after)
def tearDown(self):
response = self.client.post(
reverse('retrieve_invoice'),
{'numero': '54', 'nom': 'Isabelle Merignac'},
follow=True,
)
self.client.get(reverse('unpay_invoice'))
self.assertEqual(response.status_code, 200)
response = self.client.post(
reverse('retrieve_invoice'),
{'numero': '34', 'nom': 'Raphael Leroy'},
follow=True,
)
self.client.get(reverse('unpay_invoice'))
self.assertEqual(response.status_code, 200)
response = self.client.post(
reverse('retrieve_invoice'),
{'numero': '53', 'nom': 'Raphael Leroy'},
follow=True,
)
self.client.get(reverse('unpay_invoice'))
self.assertEqual(response.status_code, 200)
resthys.put('unpay/34', data={})
resthys.put('unpay/53', data={})
resthys.put('unpay/54', data={})
# flush messages
response = self.client.get(reverse('prepare_merged_invoices'))
self.client.get(reverse('home'))
@override_settings(DEBUG=True)
class PayInvoiceOnBackendFailure(TestCase):
def setUp(self):
self.client = Client()
@ -397,17 +345,7 @@ class PayInvoiceOnBackendFailure(TestCase):
)
self.assertContains(response, 'Payer la facture')
data = dict([
(i.get('name'), i.get('value'))
for i in
bs(response.content, 'html.parser')
.find("form", id="payment_ok")
.find("div")
.find_all('input')
])
data['saisie'] = 'T'
data['resultrans'] = 'P'
data.pop('csrfmiddlewaretoken', None)
data = get_paiement_post_data(response.content.decode())
with self.settings(RESTHYS_BASEURL='http://127.0.0.1:8080/doomtofail'):
tipi_response = self.tipi_client.post(
@ -470,13 +408,7 @@ class PayInvoiceOnBackendFailure(TestCase):
logger.setLevel(previous_level)
def tearDown(self):
response = self.client.post(
reverse('retrieve_invoice'),
{'numero': '54', 'nom': 'Isabelle Merignac'},
follow=True,
)
self.client.get(reverse('unpay_invoice'))
self.assertEqual(response.status_code, 200)
resthys.put('unpay/54', data={})
class TrustedPaidInvoice(TestCase):

Voir le fichier

@ -37,5 +37,4 @@ urlpatterns = [
name='register_paiement',
),
path('paid_invoice', views.PaidInvoice.as_view(), name='paid_invoice'),
path('unpay_invoice', views.UnpayInvoice.as_view(), name='unpay_invoice'),
]

Voir le fichier

@ -22,7 +22,6 @@ from django.shortcuts import HttpResponseRedirect, get_object_or_404
from django.conf import settings
from django.contrib import messages
from django.urls import reverse, reverse_lazy
from django.http import Http404, HttpResponseBadRequest
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
@ -129,30 +128,6 @@ class PrepareInvoice(mixins.HackyMessagesMixin, generic.edit.FormView):
context['prestations'] = utils.regroup_prestations(
context['invoice']['prestations_set']
)
# FIXME to be removed
if 'emailform' not in context and 'paiement' in self.request.session:
paiement = models.TipiPaiement.objects.get(
pk=self.request.session['paiement'],
)
data = {
'numcli': paiement.numcli,
'exer': datetime.today().year,
'refdet': paiement.refdet,
'objet': paiement.objet,
'montant': paiement.amount*100,
'mel': paiement.email,
'saisie': paiement.saisie,
'numauto': '420042',
'dattrans': '01062018',
'heurtrans': '1142',
}
context['paid_form'] = forms.PaidInvoiceForm(
{**data, **{'resultrans': 'P'}}
)
context['unpaid_form'] = forms.PaidInvoiceForm(
{**data, **{'resultrans': 'R'}}
)
return context
def get(self, request, *args, **kwargs):
@ -219,29 +194,6 @@ class PrepareMergedInvoices(PrepareInvoice):
context['prestations'] = utils.regroup_prestations(
context['invoice']['prestations_set']
)
# FIXME to be removed
paiement = models.TipiPaiement.objects.get(
pk=self.request.session['paiement'],
)
data = {
'numcli': paiement.numcli,
'exer': datetime.today().year,
'refdet': paiement.refdet,
'objet': paiement.objet,
'montant': paiement.amount*100,
'mel': paiement.email,
'saisie': paiement.saisie,
'numauto': '420042',
'dattrans': '01062018',
'heurtrans': '1142',
}
context['paid_form'] = forms.PaidInvoiceForm(
{**data, **{'resultrans': 'P'}}
)
context['unpaid_form'] = forms.PaidInvoiceForm(
{**data, **{'resultrans': 'R'}}
)
return context
@ -343,26 +295,3 @@ class RegisterPaiement(generic.edit.FormView):
"l'assistance."
)
return super().form_valid(form)
# FIXME: to be removed
class UnpayInvoice(generic.RedirectView):
url = reverse_lazy('prepare_invoice')
http_method_names = ['get']
def get(self, request, *args, **kwargs):
if not settings.DEBUG:
raise Http404
if 'merged_invoices' in request.session:
invoice_nums = request.session.get('merged_invoices')['numeros']
self.url = reverse_lazy('prepare_merged_invoices')
else:
invoice_nums = [request.session.get('invoice')['numero']]
for n in invoice_nums:
resthys.put('unpay/{}'.format(n))
messages.success(
self.request,
"Paiement reverté pour la facture n° {}".format(n),
)
return super().get(request, *args, **kwargs)

Voir le fichier

@ -182,18 +182,6 @@ Période du
</div>
</div>
</footer>
<form id="payment_ok" method="post" action="{% url "paid_invoice" %}">{% csrf_token %}
<div style="display:none">{{ paid_form.as_p }}</div>
<input type="submit" class="btn btn-success" value="Paiement réussi"/>
</form>
<form id="payment_ko" method="post" action="{% url "paid_invoice" %}">{% csrf_token %}
<div style="display:none">{{ unpaid_form.as_p }}</div>
<input type="submit" class="btn btn-danger" value="Paiement échoué"/>
</form>
<p>
<a class="btn btn-warning" href="{% url "unpay_invoice" %}">Reverter le paiement</a>
</p>
</main>
{% if not invoice.compte_payeur.email %}
<div id="get_email" class="modal" tabindex="-1" role="dialog">