dav_base: added tests for dav_base.config.modules.ModuleConfig
Run tests / Execute tox to run the test suite (push) Successful in 3m31s
Run tests / Execute tox to run the test suite (push) Successful in 3m31s
This commit is contained in:
@@ -17,11 +17,12 @@ class ModuleMeta:
|
|||||||
_json_file = 'module.json'
|
_json_file = 'module.json'
|
||||||
_root_url_name = 'root'
|
_root_url_name = 'root'
|
||||||
|
|
||||||
def __init__(self, package_name):
|
def __init__(self, package_name, load=True):
|
||||||
self._package_name = package_name
|
self._package_name = package_name
|
||||||
self._app_config = None
|
self._app_config = None
|
||||||
self._additional_apps = []
|
self._additional_apps = []
|
||||||
self._url_prefix = None
|
self._url_prefix = None
|
||||||
|
if load:
|
||||||
self._load_from_package()
|
self._load_from_package()
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
@@ -123,7 +124,7 @@ class ModuleConfig:
|
|||||||
if 'modules' in data:
|
if 'modules' in data:
|
||||||
for meta_dict in data['modules']:
|
for meta_dict in data['modules']:
|
||||||
module_name = meta_dict['package']
|
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._modules[module_name].load_from_dict(meta_dict)
|
||||||
|
|
||||||
self._loaded = True
|
self._loaded = True
|
||||||
|
|||||||
@@ -2,10 +2,8 @@
|
|||||||
from django.apps import apps
|
from django.apps import apps
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
from django.test import SimpleTestCase
|
from django.test import SimpleTestCase
|
||||||
from django.urls import URLResolver
|
|
||||||
|
|
||||||
from ..config.apps import DefaultSetting, AppSettings, AppConfig
|
from ..config.apps import DefaultSetting, AppSettings, AppConfig
|
||||||
from ..config.modules import ModuleMeta
|
|
||||||
from ..apps import AppConfig as RealAppConfig
|
from ..apps import AppConfig as RealAppConfig
|
||||||
|
|
||||||
TEST_SETTING_VALUE = 'do not change this value'
|
TEST_SETTING_VALUE = 'do not change this value'
|
||||||
@@ -171,61 +169,3 @@ class AppConfigTestCase(SimpleTestCase):
|
|||||||
self.assertEqual(app_config.__class__, RealAppConfig)
|
self.assertEqual(app_config.__class__, RealAppConfig)
|
||||||
self.assertIsInstance(app_config, AppConfig)
|
self.assertIsInstance(app_config, AppConfig)
|
||||||
self.assertEqual(app_config.settings.__class__, AppSettings)
|
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
|
|
||||||
@@ -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)
|
||||||
Reference in New Issue
Block a user