From b2154976ca8773a47497f92d192769fb3a172c5a Mon Sep 17 00:00:00 2001 From: Jens Kleineheismann Date: Thu, 21 May 2026 15:38:50 +0200 Subject: [PATCH] dav_base: added tests for dav_base.config.modules.ModuleConfig --- dav_base/config/modules.py | 7 +- .../{test_config.py => test_config_apps.py} | 60 ----- dav_base/tests/test_config_modules.py | 211 ++++++++++++++++++ 3 files changed, 215 insertions(+), 63 deletions(-) rename dav_base/tests/{test_config.py => test_config_apps.py} (73%) create mode 100644 dav_base/tests/test_config_modules.py diff --git a/dav_base/config/modules.py b/dav_base/config/modules.py index f0bfcd9..18b6747 100644 --- a/dav_base/config/modules.py +++ b/dav_base/config/modules.py @@ -17,12 +17,13 @@ class ModuleMeta: _json_file = 'module.json' _root_url_name = 'root' - def __init__(self, package_name): + def __init__(self, package_name, load=True): self._package_name = package_name self._app_config = None self._additional_apps = [] self._url_prefix = None - self._load_from_package() + if load: + self._load_from_package() def __str__(self): t = '- {}'.format(self._package_name) @@ -123,7 +124,7 @@ class ModuleConfig: if 'modules' in data: for meta_dict in data['modules']: module_name = meta_dict['package'] - self._modules[module_name] = ModuleMeta(module_name) + self._modules[module_name] = ModuleMeta(module_name, load=False) self._modules[module_name].load_from_dict(meta_dict) self._loaded = True diff --git a/dav_base/tests/test_config.py b/dav_base/tests/test_config_apps.py similarity index 73% rename from dav_base/tests/test_config.py rename to dav_base/tests/test_config_apps.py index 07d04fb..d975055 100644 --- a/dav_base/tests/test_config.py +++ b/dav_base/tests/test_config_apps.py @@ -2,10 +2,8 @@ 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' @@ -171,61 +169,3 @@ class AppConfigTestCase(SimpleTestCase): self.assertEqual(app_config.__class__, RealAppConfig) self.assertIsInstance(app_config, AppConfig) self.assertEqual(app_config.settings.__class__, AppSettings) - - -class ModuleMetaTestCase(SimpleTestCase): - 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): - def test_some(self): - # TODO - pass diff --git a/dav_base/tests/test_config_modules.py b/dav_base/tests/test_config_modules.py new file mode 100644 index 0000000..00571cc --- /dev/null +++ b/dav_base/tests/test_config_modules.py @@ -0,0 +1,211 @@ +# -*- coding: utf-8 -*- +import datetime +import json +import os +import shutil +from unittest.mock import patch +from django.core.exceptions import ImproperlyConfigured +from django.test import SimpleTestCase +from django.urls import URLResolver + +from ..config.modules import ModuleMeta, ModuleConfig + +from .utils import mkdtemp + +TMP_BASE_DIR = os.path.join(os.path.dirname(os.path.dirname(os.path.abspath(__file__))), 'tmp') + + +class ModuleMetaTestCase(SimpleTestCase): + 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_module_not_exists(self): + with self.assertRaises(ModuleNotFoundError): + _ = ModuleMeta('dav_base.tests.non_existent_app') + + def test_init_without_load(self): + app_name = 'dav_base.tests.non_existent_app' + mm = ModuleMeta(app_name, load=False) + self.assertEqual(mm.package, app_name) + self.assertEqual(mm.app, app_name) + self.assertEqual(mm.url_prefix, app_name) + + def test_url_config_not_exists(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): + def setUp(self): + prefix = 'dav_base.tests.test_config_modules-{datetime}-'.format( + datetime=datetime.datetime.now().strftime('%Y%m%d-%H%M') + ) + self.temp_dir = mkdtemp(prefix=prefix, base_dir=TMP_BASE_DIR) + + self.config_dir = os.path.join(self.temp_dir, 'main') + os.makedirs(self.config_dir) + self.config_file = os.path.join(self.config_dir, 'module_config.json') + + def tearDown(self): + shutil.rmtree(self.temp_dir) + + def test_default_config_file_not_exists(self): + with patch('dav_base.config.modules.settings') as mock_settings: + mock_settings.BASE_DIR = self.temp_dir + mc = ModuleConfig() + self.assertEqual(mc.modules, {}) + + def test_default_config_file_exists(self): + config_data = { + 'modules': [ + {'package': 'pkg1'}, + {'package': 'pkg2'}, + ] + } + + with open(self.config_file, 'w', encoding='ascii') as f: + json.dump(config_data, f) + + with patch('dav_base.config.modules.settings') as mock_settings: + mock_settings.BASE_DIR = self.temp_dir + mc = ModuleConfig() + self.assertEqual(list(mc.modules.keys()), ['pkg1', 'pkg2']) + + def test_django_base_dir_parameter(self): + config_data = { + 'modules': [ + {'package': 'pkgA'}, + {'package': 'pkgB'}, + ] + } + + with open(self.config_file, 'w', encoding='ascii') as f: + json.dump(config_data, f) + + with patch('dav_base.config.modules.settings') as mock_settings: + mock_settings.BASE_DIR = self.config_dir # No config file there + + mc = ModuleConfig() + self.assertEqual(mc.modules, {}) + + mc = ModuleConfig(django_base_dir=self.temp_dir) + self.assertEqual(list(mc.modules.keys()), ['pkgA', 'pkgB']) + + def test_custom_config_file_path(self): + config_data = { + 'modules': [ + {'package': 'pkgX'}, + {'package': 'pkgY'}, + ] + } + + config_file = os.path.join(self.config_dir, 'test.json') + with open(config_file, 'w', encoding='ascii') as f: + json.dump(config_data, f) + + with patch('dav_base.config.modules.settings') as mock_settings: + mock_settings.BASE_DIR = self.temp_dir + mc = ModuleConfig(config_file_path=config_file) + self.assertEqual(list(mc.modules.keys()), ['pkgX', 'pkgY']) + + def test_custom_config_file_path_and_django_base_dir(self): + config_data = { + 'modules': [ + {'package': 'pkg11'}, + {'package': 'pkg22'}, + ] + } + + config_file = os.path.join(self.config_dir, 'test.json') + with open(config_file, 'w', encoding='ascii') as f: + json.dump(config_data, f) + + with patch('dav_base.config.modules.settings') as mock_settings: + mock_settings.BASE_DIR = self.temp_dir + mc = ModuleConfig(config_file_path=config_file, django_base_dir=self.config_dir) + self.assertEqual(list(mc.modules.keys()), ['pkg11', 'pkg22']) + + def test_save_empty(self): + self.assertFalse(os.path.exists(self.config_file)) + with patch('dav_base.config.modules.settings') as mock_settings: + mock_settings.BASE_DIR = self.temp_dir + mc = ModuleConfig() + mc.save() + self.assertTrue(os.path.isfile(self.config_file)) + + with open(self.config_file, 'r', encoding='ascii') as f: + config_data = json.load(f) + + self.assertEqual(config_data, {'modules': []}) + + def test_save(self): + config_data = { + 'modules': [ + {'package': 'pkg_foo'}, + {'package': 'pkg_bar'}, + {'package': 'pkg_baz'}, + {'package': 'pkg_quux', 'url_prefix': 'quux'}, + ] + } + copy_modules = ['pkg_bar', 'pkg_quux'] + expected_config_data = {'modules': [d for d in config_data['modules'] if d['package'] in copy_modules]} + + config_file = os.path.join(self.config_dir, 'test.json') + with open(config_file, 'w', encoding='ascii') as f: + json.dump(config_data, f) + + with patch('dav_base.config.modules.settings') as mock_settings: + mock_settings.BASE_DIR = self.temp_dir + mc1 = ModuleConfig() + mc2 = ModuleConfig(config_file_path=config_file) + for module_name in copy_modules: + mc1.modules[module_name] = mc2.modules[module_name] + mc1.save() + + with open(self.config_file, 'r', encoding='ascii') as f: + config_data = json.load(f) + + self.assertEqual(config_data, expected_config_data)