|
7 | 7 | from rest_framework.reverse import reverse
|
8 | 8 | from rest_framework.test import APIRequestFactory, APITestCase
|
9 | 9 | from rest_framework.versioning import NamespaceVersioning
|
| 10 | +from rest_framework.relations import PKOnlyObject |
10 | 11 | import pytest
|
11 | 12 |
|
12 | 13 |
|
@@ -234,7 +235,7 @@ class FakeResolverMatch:
|
234 | 235 |
|
235 | 236 | class TestHyperlinkedRelatedField(UsingURLPatterns, APITestCase):
|
236 | 237 | included = [
|
237 |
| - url(r'^namespaced/(?P<pk>\d+)/$', dummy_view, name='namespaced'), |
| 238 | + url(r'^namespaced/(?P<pk>\d+)/$', dummy_pk_view, name='namespaced'), |
238 | 239 | ]
|
239 | 240 |
|
240 | 241 | urlpatterns = [
|
@@ -262,3 +263,44 @@ def test_bug_2489(self):
|
262 | 263 | assert self.field.to_internal_value('/v1/namespaced/3/') == 'object 3'
|
263 | 264 | with pytest.raises(serializers.ValidationError):
|
264 | 265 | self.field.to_internal_value('/v2/namespaced/3/')
|
| 266 | + |
| 267 | + |
| 268 | +class TestNamespaceVersioningHyperlinkedRelatedFieldScheme(UsingURLPatterns, APITestCase): |
| 269 | + included = [ |
| 270 | + url(r'^namespaced/(?P<pk>\d+)/$', dummy_pk_view, name='namespaced'), |
| 271 | + ] |
| 272 | + |
| 273 | + urlpatterns = [ |
| 274 | + url(r'^v1/', include(included, namespace='v1')), |
| 275 | + url(r'^v2/', include(included, namespace='v2')), |
| 276 | + url(r'^non-api/(?P<pk>\d+)/$', dummy_pk_view, name='non-api-view') |
| 277 | + ] |
| 278 | + |
| 279 | + def _create_field(self, view_name, version): |
| 280 | + request = factory.get("/") |
| 281 | + request.versioning_scheme = NamespaceVersioning() |
| 282 | + request.version = version |
| 283 | + |
| 284 | + field = serializers.HyperlinkedRelatedField( |
| 285 | + view_name=view_name, |
| 286 | + read_only=True) |
| 287 | + field._context = {'request': request} |
| 288 | + return field |
| 289 | + |
| 290 | + def test_api_url_is_properly_reversed_with_v1(self): |
| 291 | + field = self._create_field('namespaced', 'v1') |
| 292 | + assert field.to_representation(PKOnlyObject(3)) == 'http://testserver/v1/namespaced/3/' |
| 293 | + |
| 294 | + def test_api_url_is_properly_reversed_with_v2(self): |
| 295 | + field = self._create_field('namespaced', 'v2') |
| 296 | + assert field.to_representation(PKOnlyObject(5)) == 'http://testserver/v2/namespaced/5/' |
| 297 | + |
| 298 | + def test_non_api_url_is_properly_reversed_regardless_of_the_version(self): |
| 299 | + """ |
| 300 | + Regression test for #2711 |
| 301 | + """ |
| 302 | + field = self._create_field('non-api-view', 'v1') |
| 303 | + assert field.to_representation(PKOnlyObject(10)) == 'http://testserver/non-api/10/' |
| 304 | + |
| 305 | + field = self._create_field('non-api-view', 'v2') |
| 306 | + assert field.to_representation(PKOnlyObject(10)) == 'http://testserver/non-api/10/' |
0 commit comments