From 77d061d234e03004f34058028707ecddfc730fae Mon Sep 17 00:00:00 2001 From: Brandon Cazander Date: Wed, 28 Jan 2015 17:08:34 -0800 Subject: Provide rest_framework.resolve. Fixes #2489 --- tests/test_relations.py | 50 +++++++++++++++++++++++++++++++++++++++++++++++-- tests/urls.py | 4 ++-- 2 files changed, 50 insertions(+), 4 deletions(-) (limited to 'tests') diff --git a/tests/test_relations.py b/tests/test_relations.py index fbe176e2..b82a1f2a 100644 --- a/tests/test_relations.py +++ b/tests/test_relations.py @@ -1,11 +1,28 @@ from .utils import mock_reverse, fail_reverse, BadType, MockObject, MockQueryset -from django.core.exceptions import ImproperlyConfigured +from django.conf.urls import patterns, url, include +from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist from django.utils.datastructures import MultiValueDict from rest_framework import serializers from rest_framework.fields import empty -from rest_framework.test import APISimpleTestCase +from rest_framework.test import APISimpleTestCase, APIRequestFactory +from rest_framework.versioning import NamespaceVersioning import pytest +factory = APIRequestFactory() +request = factory.get('/') # Just to ensure we have a request in the serializer context + +dummy_view = lambda request, pk: None + +included_patterns = [ + url(r'^example/(?P\d+)/$', dummy_view, name='example-detail') +] + +urlpatterns = patterns( + '', + url(r'^v1/', include(included_patterns, namespace='v1')), + url(r'^example/(?P\d+)/$', dummy_view, name='example-detail') +) + class TestStringRelatedField(APISimpleTestCase): def setUp(self): @@ -48,6 +65,35 @@ class TestPrimaryKeyRelatedField(APISimpleTestCase): assert representation == self.instance.pk +class TestHyperlinkedRelatedField(APISimpleTestCase): + urls = 'tests.test_relations' + + def setUp(self): + class HyperlinkedMockQueryset(MockQueryset): + def get(self, **lookup): + for item in self.items: + if item.pk == int(lookup.get('pk', -1)): + return item + raise ObjectDoesNotExist() + + self.queryset = HyperlinkedMockQueryset([ + MockObject(pk=1, name='foo'), + MockObject(pk=2, name='bar'), + MockObject(pk=3, name='baz') + ]) + self.field = serializers.HyperlinkedRelatedField( + view_name='example-detail', + queryset=self.queryset + ) + request = factory.post('/') + request.versioning_scheme = NamespaceVersioning() + self.field._context = {'request': request} + + def test_bug_2489(self): + self.field.to_internal_value('/example/3/') + self.field.to_internal_value('/v1/example/3/') + + class TestHyperlinkedIdentityField(APISimpleTestCase): def setUp(self): self.instance = MockObject(pk=1, name='foo') diff --git a/tests/urls.py b/tests/urls.py index 41f527df..742e361d 100644 --- a/tests/urls.py +++ b/tests/urls.py @@ -1,6 +1,6 @@ """ Blank URLConf just to keep the test suite happy """ -from django.conf.urls import patterns +from tests import test_relations -urlpatterns = patterns('') +urlpatterns = test_relations.urlpatterns -- cgit v1.2.3 From f3067a7fabdd0edb5bc5f48cfdadd2850866c189 Mon Sep 17 00:00:00 2001 From: Brandon Cazander Date: Mon, 2 Feb 2015 20:41:06 -0800 Subject: Remove unnecessary APIRequestFactory get from tests. --- tests/test_relations.py | 1 - 1 file changed, 1 deletion(-) (limited to 'tests') diff --git a/tests/test_relations.py b/tests/test_relations.py index b82a1f2a..ff377d38 100644 --- a/tests/test_relations.py +++ b/tests/test_relations.py @@ -9,7 +9,6 @@ from rest_framework.versioning import NamespaceVersioning import pytest factory = APIRequestFactory() -request = factory.get('/') # Just to ensure we have a request in the serializer context dummy_view = lambda request, pk: None -- cgit v1.2.3 From 030f01afdbcd4018a288250ef1f4c12de28e63bb Mon Sep 17 00:00:00 2001 From: Brandon Cazander Date: Tue, 3 Feb 2015 02:14:38 -0800 Subject: Reorganize tests. --- tests/test_relations.py | 49 ++---------------------------------------------- tests/test_versioning.py | 41 ++++++++++++++++++++++++++++++++++++++-- tests/urls.py | 4 ++-- 3 files changed, 43 insertions(+), 51 deletions(-) (limited to 'tests') diff --git a/tests/test_relations.py b/tests/test_relations.py index ff377d38..fbe176e2 100644 --- a/tests/test_relations.py +++ b/tests/test_relations.py @@ -1,27 +1,11 @@ from .utils import mock_reverse, fail_reverse, BadType, MockObject, MockQueryset -from django.conf.urls import patterns, url, include -from django.core.exceptions import ImproperlyConfigured, ObjectDoesNotExist +from django.core.exceptions import ImproperlyConfigured from django.utils.datastructures import MultiValueDict from rest_framework import serializers from rest_framework.fields import empty -from rest_framework.test import APISimpleTestCase, APIRequestFactory -from rest_framework.versioning import NamespaceVersioning +from rest_framework.test import APISimpleTestCase import pytest -factory = APIRequestFactory() - -dummy_view = lambda request, pk: None - -included_patterns = [ - url(r'^example/(?P\d+)/$', dummy_view, name='example-detail') -] - -urlpatterns = patterns( - '', - url(r'^v1/', include(included_patterns, namespace='v1')), - url(r'^example/(?P\d+)/$', dummy_view, name='example-detail') -) - class TestStringRelatedField(APISimpleTestCase): def setUp(self): @@ -64,35 +48,6 @@ class TestPrimaryKeyRelatedField(APISimpleTestCase): assert representation == self.instance.pk -class TestHyperlinkedRelatedField(APISimpleTestCase): - urls = 'tests.test_relations' - - def setUp(self): - class HyperlinkedMockQueryset(MockQueryset): - def get(self, **lookup): - for item in self.items: - if item.pk == int(lookup.get('pk', -1)): - return item - raise ObjectDoesNotExist() - - self.queryset = HyperlinkedMockQueryset([ - MockObject(pk=1, name='foo'), - MockObject(pk=2, name='bar'), - MockObject(pk=3, name='baz') - ]) - self.field = serializers.HyperlinkedRelatedField( - view_name='example-detail', - queryset=self.queryset - ) - request = factory.post('/') - request.versioning_scheme = NamespaceVersioning() - self.field._context = {'request': request} - - def test_bug_2489(self): - self.field.to_internal_value('/example/3/') - self.field.to_internal_value('/v1/example/3/') - - class TestHyperlinkedIdentityField(APISimpleTestCase): def setUp(self): self.instance = MockObject(pk=1, name='foo') diff --git a/tests/test_versioning.py b/tests/test_versioning.py index c44f727d..e7c8485e 100644 --- a/tests/test_versioning.py +++ b/tests/test_versioning.py @@ -1,9 +1,13 @@ +from .utils import MockObject, MockQueryset from django.conf.urls import include, url +from django.core.exceptions import ObjectDoesNotExist +from rest_framework import serializers from rest_framework import status, versioning from rest_framework.decorators import APIView from rest_framework.response import Response from rest_framework.reverse import reverse -from rest_framework.test import APIRequestFactory, APITestCase +from rest_framework.test import APIRequestFactory, APITestCase, APISimpleTestCase +from rest_framework.versioning import NamespaceVersioning class RequestVersionView(APIView): @@ -29,15 +33,18 @@ class RequestInvalidVersionView(APIView): factory = APIRequestFactory() mock_view = lambda request: None +dummy_view = lambda request, pk: None included_patterns = [ url(r'^namespaced/$', mock_view, name='another'), + url(r'^example/(?P\d+)/$', dummy_view, name='example-detail') ] urlpatterns = [ url(r'^v1/', include(included_patterns, namespace='v1')), url(r'^another/$', mock_view, name='another'), - url(r'^(?P[^/]+)/another/$', mock_view, name='another') + url(r'^(?P[^/]+)/another/$', mock_view, name='another'), + url(r'^example/(?P\d+)/$', dummy_view, name='example-detail') ] @@ -221,3 +228,33 @@ class TestInvalidVersion: request.resolver_match = FakeResolverMatch response = view(request, version='v3') assert response.status_code == status.HTTP_404_NOT_FOUND + + +class TestHyperlinkedRelatedField(APISimpleTestCase): + urls = 'tests.test_versioning' + + def setUp(self): + + class HyperlinkedMockQueryset(MockQueryset): + def get(self, **lookup): + for item in self.items: + if item.pk == int(lookup.get('pk', -1)): + return item + raise ObjectDoesNotExist() + + self.queryset = HyperlinkedMockQueryset([ + MockObject(pk=1, name='foo'), + MockObject(pk=2, name='bar'), + MockObject(pk=3, name='baz') + ]) + self.field = serializers.HyperlinkedRelatedField( + view_name='example-detail', + queryset=self.queryset + ) + request = factory.post('/', urlconf='tests.test_versioning') + request.versioning_scheme = NamespaceVersioning() + self.field._context = {'request': request} + + def test_bug_2489(self): + self.field.to_internal_value('/example/3/') + self.field.to_internal_value('/v1/example/3/') diff --git a/tests/urls.py b/tests/urls.py index 742e361d..41f527df 100644 --- a/tests/urls.py +++ b/tests/urls.py @@ -1,6 +1,6 @@ """ Blank URLConf just to keep the test suite happy """ -from tests import test_relations +from django.conf.urls import patterns -urlpatterns = test_relations.urlpatterns +urlpatterns = patterns('') -- cgit v1.2.3 From e1c45133126e0c47b8470b4cf7a43c6a7f4fca43 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 5 Feb 2015 00:58:09 +0000 Subject: Fix NamespaceVersioning with hyperlinked serializer fields --- tests/test_relations_hyperlink.py | 7 +++--- tests/test_versioning.py | 50 +++++++++++++++++++++++---------------- tests/utils.py | 24 +++++++++++++++++++ 3 files changed, 56 insertions(+), 25 deletions(-) (limited to 'tests') diff --git a/tests/test_relations_hyperlink.py b/tests/test_relations_hyperlink.py index f1b882ed..aede61d2 100644 --- a/tests/test_relations_hyperlink.py +++ b/tests/test_relations_hyperlink.py @@ -1,5 +1,5 @@ from __future__ import unicode_literals -from django.conf.urls import patterns, url +from django.conf.urls import url from django.test import TestCase from rest_framework import serializers from rest_framework.test import APIRequestFactory @@ -14,8 +14,7 @@ request = factory.get('/') # Just to ensure we have a request in the serializer dummy_view = lambda request, pk: None -urlpatterns = patterns( - '', +urlpatterns = [ url(r'^dummyurl/(?P[0-9]+)/$', dummy_view, name='dummy-url'), url(r'^manytomanysource/(?P[0-9]+)/$', dummy_view, name='manytomanysource-detail'), url(r'^manytomanytarget/(?P[0-9]+)/$', dummy_view, name='manytomanytarget-detail'), @@ -24,7 +23,7 @@ urlpatterns = patterns( url(r'^nullableforeignkeysource/(?P[0-9]+)/$', dummy_view, name='nullableforeignkeysource-detail'), url(r'^onetoonetarget/(?P[0-9]+)/$', dummy_view, name='onetoonetarget-detail'), url(r'^nullableonetoonesource/(?P[0-9]+)/$', dummy_view, name='nullableonetoonesource-detail'), -) +] # ManyToMany diff --git a/tests/test_versioning.py b/tests/test_versioning.py index e7c8485e..cdd10065 100644 --- a/tests/test_versioning.py +++ b/tests/test_versioning.py @@ -1,4 +1,4 @@ -from .utils import MockObject, MockQueryset +from .utils import MockObject, MockQueryset, UsingURLPatterns from django.conf.urls import include, url from django.core.exceptions import ObjectDoesNotExist from rest_framework import serializers @@ -6,8 +6,9 @@ from rest_framework import status, versioning from rest_framework.decorators import APIView from rest_framework.response import Response from rest_framework.reverse import reverse -from rest_framework.test import APIRequestFactory, APITestCase, APISimpleTestCase +from rest_framework.test import APIRequestFactory, APITestCase from rest_framework.versioning import NamespaceVersioning +import pytest class RequestVersionView(APIView): @@ -35,18 +36,6 @@ factory = APIRequestFactory() mock_view = lambda request: None dummy_view = lambda request, pk: None -included_patterns = [ - url(r'^namespaced/$', mock_view, name='another'), - url(r'^example/(?P\d+)/$', dummy_view, name='example-detail') -] - -urlpatterns = [ - url(r'^v1/', include(included_patterns, namespace='v1')), - url(r'^another/$', mock_view, name='another'), - url(r'^(?P[^/]+)/another/$', mock_view, name='another'), - url(r'^example/(?P\d+)/$', dummy_view, name='example-detail') -] - class TestRequestVersion: def test_unversioned(self): @@ -121,8 +110,17 @@ class TestRequestVersion: assert response.data == {'version': None} -class TestURLReversing(APITestCase): - urls = 'tests.test_versioning' +class TestURLReversing(UsingURLPatterns, APITestCase): + included = [ + url(r'^namespaced/$', mock_view, name='another'), + url(r'^example/(?P\d+)/$', dummy_view, name='example-detail') + ] + + urlpatterns = [ + url(r'^v1/', include(included, namespace='v1')), + url(r'^another/$', mock_view, name='another'), + url(r'^(?P[^/]+)/another/$', mock_view, name='another'), + ] def test_reverse_unversioned(self): view = ReverseView.as_view() @@ -230,10 +228,18 @@ class TestInvalidVersion: assert response.status_code == status.HTTP_404_NOT_FOUND -class TestHyperlinkedRelatedField(APISimpleTestCase): - urls = 'tests.test_versioning' +class TestHyperlinkedRelatedField(UsingURLPatterns, APITestCase): + included = [ + url(r'^namespaced/(?P\d+)/$', mock_view, name='namespaced'), + ] + + urlpatterns = [ + url(r'^v1/', include(included, namespace='v1')), + url(r'^v2/', include(included, namespace='v2')) + ] def setUp(self): + super(TestHyperlinkedRelatedField, self).setUp() class HyperlinkedMockQueryset(MockQueryset): def get(self, **lookup): @@ -248,13 +254,15 @@ class TestHyperlinkedRelatedField(APISimpleTestCase): MockObject(pk=3, name='baz') ]) self.field = serializers.HyperlinkedRelatedField( - view_name='example-detail', + view_name='namespaced', queryset=self.queryset ) request = factory.post('/', urlconf='tests.test_versioning') request.versioning_scheme = NamespaceVersioning() + request.version = 'v1' self.field._context = {'request': request} def test_bug_2489(self): - self.field.to_internal_value('/example/3/') - self.field.to_internal_value('/v1/example/3/') + self.field.to_internal_value('/v1/namespaced/3/') + with pytest.raises(serializers.ValidationError): + self.field.to_internal_value('/v2/namespaced/3/') diff --git a/tests/utils.py b/tests/utils.py index 5b2d7586..b9034996 100644 --- a/tests/utils.py +++ b/tests/utils.py @@ -2,6 +2,30 @@ from django.core.exceptions import ObjectDoesNotExist from django.core.urlresolvers import NoReverseMatch +class UsingURLPatterns(object): + """ + Isolates URL patterns used during testing on the test class itself. + For example: + + class MyTestCase(UsingURLPatterns, TestCase): + urlpatterns = [ + ... + ] + + def test_something(self): + ... + """ + urls = __name__ + + def setUp(self): + global urlpatterns + urlpatterns = self.urlpatterns + + def tearDown(self): + global urlpatterns + urlpatterns = [] + + class MockObject(object): def __init__(self, **kwargs): self._kwargs = kwargs -- cgit v1.2.3 From f98f842827c6e79bbaa196482e3c3c549e8999c8 Mon Sep 17 00:00:00 2001 From: Tom Christie Date: Thu, 5 Feb 2015 01:24:55 +0000 Subject: Minor bits of test cleanup --- tests/test_versioning.py | 39 +++++++++++++++------------------------ 1 file changed, 15 insertions(+), 24 deletions(-) (limited to 'tests') diff --git a/tests/test_versioning.py b/tests/test_versioning.py index cdd10065..553463d1 100644 --- a/tests/test_versioning.py +++ b/tests/test_versioning.py @@ -1,6 +1,5 @@ -from .utils import MockObject, MockQueryset, UsingURLPatterns +from .utils import UsingURLPatterns from django.conf.urls import include, url -from django.core.exceptions import ObjectDoesNotExist from rest_framework import serializers from rest_framework import status, versioning from rest_framework.decorators import APIView @@ -33,8 +32,8 @@ class RequestInvalidVersionView(APIView): factory = APIRequestFactory() -mock_view = lambda request: None -dummy_view = lambda request, pk: None +dummy_view = lambda request: None +dummy_pk_view = lambda request, pk: None class TestRequestVersion: @@ -112,14 +111,14 @@ class TestRequestVersion: class TestURLReversing(UsingURLPatterns, APITestCase): included = [ - url(r'^namespaced/$', mock_view, name='another'), - url(r'^example/(?P\d+)/$', dummy_view, name='example-detail') + url(r'^namespaced/$', dummy_view, name='another'), + url(r'^example/(?P\d+)/$', dummy_pk_view, name='example-detail') ] urlpatterns = [ url(r'^v1/', include(included, namespace='v1')), - url(r'^another/$', mock_view, name='another'), - url(r'^(?P[^/]+)/another/$', mock_view, name='another'), + url(r'^another/$', dummy_view, name='another'), + url(r'^(?P[^/]+)/another/$', dummy_view, name='another'), ] def test_reverse_unversioned(self): @@ -230,7 +229,7 @@ class TestInvalidVersion: class TestHyperlinkedRelatedField(UsingURLPatterns, APITestCase): included = [ - url(r'^namespaced/(?P\d+)/$', mock_view, name='namespaced'), + url(r'^namespaced/(?P\d+)/$', dummy_view, name='namespaced'), ] urlpatterns = [ @@ -241,28 +240,20 @@ class TestHyperlinkedRelatedField(UsingURLPatterns, APITestCase): def setUp(self): super(TestHyperlinkedRelatedField, self).setUp() - class HyperlinkedMockQueryset(MockQueryset): - def get(self, **lookup): - for item in self.items: - if item.pk == int(lookup.get('pk', -1)): - return item - raise ObjectDoesNotExist() - - self.queryset = HyperlinkedMockQueryset([ - MockObject(pk=1, name='foo'), - MockObject(pk=2, name='bar'), - MockObject(pk=3, name='baz') - ]) + class MockQueryset(object): + def get(self, pk): + return 'object %s' % pk + self.field = serializers.HyperlinkedRelatedField( view_name='namespaced', - queryset=self.queryset + queryset=MockQueryset() ) - request = factory.post('/', urlconf='tests.test_versioning') + request = factory.get('/') request.versioning_scheme = NamespaceVersioning() request.version = 'v1' self.field._context = {'request': request} def test_bug_2489(self): - self.field.to_internal_value('/v1/namespaced/3/') + assert self.field.to_internal_value('/v1/namespaced/3/') == 'object 3' with pytest.raises(serializers.ValidationError): self.field.to_internal_value('/v2/namespaced/3/') -- cgit v1.2.3