mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-02-26 16:30:41 +03:00
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:
parent
8f4590e834
commit
b685a22f2c
|
@ -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
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user