my testcases are failing in django for PUT and DELTE methods

Viewed 46

i have build a basic crud api with django_rest_framework.when i write test cases for GET and POST it works fine ,But when i write test for PUT and Delete it gives me error.

tests.py

import json
from django.urls import reverse
from rest_framework.test import APITestCase
from rest_framework import status
from .models import Customer
from .serializers import CustomerSerializer


class PostCustomerTest(APITestCase):

    def test_post(self):
        data = {
            "name": "john",
            "address": "address",
            "phoneNumber": "2645662",
            "gstin": "26456",
            "outstandingbalance": 2356.26 }
        
        response = self.client.post("/api/",data)
        self.assertEqual(response.status_code,status.HTTP_201_CREATED)

    def test_get(self):
        response = self.client.get('/api',{},True)
        self.assertEquals(response.status_code,status.HTTP_200_OK)

    def test_put(self):
        data = {
            "name": "test",
            "address": "address",
            "phoneNumber": "2645662",
            "gstin": "26456",
            "outstandingbalance": .36
            }

        response = self.client.put("/api/1/",data)
        serializer = CustomerSerializer(data)
        print(response.status_code)
        # self.assertEquals(response.data,serializer.data)
        self.assertEqual(response.status_code,status.HTTP_200_OK)
    
    def test_delete(self):
        response = self.client.delete("api/1/")

        self.assertEquals(response.status_code,status.HTTP_200_OK)

views.py

class CustomerView(APIView):

    def get_object(self, pk):
        try:
            return Customer.objects.get(pk=pk)
        except Customer.DoesNotExist:
            raise Http404

    def get(self,request,format=None):
        cus = Customer.objects.all()
        serializer = CustomerSerializer(cus,many=True)

        return Response(serializer.data,status=status.HTTP_200_OK)

    def post(self,request,format=None):

        serializer = CustomerSerializer(data=request.data)

        if serializer.is_valid():
            serializer.save()
            print("after Save")
            return Response({
                'Status':True,
                'Message':"Customer Added Successfully",
            },status=status.HTTP_201_CREATED)
        
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)

    def put(self, request, pk, format=None):
        customer = self.get_object(pk)
        serializer = CustomerSerializer(customer, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data,status=status.HTTP_200_OK)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

    def delete(self, request, pk, format=None):
        customer = self.get_object(pk)
        customer.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)

models.py

class Customer(models.Model):
    name = models.CharField(max_length=50)
    address = models.CharField(max_length=50)
    phoneNumber = models.CharField(max_length=50)
    gstin = models.CharField(max_length=50)
    outstandingbalance = models.FloatField()

    def __str__(self):
        return self.name

serializers.py

from rest_framework import serializers
from .models import *

class CustomerSerializer(serializers.ModelSerializer):
    
    class Meta:
        model = Customer
        fields = '__all__'

urls.py

from django.urls import path
from . import views

from rest_framework.urlpatterns import format_suffix_patterns


urlpatterns = [
    path('',views.CustomerView.as_view(),name='customer_get_post'),
    path('<int:pk>/',views.CustomerView.as_view(),name='customer_put_delete')
]

urlpatterns = format_suffix_patterns(urlpatterns)

project/urls.py

path('api/',include('api.urls'))

The Error i'm getting was

AssertionError: 404 != 200

why 404 occurs , the Object will be created in POST test case ,right..? i'm new to testcases ,If anybody can help me it would be great.

1 Answers

You should not make assumptions about in what order the tests run, nor will the primary key per se be one. Normally one uses the setUpTestData method to create data at the database side, so:

class PostCustomerTest(APITestCase):

    @classmethod
    def setUpTestData(cls):
        cls.item1 = Customer.objects.create(
            name='test1'
            address ='test2'
            phoneNumber='0123456789'
            gstin='test3'
            outstandingbalance=13.02
        )
        cls.item2 = Customer.objects.create(
            name='test4'
            address ='test5'
            phoneNumber='987654321'
            gstin='test6'
            outstandingbalance=14.25
        )

    # …

    def test_put(self):
        data = {
            'name': 'test',
            'address': 'address',
            'phoneNumber': '2645662',
            'gstin': '26456',
            'outstandingbalance': .36
        }
        response = self.client.put(f'/api/{self.item1.pk}/',data)
        serializer = CustomerSerializer(data)
        print(response.status_code)
        self.assertEqual(response.status_code,status.HTTP_200_OK)
    
    def test_delete(self):
        response = self.client.delete(f'api/{self.item2.pk}/')
        self.assertEquals(response.status_code,status.HTTP_200_OK)
Related