From 9a0b7d0450586bf639d29777fb3f6e60e3be496b Mon Sep 17 00:00:00 2001 From: Andrey Kurilin Date: Fri, 10 Jan 2014 16:56:51 +0200 Subject: [PATCH] Replace file.write and os.path.exists by mock During the test files may be lost in the temporary directory. Therefore, it would be nice if we reduce dependence of temporary directory. This patch replace buildin method file.write by mock in ShellCacheSchemaTest. Also we need to replace method os.path.exists by mock to correct all checks. Fixes bug: #1267515 Change-Id: I3faca27348e15b28619e49f11d0d6cff5a9e2906 --- tests/test_shell.py | 91 +++++++++++++++++++-------------------------- 1 file changed, 39 insertions(+), 52 deletions(-) diff --git a/tests/test_shell.py b/tests/test_shell.py index 45cbeae..192f02f 100644 --- a/tests/test_shell.py +++ b/tests/test_shell.py @@ -17,7 +17,6 @@ import argparse import os -import tempfile import mock @@ -106,8 +105,15 @@ class ShellTest(utils.TestCase): class ShellCacheSchemaTest(utils.TestCase): def setUp(self): super(ShellCacheSchemaTest, self).setUp() - self.shell = openstack_shell.OpenStackImagesShell() self._mock_client_setup() + self._mock_shell_setup() + os.path.exists = mock.MagicMock() + self.cache_dir = '/dir_for_cached_schema' + self.cache_file = self.cache_dir + '/image_schema.json' + + def tearDown(self): + super(ShellCacheSchemaTest, self).tearDown() + os.path.exists.reset_mock() def _mock_client_setup(self): self.schema_dict = { @@ -120,6 +126,11 @@ class ShellCacheSchemaTest(utils.TestCase): self.client = mock.Mock() self.client.schemas.get.return_value = schemas.Schema(self.schema_dict) + def _mock_shell_setup(self): + mocked_get_client = mock.MagicMock(return_value=self.client) + self.shell = openstack_shell.OpenStackImagesShell() + self.shell._get_versioned_client = mocked_get_client + def _make_args(self, args): class Args(): def __init__(self, entries): @@ -127,76 +138,52 @@ class ShellCacheSchemaTest(utils.TestCase): return Args(args) - def _write_file(self, path, text): - with file(path, 'w') as f: - f.write(text) - - def _read_file(self, path): - with file(path, 'r') as f: - text = f.read() - - return text - + @mock.patch('__builtin__.file', new=mock.mock_open(), create=True) def test_cache_schema_gets_when_not_exists(self): - cache_dir = tempfile.gettempdir() - - cache_file = cache_dir + '/image_schema.json' - - if os.path.exists(cache_file): - os.remove(cache_file) + mocked_path_exists_result_lst = [True, False] + os.path.exists.side_effect = \ + lambda *args: mocked_path_exists_result_lst.pop(0) options = { 'get_schema': False } - with mock.patch.object(self.shell, '_get_versioned_client')\ - as mocked_get_client: - mocked_get_client.return_value = self.client - self.shell._cache_schema(self._make_args(options), - home_dir=cache_dir) + self.shell._cache_schema(self._make_args(options), + home_dir=self.cache_dir) - self.assertTrue(os.path.exists(cache_file)) + self.assertEqual(4, file.mock_calls.__len__()) + self.assertEqual(mock.call(self.cache_file, 'w'), file.mock_calls[0]) + self.assertEqual(mock.call().write(json.dumps(self.schema_dict)), + file.mock_calls[2]) + @mock.patch('__builtin__.file', new=mock.mock_open(), create=True) def test_cache_schema_gets_when_forced(self): - cache_dir = tempfile.gettempdir() - - cache_file = cache_dir + '/image_schema.json' - - dummy_schema = 'my dummy schema' - self._write_file(cache_file, dummy_schema) + os.path.exists.return_value = True options = { 'get_schema': True } - with mock.patch.object(self.shell, '_get_versioned_client') \ - as mocked_get_client: - mocked_get_client.return_value = self.client - self.shell._cache_schema(self._make_args(options), - home_dir=cache_dir) + self.shell._cache_schema(self._make_args(options), + home_dir=self.cache_dir) - self.assertTrue(os.path.exists(cache_file)) - text = self._read_file(cache_file) - self.assertEqual(text, json.dumps(self.schema_dict)) + self.assertEqual(4, file.mock_calls.__len__()) + self.assertEqual(mock.call(self.cache_file, 'w'), file.mock_calls[0]) + self.assertEqual(mock.call().write(json.dumps(self.schema_dict)), + file.mock_calls[2]) + @mock.patch('__builtin__.file', new=mock.mock_open(), create=True) def test_cache_schema_leaves_when_present_not_forced(self): - cache_dir = tempfile.gettempdir() - - cache_file = cache_dir + '/image_schema.json' - - dummy_schema = 'my dummy schema' - self._write_file(cache_file, dummy_schema) + os.path.exists.return_value = True options = { 'get_schema': False } - with mock.patch.object(self.shell, '_get_versioned_client') \ - as mocked_get_client: - mocked_get_client.return_value = self.client - self.shell._cache_schema(self._make_args(options), - home_dir=cache_dir) + self.shell._cache_schema(self._make_args(options), + home_dir=self.cache_dir) - self.assertTrue(os.path.exists(cache_file)) - text = self._read_file(cache_file) - self.assertEqual(text, dummy_schema) + os.path.exists.assert_any_call(self.cache_dir) + os.path.exists.assert_any_call(self.cache_file) + self.assertEqual(2, os.path.exists.call_count) + self.assertEqual(0, file.mock_calls.__len__())