diff --git a/heatclient/tests/unit/test_template_utils.py b/heatclient/tests/unit/test_template_utils.py index 7de72b57..a48e0b36 100644 --- a/heatclient/tests/unit/test_template_utils.py +++ b/heatclient/tests/unit/test_template_utils.py @@ -15,10 +15,9 @@ import base64 import json import tempfile -import mox +import mock import six from six.moves.urllib import error -from six.moves.urllib import request import testtools from testtools import matchers import yaml @@ -32,30 +31,24 @@ class ShellEnvironmentTest(testtools.TestCase): template_a = b'{"heat_template_version": "2013-05-23"}' - def setUp(self): - super(ShellEnvironmentTest, self).setUp() - self.m = mox.Mox() - - self.addCleanup(self.m.VerifyAll) - self.addCleanup(self.m.UnsetStubs) - def collect_links(self, env, content, url, env_base_url=''): - jenv = yaml.safe_load(env) files = {} if url: - self.m.StubOutWithMock(request, 'urlopen') - request.urlopen(url).AndReturn(six.BytesIO(content)) - request.urlopen(url).AndReturn(six.BytesIO(content)) - self.m.ReplayAll() + def side_effect(args): + if url == args: + return six.BytesIO(content) + with mock.patch('six.moves.urllib.request.urlopen') as mock_url: + mock_url.side_effect = side_effect + template_utils.resolve_environment_urls( + jenv.get('resource_registry'), files, env_base_url) + self.assertEqual(content.decode('utf-8'), files[url]) + else: + template_utils.resolve_environment_urls( + jenv.get('resource_registry'), files, env_base_url) - template_utils.resolve_environment_urls( - jenv.get('resource_registry'), files, env_base_url) - if url: - self.assertEqual(content.decode('utf-8'), files[url]) - - def test_ignore_env_keys(self): - self.m.StubOutWithMock(request, 'urlopen') + @mock.patch('six.moves.urllib.request.urlopen') + def test_ignore_env_keys(self, mock_url): env_file = '/home/my/dir/env.yaml' env = b''' resource_registry: @@ -64,9 +57,7 @@ class ShellEnvironmentTest(testtools.TestCase): hooks: pre_create restricted_actions: replace ''' - request.urlopen('file://%s' % env_file).AndReturn( - six.BytesIO(env)) - self.m.ReplayAll() + mock_url.return_value = six.BytesIO(env) _, env_dict = template_utils.process_environment_and_files( env_file) self.assertEqual( @@ -74,24 +65,18 @@ class ShellEnvironmentTest(testtools.TestCase): u'bar': {u'hooks': u'pre_create', u'restricted_actions': u'replace'}}}}, env_dict) - self.m.VerifyAll() + mock_url.assert_called_with('file://%s' % env_file) - def test_process_environment_file(self): + @mock.patch('six.moves.urllib.request.urlopen') + def test_process_environment_file(self, mock_url): - self.m.StubOutWithMock(request, 'urlopen') env_file = '/home/my/dir/env.yaml' env = b''' resource_registry: "OS::Thingy": "file:///home/b/a.yaml" ''' - - request.urlopen('file://%s' % env_file).AndReturn( - six.BytesIO(env)) - request.urlopen('file:///home/b/a.yaml').AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file:///home/b/a.yaml').AndReturn( - six.BytesIO(self.template_a)) - self.m.ReplayAll() + mock_url.side_effect = [six.BytesIO(env), six.BytesIO(self.template_a), + six.BytesIO(self.template_a)] files, env_dict = template_utils.process_environment_and_files( env_file) @@ -101,10 +86,15 @@ class ShellEnvironmentTest(testtools.TestCase): env_dict) self.assertEqual(self.template_a.decode('utf-8'), files['file:///home/b/a.yaml']) + mock_url.assert_has_calls([ + mock.call('file://%s' % env_file), + mock.call('file:///home/b/a.yaml'), + mock.call('file:///home/b/a.yaml') + ]) - def test_process_environment_relative_file(self): + @mock.patch('six.moves.urllib.request.urlopen') + def test_process_environment_relative_file(self, mock_url): - self.m.StubOutWithMock(request, 'urlopen') env_file = '/home/my/dir/env.yaml' env_url = 'file:///home/my/dir/env.yaml' env = b''' @@ -112,13 +102,8 @@ class ShellEnvironmentTest(testtools.TestCase): "OS::Thingy": a.yaml ''' - request.urlopen(env_url).AndReturn( - six.BytesIO(env)) - request.urlopen('file:///home/my/dir/a.yaml').AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file:///home/my/dir/a.yaml').AndReturn( - six.BytesIO(self.template_a)) - self.m.ReplayAll() + mock_url.side_effect = [six.BytesIO(env), six.BytesIO(self.template_a), + six.BytesIO(self.template_a)] self.assertEqual( env_url, @@ -136,24 +121,23 @@ class ShellEnvironmentTest(testtools.TestCase): env_dict) self.assertEqual(self.template_a.decode('utf-8'), files['file:///home/my/dir/a.yaml']) + mock_url.assert_has_calls([ + mock.call(env_url), + mock.call('file:///home/my/dir/a.yaml'), + mock.call('file:///home/my/dir/a.yaml') + ]) - def test_process_environment_relative_file_up(self): + @mock.patch('six.moves.urllib.request.urlopen') + def test_process_environment_relative_file_up(self, mock_url): - self.m.StubOutWithMock(request, 'urlopen') env_file = '/home/my/dir/env.yaml' env_url = 'file:///home/my/dir/env.yaml' env = b''' resource_registry: "OS::Thingy": ../bar/a.yaml ''' - - request.urlopen(env_url).AndReturn( - six.BytesIO(env)) - request.urlopen('file:///home/my/bar/a.yaml').AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file:///home/my/bar/a.yaml').AndReturn( - six.BytesIO(self.template_a)) - self.m.ReplayAll() + mock_url.side_effect = [six.BytesIO(env), six.BytesIO(self.template_a), + six.BytesIO(self.template_a)] env_url = 'file://%s' % env_file self.assertEqual( @@ -172,20 +156,22 @@ class ShellEnvironmentTest(testtools.TestCase): env_dict) self.assertEqual(self.template_a.decode('utf-8'), files['file:///home/my/bar/a.yaml']) + mock_url.assert_has_calls([ + mock.call(env_url), + mock.call('file:///home/my/bar/a.yaml'), + mock.call('file:///home/my/bar/a.yaml') + ]) - def test_process_environment_url(self): + @mock.patch('six.moves.urllib.request.urlopen') + def test_process_environment_url(self, mock_url): env = b''' resource_registry: "OS::Thingy": "a.yaml" ''' url = 'http://no.where/some/path/to/file.yaml' tmpl_url = 'http://no.where/some/path/to/a.yaml' - - self.m.StubOutWithMock(request, 'urlopen') - request.urlopen(url).AndReturn(six.BytesIO(env)) - request.urlopen(tmpl_url).AndReturn(six.BytesIO(self.template_a)) - request.urlopen(tmpl_url).AndReturn(six.BytesIO(self.template_a)) - self.m.ReplayAll() + mock_url.side_effect = [six.BytesIO(env), six.BytesIO(self.template_a), + six.BytesIO(self.template_a)] files, env_dict = template_utils.process_environment_and_files( url) @@ -193,30 +179,34 @@ class ShellEnvironmentTest(testtools.TestCase): self.assertEqual({'resource_registry': {'OS::Thingy': tmpl_url}}, env_dict) self.assertEqual(self.template_a.decode('utf-8'), files[tmpl_url]) + mock_url.assert_has_calls([ + mock.call(url), + mock.call(tmpl_url), + mock.call(tmpl_url) + ]) - def test_process_environment_empty_file(self): + @mock.patch('six.moves.urllib.request.urlopen') + def test_process_environment_empty_file(self, mock_url): - self.m.StubOutWithMock(request, 'urlopen') env_file = '/home/my/dir/env.yaml' env = b'' - - request.urlopen('file://%s' % env_file).AndReturn(six.BytesIO(env)) - self.m.ReplayAll() + mock_url.return_value = six.BytesIO(env) files, env_dict = template_utils.process_environment_and_files( env_file) self.assertEqual({}, env_dict) self.assertEqual({}, files) + mock_url.assert_called_with('file://%s' % env_file) def test_no_process_environment_and_files(self): files, env = template_utils.process_environment_and_files() self.assertEqual({}, env) self.assertEqual({}, files) - def test_process_multiple_environments_and_files(self): + @mock.patch('six.moves.urllib.request.urlopen') + def test_process_multiple_environments_and_files(self, mock_url): - self.m.StubOutWithMock(request, 'urlopen') env_file1 = '/home/my/dir/env1.yaml' env_file2 = '/home/my/dir/env2.yaml' @@ -233,19 +223,12 @@ class ShellEnvironmentTest(testtools.TestCase): "OS::Thingy2": "file:///home/b/b.yaml" ''' - request.urlopen('file://%s' % env_file1).AndReturn( - six.BytesIO(env1)) - request.urlopen('file:///home/b/a.yaml').AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file:///home/b/a.yaml').AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file://%s' % env_file2).AndReturn( - six.BytesIO(env2)) - request.urlopen('file:///home/b/b.yaml').AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file:///home/b/b.yaml').AndReturn( - six.BytesIO(self.template_a)) - self.m.ReplayAll() + mock_url.side_effect = [six.BytesIO(env1), + six.BytesIO(self.template_a), + six.BytesIO(self.template_a), + six.BytesIO(env2), + six.BytesIO(self.template_a), + six.BytesIO(self.template_a)] files, env = template_utils.process_multiple_environments_and_files( [env_file1, env_file2]) @@ -263,10 +246,18 @@ class ShellEnvironmentTest(testtools.TestCase): files['file:///home/b/a.yaml']) self.assertEqual(self.template_a.decode('utf-8'), files['file:///home/b/b.yaml']) + mock_url.assert_has_calls([ + mock.call('file://%s' % env_file1), + mock.call('file:///home/b/a.yaml'), + mock.call('file:///home/b/a.yaml'), + mock.call('file://%s' % env_file2), + mock.call('file:///home/b/b.yaml'), + mock.call('file:///home/b/b.yaml') + ]) - def test_process_multiple_environments_default_resources(self): + @mock.patch('six.moves.urllib.request.urlopen') + def test_process_multiple_environments_default_resources(self, mock_url): - self.m.StubOutWithMock(request, 'urlopen') env_file1 = '/home/my/dir/env1.yaml' env_file2 = '/home/my/dir/env2.yaml' @@ -286,28 +277,16 @@ class ShellEnvironmentTest(testtools.TestCase): resource2: "OS::Thingy4": "file:///home/b/b.yaml" ''' - - request.urlopen('file://%s' % env_file1).InAnyOrder().AndReturn( - six.BytesIO(env1)) - request.urlopen('file:///home/b/a.yaml').InAnyOrder().AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file:///home/b/b.yaml').InAnyOrder().AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file:///home/b/a.yaml').InAnyOrder().AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file:///home/b/b.yaml').InAnyOrder().AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file://%s' % env_file2).InAnyOrder().AndReturn( - six.BytesIO(env2)) - request.urlopen('file:///home/b/a.yaml').InAnyOrder().AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file:///home/b/b.yaml').InAnyOrder().AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file:///home/b/a.yaml').InAnyOrder().AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file:///home/b/b.yaml').InAnyOrder().AndReturn( - six.BytesIO(self.template_a)) - self.m.ReplayAll() + mock_url.side_effect = [six.BytesIO(env1), + six.BytesIO(self.template_a), + six.BytesIO(self.template_a), + six.BytesIO(self.template_a), + six.BytesIO(self.template_a), + six.BytesIO(env2), + six.BytesIO(self.template_a), + six.BytesIO(self.template_a), + six.BytesIO(self.template_a), + six.BytesIO(self.template_a)] files, env = template_utils.process_multiple_environments_and_files( [env_file1, env_file2]) @@ -331,6 +310,19 @@ class ShellEnvironmentTest(testtools.TestCase): files['file:///home/b/a.yaml']) self.assertEqual(self.template_a.decode('utf-8'), files['file:///home/b/b.yaml']) + mock_url.assert_has_calls([ + mock.call('file://%s' % env_file1), + mock.call('file:///home/b/a.yaml'), + mock.call('file:///home/b/b.yaml'), + mock.call('file:///home/b/a.yaml'), + mock.call('file:///home/b/b.yaml'), + mock.call('file://%s' % env_file2), + mock.call('file:///home/b/a.yaml'), + mock.call('file:///home/b/b.yaml'), + mock.call('file:///home/b/a.yaml'), + mock.call('file:///home/b/b.yaml'), + + ], any_order=True) def test_no_process_multiple_environments_and_files(self): files, env = template_utils.process_multiple_environments_and_files() @@ -347,8 +339,6 @@ class ShellEnvironmentTest(testtools.TestCase): "OS::Thingy1": "b/a.yaml" ''' - self.m.ReplayAll() - self.object_requested = False def env_path_is_object(object_url): @@ -376,9 +366,9 @@ class ShellEnvironmentTest(testtools.TestCase): self.assertEqual(self.template_a.decode('utf-8'), files['http://no.where/path/to/b/a.yaml']) - def test_process_multiple_environments_and_files_tracker(self): + @mock.patch('six.moves.urllib.request.urlopen') + def test_process_multiple_environments_and_files_tracker(self, mock_url): # Setup - self.m.StubOutWithMock(request, 'urlopen') env_file1 = '/home/my/dir/env1.yaml' env1 = b''' @@ -387,13 +377,9 @@ class ShellEnvironmentTest(testtools.TestCase): resource_registry: "OS::Thingy1": "file:///home/b/a.yaml" ''' - request.urlopen('file://%s' % env_file1).AndReturn( - six.BytesIO(env1)) - request.urlopen('file:///home/b/a.yaml').AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file:///home/b/a.yaml').AndReturn( - six.BytesIO(self.template_a)) - self.m.ReplayAll() + mock_url.side_effect = [six.BytesIO(env1), + six.BytesIO(self.template_a), + six.BytesIO(self.template_a)] # Test env_file_list = [] @@ -414,24 +400,25 @@ class ShellEnvironmentTest(testtools.TestCase): self.assertIn('file:///home/my/dir/env1.yaml', files) self.assertEqual(expected_env, json.loads(files['file:///home/my/dir/env1.yaml'])) + mock_url.assert_has_calls([ + mock.call('file://%s' % env_file1), + mock.call('file:///home/b/a.yaml'), + mock.call('file:///home/b/a.yaml'), - def test_process_environment_relative_file_tracker(self): + ]) + + @mock.patch('six.moves.urllib.request.urlopen') + def test_process_environment_relative_file_tracker(self, mock_url): - self.m.StubOutWithMock(request, 'urlopen') env_file = '/home/my/dir/env.yaml' env_url = 'file:///home/my/dir/env.yaml' env = b''' resource_registry: "OS::Thingy": a.yaml ''' - - request.urlopen(env_url).AndReturn( - six.BytesIO(env)) - request.urlopen('file:///home/my/dir/a.yaml').AndReturn( - six.BytesIO(self.template_a)) - request.urlopen('file:///home/my/dir/a.yaml').AndReturn( - six.BytesIO(self.template_a)) - self.m.ReplayAll() + mock_url.side_effect = [six.BytesIO(env), + six.BytesIO(self.template_a), + six.BytesIO(self.template_a)] self.assertEqual( env_url, @@ -454,6 +441,12 @@ class ShellEnvironmentTest(testtools.TestCase): self.assertEqual(['file:///home/my/dir/env.yaml'], env_file_list) self.assertEqual(json.dumps(expected_env), files['file:///home/my/dir/env.yaml']) + mock_url.assert_has_calls([ + mock.call(env_url), + mock.call('file:///home/my/dir/a.yaml'), + mock.call('file:///home/my/dir/a.yaml'), + + ]) def test_global_files(self): url = 'file:///home/b/a.yaml' @@ -538,13 +531,6 @@ class ShellEnvironmentTest(testtools.TestCase): class TestGetTemplateContents(testtools.TestCase): - def setUp(self): - super(TestGetTemplateContents, self).setUp() - self.m = mox.Mox() - - self.addCleanup(self.m.VerifyAll) - self.addCleanup(self.m.UnsetStubs) - def test_get_template_contents_file(self): with tempfile.NamedTemporaryFile() as tmpl_file: tmpl = (b'{"AWSTemplateFormatVersion" : "2010-09-09",' @@ -611,23 +597,22 @@ class TestGetTemplateContents(testtools.TestCase): matchers.MatchesRegex( 'Error parsing template file://%s ' % tmpl_file.name)) - def test_get_template_contents_url(self): + @mock.patch('six.moves.urllib.request.urlopen') + def test_get_template_contents_url(self, mock_url): tmpl = b'{"AWSTemplateFormatVersion" : "2010-09-09", "foo": "bar"}' url = 'http://no.where/path/to/a.yaml' - self.m.StubOutWithMock(request, 'urlopen') - request.urlopen(url).AndReturn(six.BytesIO(tmpl)) - self.m.ReplayAll() + mock_url.return_value = six.BytesIO(tmpl) files, tmpl_parsed = template_utils.get_template_contents( template_url=url) self.assertEqual({"AWSTemplateFormatVersion": "2010-09-09", "foo": "bar"}, tmpl_parsed) self.assertEqual({}, files) + mock_url.assert_called_with(url) def test_get_template_contents_object(self): tmpl = '{"AWSTemplateFormatVersion" : "2010-09-09", "foo": "bar"}' url = 'http://no.where/path/to/a.yaml' - self.m.ReplayAll() self.object_requested = False @@ -652,7 +637,6 @@ class TestGetTemplateContents(testtools.TestCase): '"FooBar": {' '"type": "foo/bar.yaml"}}}') url = 'http://no.where/path/to/a.yaml' - self.m.ReplayAll() self.object_requested = False @@ -685,15 +669,15 @@ class TestGetTemplateContents(testtools.TestCase): [{'path': '/tmp/%s' % filename, 'content': {'get_file': url}, 'encoding': 'b64'}]}}}}} - self.m.StubOutWithMock(request, 'urlopen') - raw_content = base64.decodestring(content) - response = six.BytesIO(raw_content) - request.urlopen(url).AndReturn(response) - self.m.ReplayAll() - files = {} - template_utils.resolve_template_get_files( - template, files, base_url) - self.assertEqual({url: content}, files) + with mock.patch('six.moves.urllib.request.urlopen') as mock_url: + raw_content = base64.decodestring(content) + response = six.BytesIO(raw_content) + mock_url.return_value = response + files = {} + template_utils.resolve_template_get_files( + template, files, base_url) + self.assertEqual({url: content}, files) + mock_url.assert_called_with(url) def test_get_zip_content(self): filename = 'heat.zip' @@ -746,6 +730,7 @@ ABOkDAABQSwUGAAAAAAEAAQBOAAAARwAAAAAA\n''' self.check_non_utf8_content(filename=filename, content=content) +@mock.patch('six.moves.urllib.request.urlopen') class TestTemplateGetFileFunctions(testtools.TestCase): hot_template = b'''heat_template_version: 2013-05-23 @@ -769,48 +754,20 @@ resources: ignored_none: {get_file: } ''' - def setUp(self): - super(TestTemplateGetFileFunctions, self).setUp() - self.m = mox.Mox() - - self.addCleanup(self.m.VerifyAll) - self.addCleanup(self.m.UnsetStubs) - - def test_hot_template(self): - self.m.StubOutWithMock(request, 'urlopen') + def test_hot_template(self, mock_url): tmpl_file = '/home/my/dir/template.yaml' url = 'file:///home/my/dir/template.yaml' - request.urlopen(url).AndReturn( - six.BytesIO(self.hot_template)) - request.urlopen( - 'http://localhost/bar.yaml').InAnyOrder().AndReturn( - six.BytesIO(b'bar contents')) - request.urlopen( - 'file:///home/my/dir/foo.yaml').InAnyOrder().AndReturn( - six.BytesIO(b'foo contents')) - request.urlopen( - 'file:///home/my/dir/baz/baz1.yaml').InAnyOrder().AndReturn( - six.BytesIO(b'baz1 contents')) - request.urlopen( - 'file:///home/my/dir/baz/baz2.yaml').InAnyOrder().AndReturn( - six.BytesIO(b'baz2 contents')) - request.urlopen( - 'file:///home/my/dir/baz/baz3.yaml').InAnyOrder().AndReturn( - six.BytesIO(b'baz3 contents')) - - self.m.ReplayAll() + mock_url.side_effect = [six.BytesIO(self.hot_template), + six.BytesIO(b'bar contents'), + six.BytesIO(b'foo contents'), + six.BytesIO(b'baz1 contents'), + six.BytesIO(b'baz2 contents'), + six.BytesIO(b'baz3 contents')] files, tmpl_parsed = template_utils.get_template_contents( template_file=tmpl_file) - self.assertEqual({ - 'http://localhost/bar.yaml': b'bar contents', - 'file:///home/my/dir/foo.yaml': b'foo contents', - 'file:///home/my/dir/baz/baz1.yaml': b'baz1 contents', - 'file:///home/my/dir/baz/baz2.yaml': b'baz2 contents', - 'file:///home/my/dir/baz/baz3.yaml': b'baz3 contents', - }, files) self.assertEqual({ 'heat_template_version': '2013-05-23', 'resources': { @@ -836,9 +793,16 @@ resources: } } }, tmpl_parsed) + mock_url.assert_has_calls([ + mock.call(url), + mock.call('http://localhost/bar.yaml'), + mock.call('file:///home/my/dir/foo.yaml'), + mock.call('file:///home/my/dir/baz/baz1.yaml'), + mock.call('file:///home/my/dir/baz/baz2.yaml'), + mock.call('file:///home/my/dir/baz/baz3.yaml') + ], any_order=True) - def test_hot_template_outputs(self): - self.m.StubOutWithMock(request, 'urlopen') + def test_hot_template_outputs(self, mock_url): tmpl_file = '/home/my/dir/template.yaml' url = 'file://%s' % tmpl_file foo_url = 'file:///home/my/dir/foo.yaml' @@ -848,15 +812,17 @@ outputs:\n\ contents:\n\ value:\n\ get_file: foo.yaml\n''' - request.urlopen(url).AndReturn(six.BytesIO(contents)) - request.urlopen(foo_url).AndReturn(six.BytesIO(b'foo contents')) - self.m.ReplayAll() + mock_url.side_effect = [six.BytesIO(contents), + six.BytesIO(b'foo contents')] files = template_utils.get_template_contents( template_file=tmpl_file)[0] self.assertEqual({foo_url: b'foo contents'}, files) + mock_url.assert_has_calls([ + mock.call(url), + mock.call(foo_url) + ]) - def test_hot_template_same_file(self): - self.m.StubOutWithMock(request, 'urlopen') + def test_hot_template_same_file(self, mock_url): tmpl_file = '/home/my/dir/template.yaml' url = 'file://%s' % tmpl_file foo_url = 'file:///home/my/dir/foo.yaml' @@ -869,14 +835,17 @@ outputs:\n\ template:\n\ value:\n\ get_file: foo.yaml\n''' - request.urlopen(url).AndReturn(six.BytesIO(contents)) + mock_url.side_effect = [six.BytesIO(contents), + six.BytesIO(b'foo contents')] # asserts that is fetched only once even though it is # referenced in the template twice - request.urlopen(foo_url).AndReturn(six.BytesIO(b'foo contents')) - self.m.ReplayAll() files = template_utils.get_template_contents( template_file=tmpl_file)[0] self.assertEqual({foo_url: b'foo contents'}, files) + mock_url.assert_has_calls([ + mock.call(url), + mock.call(foo_url) + ]) class TestTemplateTypeFunctions(testtools.TestCase): @@ -909,38 +878,26 @@ parameters: type: string ''' - def setUp(self): - super(TestTemplateTypeFunctions, self).setUp() - self.m = mox.Mox() - - self.addCleanup(self.m.VerifyAll) - self.addCleanup(self.m.UnsetStubs) - - def test_hot_template(self): - self.m.StubOutWithMock(request, 'urlopen') + @mock.patch('six.moves.urllib.request.urlopen') + def test_hot_template(self, mock_url): tmpl_file = '/home/my/dir/template.yaml' url = 'file:///home/my/dir/template.yaml' - request.urlopen( - 'file:///home/my/dir/foo.yaml').InAnyOrder().AndReturn( - six.BytesIO(self.foo_template)) - request.urlopen( - 'file:///home/my/dir/foo.yaml').InAnyOrder().AndReturn( - six.BytesIO(self.foo_template)) - request.urlopen(url).InAnyOrder().AndReturn( - six.BytesIO(self.hot_template)) - request.urlopen( - 'file:///home/my/dir/spam/egg.yaml').InAnyOrder().AndReturn( - six.BytesIO(self.egg_template)) - request.urlopen( - 'file:///home/my/dir/spam/egg.yaml').InAnyOrder().AndReturn( - six.BytesIO(self.egg_template)) - self.m.ReplayAll() + + def side_effect(args): + if url == args: + return six.BytesIO(self.hot_template) + if 'file:///home/my/dir/foo.yaml' == args: + return six.BytesIO(self.foo_template) + if 'file:///home/my/dir/spam/egg.yaml' == args: + return six.BytesIO(self.egg_template) + mock_url.side_effect = side_effect files, tmpl_parsed = template_utils.get_template_contents( template_file=tmpl_file) self.assertEqual(yaml.safe_load(self.foo_template.decode('utf-8')), json.loads(files.get('file:///home/my/dir/foo.yaml'))) + self.assertEqual( yaml.safe_load(self.egg_template.decode('utf-8')), json.loads(files.get('file:///home/my/dir/spam/egg.yaml'))) @@ -968,6 +925,12 @@ parameters: } }, tmpl_parsed) + mock_url.assert_has_calls([ + mock.call('file:///home/my/dir/foo.yaml'), + mock.call(url), + mock.call('file:///home/my/dir/spam/egg.yaml'), + ], any_order=True) + class TestTemplateInFileFunctions(testtools.TestCase): @@ -993,30 +956,21 @@ parameters: type: string ''' - def setUp(self): - super(TestTemplateInFileFunctions, self).setUp() - self.m = mox.Mox() - - self.addCleanup(self.m.VerifyAll) - self.addCleanup(self.m.UnsetStubs) - - def test_hot_template(self): - self.m.StubOutWithMock(request, 'urlopen') + @mock.patch('six.moves.urllib.request.urlopen') + def test_hot_template(self, mock_url): tmpl_file = '/home/my/dir/template.yaml' url = 'file:///home/my/dir/template.yaml' foo_url = 'file:///home/my/dir/foo.yaml' bar_url = 'file:///home/my/dir/bar.yaml' - request.urlopen(url).InAnyOrder().AndReturn( - six.BytesIO(self.hot_template)) - request.urlopen(foo_url).InAnyOrder().AndReturn( - six.BytesIO(self.foo_template)) - request.urlopen(foo_url).InAnyOrder().AndReturn( - six.BytesIO(self.foo_template)) - request.urlopen(bar_url).InAnyOrder().AndReturn( - six.BytesIO(self.bar_template)) - request.urlopen(bar_url).InAnyOrder().AndReturn( - six.BytesIO(self.bar_template)) - self.m.ReplayAll() + + def side_effect(args): + if url == args: + return six.BytesIO(self.hot_template) + if foo_url == args: + return six.BytesIO(self.foo_template) + if bar_url == args: + return six.BytesIO(self.bar_template) + mock_url.side_effect = side_effect files, tmpl_parsed = template_utils.get_template_contents( template_file=tmpl_file) @@ -1052,6 +1006,12 @@ parameters: } }, tmpl_parsed) + mock_url.assert_has_calls([ + mock.call(foo_url), + mock.call(url), + mock.call(bar_url), + ], any_order=True) + class TestNestedIncludes(testtools.TestCase): @@ -1095,15 +1055,8 @@ parameters: type: string ''' - def setUp(self): - super(TestNestedIncludes, self).setUp() - self.m = mox.Mox() - - self.addCleanup(self.m.VerifyAll) - self.addCleanup(self.m.UnsetStubs) - - def test_env_nested_includes(self): - self.m.StubOutWithMock(request, 'urlopen') + @mock.patch('six.moves.urllib.request.urlopen') + def test_env_nested_includes(self, mock_url): env_file = '/home/my/dir/env.yaml' env_url = 'file:///home/my/dir/env.yaml' env = b''' @@ -1118,35 +1071,24 @@ parameters: two_url = u'file:///home/my/dir/spam/two.yaml' three_url = u'file:///home/my/dir/spam/three.yaml' - request.urlopen(env_url).AndReturn( - six.BytesIO(env)) - request.urlopen(template_url).AndReturn( - six.BytesIO(self.hot_template)) - request.urlopen(template_url).AndReturn( - six.BytesIO(self.hot_template)) - - request.urlopen(foo_url).InAnyOrder().AndReturn( - six.BytesIO(self.foo_template)) - request.urlopen(egg_url).InAnyOrder().AndReturn( - six.BytesIO(self.egg_template)) - request.urlopen(ham_url).InAnyOrder().AndReturn( - six.BytesIO(b'ham contents')) - request.urlopen(one_url).InAnyOrder().AndReturn( - six.BytesIO(self.foo_template)) - request.urlopen(two_url).InAnyOrder().AndReturn( - six.BytesIO(self.foo_template)) - request.urlopen(three_url).InAnyOrder().AndReturn( - six.BytesIO(b'three contents')) - request.urlopen(foo_url).InAnyOrder().AndReturn( - six.BytesIO(self.foo_template)) - request.urlopen(egg_url).InAnyOrder().AndReturn( - six.BytesIO(self.egg_template)) - request.urlopen(one_url).InAnyOrder().AndReturn( - six.BytesIO(self.foo_template)) - request.urlopen(two_url).InAnyOrder().AndReturn( - six.BytesIO(self.foo_template)) - - self.m.ReplayAll() + def side_effect(args): + if env_url == args: + return six.BytesIO(env) + if template_url == args: + return six.BytesIO(self.hot_template) + if foo_url == args: + return six.BytesIO(self.foo_template) + if egg_url == args: + return six.BytesIO(self.egg_template) + if ham_url == args: + return six.BytesIO(b'ham contents') + if one_url == args: + return six.BytesIO(self.foo_template) + if two_url == args: + return six.BytesIO(self.foo_template) + if three_url == args: + return six.BytesIO(b'three contents') + mock_url.side_effect = side_effect files, env_dict = template_utils.process_environment_and_files( env_file) @@ -1201,3 +1143,13 @@ parameters: json.loads(files.get(two_url))) self.assertEqual(b'three contents', files.get(three_url)) + mock_url.assert_has_calls([ + mock.call(env_url), + mock.call(template_url), + mock.call(foo_url), + mock.call(egg_url), + mock.call(ham_url), + mock.call(one_url), + mock.call(two_url), + mock.call(three_url), + ], any_order=True)