@@ -21,6 +21,11 @@ class RouterTestModel(models.Model):
21
21
text = models .CharField (max_length = 200 )
22
22
23
23
24
+ class BasenameTestModel (models .Model ):
25
+ uuid = models .CharField (max_length = 20 )
26
+ text = models .CharField (max_length = 200 )
27
+
28
+
24
29
class NoteSerializer (serializers .HyperlinkedModelSerializer ):
25
30
url = serializers .HyperlinkedIdentityField (view_name = 'routertestmodel-detail' , lookup_field = 'uuid' )
26
31
@@ -42,6 +47,11 @@ class KWargedNoteViewSet(viewsets.ModelViewSet):
42
47
lookup_url_kwarg = 'text'
43
48
44
49
50
+ class BasenameViewSet (viewsets .ModelViewSet ):
51
+ queryset = BasenameTestModel .objects .all ()
52
+ serializer_class = None
53
+
54
+
45
55
class MockViewSet (viewsets .ModelViewSet ):
46
56
queryset = None
47
57
serializer_class = None
@@ -156,7 +166,7 @@ def test_multiple_action_handlers(self):
156
166
def test_register_after_accessing_urls (self ):
157
167
self .router .register (r'notes' , NoteViewSet )
158
168
assert len (self .router .urls ) == 2 # list and detail
159
- self .router .register (r'notes_bis' , NoteViewSet )
169
+ self .router .register (r'notes_bis' , NoteViewSet , basename = 'notes_bis' )
160
170
assert len (self .router .urls ) == 4
161
171
162
172
@@ -481,3 +491,103 @@ def test_basename(self):
481
491
initkwargs = match .func .initkwargs
482
492
483
493
assert initkwargs ['basename' ] == 'routertestmodel'
494
+
495
+
496
+ class BasenameTestCase :
497
+ def test_conflicting_autogenerated_basenames (self ):
498
+ """
499
+ Ensure 2 routers with the same model, and no basename specified
500
+ throws an ImproperlyConfigured exception
501
+ """
502
+ self .router .register (r'notes' , NoteViewSet )
503
+
504
+ with pytest .raises (ImproperlyConfigured ):
505
+ self .router .register (r'notes_kwduplicate' , KWargedNoteViewSet )
506
+
507
+ with pytest .raises (ImproperlyConfigured ):
508
+ self .router .register (r'notes_duplicate' , NoteViewSet )
509
+
510
+ def test_conflicting_mixed_basenames (self ):
511
+ """
512
+ Ensure 2 routers with the same model, and no basename specified on 1
513
+ throws an ImproperlyConfigured exception
514
+ """
515
+ self .router .register (r'notes' , NoteViewSet )
516
+
517
+ with pytest .raises (ImproperlyConfigured ):
518
+ self .router .register (r'notes_kwduplicate' , KWargedNoteViewSet , basename = 'routertestmodel' )
519
+
520
+ with pytest .raises (ImproperlyConfigured ):
521
+ self .router .register (r'notes_duplicate' , NoteViewSet , basename = 'routertestmodel' )
522
+
523
+ def test_nonconflicting_mixed_basenames (self ):
524
+ """
525
+ Ensure 2 routers with the same model, and a distinct basename
526
+ specified on the second router does not fail
527
+ """
528
+ self .router .register (r'notes' , NoteViewSet )
529
+ self .router .register (r'notes_kwduplicate' , KWargedNoteViewSet , basename = 'routertestmodel_kwduplicate' )
530
+ self .router .register (r'notes_duplicate' , NoteViewSet , basename = 'routertestmodel_duplicate' )
531
+
532
+ def test_conflicting_specified_basename (self ):
533
+ """
534
+ Ensure 2 routers with the same model, and the same basename specified
535
+ on both throws an ImproperlyConfigured exception
536
+ """
537
+ self .router .register (r'notes' , NoteViewSet , basename = 'notes' )
538
+
539
+ with pytest .raises (ImproperlyConfigured ):
540
+ self .router .register (r'notes_kwduplicate' , KWargedNoteViewSet , basename = 'notes' )
541
+
542
+ with pytest .raises (ImproperlyConfigured ):
543
+ self .router .register (r'notes_duplicate' , KWargedNoteViewSet , basename = 'notes' )
544
+
545
+ def test_nonconflicting_specified_basename (self ):
546
+ """
547
+ Ensure 2 routers with the same model, and a distinct basename specified
548
+ on each does not throw an exception
549
+ """
550
+ self .router .register (r'notes' , NoteViewSet , basename = 'notes' )
551
+ self .router .register (r'notes_kwduplicate' , KWargedNoteViewSet , basename = 'notes_kwduplicate' )
552
+ self .router .register (r'notes_duplicate' , NoteViewSet , basename = 'notes_duplicate' )
553
+
554
+ def test_nonconflicting_specified_basename_different_models (self ):
555
+ """
556
+ Ensure 2 routers with different models, and a distinct basename specified
557
+ on each does not throw an exception
558
+ """
559
+ self .router .register (r'notes' , NoteViewSet , basename = 'notes' )
560
+ self .router .register (r'notes_basename' , BasenameViewSet , basename = 'notes_basename' )
561
+
562
+ def test_conflicting_specified_basename_different_models (self ):
563
+ """
564
+ Ensure 2 routers with different models, and a conflicting basename specified
565
+ throws an exception
566
+ """
567
+ self .router .register (r'notes' , NoteViewSet )
568
+ with pytest .raises (ImproperlyConfigured ):
569
+ self .router .register (r'notes_basename' , BasenameViewSet , basename = 'routertestmodel' )
570
+
571
+ def test_nonconflicting_autogenerated_basename_different_models (self ):
572
+ """
573
+ Ensure 2 routers with different models, and a distinct basename specified
574
+ on each does not throw an exception
575
+ """
576
+ self .router .register (r'notes' , NoteViewSet )
577
+ self .router .register (r'notes_basename' , BasenameViewSet )
578
+
579
+
580
+ class TestDuplicateBasenameSimpleRouter (BasenameTestCase , TestCase ):
581
+ def setUp (self ):
582
+ self .router = SimpleRouter (trailing_slash = False )
583
+
584
+
585
+ class TestDuplicateBasenameDefaultRouter (BasenameTestCase , TestCase ):
586
+ def setUp (self ):
587
+ self .router = DefaultRouter ()
588
+
589
+
590
+ class TestDuplicateBasenameDefaultRouterRootViewName (BasenameTestCase , TestCase ):
591
+ def setUp (self ):
592
+ self .router = DefaultRouter ()
593
+ self .router .root_view_name = 'nameable-root'
0 commit comments