Skip to content

Commit 49881c0

Browse files
committed
tests for #35
1 parent 433b75e commit 49881c0

File tree

8 files changed

+122
-15
lines changed

8 files changed

+122
-15
lines changed

django_enum/fields.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ def _coerce_to_value_type(self, value: Any) -> Enum:
9494
return type(values(self.enum)[0])(value)
9595
# can't ever reach this - just here to make type checker happy
9696
return value # pragma: no cover
97-
97+
9898
def __init__(
9999
self,
100100
*args,

django_enum/tests/djenum/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
class AdminDisplayBug35Admin(admin.ModelAdmin):
88

99
list_display = ('text_enum', 'int_enum')
10-
readonly_fields = ('text_enum', 'int_enum')
10+
readonly_fields = ('text_enum', 'int_enum', 'blank_int', 'blank_txt')
1111

1212

1313
admin.site.register(AdminDisplayBug35, AdminDisplayBug35Admin)

django_enum/tests/djenum/migrations/0001_initial.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
# Generated by Django 3.2.18 on 2023-04-09 00:14
1+
# Generated by Django 3.2.21 on 2023-10-01 01:48
22

3-
import django_enum.fields
43
from django.db import migrations, models
4+
import django_enum.fields
55

66

77
class Migration(migrations.Migration):
@@ -16,8 +16,10 @@ class Migration(migrations.Migration):
1616
name='AdminDisplayBug35',
1717
fields=[
1818
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19-
('text_enum', django_enum.fields.EnumCharField(choices=[('A', 'Label A'), ('B', 'Label B'), ('C', 'Label C')], default=None, max_length=1, null=True)),
20-
('int_enum', django_enum.fields.EnumPositiveSmallIntegerField(choices=[(1, 'One'), (2, 'Two'), (3, 'Three')], default=None, null=True)),
19+
('text_enum', django_enum.fields.EnumCharField(choices=[('V1', 'Value1'), ('V22', 'Value2'), ('V333', 'Value3'), ('D', 'Default')], default='V1', max_length=4)),
20+
('int_enum', django_enum.fields.EnumPositiveSmallIntegerField(choices=[(0, 'Value 1'), (2, 'Value 2'), (32767, 'Value 32767')], default=2)),
21+
('blank_int', django_enum.fields.EnumPositiveSmallIntegerField(choices=[(0, 'Value 1'), (2, 'Value 2'), (32767, 'Value 32767')], default=None, null=True)),
22+
('blank_txt', django_enum.fields.EnumCharField(choices=[('V1', 'Value1'), ('V22', 'Value2'), ('V333', 'Value3'), ('D', 'Default')], default=None, max_length=4, null=True)),
2123
],
2224
),
2325
migrations.CreateModel(

django_enum/tests/djenum/models.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,14 +119,23 @@ class BadDefault(models.Model):
119119
class AdminDisplayBug35(models.Model):
120120

121121
text_enum = EnumField(
122-
DJTextEnum,
123-
null=True,
124-
default=None
122+
TextEnum,
123+
default=TextEnum.VALUE1
125124
)
126125

127126
int_enum = EnumField(
128-
DJIntEnum,
127+
SmallPosIntEnum,
128+
default=SmallPosIntEnum.VAL2
129+
)
130+
131+
blank_int = EnumField(
132+
SmallPosIntEnum,
129133
null=True,
130134
default=None
131135
)
132136

137+
blank_txt = EnumField(
138+
TextEnum,
139+
null=True,
140+
default=None
141+
)

django_enum/tests/enum_prop/admin.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,12 @@
11
from django.contrib import admin
2-
from django_enum.tests.enum_prop.models import EnumTester
2+
from django_enum.tests.enum_prop.models import EnumTester, AdminDisplayBug35
3+
4+
5+
class AdminDisplayBug35Admin(admin.ModelAdmin):
6+
7+
list_display = ('text_enum', 'int_enum')
8+
readonly_fields = ('text_enum', 'int_enum', 'blank_int', 'blank_txt')
9+
310

411
admin.site.register(EnumTester)
12+
admin.site.register(AdminDisplayBug35, AdminDisplayBug35Admin)

django_enum/tests/enum_prop/migrations/0001_initial.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
# Generated by Django 3.2.18 on 2023-04-02 18:42
1+
# Generated by Django 3.2.21 on 2023-10-01 01:48
22

3-
import django_enum.fields
43
from django.db import migrations, models
4+
import django_enum.fields
55

66

77
class Migration(migrations.Migration):
@@ -12,6 +12,16 @@ class Migration(migrations.Migration):
1212
]
1313

1414
operations = [
15+
migrations.CreateModel(
16+
name='AdminDisplayBug35',
17+
fields=[
18+
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
19+
('text_enum', django_enum.fields.EnumCharField(choices=[('V1', 'Value1'), ('V22', 'Value2'), ('V333', 'Value3'), ('D', 'Default')], default='V1', max_length=4)),
20+
('int_enum', django_enum.fields.EnumPositiveSmallIntegerField(choices=[(0, 'Value 1'), (2, 'Value 2'), (32767, 'Value 32767')], default=2)),
21+
('blank_int', django_enum.fields.EnumPositiveSmallIntegerField(choices=[(0, 'Value 1'), (2, 'Value 2'), (32767, 'Value 32767')], default=None, null=True)),
22+
('blank_txt', django_enum.fields.EnumCharField(choices=[('V1', 'Value1'), ('V22', 'Value2'), ('V333', 'Value3'), ('D', 'Default')], default=None, max_length=4, null=True)),
23+
],
24+
),
1525
migrations.CreateModel(
1626
name='EnumTester',
1727
fields=[

django_enum/tests/enum_prop/models.py

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,31 @@ class Color(TextChoices, s('rgb'), s('hex', case_fold=True)):
131131
color = EnumField(Color)
132132

133133

134+
class AdminDisplayBug35(models.Model):
135+
136+
text_enum = EnumField(
137+
TextEnum,
138+
default=TextEnum.VALUE1
139+
)
140+
141+
int_enum = EnumField(
142+
SmallPosIntEnum,
143+
default=SmallPosIntEnum.VAL2
144+
)
145+
146+
blank_int = EnumField(
147+
SmallPosIntEnum,
148+
null=True,
149+
default=None
150+
)
151+
152+
blank_txt = EnumField(
153+
TextEnum,
154+
null=True,
155+
default=None
156+
)
157+
158+
134159
class PerfCompare(models.Model):
135160

136161
small_pos_int = models.PositiveSmallIntegerField(choices=SmallPosIntEnum.choices, null=True, default=None, db_index=True, blank=True)

django_enum/tests/tests.py

Lines changed: 55 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from django.db import connection, transaction
1111
from django.db.models import Q
1212
from django.http import QueryDict
13-
from django.test import Client, TestCase
13+
from django.test import Client, TestCase, LiveServerTestCase
1414
from django.urls import reverse
1515
from django.utils.functional import classproperty
1616
from django_enum import TextChoices
@@ -30,7 +30,7 @@
3030
# ExternEnum
3131
# )
3232
from django_enum.tests.djenum.forms import EnumTesterForm
33-
from django_enum.tests.djenum.models import BadDefault, EnumTester
33+
from django_enum.tests.djenum.models import BadDefault, EnumTester, AdminDisplayBug35
3434
from django_test_migrations.constants import MIGRATION_TEST_MARKER
3535
from django_test_migrations.contrib.unittest_case import MigratorTestCase
3636

@@ -964,6 +964,53 @@ def test_query(self):
964964
self.assertRaises(ValueError, self.MODEL_CLASS.objects.filter, big_pos_int=type('WrongType')())
965965

966966

967+
class TestAdmin(EnumTypeMixin, LiveServerTestCase):
968+
969+
BUG35_CLASS = AdminDisplayBug35
970+
971+
def test_admin_list_display_bug35(self):
972+
from django.contrib.auth import get_user_model
973+
974+
get_user_model().objects.create_superuser(
975+
username='admin',
976+
977+
password='admin_password',
978+
)
979+
self.client.login(username='admin', password='admin_password')
980+
981+
obj = self.BUG35_CLASS.objects.create()
982+
983+
resp = self.client.get(
984+
reverse(f'admin:{self.BUG35_CLASS._meta.label_lower.replace(".", "_")}_changelist')
985+
)
986+
self.assertContains(resp, '<td class="field-int_enum">Value 2</td>')
987+
change_link = reverse(
988+
f'admin:{self.BUG35_CLASS._meta.label_lower.replace(".", "_")}_change',
989+
args=[obj.id]
990+
)
991+
self.assertContains(resp, f'<a href="{change_link}">Value1</a>')
992+
993+
def test_admin_change_display_bug35(self):
994+
from django.contrib.auth import get_user_model
995+
996+
get_user_model().objects.create_superuser(
997+
username='admin',
998+
999+
password='admin_password',
1000+
)
1001+
self.client.login(username='admin', password='admin_password')
1002+
1003+
obj = self.BUG35_CLASS.objects.create()
1004+
resp = self.client.get(
1005+
reverse(
1006+
f'admin:{self.BUG35_CLASS._meta.label_lower.replace(".", "_")}_change',
1007+
args=[obj.id]
1008+
)
1009+
)
1010+
self.assertContains(resp, '<div class="readonly">Value1</div>')
1011+
self.assertContains(resp, '<div class="readonly">Value 2</div>')
1012+
1013+
9671014
class TestFormField(EnumTypeMixin, TestCase):
9681015

9691016
MODEL_CLASS = EnumTester
@@ -1788,6 +1835,7 @@ def test_bulk_update(self):
17881835
SingleEnumPerf,
17891836
SingleFieldPerf,
17901837
SingleNoCoercePerf,
1838+
AdminDisplayBug35
17911839
)
17921840
from enum_properties import EnumProperties, s
17931841

@@ -2100,6 +2148,11 @@ def test_saving(self):
21002148
self.assertEqual(tester.text, None)
21012149

21022150

2151+
class TestEnumPropAdmin(TestAdmin):
2152+
2153+
BUG35_CLASS = AdminDisplayBug35
2154+
2155+
21032156
class TestSymmetricEmptyValEquivalency(TestCase):
21042157

21052158
def test(self):

0 commit comments

Comments
 (0)