This commit is contained in:
lwark
2025-09-17 07:52:16 -05:00
commit a2ff72dda8
584 changed files with 52247 additions and 0 deletions

115
tests/core/test_checks.py Normal file
View File

@@ -0,0 +1,115 @@
import copy
from django.conf import settings
from django.core.checks import Error
from django.core.checks import registry
from django.test import TestCase
from wiki.checks import FIELDS_IN_CUSTOM_USER_MODEL
from wiki.checks import REQUIRED_CONTEXT_PROCESSORS
from wiki.checks import REQUIRED_INSTALLED_APPS
from wiki.checks import Tags
from ..base import wiki_override_settings
def _remove(settings, arg):
return [setting for setting in settings if not setting.startswith(arg)]
class CheckTests(TestCase):
def test_required_installed_apps(self):
for app in REQUIRED_INSTALLED_APPS:
with self.settings(
INSTALLED_APPS=_remove(settings.INSTALLED_APPS, app[0])
):
errors = registry.run_checks(
tags=[Tags.required_installed_apps]
)
expected_errors = [
Error(
"needs %s in INSTALLED_APPS" % app[1],
id="wiki.%s" % app[2],
)
]
self.assertEqual(errors, expected_errors)
def test_required_context_processors(self):
for context_processor in REQUIRED_CONTEXT_PROCESSORS:
TEMPLATES = copy.deepcopy(settings.TEMPLATES)
TEMPLATES[0]["OPTIONS"]["context_processors"] = [
cp
for cp in TEMPLATES[0]["OPTIONS"]["context_processors"]
if cp != context_processor[0]
]
with self.settings(TEMPLATES=TEMPLATES):
errors = registry.run_checks(tags=[Tags.context_processors])
expected_errors = [
Error(
"needs %s in TEMPLATES[*]['OPTIONS']['context_processors']"
% context_processor[0],
id="wiki.%s" % context_processor[1],
)
]
self.assertEqual(errors, expected_errors)
def test_custom_user_model_mitigation_required(self):
"""
Django check django.forms.ModelForm.Meta on definition, and raises an error if Meta.fields don't exist in Meta.model.
This causes problems in wiki.forms.UserCreationForm and wiki.forms.UserUpdateForm when a custom user model doesn't have fields django-wiki assumes.
There is some code in wiki.forms that detects this situation.
This check asserts that Django are still raising an exception on definition, and asserts the mitigation code in wiki.forms,
and that test_check_for_fields_in_custom_user_model below are required.
"""
from django.core.exceptions import FieldError
from django import forms
from ..testdata.models import VeryCustomUser
with self.assertRaisesRegex(
FieldError,
"Unknown field\\(s\\) \\((email|username|, )+\\) specified for VeryCustomUser",
):
class UserUpdateForm(forms.ModelForm):
class Meta:
model = VeryCustomUser
fields = ["username", "email"]
def test_check_for_fields_in_custom_user_model(self):
from django.contrib.auth import get_user_model
with wiki_override_settings(
WIKI_ACCOUNT_HANDLING=False,
AUTH_USER_MODEL="testdata.VeryCustomUser",
):
errors = registry.run_checks(
tags=[Tags.fields_in_custom_user_model]
)
self.assertEqual(errors, [])
with wiki_override_settings(
WIKI_ACCOUNT_HANDLING=True,
AUTH_USER_MODEL="testdata.VeryCustomUser",
):
errors = registry.run_checks(
tags=[Tags.fields_in_custom_user_model]
)
expected_errors = [
Error(
"%s.%s.%s refers to a field that is not of type %s"
% (
get_user_model().__module__,
get_user_model().__name__,
field_fetcher,
required_field_type,
),
hint="If you have your own login/logout views, turn off settings.WIKI_ACCOUNT_HANDLING",
obj=get_user_model(),
id="wiki.%s" % error_code,
)
for check_function_name, field_fetcher, required_field_type, error_code in FIELDS_IN_CUSTOM_USER_MODEL
]
self.assertEqual(errors, expected_errors)
with wiki_override_settings(WIKI_ACCOUNT_HANDLING=True):
errors = registry.run_checks(
tags=[Tags.fields_in_custom_user_model]
)
self.assertEqual(errors, [])