From 8d0069a9e682125b4800a2de87ef89c01382c521 Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Thu, 21 May 2026 13:38:34 +0200 Subject: [PATCH] Improved tests for app settings and added tests for dav_base.config.modules.ModuleMeta --- dav_auth/tests/test_apps.py | 4 +-- dav_base/tests/fake_app1/__init__.py | 0 dav_base/tests/fake_app1/module.json | 4 +++ dav_base/tests/fake_app1/urls.py | 8 +++++ dav_base/tests/generic.py | 26 +++++++++++--- dav_base/tests/test_apps.py | 6 ++-- dav_base/tests/test_config.py | 54 ++++++++++++++++++++++++++-- dav_events/tests/test_apps.py | 37 +++++++++---------- dav_registration/tests/test_apps.py | 3 +- 9 files changed, 110 insertions(+), 32 deletions(-) create mode 100644 dav_base/tests/fake_app1/__init__.py create mode 100644 dav_base/tests/fake_app1/module.json create mode 100644 dav_base/tests/fake_app1/urls.py diff --git a/dav_auth/tests/test_apps.py b/dav_auth/tests/test_apps.py index 16b5c63..43b0be7 100644 --- a/dav_auth/tests/test_apps.py +++ b/dav_auth/tests/test_apps.py @@ -8,6 +8,6 @@ class TestCase(AppsTestCase): app_config = apps.get_app_config('dav_auth') settings = ( - AppSetting('login_redirect_url', string_types), - AppSetting('logout_redirect_url', string_types), + AppSetting('login_redirect_url', 'root', string_types), + AppSetting('logout_redirect_url', 'root', string_types), ) diff --git a/dav_base/tests/fake_app1/__init__.py b/dav_base/tests/fake_app1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/dav_base/tests/fake_app1/module.json b/dav_base/tests/fake_app1/module.json new file mode 100644 index 0000000..ee1444f --- /dev/null +++ b/dav_base/tests/fake_app1/module.json @@ -0,0 +1,4 @@ +{ + "url_prefix": "test", + "app_config": ".apps.AppConfig" +} diff --git a/dav_base/tests/fake_app1/urls.py b/dav_base/tests/fake_app1/urls.py new file mode 100644 index 0000000..61d700d --- /dev/null +++ b/dav_base/tests/fake_app1/urls.py @@ -0,0 +1,8 @@ +from django.urls import re_path +from django.views import generic + +app_name = 'fake_app' + +urlpatterns = [ + re_path(r'^$', generic.TemplateView.as_view(), name='root'), +] diff --git a/dav_base/tests/generic.py b/dav_base/tests/generic.py index 0320976..8f8b1ff 100644 --- a/dav_base/tests/generic.py +++ b/dav_base/tests/generic.py @@ -12,10 +12,13 @@ from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as ExpectedConditions +from ..config.apps import DefaultSetting + class AppSetting: # pylint: disable=too-few-public-methods - def __init__(self, name, of=None): + def __init__(self, name, default, of=None): self.name = name + self.default = default self.of = of @@ -26,16 +29,29 @@ class AppsTestCase(SimpleTestCase): def setUp(self): super().setUp() if self.app_config: + self.default_settings = self.app_config.default_settings self.configured_settings = self.app_config.settings else: + self.default_settings = () self.configured_settings = None - def test_settings(self): - config = self.configured_settings + def test_defaults(self): + defaults = {} + for d in self.default_settings: + self.assertIsInstance(d, DefaultSetting) + defaults[d.name] = d.value + for setting in self.settings: name = setting.name - self.assertTrue(hasattr(config, name), 'Settings do not contain {}'.format(name)) - value = getattr(config, name) + self.assertIn(name, defaults.keys()) + self.assertEqual(defaults[name], setting.default, 'Default value of {} is not correct'.format(name)) + + def test_configured_settings(self): + for setting in self.settings: + name = setting.name + self.assertTrue(hasattr(self.configured_settings, name), 'Settings do not contain {}'.format(name)) + + value = getattr(self.configured_settings, name) of = setting.of if of is not None: self.assertIsInstance(value, of) diff --git a/dav_base/tests/test_apps.py b/dav_base/tests/test_apps.py index a210d65..f7aaf17 100644 --- a/dav_base/tests/test_apps.py +++ b/dav_base/tests/test_apps.py @@ -8,7 +8,7 @@ class TestCase(AppsTestCase): app_config = apps.get_app_config('dav_base') settings = ( - AppSetting('email_sender', string_types), - AppSetting('email_base_url', string_types), - AppSetting('email_subject_prefix', string_types), + AppSetting('email_sender', None, string_types), + AppSetting('email_base_url', None, string_types), + AppSetting('email_subject_prefix', '', string_types), ) diff --git a/dav_base/tests/test_config.py b/dav_base/tests/test_config.py index 1ea107d..07d04fb 100644 --- a/dav_base/tests/test_config.py +++ b/dav_base/tests/test_config.py @@ -2,8 +2,10 @@ from django.apps import apps from django.core.exceptions import ImproperlyConfigured from django.test import SimpleTestCase +from django.urls import URLResolver from ..config.apps import DefaultSetting, AppSettings, AppConfig +from ..config.modules import ModuleMeta from ..apps import AppConfig as RealAppConfig TEST_SETTING_VALUE = 'do not change this value' @@ -172,9 +174,55 @@ class AppConfigTestCase(SimpleTestCase): class ModuleMetaTestCase(SimpleTestCase): - def test_some(self): - # TODO - pass + def test_init(self): + mm = ModuleMeta('dav_base.tests.fake_app1') + self.assertEqual(mm.package, 'dav_base.tests.fake_app1') + self.assertEqual(mm.app, 'dav_base.tests.fake_app1.apps.AppConfig') + self.assertEqual(mm.additional_apps, []) + self.assertEqual(mm.url_prefix, 'test') + self.assertEqual(mm.url_namespace, 'dav_base_tests_fake_app1') + pattern = mm.url_conf_pattern + self.assertIsInstance(pattern, URLResolver) + self.assertEqual('^test/', str(pattern.pattern)) + + def test_cannot_include_urls(self): + mm = ModuleMeta('dav_base.tests.fake_app1') + dd = {'package': 'dav_base'} + mm.load_from_dict(dd) + with self.assertRaises(ImproperlyConfigured): + _ = mm.url_conf_pattern + + def test_load_from_dict(self): + mm = ModuleMeta('dav_base.tests.fake_app1') + dd = {'package': 'dav_base2.foo', + 'app_config': 'MyApp.MyAppConfig', + 'additional_apps': ['test1', 'test2.subtest'], + 'url_prefix': 'test_url_prefix', + } + mm.load_from_dict(dd) + self.assertEqual(mm.package, dd['package']) + self.assertEqual(mm.app, dd['app_config']) + self.assertEqual(mm.additional_apps, dd['additional_apps']) + self.assertEqual(mm.url_prefix, dd['url_prefix']) + self.assertEqual(mm.url_namespace, dd['package'].replace('.', '_')) + + dd = {'package': 'dav_base2.bar'} + mm.load_from_dict(dd) + self.assertEqual(mm.url_prefix, dd['package']) + self.assertEqual(mm.app, dd['package']) + self.assertEqual(mm.additional_apps, []) + self.assertEqual(mm.url_prefix, dd['package']) + + def test_dump_as_dict(self): + mm = ModuleMeta('dav_base.tests.fake_app1') + dd_in = {'package': 'dav_base2.foo', + 'app_config': '.mymod.MyAppConfig', + 'additional_apps': ['test1'], + 'url_prefix': 'test_url_prefix', + } + mm.load_from_dict(dd_in) + dd_out = mm.dump_as_dict() + self.assertEqual(dd_in, dd_out) class ModuleConfigTestCase(SimpleTestCase): diff --git a/dav_events/tests/test_apps.py b/dav_events/tests/test_apps.py index a61d99a..594ef11 100644 --- a/dav_events/tests/test_apps.py +++ b/dav_events/tests/test_apps.py @@ -1,4 +1,5 @@ from django.apps import apps +from django.core.exceptions import ImproperlyConfigured from dav_base.tests.generic import AppSetting, AppsTestCase @@ -7,22 +8,22 @@ class TestCase(AppsTestCase): app_config = apps.get_app_config('dav_events') settings = ( - AppSetting('enable_email_on_status_update', bool), - AppSetting('enable_email_on_update', bool), - AppSetting('enable_email_on_registration_closed', bool), - AppSetting('groups_manager_super', list), - AppSetting('groups_manager_w', list), - AppSetting('groups_manager_s', list), - AppSetting('groups_manager_m', list), - AppSetting('groups_manager_k', list), - AppSetting('groups_manager_b', list), - AppSetting('groups_publisher_print', list), - AppSetting('groups_publisher_web', list), - AppSetting('groups_publisher_facebook', list), - AppSetting('forms_development_init', bool), - AppSetting('form_initials', dict), - AppSetting('matrix_config', dict), - AppSetting('publish_before_begin_days', int), - AppSetting('publish_before_deadline_days', int), - AppSetting('publish_issues', list), + AppSetting('enable_email_on_status_update', False, bool), + AppSetting('enable_email_on_update', False, bool), + AppSetting('enable_email_on_registration_closed', False, bool), + AppSetting('groups_manager_super', [], list), + AppSetting('groups_manager_w', [], list), + AppSetting('groups_manager_s', [], list), + AppSetting('groups_manager_m', [], list), + AppSetting('groups_manager_k', [], list), + AppSetting('groups_manager_b', [], list), + AppSetting('groups_publisher_print', [], list), + AppSetting('groups_publisher_web', [], list), + AppSetting('groups_publisher_facebook', [], list), + AppSetting('forms_development_init', False, bool), + AppSetting('form_initials', {}, dict), + AppSetting('matrix_config', ImproperlyConfigured, dict), + AppSetting('publish_before_begin_days', 10, int), + AppSetting('publish_before_deadline_days', 7, int), + AppSetting('publish_issues', [], list), ) diff --git a/dav_registration/tests/test_apps.py b/dav_registration/tests/test_apps.py index aaf8fa4..a247464 100644 --- a/dav_registration/tests/test_apps.py +++ b/dav_registration/tests/test_apps.py @@ -1,4 +1,5 @@ from django.apps import apps +from django.core.exceptions import ImproperlyConfigured from six import string_types from dav_base.tests.generic import AppSetting, AppsTestCase @@ -8,5 +9,5 @@ class TestCase(AppsTestCase): app_config = apps.get_app_config('dav_registration') settings = ( - AppSetting('privacy_policy', string_types), + AppSetting('privacy_policy', ImproperlyConfigured, string_types), )