diff options
| author | Tom Christie | 2012-10-29 09:11:32 -0700 | 
|---|---|---|
| committer | Tom Christie | 2012-10-29 09:11:32 -0700 | 
| commit | 6b6f0e682b540d6c1d4114864a33205f5fa87e72 (patch) | |
| tree | a713ebbe4e31aef7573aef00f4afa56ef4c95cd1 /rest_framework/tests | |
| parent | ee8ab283f091b73e284c74a11882f910a04eb2de (diff) | |
| parent | 1a16289edeea73253826916ca230af2bf30ba39f (diff) | |
| download | django-rest-framework-6b6f0e682b540d6c1d4114864a33205f5fa87e72.tar.bz2 | |
Merge pull request #331 from markotibold/test_put_as_create
Test put as create
Diffstat (limited to 'rest_framework/tests')
| -rw-r--r-- | rest_framework/tests/generics.py | 40 | ||||
| -rw-r--r-- | rest_framework/tests/models.py | 5 | 
2 files changed, 43 insertions, 2 deletions
diff --git a/rest_framework/tests/generics.py b/rest_framework/tests/generics.py index f4263478..a0a4109d 100644 --- a/rest_framework/tests/generics.py +++ b/rest_framework/tests/generics.py @@ -2,7 +2,7 @@ from django.test import TestCase  from django.test.client import RequestFactory  from django.utils import simplejson as json  from rest_framework import generics, serializers, status -from rest_framework.tests.models import BasicModel, Comment +from rest_framework.tests.models import BasicModel, Comment, SlugBasedModel  factory = RequestFactory() @@ -22,6 +22,13 @@ class InstanceView(generics.RetrieveUpdateDestroyAPIView):      model = BasicModel +class SlugBasedInstanceView(InstanceView): +    """ +    A model with a slug-field. +    """ +    model = SlugBasedModel + +  class TestRootView(TestCase):      def setUp(self):          """ @@ -129,6 +136,7 @@ class TestInstanceView(TestCase):              for obj in self.objects.all()          ]          self.view = InstanceView.as_view() +        self.slug_based_view = SlugBasedInstanceView.as_view()      def test_get_instance_view(self):          """ @@ -198,7 +206,7 @@ class TestInstanceView(TestCase):      def test_put_cannot_set_id(self):          """ -        POST requests to create a new object should not be able to set the id. +        PUT requests to create a new object should not be able to set the id.          """          content = {'id': 999, 'text': 'foobar'}          request = factory.put('/1', json.dumps(content), @@ -224,6 +232,34 @@ class TestInstanceView(TestCase):          updated = self.objects.get(id=1)          self.assertEquals(updated.text, 'foobar') +    def test_put_as_create_on_id_based_url(self): +        """ +        PUT requests to RetrieveUpdateDestroyAPIView should create an object +        at the requested url if it doesn't exist. +        """ +        content = {'text': 'foobar'} +        # pk fields can not be created on demand, only the database can set th pk for a new object +        request = factory.put('/5', json.dumps(content), +                              content_type='application/json') +        response = self.view(request, pk=5).render() +        self.assertEquals(response.status_code, status.HTTP_201_CREATED) +        new_obj = self.objects.get(pk=5) +        self.assertEquals(new_obj.text, 'foobar') + +    def test_put_as_create_on_slug_based_url(self): +        """ +        PUT requests to RetrieveUpdateDestroyAPIView should create an object +        at the requested url if possible, else return HTTP_403_FORBIDDEN error-response. +        """ +        content = {'text': 'foobar'} +        request = factory.put('/test_slug', json.dumps(content), +                              content_type='application/json') +        response = self.slug_based_view(request, pk='test_slug').render() +        self.assertEquals(response.status_code, status.HTTP_201_CREATED) +        self.assertEquals(response.data, {'slug': 'test_slug', 'text': 'foobar'}) +        new_obj = self.objects.get(slug='test_slug') +        self.assertEquals(new_obj.text, 'foobar') +  # Regression test for #285 diff --git a/rest_framework/tests/models.py b/rest_framework/tests/models.py index d4ea729b..ac73a4bb 100644 --- a/rest_framework/tests/models.py +++ b/rest_framework/tests/models.py @@ -52,6 +52,11 @@ class BasicModel(RESTFrameworkModel):      text = models.CharField(max_length=100) +class SlugBasedModel(RESTFrameworkModel): +    text = models.CharField(max_length=100) +    slug = models.SlugField(max_length=32) + +  class DefaultValueModel(RESTFrameworkModel):      text = models.CharField(default='foobar', max_length=100)  | 
