From e3b9dbf88c3bd452c76c1b9eeacac12576bca11f Mon Sep 17 00:00:00 2001 From: Omid Hashemzadeh Date: Sun, 18 May 2025 15:44:35 +0100 Subject: [PATCH] Add some filter_backends to ModelViewset --- tasks/serializers.py | 9 +++++++++ tasks/tests/test_api.py | 37 ++++++++++++++++++++++++------------- tasks/views.py | 5 +++++ 3 files changed, 38 insertions(+), 13 deletions(-) diff --git a/tasks/serializers.py b/tasks/serializers.py index c1cc659..e7e7ebe 100644 --- a/tasks/serializers.py +++ b/tasks/serializers.py @@ -6,3 +6,12 @@ class TaskSerializer(serializers.ModelSerializer): class Meta: model = Task fields = "__all__" + + def validate_title(self, value): + if not value.strip(): + raise serializers.ValidationError("Title cannot be empty.") + return value + + def create(self, validated_data): + task = Task.objects.create(**validated_data) + return task \ No newline at end of file diff --git a/tasks/tests/test_api.py b/tasks/tests/test_api.py index 5e1f07b..b663b10 100644 --- a/tasks/tests/test_api.py +++ b/tasks/tests/test_api.py @@ -1,20 +1,31 @@ +from datetime import date import pytest -from rest_framework.test import APIClient from django.urls import reverse -from datetime import date +from rest_framework.test import APIClient +from tasks.models import Task +@pytest.fixture +def api_client(): + return APIClient() @pytest.mark.django_db -def test_create_task_api(): - client = APIClient() - url = reverse("task-list") # Adjust if you use a different route name - response = client.post( - url, - { - "title": "API Task", +def test_create_task(api_client): + url = reverse("task-list") # If you're using a DRF viewset with basename "task" + data = { + "title": "Test Task", "due_date": date.today(), - }, - format="json", - ) + } + + response = api_client.post(url, data, format="json") assert response.status_code == 201 - assert response.data["title"] == "API Task" + assert Task.objects.count() == 1 + assert Task.objects.first().title == "Test Task" + +@pytest.mark.django_db +def test_get_tasks(api_client): + Task.objects.create(title="Task 1", due_date= date.today()) + Task.objects.create(title="Task 2", due_date= date.today()) + url = reverse("task-list") + response = api_client.get(url) + assert response.status_code == 200 + assert len(response.data) == 2 diff --git a/tasks/views.py b/tasks/views.py index d17de23..a6f1642 100644 --- a/tasks/views.py +++ b/tasks/views.py @@ -1,4 +1,6 @@ from rest_framework import viewsets +from rest_framework import filters + from tasks.models import Task from tasks.serializers import TaskSerializer @@ -12,3 +14,6 @@ def home_view(request): class TaskViewSet(viewsets.ModelViewSet): queryset = Task.objects.all().order_by("-created_at") serializer_class = TaskSerializer + + filter_backends = [filters.SearchFilter] + search_fields = ["title"] \ No newline at end of file