|
6 | 6 | from django.http import Http404
|
7 | 7 | from django.test import TestCase, override_settings
|
8 | 8 |
|
9 |
| -from rest_framework import filters, pagination, permissions, serializers |
| 9 | +from rest_framework import ( |
| 10 | + filters, generics, pagination, permissions, serializers |
| 11 | +) |
10 | 12 | from rest_framework.compat import coreapi, coreschema
|
11 | 13 | from rest_framework.decorators import (
|
12 | 14 | api_view, detail_route, list_route, schema
|
13 | 15 | )
|
14 | 16 | from rest_framework.request import Request
|
15 |
| -from rest_framework.routers import DefaultRouter |
| 17 | +from rest_framework.routers import DefaultRouter, SimpleRouter |
16 | 18 | from rest_framework.schemas import (
|
17 | 19 | AutoSchema, ManualSchema, SchemaGenerator, get_schema_view
|
18 | 20 | )
|
19 | 21 | from rest_framework.schemas.generators import EndpointEnumerator
|
20 | 22 | from rest_framework.test import APIClient, APIRequestFactory
|
21 | 23 | from rest_framework.utils import formatting
|
22 | 24 | from rest_framework.views import APIView
|
23 |
| -from rest_framework.viewsets import ModelViewSet |
| 25 | +from rest_framework.viewsets import GenericViewSet, ModelViewSet |
| 26 | + |
| 27 | +from .models import BasicModel |
24 | 28 |
|
25 | 29 | factory = APIRequestFactory()
|
26 | 30 |
|
@@ -726,3 +730,81 @@ def get(self, request, *args, **kwargs):
|
726 | 730 | "The `OldFashionedExcludedView.exclude_from_schema` attribute is "
|
727 | 731 | "pending deprecation. Set `schema = None` instead."
|
728 | 732 | )
|
| 733 | + |
| 734 | + |
| 735 | +@api_view(["GET"]) |
| 736 | +def simple_fbv(request): |
| 737 | + pass |
| 738 | + |
| 739 | + |
| 740 | +class BasicModelSerializer(serializers.ModelSerializer): |
| 741 | + class Meta: |
| 742 | + model = BasicModel |
| 743 | + fields = "__all__" |
| 744 | + |
| 745 | + |
| 746 | +class NamingCollisionView(generics.RetrieveUpdateDestroyAPIView): |
| 747 | + queryset = BasicModel.objects.all() |
| 748 | + serializer_class = BasicModelSerializer |
| 749 | + |
| 750 | + |
| 751 | +class NamingCollisionViewSet(GenericViewSet): |
| 752 | + """ |
| 753 | + Example via: https://stackoverflow.com/questions/43778668/django-rest-framwork-occured-typeerror-link-object-does-not-support-item-ass/ |
| 754 | + """ |
| 755 | + permision_class = () |
| 756 | + |
| 757 | + @list_route() |
| 758 | + def detail(self, request): |
| 759 | + return {} |
| 760 | + |
| 761 | + @list_route(url_path='detail/export') |
| 762 | + def detail_export(self, request): |
| 763 | + return {} |
| 764 | + |
| 765 | + |
| 766 | +naming_collisions_router = SimpleRouter() |
| 767 | +naming_collisions_router.register(r'collision', NamingCollisionViewSet, base_name="collision") |
| 768 | + |
| 769 | + |
| 770 | +class TestURLNamingCollisions(TestCase): |
| 771 | + """ |
| 772 | + Ref: https://github.com/encode/django-rest-framework/issues/4704 |
| 773 | + """ |
| 774 | + def test_manually_routing_nested_routes(self): |
| 775 | + patterns = [ |
| 776 | + url(r'^test', simple_fbv), |
| 777 | + url(r'^test/list/', simple_fbv), |
| 778 | + ] |
| 779 | + |
| 780 | + generator = SchemaGenerator(title='Naming Colisions', patterns=patterns) |
| 781 | + |
| 782 | + with pytest.raises(ValueError): |
| 783 | + generator.get_schema() |
| 784 | + |
| 785 | + def test_manually_routing_generic_view(self): |
| 786 | + patterns = [ |
| 787 | + url(r'^test', NamingCollisionView.as_view()), |
| 788 | + url(r'^test/retrieve/', NamingCollisionView.as_view()), |
| 789 | + url(r'^test/update/', NamingCollisionView.as_view()), |
| 790 | + |
| 791 | + # Fails with method names: |
| 792 | + url(r'^test/get/', NamingCollisionView.as_view()), |
| 793 | + url(r'^test/put/', NamingCollisionView.as_view()), |
| 794 | + url(r'^test/delete/', NamingCollisionView.as_view()), |
| 795 | + ] |
| 796 | + |
| 797 | + generator = SchemaGenerator(title='Naming Colisions', patterns=patterns) |
| 798 | + |
| 799 | + with pytest.raises(ValueError): |
| 800 | + generator.get_schema() |
| 801 | + |
| 802 | + def test_from_router(self): |
| 803 | + patterns = [ |
| 804 | + url(r'from-router', include(naming_collisions_router.urls)), |
| 805 | + ] |
| 806 | + |
| 807 | + generator = SchemaGenerator(title='Naming Colisions', patterns=patterns) |
| 808 | + |
| 809 | + with pytest.raises(ValueError): |
| 810 | + generator.get_schema() |
0 commit comments