From bf3b62e2ff72e47a7c39d882051c0b435c72852f Mon Sep 17 00:00:00 2001 From: Joffrey F Date: Mon, 5 Jun 2017 16:57:09 -0700 Subject: [PATCH] Add configs tests Signed-off-by: Joffrey F --- tests/unit/bundle_test.py | 4 +- tests/unit/config/config_test.py | 168 ++++++++++++++++++++++++++++++- tests/unit/project_test.py | 12 +++ 3 files changed, 182 insertions(+), 2 deletions(-) diff --git a/tests/unit/bundle_test.py b/tests/unit/bundle_test.py index 21bdb31b0..3c6e9ec53 100644 --- a/tests/unit/bundle_test.py +++ b/tests/unit/bundle_test.py @@ -78,7 +78,9 @@ def test_to_bundle(): services=services, volumes={'special': {}}, networks={'extra': {}}, - secrets={}) + secrets={}, + configs={} + ) with mock.patch('compose.bundle.log.warn', autospec=True) as mock_log: output = bundle.to_bundle(config, image_digests) diff --git a/tests/unit/config/config_test.py b/tests/unit/config/config_test.py index d1160c767..d92a35c00 100644 --- a/tests/unit/config/config_test.py +++ b/tests/unit/config/config_test.py @@ -1982,6 +1982,38 @@ class ConfigTest(unittest.TestCase): actual = config.merge_service_dicts(base, override, V3_1) assert actual['secrets'] == override['secrets'] + def test_merge_different_configs(self): + base = { + 'image': 'busybox', + 'configs': [ + {'source': 'src.txt'} + ] + } + override = {'configs': ['other-src.txt']} + + actual = config.merge_service_dicts(base, override, V3_3) + assert secret_sort(actual['configs']) == secret_sort([ + {'source': 'src.txt'}, + {'source': 'other-src.txt'} + ]) + + def test_merge_configs_override(self): + base = { + 'image': 'busybox', + 'configs': ['src.txt'], + } + override = { + 'configs': [ + { + 'source': 'src.txt', + 'target': 'data.txt', + 'mode': 0o400 + } + ] + } + actual = config.merge_service_dicts(base, override, V3_3) + assert actual['configs'] == override['configs'] + def test_merge_deploy(self): base = { 'image': 'busybox', @@ -2214,6 +2246,91 @@ class ConfigTest(unittest.TestCase): ] assert service_sort(service_dicts) == service_sort(expected) + def test_load_configs(self): + base_file = config.ConfigFile( + 'base.yaml', + { + 'version': '3.3', + 'services': { + 'web': { + 'image': 'example/web', + 'configs': [ + 'one', + { + 'source': 'source', + 'target': 'target', + 'uid': '100', + 'gid': '200', + 'mode': 0o777, + }, + ], + }, + }, + 'configs': { + 'one': {'file': 'secret.txt'}, + }, + }) + details = config.ConfigDetails('.', [base_file]) + service_dicts = config.load(details).services + expected = [ + { + 'name': 'web', + 'image': 'example/web', + 'configs': [ + types.ServiceConfig('one', None, None, None, None), + types.ServiceConfig('source', 'target', '100', '200', 0o777), + ], + }, + ] + assert service_sort(service_dicts) == service_sort(expected) + + def test_load_configs_multi_file(self): + base_file = config.ConfigFile( + 'base.yaml', + { + 'version': '3.3', + 'services': { + 'web': { + 'image': 'example/web', + 'configs': ['one'], + }, + }, + 'configs': { + 'one': {'file': 'secret.txt'}, + }, + }) + override_file = config.ConfigFile( + 'base.yaml', + { + 'version': '3.3', + 'services': { + 'web': { + 'configs': [ + { + 'source': 'source', + 'target': 'target', + 'uid': '100', + 'gid': '200', + 'mode': 0o777, + }, + ], + }, + }, + }) + details = config.ConfigDetails('.', [base_file, override_file]) + service_dicts = config.load(details).services + expected = [ + { + 'name': 'web', + 'image': 'example/web', + 'configs': [ + types.ServiceConfig('one', None, None, None, None), + types.ServiceConfig('source', 'target', '100', '200', 0o777), + ], + }, + ] + assert service_sort(service_dicts) == service_sort(expected) + class NetworkModeTest(unittest.TestCase): @@ -2533,6 +2650,24 @@ class InterpolationTest(unittest.TestCase): } } + @mock.patch.dict(os.environ) + def test_interpolation_configs_section(self): + os.environ['FOO'] = 'baz.bar' + config_dict = config.load(build_config_details({ + 'version': '3.3', + 'configs': { + 'configdata': { + 'external': {'name': '$FOO'} + } + } + })) + assert config_dict.configs == { + 'configdata': { + 'external': {'name': 'baz.bar'}, + 'external_name': 'baz.bar' + } + } + class VolumeConfigTest(unittest.TestCase): @@ -3964,7 +4099,38 @@ class SerializeTest(unittest.TestCase): 'image': 'alpine', 'name': 'web' } - ], volumes={}, networks={}, secrets={}) + ], volumes={}, networks={}, secrets={}, configs={}) serialized_config = yaml.load(serialize_config(config_dict)) assert '8080:80/tcp' in serialized_config['services']['web']['ports'] + + def test_serialize_configs(self): + service_dict = { + 'image': 'example/web', + 'configs': [ + {'source': 'one'}, + { + 'source': 'source', + 'target': 'target', + 'uid': '100', + 'gid': '200', + 'mode': 0o777, + } + ] + } + configs_dict = { + 'one': {'file': '/one.txt'}, + 'source': {'file': '/source.pem'}, + 'two': {'external': True}, + } + config_dict = config.load(build_config_details({ + 'version': '3.3', + 'services': {'web': service_dict}, + 'configs': configs_dict + })) + + serialized_config = yaml.load(serialize_config(config_dict)) + serialized_service = serialized_config['services']['web'] + assert secret_sort(serialized_service['configs']) == secret_sort(service_dict['configs']) + assert 'configs' in serialized_config + assert serialized_config['configs']['two'] == configs_dict['two'] diff --git a/tests/unit/project_test.py b/tests/unit/project_test.py index 32d0adfaf..c5366c395 100644 --- a/tests/unit/project_test.py +++ b/tests/unit/project_test.py @@ -37,6 +37,7 @@ class ProjectTest(unittest.TestCase): networks=None, volumes=None, secrets=None, + configs=None, ) project = Project.from_config( name='composetest', @@ -66,6 +67,7 @@ class ProjectTest(unittest.TestCase): networks=None, volumes=None, secrets=None, + configs=None, ) project = Project.from_config('composetest', config, None) self.assertEqual(len(project.services), 2) @@ -173,6 +175,7 @@ class ProjectTest(unittest.TestCase): networks=None, volumes=None, secrets=None, + configs=None, ), ) assert project.get_service('test')._get_volumes_from() == [container_id + ":rw"] @@ -206,6 +209,7 @@ class ProjectTest(unittest.TestCase): networks=None, volumes=None, secrets=None, + configs=None, ), ) assert project.get_service('test')._get_volumes_from() == [container_name + ":rw"] @@ -232,6 +236,7 @@ class ProjectTest(unittest.TestCase): networks=None, volumes=None, secrets=None, + configs=None, ), ) with mock.patch.object(Service, 'containers') as mock_return: @@ -366,6 +371,7 @@ class ProjectTest(unittest.TestCase): networks=None, volumes=None, secrets=None, + configs=None, ), ) service = project.get_service('test') @@ -391,6 +397,7 @@ class ProjectTest(unittest.TestCase): networks=None, volumes=None, secrets=None, + configs=None, ), ) service = project.get_service('test') @@ -425,6 +432,7 @@ class ProjectTest(unittest.TestCase): networks=None, volumes=None, secrets=None, + configs=None, ), ) @@ -446,6 +454,7 @@ class ProjectTest(unittest.TestCase): networks=None, volumes=None, secrets=None, + configs=None, ), ) @@ -467,6 +476,7 @@ class ProjectTest(unittest.TestCase): networks={'custom': {}}, volumes=None, secrets=None, + configs=None, ), ) @@ -498,6 +508,7 @@ class ProjectTest(unittest.TestCase): networks=None, volumes=None, secrets=None, + configs=None, ), ) self.assertEqual([c.id for c in project.containers()], ['1']) @@ -515,6 +526,7 @@ class ProjectTest(unittest.TestCase): networks={'default': {}}, volumes={'data': {}}, secrets=None, + configs=None, ), ) self.mock_client.remove_network.side_effect = NotFound(None, None, 'oops')