From dc781caaad417f32638c3af1f7a2250e5b17d695 Mon Sep 17 00:00:00 2001 From: Tsanda Artyom Date: Wed, 24 Mar 2021 21:38:31 +0300 Subject: [PATCH] (bug) order complete twice --- candy_shop/apps/delivery/serializers.py | 3 +- candy_shop/apps/delivery/services.py | 3 ++ .../delivery/tests/test_orders_complete.py | 28 +++++++++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/candy_shop/apps/delivery/serializers.py b/candy_shop/apps/delivery/serializers.py index ec28d35..52e96e7 100644 --- a/candy_shop/apps/delivery/serializers.py +++ b/candy_shop/apps/delivery/serializers.py @@ -147,7 +147,8 @@ class CompleteOrderSerializer(serializers.Serializer): order_id = serializers.PrimaryKeyRelatedField(queryset=Order.objects.all()) def validate_order_id(self, value): - if value.status != Order.OrderStatus.ASSIGNED: + if not (value.status in [Order.OrderStatus.ASSIGNED, + Order.OrderStatus.COMPLETE]): raise serializers.ValidationError("Order has invalid status") return value diff --git a/candy_shop/apps/delivery/services.py b/candy_shop/apps/delivery/services.py index 789d78a..3393d98 100644 --- a/candy_shop/apps/delivery/services.py +++ b/candy_shop/apps/delivery/services.py @@ -44,6 +44,9 @@ def assign_orders(courier): def complete_order(courier: Courier, order: Order): + if order.status == Order.OrderStatus.COMPLETE: + return order + order.status = Order.OrderStatus.COMPLETE order.complete_time = timezone.now() diff --git a/candy_shop/apps/delivery/tests/test_orders_complete.py b/candy_shop/apps/delivery/tests/test_orders_complete.py index f32a91c..27bf812 100644 --- a/candy_shop/apps/delivery/tests/test_orders_complete.py +++ b/candy_shop/apps/delivery/tests/test_orders_complete.py @@ -1,6 +1,7 @@ import pytest import json from rest_framework import status +from candy_shop.apps.delivery.models import Order @pytest.fixture @@ -77,3 +78,30 @@ def test_invalid_complete(simple_setup, client): json.dumps(complete), content_type="application/json") assert response.status_code == status.HTTP_400_BAD_REQUEST + + +@pytest.mark.django_db +@pytest.mark.integration +def test_complete_twice(simple_setup, client): + complete = { + "courier_id": 1, + "order_id": 1, + } + response = client.post( + '/orders/complete', + json.dumps(complete), + content_type="application/json") + assert response.status_code == status.HTTP_200_OK + assert response.data['order_id'] == 1 + + complete_time = Order.objects.get(pk=1).complete_time + + response = client.post( + '/orders/complete', + json.dumps(complete), + content_type="application/json") + assert response.status_code == status.HTTP_200_OK + assert response.data['order_id'] == 1 + + assert Order.objects.get(pk=1).complete_time == complete_time +