diff --git a/la_chariotte/order/models.py b/la_chariotte/order/models.py index a2e30b3..b6f446d 100644 --- a/la_chariotte/order/models.py +++ b/la_chariotte/order/models.py @@ -1,4 +1,5 @@ from django.contrib.auth.models import User +from django.core.exceptions import ValidationError from django.db import models from django.urls import reverse from django.utils import timezone @@ -25,6 +26,16 @@ class GroupedOrder(models.Model): def get_absolute_url(self): return reverse("order:manage_items", kwargs={"pk": self.pk}) + def clean_fields(self, exclude=None): + super().clean_fields(exclude=exclude) + if self.delivery_date < timezone.now().date(): + raise ValidationError("La date de livraison ne doit pas être dans le passé") + + if self.delivery_date < self.deadline.date(): + raise ValidationError( + "La date limite de commande doit être avant la date de livraison" + ) + def __str__(self): # pragma: no cover return ( self.name diff --git a/la_chariotte/order/tests/test_models.py b/la_chariotte/order/tests/test_models.py index ed8612f..47ef195 100644 --- a/la_chariotte/order/tests/test_models.py +++ b/la_chariotte/order/tests/test_models.py @@ -1,11 +1,12 @@ import datetime +from django.urls import reverse from django.utils import timezone from la_chariotte.order.models import GroupedOrder -class TestGroupedOrdersModel: +class TestGroupedOrderModel: """Tests for Grouped orders model""" def test_is_ongoing_with_ongoing_grouped_order(self): @@ -49,3 +50,63 @@ class TestGroupedOrdersModel: del_date = timezone.now().date() + datetime.timedelta(days=1) old_gr_order = GroupedOrder(deadline=deadline, delivery_date=del_date) assert old_gr_order.is_to_be_delivered() + + def test_deadline_after_delivery_date(self, client_log): + """If the deadline is set after the delivery date, an validation error is raised""" + assert GroupedOrder.objects.count() == 0 + create_gorder_url = reverse("order:create_grouped_order") + response = client_log.get(create_gorder_url) + assert response.status_code == 200 + date = timezone.now().date() + datetime.timedelta(days=22) + deadline = timezone.now() + datetime.timedelta(days=32) + response = client_log.post( + create_gorder_url, + {"name": "titre test", "deadline": deadline, "delivery_date": date}, + ) + assert response.status_code == 200 + assert not response.context.get("form").is_valid() + "La date limite de commande doit être avant la date de livraison" in response.content.decode() + assert ( + response.context.get("form").errors["__all__"][0] + == "La date limite de commande doit être avant la date de livraison" + ) + assert GroupedOrder.objects.count() == 0 + + def test_deadline_same_day_as_delivery_date(self, client_log): + """If the deadline is set the seame day as delivery date, no validation error is raised""" + assert GroupedOrder.objects.count() == 0 + create_gorder_url = reverse("order:create_grouped_order") + response = client_log.get(create_gorder_url) + assert response.status_code == 200 + date = timezone.now().date() + datetime.timedelta(days=32) + deadline = timezone.now() + datetime.timedelta(days=32) + response = client_log.post( + create_gorder_url, + {"name": "titre test", "deadline": deadline, "delivery_date": date}, + ) + assert response.status_code == 302 + assert GroupedOrder.objects.count() == 1 + + def test_delivery_date_in_past(self, client_log): + """If the delivery date is set into the past, a validation error is raised""" + assert GroupedOrder.objects.count() == 0 + create_gorder_url = reverse("order:create_grouped_order") + response = client_log.get(create_gorder_url) + assert response.status_code == 200 + date = timezone.now().date() - datetime.timedelta(days=1) + deadline = timezone.now() - datetime.timedelta(days=3) + response = client_log.post( + create_gorder_url, + {"name": "titre test", "deadline": deadline, "delivery_date": date}, + ) + assert response.status_code == 200 + assert not response.context.get("form").is_valid() + assert ( + response.context.get("form").errors["__all__"][0] + == "La date de livraison ne doit pas être dans le passé" + ) + "La date de livraison ne doit pas être dans le passé" in response.content.decode() + assert GroupedOrder.objects.count() == 0 + + def test_delivery_date_and_name_unique_together(self): + pass \ No newline at end of file