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
This commit is contained in:
Andrey Kurilin
2014-01-10 16:56:51 +02:00
parent c473f19fc9
commit 9a0b7d0450
+39 -52
View File
@@ -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__())