diff --git a/src/apps/api/serializers.py b/src/apps/api/serializers.py index 023fbb8..4c7036e 100644 --- a/src/apps/api/serializers.py +++ b/src/apps/api/serializers.py @@ -5,6 +5,14 @@ from apps.lyric.models import User class ItemSerializer(serializers.ModelSerializer): + text = serializers.CharField() + + def validate_text(self, value): + list_ = self.context["list"] + if list_.item_set.filter(text=value).exists(): + raise serializers.ValidationError("duplicate") + return value + class Meta: model = Item fields = ["id", "text"] diff --git a/src/apps/api/tests/integrated/test_views.py b/src/apps/api/tests/integrated/test_views.py index 9a6d2e6..76b30d9 100644 --- a/src/apps/api/tests/integrated/test_views.py +++ b/src/apps/api/tests/integrated/test_views.py @@ -24,7 +24,6 @@ class ListDetailAPITest(BaseAPITest): self.assertEqual(len(response.data["items"]), 2) class ListItemsAPITest(BaseAPITest): - def test_can_add_item_to_list(self): list_ = List.objects.create(owner=self.user) @@ -37,6 +36,28 @@ class ListItemsAPITest(BaseAPITest): self.assertEqual(Item.objects.count(), 1) self.assertEqual(Item.objects.first().text, "a new item") + def test_cannot_add_empty_item_to_list(self): + list_ = List.objects.create(owner=self.user) + + response = self.client.post( + f"/api/lists/{list_.id}/items/", + {"text": ""}, + ) + + self.assertEqual(response.status_code, 400) + self.assertEqual(Item.objects.count(), 0) + + def test_cannot_add_duplicate_item_to_list(self): + list_ = List.objects.create(owner=self.user) + Item.objects.create(text="list item", list=list_) + duplicate_response = self.client.post( + f"/api/lists/{list_.id}/items/", + {"text": "list item"}, + ) + + self.assertEqual(duplicate_response.status_code, 400) + self.assertEqual(Item.objects.count(), 1) + class ListsAPITest(BaseAPITest): def test_get_returns_only_users_lists(self): list1 = List.objects.create(owner=self.user) diff --git a/src/apps/api/views.py b/src/apps/api/views.py index ee0defa..95d7ff8 100644 --- a/src/apps/api/views.py +++ b/src/apps/api/views.py @@ -16,7 +16,7 @@ class ListDetailAPI(APIView): class ListItemsAPI(APIView): def post(self, request, list_id): list_ = get_object_or_404(List, id=list_id) - serializer = ItemSerializer(data=request.data) + serializer = ItemSerializer(data=request.data, context={"list": list_}) if serializer.is_valid(): serializer.save(list=list_) return Response(serializer.data, status=201)