mardi 28 juillet 2015

Test Cases For PUT in DJANGO REST and mongoengine

I am using DJango 1.8.3 and mongo as database using mongoengine for developing rest based API.

My models.py file is

class Client(Document):
    client_name = StringField(max_length=50)
    client_email = EmailField()
    city = StringField(max_length=50)
    country = StringField(max_length=200, verbose_name="Country") 

Serializers.py class ClientSerializer(DocumentSerializer):

    class Meta:
        model = Client
        depth = 1

views.py

class ClientDetails(generics.RetrieveUpdateDestroyAPIView):
    serializer_class = ClientSerializer
    queryset = Client.objects.all()

class ClientList(generics.ListCreateAPIView):
    serializer_class = ClientSerializer
    queryset = Client.objects.all()

urls.py

urlpatterns = [
url(r'^client/$', views.ClientList.as_view(), name='client'),
url(r'^client/(?P<id>[\w]{24})/$', views.ClientDetails.as_view(),
    name='client_details'),
]

test.py

def test_get_client(self):
    """
    Ensure we get existing clients from mongo database.
    """
    url = '/client_management/client/'
    factory = APIRequestFactory()
    user = User.objects.get(username='jacob')
    view = views.ClientList.as_view()

    # Make an authenticated request to the view...
    request = factory.get(url)
    force_authenticate(request, user=user)
    response = view(request)
    self.assertEqual(response.status_code, 200)

def test_delete_client(self):
    """
    Ensure we can delete new clients in mongo database.
    """
    url = '/client_management/client/'
    data = {'client_name'='XX'}
    factory = APIRequestFactory()
    user = User.objects.get(username='jacob')
    view = views.ClientList.as_view()

    # Make an authenticated request to the view...
    request = factory.post(url, data=data,)
    force_authenticate(request, user=user)
    response = view(request)
    ##self.assertEqual(response.status_code, status.HTTP_201_CREATED)

    g_id = response.data['id']
    urls = '/client_management/client/?id=' + g_id
    ## even tried
    ## urls = '/client_management/client/ + g_id + /
    data['id'] = g_id
    #data['client_name'] = 'MAA'
    view = views.ClientDetails.as_view()
    request = factory.delete(urls)
    ## tried this also
    ## request = factory.delete('/client_management/client/', id=g_id)
    print request
    force_authenticate(request, user=user)
    response = view(request)
    self.assertEqual(response.status_code, 201)

which is working as expected. GET AND POST test cases are working fine

When I am writing Test cases for PUT, DELETE

I am getting the error

Expected view ClientDetails to be called with a URL keyword argument named "id".
Fix your URL conf, or set the `.lookup_field` attribute on the view correctly

From Error It is clear it is expecting ID I tried passing client ID in url also as a seprate parameter in request.

But error is still same, don't know how to pass id in this case any help is appreciated.

Advance thanks for help

Aucun commentaire:

Enregistrer un commentaire