Skip to content

Commit

Permalink
chore: Use RequestFactory for admin tests
Browse files Browse the repository at this point in the history
  • Loading branch information
last-partizan committed Feb 8, 2025
1 parent 063eb16 commit 85fc2cb
Showing 1 changed file with 60 additions and 57 deletions.
117 changes: 60 additions & 57 deletions modeltranslation/tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
from django.contrib.admin.sites import AdminSite
from django.db.models import TextField
from django.utils.translation import get_language, trans_real
from django.test import TestCase
from django.test import TestCase, RequestFactory

from modeltranslation import admin, translator
from modeltranslation.tests import models
Expand All @@ -15,16 +15,13 @@

from .tests import reload_override_settings

# None of the following tests really depend on the content of the request,
# so we'll just pass in None.
request = None


class TranslationAdminTest(TestCase):
def setUp(self):
super().setUp()
self.test_obj = models.TestModel.objects.create(title="Testtitle", text="Testtext")
self.site = AdminSite()
self.request = RequestFactory().get("/")

def tearDown(self):
self.test_obj.delete()
Expand All @@ -35,7 +32,7 @@ class TestModelAdmin(admin.TranslationAdmin):
pass

ma = TestModelAdmin(models.TestModel, self.site)
assert tuple(ma.get_form(request).base_fields.keys()) == (
assert tuple(ma.get_form(self.request).base_fields.keys()) == (
"title_de",
"title_en",
"text_de",
Expand Down Expand Up @@ -67,17 +64,17 @@ class TestModelAdmin(admin.TranslationAdmin):
"dynamic_default_de",
"dynamic_default_en",
]
assert ma.get_fieldsets(request) == [(None, {"fields": fields})]
assert ma.get_fieldsets(request, self.test_obj) == [(None, {"fields": fields})]
assert ma.get_fieldsets(self.request) == [(None, {"fields": fields})]
assert ma.get_fieldsets(self.request, self.test_obj) == [(None, {"fields": fields})]

def test_field_arguments(self):
class TestModelAdmin(admin.TranslationAdmin):
fields = ["title"]

ma = TestModelAdmin(models.TestModel, self.site)
fields = ["title_de", "title_en"]
assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request, self.test_obj).base_fields.keys()) == tuple(fields)

def test_field_arguments_restricted_on_form(self):
# Using `fields`.
Expand All @@ -86,56 +83,56 @@ class TestModelAdmin(admin.TranslationAdmin):

ma = TestModelAdmin(models.TestModel, self.site)
fields = ["title_de", "title_en"]
assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request, self.test_obj).base_fields.keys()) == tuple(fields)

# Using `fieldsets`.
class TestModelAdmin(admin.TranslationAdmin):
fieldsets = [(None, {"fields": ["title"]})]

ma = TestModelAdmin(models.TestModel, self.site)
assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request, self.test_obj).base_fields.keys()) == tuple(fields)

# Using `exclude`.
class TestModelAdmin(admin.TranslationAdmin):
exclude = ["url", "email", "dynamic_default"]

ma = TestModelAdmin(models.TestModel, self.site)
fields = ["title_de", "title_en", "text_de", "text_en"]
assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request).base_fields.keys()) == tuple(fields)

# You can also pass a tuple to `exclude`.
class TestModelAdmin(admin.TranslationAdmin):
exclude = ("url", "email", "dynamic_default")

ma = TestModelAdmin(models.TestModel, self.site)
assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request, self.test_obj).base_fields.keys()) == tuple(fields)

# Using `fields` and `exclude`.
class TestModelAdmin(admin.TranslationAdmin):
fields = ["title", "url"]
exclude = ["url"]

ma = TestModelAdmin(models.TestModel, self.site)
assert tuple(ma.get_form(request).base_fields.keys()) == ("title_de", "title_en")
assert tuple(ma.get_form(self.request).base_fields.keys()) == ("title_de", "title_en")

# Using `fields` and `readonly_fields`.
class TestModelAdmin(admin.TranslationAdmin):
fields = ["title", "url"]
readonly_fields = ["url"]

ma = TestModelAdmin(models.TestModel, self.site)
assert tuple(ma.get_form(request).base_fields.keys()) == ("title_de", "title_en")
assert tuple(ma.get_form(self.request).base_fields.keys()) == ("title_de", "title_en")

# Using `readonly_fields`.
# Note: readonly fields are not included in the form.
class TestModelAdmin(admin.TranslationAdmin):
readonly_fields = ["title"]

ma = TestModelAdmin(models.TestModel, self.site)
assert tuple(ma.get_form(request).base_fields.keys()) == (
assert tuple(ma.get_form(self.request).base_fields.keys()) == (
"text_de",
"text_en",
"url_de",
Expand All @@ -155,7 +152,7 @@ class TestModelAdmin(admin.TranslationAdmin):
)

ma = TestModelAdmin(models.TestModel, self.site)
assert tuple(ma.get_form(request).base_fields.keys()) == (
assert tuple(ma.get_form(self.request).base_fields.keys()) == (
"title_de",
"title_en",
"url_de",
Expand All @@ -170,8 +167,8 @@ class TestModelAdmin(admin.TranslationAdmin):

ma = TestModelAdmin(models.TestModel, self.site)
fields = ["email_de", "email_en", "title_de", "title_en", "url_de", "url_en"]
assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request, self.test_obj).base_fields.keys()) == tuple(fields)

def test_field_arguments_restricted_on_custom_form(self):
# Using `fields`.
Expand All @@ -185,8 +182,8 @@ class TestModelAdmin(admin.TranslationAdmin):

ma = TestModelAdmin(models.TestModel, self.site)
fields = ["url_de", "url_en", "email_de", "email_en"]
assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request, self.test_obj).base_fields.keys()) == tuple(fields)

# Using `exclude`.
class TestModelForm(forms.ModelForm):
Expand All @@ -199,8 +196,8 @@ class TestModelAdmin(admin.TranslationAdmin):

ma = TestModelAdmin(models.TestModel, self.site)
fields = ["title_de", "title_en", "text_de", "text_en"]
assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request, self.test_obj).base_fields.keys()) == tuple(fields)

# If both, the custom form an the ModelAdmin define an `exclude`
# option, the ModelAdmin wins. This is Django behaviour.
Expand All @@ -210,8 +207,8 @@ class TestModelAdmin(admin.TranslationAdmin):

ma = TestModelAdmin(models.TestModel, self.site)
fields = ["title_de", "title_en", "text_de", "text_en", "email_de", "email_en"]
assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request, self.test_obj).base_fields.keys()) == tuple(fields)

# Same for `fields`.
class TestModelForm(forms.ModelForm):
Expand All @@ -225,8 +222,8 @@ class TestModelAdmin(admin.TranslationAdmin):

ma = TestModelAdmin(models.TestModel, self.site)
fields = ["email_de", "email_en"]
assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request, self.test_obj).base_fields.keys()) == tuple(fields)

def test_model_form_widgets(self):
class TestModelForm(forms.ModelForm):
Expand All @@ -244,14 +241,16 @@ class TestModelAdmin(admin.TranslationAdmin):

ma = TestModelAdmin(models.TestModel, self.site)
fields = ["text_de", "text_en"]
assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request, self.test_obj).base_fields.keys()) == tuple(fields)

for field in fields:
assert "myprop" in ma.get_form(request).base_fields.get(field).widget.attrs.keys()
assert "myprop" in ma.get_form(self.request).base_fields.get(field).widget.attrs.keys()
assert (
"myval"
in ma.get_form(request, self.test_obj).base_fields.get(field).widget.attrs.values()
in ma.get_form(self.request, self.test_obj)
.base_fields.get(field)
.widget.attrs.values()
)

def test_widget_ordering_via_formfield_for_dbfield(self):
Expand All @@ -262,18 +261,20 @@ def formfield_for_dbfield(self, db_field, request, **kwargs):
if isinstance(db_field, TextField):
kwargs["widget"] = forms.Textarea(attrs={"myprop": "myval"})
return db_field.formfield(**kwargs)
return super().formfield_for_dbfield(db_field, request, **kwargs)
return super().formfield_for_dbfield(db_field, self.request, **kwargs)

ma = TestModelAdmin(models.TestModel, self.site)
fields = ["text_de", "text_en"]
assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request, self.test_obj).base_fields.keys()) == tuple(fields)

for field in fields:
assert "myprop" in ma.get_form(request).base_fields.get(field).widget.attrs.keys()
assert "myprop" in ma.get_form(self.request).base_fields.get(field).widget.attrs.keys()
assert (
"myval"
in ma.get_form(request, self.test_obj).base_fields.get(field).widget.attrs.values()
in ma.get_form(self.request, self.test_obj)
.base_fields.get(field)
.widget.attrs.values()
)

def test_widget_classes_appended_by_formfield_for_dbfield(self):
Expand All @@ -290,7 +291,7 @@ class OneToOneFieldModelAdmin(admin.TranslationAdmin):
ma = ForeignKeyModelModelAdmin(models.ForeignKeyModel, self.site)
fields = ["test_de", "test_en"]
for field in fields:
widget = ma.get_form(request).base_fields.get(field).widget
widget = ma.get_form(self.request).base_fields.get(field).widget
# Django 5.1 Adds this attr, ignore it
widget.attrs.pop("data-context", None)
assert {} == widget.attrs
Expand Down Expand Up @@ -318,16 +319,18 @@ class DataTranslationOptions(translator.TranslationOptions):
fieldsets = [("Test", {"fields": ["data_de", "data_en"]})]

try:
ma_fieldsets = ma.get_inline_instances(request)[0].get_fieldsets(request)
ma_fieldsets = ma.get_inline_instances(self.request)[0].get_fieldsets(self.request)
except AttributeError: # Django 1.3 fallback
ma_fieldsets = ma.inlines[0](models.TestModel, self.site).get_fieldsets(request)
ma_fieldsets = ma.inlines[0](models.TestModel, self.site).get_fieldsets(self.request)
assert ma_fieldsets == fieldsets

try:
ma_fieldsets = ma.get_inline_instances(request)[0].get_fieldsets(request, self.test_obj)
ma_fieldsets = ma.get_inline_instances(self.request)[0].get_fieldsets(
self.request, self.test_obj
)
except AttributeError: # Django 1.3 fallback
ma_fieldsets = ma.inlines[0](models.TestModel, self.site).get_fieldsets(
request, self.test_obj
self.request, self.test_obj
)
assert ma_fieldsets == fieldsets

Expand Down Expand Up @@ -379,8 +382,8 @@ class MultitableModelBAdmin(admin.TranslationAdmin):
maa = MultitableModelAAdmin(models.MultitableModelA, self.site)
mab = MultitableModelBAdmin(models.MultitableModelB, self.site)

assert tuple(maa.get_form(request).base_fields.keys()) == ("titlea_de", "titlea_en")
assert tuple(mab.get_form(request).base_fields.keys()) == (
assert tuple(maa.get_form(self.request).base_fields.keys()) == ("titlea_de", "titlea_en")
assert tuple(mab.get_form(self.request).base_fields.keys()) == (
"titlea_de",
"titlea_en",
"titleb_de",
Expand All @@ -395,8 +398,8 @@ class GroupFieldsetsModelAdmin(admin.TranslationAdmin):

ma = GroupFieldsetsModelAdmin(models.GroupFieldsetsModel, self.site)
fields = ["title_de", "title_en"]
assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request, self.test_obj).base_fields.keys()) == tuple(fields)

# Now set group_fieldsets only
class GroupFieldsetsModelAdmin(admin.TranslationAdmin):
Expand All @@ -411,8 +414,8 @@ class GroupFieldsetsModelAdmin(admin.TranslationAdmin):
("Title", {"classes": ("mt-fieldset",), "fields": ["title_de", "title_en"]}),
("Text", {"classes": ("mt-fieldset",), "fields": ["text_de", "text_en"]}),
]
assert ma.get_fieldsets(request) == fieldsets
assert ma.get_fieldsets(request, self.test_obj) == fieldsets
assert ma.get_fieldsets(self.request) == fieldsets
assert ma.get_fieldsets(self.request, self.test_obj) == fieldsets

# Verify that other options are still taken into account

Expand All @@ -426,8 +429,8 @@ class GroupFieldsetsModelAdmin(admin.TranslationAdmin):
("Title", {"classes": ("mt-fieldset",), "fields": ["title_de", "title_en"]}),
("Text", {"classes": ("mt-fieldset",), "fields": ["text_de", "text_en"]}),
]
assert ma.get_fieldsets(request) == fieldsets
assert ma.get_fieldsets(request, self.test_obj) == fieldsets
assert ma.get_fieldsets(self.request) == fieldsets
assert ma.get_fieldsets(self.request, self.test_obj) == fieldsets

# Exclude a translation field
class GroupFieldsetsModelAdmin(admin.TranslationAdmin):
Expand All @@ -439,8 +442,8 @@ class GroupFieldsetsModelAdmin(admin.TranslationAdmin):
("", {"fields": ["email"]}),
("Title", {"classes": ("mt-fieldset",), "fields": ["title_de", "title_en"]}),
]
assert ma.get_fieldsets(request) == fieldsets
assert ma.get_fieldsets(request, self.test_obj) == fieldsets
assert ma.get_fieldsets(self.request) == fieldsets
assert ma.get_fieldsets(self.request, self.test_obj) == fieldsets

def test_prepopulated_fields(self):
trans_real.activate("de")
Expand Down Expand Up @@ -519,8 +522,8 @@ class ProxyTestModelAdmin(admin.TranslationAdmin):

ma = ProxyTestModelAdmin(models.ProxyTestModel, self.site)
fields = ["title_de", "title_en"]
assert tuple(ma.get_form(request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(request, self.test_obj).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request).base_fields.keys()) == tuple(fields)
assert tuple(ma.get_form(self.request, self.test_obj).base_fields.keys()) == tuple(fields)

def test_class_attribute_access_raises_type_error(self):
# Test for django-cms compatibility
Expand Down

0 comments on commit 85fc2cb

Please sign in to comment.