diff --git a/la_chariotte/order/tests/test_views.py b/la_chariotte/order/tests/test_views.py index fb0a01f..1940b19 100644 --- a/la_chariotte/order/tests/test_views.py +++ b/la_chariotte/order/tests/test_views.py @@ -542,6 +542,77 @@ class TestGroupedOrderDetailView: == "Trop de test item 1 commandés pour la quantité disponible" ) + def test_order_item_no_ordered_item_created_for_empty_order( + self, client, other_user + ): + """ + when a user does not order all items, those that are not ordered don't have a related OrderedItem + """ + grouped_order = create_grouped_order( + days_before_delivery_date=5, + days_before_deadline=2, + name="gr order test", + orga_user=other_user, + ) + item = models.Item.objects.create( + name="test item 1", grouped_order=grouped_order, price=1, max_limit=20 + ) + item2 = models.Item.objects.create( + name="test item 2", grouped_order=grouped_order, price=5 + ) + detail_url = reverse( + "order:grouped_order_detail", + kwargs={ + "pk": grouped_order.pk, + }, + ) + response = client.get(detail_url) + assert response.status_code == 200 + assert "test item" in response.content.decode() + assert "gr order test" in response.content.decode() + assert "20 disponibles" in response.content.decode() + assert item.ordered_nb == 0 + assert item2.ordered_nb == 0 + order_url = reverse( + "order:order", + kwargs={ + "grouped_order_id": grouped_order.pk, + }, + ) + response = client.post( + order_url, + { + f"quantity_{item.pk}": 4, + f"quantity_{item2.pk}": 0, + "first_name": "Prénom", + "last_name": "Nom", + "phone": "0645632569", + "email": "test@mail.fr", + }, + ) + assert response.status_code == 302 + order = models.Order.objects.get(grouped_order=grouped_order.pk) + assert response.url == reverse( + "order:order_confirm", + kwargs={ + "grouped_order_id": grouped_order.pk, + "pk": order.pk, + }, + ) + item.refresh_from_db() + item2.refresh_from_db() + assert models.OrderAuthor.objects.first().first_name == "Prénom" + assert models.OrderAuthor.objects.first().email == "test@mail.fr" + assert models.OrderAuthor.objects.first().phone == "0645632569" + assert item.ordered_nb == 4 + assert item2.ordered_nb == 0 + order = models.Order.objects.first() + assert order.ordered_items.count() == 1 + assert models.OrderedItem.objects.filter(item=item2.pk).count() == 0 + assert order.articles_nb == 4 + assert order.price == 4 + assert item.get_remaining_nb() == 16 + class TestGroupedOrderOverview: def test_get_overview(self, client_log): diff --git a/la_chariotte/order/views.py b/la_chariotte/order/views.py index 1fa091b..51c60a2 100644 --- a/la_chariotte/order/views.py +++ b/la_chariotte/order/views.py @@ -197,7 +197,8 @@ def order(request, grouped_order_id): error_message = validate_item_ordered_nb(item, quantity) if error_message: break # stop creating items if there is an error - OrderedItem.objects.create(nb=quantity, order=order, item=item) + if quantity > 0: + OrderedItem.objects.create(nb=quantity, order=order, item=item) # Redisplay the form with error messages if there is an error if error_message: