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.