Files
heinzel d9cfffb8c2
Run tests / Execute tox to run the test suite (push) Successful in 3m29s
dav_base: cosmetics
2026-05-28 14:51:49 +02:00

241 lines
8.9 KiB
Python

# -*- 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')
self.assertEqual(mm.root_url_name, 'dav_base_tests_fake_app1:root')
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'
app_namespace = app_name.replace('.', '_')
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)
self.assertEqual(mm.url_namespace, app_namespace)
self.assertEqual(mm.root_url_name, app_namespace + ':root')
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_str(self):
app_name = 'dav_base.tests.fake_app1'
mm = ModuleMeta(app_name)
self.assertEqual(str(mm), '- {}'.format(app_name))
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',
}
expected_namespace = dd['package'].replace('.', '_')
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, expected_namespace)
self.assertEqual(mm.root_url_name, expected_namespace + ':root')
dd = {'package': 'dav_base2.bar'}
expected_namespace = dd['package'].replace('.', '_')
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'])
self.assertEqual(mm.url_namespace, expected_namespace)
self.assertEqual(mm.root_url_name, expected_namespace + ':root')
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(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)
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_overwrite(self):
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))
mc.modules['mod1'] = ModuleMeta('mod1', load=False)
mc.save()
with open(self.config_file, 'r', encoding='ascii') as f:
config_data = json.load(f)
self.assertEqual(config_data, {'modules': [{'package': 'mod1'}]})