232 lines
8.4 KiB
Python
232 lines
8.4 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')
|
|
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_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',
|
|
}
|
|
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(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'}]})
|
|
|