Skip to content

Commit ce1db2c

Browse files
committed
add django rest framework tests and admin
1 parent 5767659 commit ce1db2c

File tree

9 files changed

+135
-34
lines changed

9 files changed

+135
-34
lines changed

django_enum/tests/djenum/admin.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from django.contrib import admin
2+
from django_enum.tests.djenum.models import EnumTester
3+
4+
admin.site.register(EnumTester)

django_enum/tests/djenum/urls.py

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
1-
from django.urls import path
1+
from django.urls import include, path
22
from django_enum.tests.djenum.models import EnumTester
33
from django_enum.tests.djenum.views import (
4+
DRFView,
45
EnumTesterCreateView,
56
EnumTesterDeleteView,
67
EnumTesterDetailView,
@@ -10,9 +11,14 @@
1011
EnumTesterListView,
1112
EnumTesterUpdateView,
1213
)
14+
from rest_framework import routers
1315

1416
app_name = 'django_enum_tests_djenum'
1517

18+
19+
router = routers.DefaultRouter()
20+
router.register(r'enumtesters', DRFView)
21+
1622
urlpatterns = [
1723
path('enum/<int:pk>', EnumTesterDetailView.as_view(), name='enum-detail'),
1824
path('enum/list/', EnumTesterListView.as_view(), name='enum-list'),
@@ -21,7 +27,8 @@
2127
path('enum/<int:pk>/', EnumTesterUpdateView.as_view(), name='enum-update'),
2228
path('enum/form/<int:pk>/', EnumTesterFormView.as_view(), name='enum-form-update'),
2329
path('enum/<int:pk>/delete/', EnumTesterDeleteView.as_view(), name='enum-delete'),
24-
path('enum/form/<int:pk>/delete/', EnumTesterFormDeleteView.as_view(), name='enum-form-delete')
30+
path('enum/form/<int:pk>/delete/', EnumTesterFormDeleteView.as_view(), name='enum-form-delete'),
31+
path('drf/', include(router.urls))
2532
]
2633

2734
try:

django_enum/tests/djenum/views.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django_enum.tests.djenum import enums as dj_enums
55
from django_enum.tests.djenum.forms import EnumTesterForm
66
from django_enum.tests.djenum.models import EnumTester
7+
from rest_framework import serializers, viewsets
78

89

910
class URLMixin:
@@ -96,6 +97,17 @@ def get_success_url(self): # pragma: no cover
9697
return reverse(f'{self.NAMESPACE}:enum-list')
9798

9899

100+
class EnumTesterSerializer(serializers.ModelSerializer):
101+
class Meta:
102+
model = EnumTester
103+
fields = '__all__'
104+
105+
106+
class DRFView(viewsets.ModelViewSet):
107+
queryset = EnumTester.objects.all()
108+
serializer_class = EnumTesterSerializer
109+
110+
99111
try:
100112
from django_enum.filters import FilterSet as EnumFilterSet
101113
from django_filters.views import FilterView

django_enum/tests/enum_prop/admin.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
from django.contrib import admin
2+
from django_enum.tests.enum_prop.models import EnumTester
3+
4+
admin.site.register(EnumTester)

django_enum/tests/enum_prop/urls.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
try:
2-
from django.urls import path
2+
from django.urls import include, path
33
from django_enum.tests.enum_prop.models import EnumTester
44
from django_enum.tests.enum_prop.views import (
5+
DRFView,
56
EnumTesterCreateView,
67
EnumTesterDeleteView,
78
EnumTesterDetailView,
@@ -11,9 +12,13 @@
1112
EnumTesterListView,
1213
EnumTesterUpdateView,
1314
)
15+
from rest_framework import routers
1416

1517
app_name = 'django_enum_tests_enum_prop'
1618

19+
router = routers.DefaultRouter()
20+
router.register(r'enumtesters', DRFView)
21+
1722
urlpatterns = [
1823
path('enum/<int:pk>', EnumTesterDetailView.as_view(), name='enum-detail'),
1924
path('enum/list/', EnumTesterListView.as_view(), name='enum-list'),
@@ -22,7 +27,8 @@
2227
path('enum/<int:pk>/', EnumTesterUpdateView.as_view(), name='enum-update'),
2328
path('enum/form/<int:pk>/', EnumTesterFormView.as_view(), name='enum-form-update'),
2429
path('enum/<int:pk>/delete/', EnumTesterDeleteView.as_view(), name='enum-delete'),
25-
path('enum/form/<int:pk>/delete/', EnumTesterFormDeleteView.as_view(), name='enum-form-delete')
30+
path('enum/form/<int:pk>/delete/', EnumTesterFormDeleteView.as_view(), name='enum-form-delete'),
31+
path('drf/', include(router.urls))
2632
]
2733

2834
try:

django_enum/tests/enum_prop/views.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from django_enum.tests.enum_prop import enums as prop_enums
66
from django_enum.tests.enum_prop.forms import EnumTesterForm
77
from django_enum.tests.enum_prop.models import EnumTester
8+
from rest_framework import serializers, viewsets
89

910

1011
class EnumTesterDetailView(views.EnumTesterDetailView):
@@ -64,6 +65,18 @@ class EnumTesterFormDeleteView(views.EnumTesterFormDeleteView):
6465
NAMESPACE = 'django_enum_tests_enum_prop'
6566
enums = prop_enums
6667

68+
69+
class EnumTesterSerializer(serializers.ModelSerializer):
70+
class Meta:
71+
model = EnumTester
72+
fields = '__all__'
73+
74+
75+
class DRFView(viewsets.ModelViewSet):
76+
queryset = EnumTester.objects.all()
77+
serializer_class = EnumTesterSerializer
78+
79+
6780
try:
6881

6982
from django_enum.tests.djenum.views import EnumTesterFilterViewSet

django_enum/tests/settings.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
INSTALLED_APPS = [
4545
'django_enum.tests.djenum',
4646
'django_enum.tests.tmpls',
47+
'rest_framework',
4748
'django.contrib.auth',
4849
'django.contrib.contenttypes',
4950
'django.contrib.sessions',
@@ -74,3 +75,9 @@
7475

7576
TEST_EDIT_DIR = Path(__file__).parent / 'edit_tests' / 'edits'
7677
TEST_MIGRATION_DIR = Path(__file__).parent / 'edit_tests' / 'migrations'
78+
79+
REST_FRAMEWORK = {
80+
# no auth
81+
'DEFAULT_AUTHENTICATION_CLASSES': [],
82+
'DEFAULT_PERMISSION_CLASSES': [],
83+
}

django_enum/tests/tests.py

Lines changed: 77 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -779,6 +779,22 @@ class TestRequests(EnumTypeMixin, TestCase):
779779

780780
maxDiff = None
781781

782+
fields = [
783+
'small_pos_int',
784+
'small_int',
785+
'pos_int',
786+
'int',
787+
'big_pos_int',
788+
'big_int',
789+
'constant',
790+
'text',
791+
'dj_int_enum',
792+
'dj_text_enum',
793+
'non_strict_int',
794+
'non_strict_text',
795+
'no_coerce',
796+
]
797+
782798
def setUp(self):
783799
self.values = {val: {} for val in self.compared_attributes}
784800
self.objects = []
@@ -873,6 +889,65 @@ def post_params_symmetric(self):
873889
**self.post_params,
874890
}
875891

892+
def test_drf_read(self):
893+
c = Client()
894+
response = c.get(reverse(f'{self.NAMESPACE}:enumtester-list'))
895+
read_objects = response.json()
896+
self.assertEqual(len(read_objects), len(self.objects))
897+
898+
for idx, obj in enumerate(response.json()):
899+
# should be same order
900+
self.assertEqual(obj['id'], self.objects[idx].id)
901+
for field in self.fields:
902+
self.assertEqual(obj[field], getattr(self.objects[idx], field))
903+
904+
def test_drf_update(self):
905+
c = Client()
906+
params = self.post_params#_symmetric TODO
907+
response = c.put(
908+
reverse(
909+
f'{self.NAMESPACE}:enumtester-detail',
910+
kwargs={'pk': self.objects[0].id}
911+
),
912+
params,
913+
follow=True,
914+
content_type='application/json'
915+
)
916+
self.assertEqual(response.status_code, 200)
917+
fetched = c.get(
918+
reverse(
919+
f'{self.NAMESPACE}:enumtester-detail',
920+
kwargs={'pk': self.objects[0].id}
921+
),
922+
follow=True
923+
).json()
924+
925+
obj = self.MODEL_CLASS.objects.get(pk=self.objects[0].id)
926+
927+
self.assertEqual(fetched['id'], obj.id)
928+
for field in self.fields:
929+
self.assertEqual(fetched[field], getattr(obj, field))
930+
self.assertEqual(params[field], getattr(obj, field))
931+
932+
def test_drf_post(self):
933+
c = Client()
934+
params = self.post_params#_symmetric TODO
935+
response = c.post(
936+
reverse(f'{self.NAMESPACE}:enumtester-list'),
937+
params,
938+
follow=True,
939+
content_type='application/json'
940+
)
941+
self.assertEqual(response.status_code, 201)
942+
created = response.json()
943+
944+
obj = self.MODEL_CLASS.objects.last()
945+
946+
self.assertEqual(created['id'], obj.id)
947+
for field in self.fields:
948+
self.assertEqual(created[field], getattr(obj, field))
949+
self.assertEqual(params[field], getattr(obj, field))
950+
876951
def test_add(self):
877952
"""
878953
Test that add forms work and that EnumField type allows creations
@@ -959,21 +1034,7 @@ def test_add_form(self):
9591034
response = c.get(reverse(f'{self.NAMESPACE}:{form_url}'))
9601035
soup = Soup(response.content, features='html.parser')
9611036

962-
for field in [
963-
'small_pos_int',
964-
'small_int',
965-
'pos_int',
966-
'int',
967-
'big_pos_int',
968-
'big_int',
969-
'constant',
970-
'text',
971-
'dj_int_enum',
972-
'dj_text_enum',
973-
'non_strict_int',
974-
'non_strict_text',
975-
'no_coerce'
976-
]:
1037+
for field in self.fields:
9771038
field = EnumTester._meta.get_field(field)
9781039
expected = dict(zip([en for en in field.enum], field.enum.labels)) # value -> label
9791040
null_opt = False
@@ -1006,21 +1067,7 @@ def verify_form(self, obj, soup, non_strict_options=False):
10061067
in the options lists for non strict fields
10071068
:return:
10081069
"""
1009-
for field in [
1010-
'small_pos_int',
1011-
'small_int',
1012-
'pos_int',
1013-
'int',
1014-
'big_pos_int',
1015-
'big_int',
1016-
'constant',
1017-
'text',
1018-
'dj_int_enum',
1019-
'dj_text_enum',
1020-
'non_strict_int',
1021-
'non_strict_text',
1022-
'no_coerce',
1023-
]:
1070+
for field in self.fields:
10241071
field = self.MODEL_CLASS._meta.get_field(field)
10251072
expected = dict(zip([en for en in field.enum],
10261073
field.enum.labels)) # value -> label

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,7 @@ coverage = "^6.2"
6565
beautifulsoup4 = "^4.11.1"
6666
pytest-django = "^4.5.2"
6767
django-test-migrations = "^1.2.0"
68+
djangorestframework = "^3.13.1"
6869

6970
[build-system]
7071
requires = ["poetry-core>=1.0.0"]

0 commit comments

Comments
 (0)