Add tests for the new functionality.

- Cover the InstanceReaderMixin and InstanceWriterMixin classes
- New tests to make sure that UpdateModelMixin can write models with many-to-many data
This commit is contained in:
Mjumbe Wawatu Poe 2012-08-25 19:36:55 -04:00
parent 8f4590e834
commit b685a22f2c

View File

@ -4,7 +4,8 @@ from django.utils import simplejson as json
from djangorestframework import status
from djangorestframework.compat import RequestFactory
from django.contrib.auth.models import Group, User
from djangorestframework.mixins import CreateModelMixin, PaginatorMixin, ReadModelMixin
from djangorestframework.mixins import (CreateModelMixin, PaginatorMixin,
ReadModelMixin, UpdateModelMixin)
from djangorestframework.resources import ModelResource
from djangorestframework.response import Response, ErrorResponse
from djangorestframework.tests.models import CustomUser
@ -71,6 +72,10 @@ class TestModelCreation(TestModelsTestCase):
mixin.resource = GroupResource
mixin.CONTENT = form_data
mixin.request = request
mixin.args = ()
mixin.kwargs = {}
response = mixin.post(request)
self.assertEquals(1, Group.objects.count())
self.assertEquals('foo', response.cleaned_content.name)
@ -97,6 +102,10 @@ class TestModelCreation(TestModelsTestCase):
mixin.resource = UserResource
mixin.CONTENT = cleaned_data
mixin.request = request
mixin.args = ()
mixin.kwargs = {}
response = mixin.post(request)
self.assertEquals(1, User.objects.count())
self.assertEquals(1, response.cleaned_content.groups.count())
@ -120,6 +129,10 @@ class TestModelCreation(TestModelsTestCase):
mixin.resource = UserResource
mixin.CONTENT = cleaned_data
mixin.request = request
mixin.args = ()
mixin.kwargs = {}
response = mixin.post(request)
self.assertEquals(1, CustomUser.objects.count())
self.assertEquals(0, response.cleaned_content.groups.count())
@ -135,6 +148,10 @@ class TestModelCreation(TestModelsTestCase):
mixin.resource = UserResource
mixin.CONTENT = cleaned_data
mixin.request = request
mixin.args = ()
mixin.kwargs = {}
response = mixin.post(request)
self.assertEquals(2, CustomUser.objects.count())
self.assertEquals(1, response.cleaned_content.groups.count())
@ -151,6 +168,10 @@ class TestModelCreation(TestModelsTestCase):
mixin.resource = UserResource
mixin.CONTENT = cleaned_data
mixin.request = request
mixin.args = ()
mixin.kwargs = {}
response = mixin.post(request)
self.assertEquals(3, CustomUser.objects.count())
self.assertEquals(2, response.cleaned_content.groups.count())
@ -158,6 +179,160 @@ class TestModelCreation(TestModelsTestCase):
self.assertEquals('foo2', response.cleaned_content.groups.all()[1].name)
class TestModelUpdate(TestModelsTestCase):
"""Tests on UpdateModelMixin"""
def setUp(self):
super(TestModelsTestCase, self).setUp()
self.req = RequestFactory()
def test_update(self):
group = Group.objects.create(name='my group')
self.assertEquals(1, Group.objects.count())
class GroupResource(ModelResource):
model = Group
# Update existing
form_data = {'name': 'my renamed group'}
request = self.req.put('/groups/' + str(group.pk), data=form_data)
mixin = UpdateModelMixin()
mixin.resource = GroupResource
mixin.CONTENT = form_data
mixin.request = request
mixin.args = ()
mixin.kwargs = {'pk': group.pk}
response = mixin.put(request, **mixin.kwargs)
self.assertEquals(1, Group.objects.count())
self.assertEquals('my renamed group', response.name)
# Create new
form_data = {'name': 'other group'}
request = self.req.put('/groups/' + str(group.pk + 1), data=form_data)
mixin = UpdateModelMixin()
mixin.resource = GroupResource
mixin.CONTENT = form_data
mixin.request = request
mixin.args = ()
mixin.kwargs = {'pk': group.pk + 1}
response = mixin.put(request, **mixin.kwargs)
self.assertEquals(2, Group.objects.count())
self.assertEquals('other group', response.cleaned_content.name)
self.assertEquals(201, response.status)
def test_update_with_m2m_relation(self):
class UserResource(ModelResource):
model = User
def url(self, instance):
return "/users/%i" % instance.id
group = Group(name='foo')
group.save()
user = User.objects.create_user(username='bar', password='blah')
self.assertEquals(1, User.objects.count())
self.assertEquals(0, user.groups.count())
form_data = {
'password': 'baz',
'groups': [group.id]
}
request = self.req.post('/users/' + str(user.pk), data=form_data)
cleaned_data = dict(form_data)
cleaned_data['groups'] = [group]
mixin = UpdateModelMixin()
mixin.resource = UserResource
mixin.CONTENT = cleaned_data
mixin.request = request
mixin.args = ()
mixin.kwargs = {'pk': user.pk}
response = mixin.put(request, **mixin.kwargs)
self.assertEquals(1, User.objects.count())
self.assertEquals(1, response.groups.count())
self.assertEquals('foo', response.groups.all()[0].name)
self.assertEquals('bar', response.username)
def test_update_with_m2m_relation_through(self):
"""
Tests updating where the m2m relation uses a through table
"""
class UserResource(ModelResource):
model = CustomUser
def url(self, instance):
return "/customusers/%i" % instance.id
user = CustomUser.objects.create(username='bar')
# Update existing resource with empty relation
form_data = {'username': 'bar0', 'groups': []}
request = self.req.put('/users/' + str(user.pk), data=form_data)
cleaned_data = dict(form_data)
cleaned_data['groups'] = []
mixin = UpdateModelMixin()
mixin.resource = UserResource
mixin.CONTENT = cleaned_data
mixin.request = request
mixin.args = ()
mixin.kwargs = {'pk': user.pk}
response = mixin.put(request, **mixin.kwargs)
self.assertEquals(1, CustomUser.objects.count())
self.assertEquals(0, response.groups.count())
# Update existing resource with one relation
group = Group(name='foo1')
group.save()
form_data = {'username': 'bar1', 'groups': [group.id]}
request = self.req.put('/users/' + str(user.pk), data=form_data)
cleaned_data = dict(form_data)
cleaned_data['groups'] = [group]
mixin = UpdateModelMixin()
mixin.resource = UserResource
mixin.CONTENT = cleaned_data
mixin.request = request
mixin.args = ()
mixin.kwargs = {'pk': user.pk}
response = mixin.put(request, **mixin.kwargs)
self.assertEquals(1, CustomUser.objects.count())
self.assertEquals(1, response.groups.count())
self.assertEquals('foo1', response.groups.all()[0].name)
# Update existing resource with more than one relation
group2 = Group(name='foo2')
group2.save()
form_data = {'username': 'bar2', 'groups': [group.id, group2.id]}
request = self.req.put('/users/' + str(user.pk), data=form_data)
cleaned_data = dict(form_data)
cleaned_data['groups'] = [group, group2]
mixin = UpdateModelMixin()
mixin.resource = UserResource
mixin.CONTENT = cleaned_data
mixin.request = request
mixin.args = ()
mixin.kwargs = {'pk': user.pk}
response = mixin.put(request, **mixin.kwargs)
self.assertEquals(1, CustomUser.objects.count())
self.assertEquals(2, response.groups.count())
self.assertEquals('foo1', response.groups.all()[0].name)
self.assertEquals('foo2', response.groups.all()[1].name)
class MockPaginatorView(PaginatorMixin, View):
total = 60