dav_base: added tests for dav_base.config.modules.ModuleConfig
Run tests / Execute tox to run the test suite (push) Successful in 3m31s

This commit is contained in:
2026-05-21 15:38:50 +02:00
parent 8d0069a9e6
commit b2154976ca
3 changed files with 215 additions and 63 deletions
+4 -3
View File
@@ -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
@@ -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
+211
View File
@@ -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)