From dc71d165298c38f99eb62583bcd80bc4bc9a75f4 Mon Sep 17 00:00:00 2001 From: Huanxuan Ao Date: Thu, 19 May 2016 11:03:13 +0800 Subject: [PATCH] Add FakeSnapshot class and update snapshot test in VolumeV2 Add FakeSnapshot class and update unit tests for snapshot commands with the FakeSnapshot class. Change-Id: If039a48b9d5f8430cc3d041b8c7ec30af8ff0e03 --- openstackclient/tests/volume/v2/fakes.py | 53 ++++ .../tests/volume/v2/test_snapshot.py | 265 ++++++++++-------- 2 files changed, 196 insertions(+), 122 deletions(-) diff --git a/openstackclient/tests/volume/v2/fakes.py b/openstackclient/tests/volume/v2/fakes.py index c4155c69b..6e372de3b 100644 --- a/openstackclient/tests/volume/v2/fakes.py +++ b/openstackclient/tests/volume/v2/fakes.py @@ -552,3 +552,56 @@ class FakeBackup(object): backups.append(backup) return backups + + +class FakeSnapshot(object): + """Fake one or more snapshot.""" + + @staticmethod + def create_one_snapshot(attrs=None): + """Create a fake snapshot. + + :param Dictionary attrs: + A dictionary with all attributes + :return: + A FakeResource object with id, name, description, etc. + """ + attrs = attrs or {} + + # Set default attributes. + snapshot_info = { + "id": 'snapshot-id-' + uuid.uuid4().hex, + "name": 'snapshot-name-' + uuid.uuid4().hex, + "description": 'snapshot-description-' + uuid.uuid4().hex, + "size": 10, + "status": "available", + "metadata": {"foo": "bar"}, + "created_at": "2015-06-03T18:49:19.000000", + "volume_id": 'vloume-id-' + uuid.uuid4().hex, + } + + # Overwrite default attributes. + snapshot_info.update(attrs) + + snapshot = fakes.FakeResource( + info=copy.deepcopy(snapshot_info), + loaded=True) + return snapshot + + @staticmethod + def create_snapshots(attrs=None, count=2): + """Create multiple fake snapshots. + + :param Dictionary attrs: + A dictionary with all attributes + :param int count: + The number of snapshots to fake + :return: + A list of FakeResource objects faking the snapshots + """ + snapshots = [] + for i in range(0, count): + snapshot = FakeSnapshot.create_one_snapshot(attrs) + snapshots.append(snapshot) + + return snapshots diff --git a/openstackclient/tests/volume/v2/test_snapshot.py b/openstackclient/tests/volume/v2/test_snapshot.py index d2fa5e07d..fe6fbb520 100644 --- a/openstackclient/tests/volume/v2/test_snapshot.py +++ b/openstackclient/tests/volume/v2/test_snapshot.py @@ -12,9 +12,7 @@ # under the License. # -import copy - -from openstackclient.tests import fakes +from openstackclient.common import utils from openstackclient.tests.volume.v2 import fakes as volume_fakes from openstackclient.volume.v2 import snapshot @@ -32,58 +30,75 @@ class TestSnapshot(volume_fakes.TestVolume): class TestSnapshotCreate(TestSnapshot): + columns = ( + 'created_at', + 'description', + 'id', + 'name', + 'properties', + 'size', + 'status', + 'volume_id', + ) + def setUp(self): super(TestSnapshotCreate, self).setUp() - self.volumes_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(volume_fakes.VOLUME), - loaded=True + self.volume = volume_fakes.FakeVolume.create_one_volume() + self.new_snapshot = volume_fakes.FakeSnapshot.create_one_snapshot( + attrs={'volume_id': self.volume.id}) + + self.data = ( + self.new_snapshot.created_at, + self.new_snapshot.description, + self.new_snapshot.id, + self.new_snapshot.name, + utils.format_dict(self.new_snapshot.metadata), + self.new_snapshot.size, + self.new_snapshot.status, + self.new_snapshot.volume_id, ) - self.snapshots_mock.create.return_value = fakes.FakeResource( - None, - copy.deepcopy(volume_fakes.SNAPSHOT), - loaded=True - ) + self.volumes_mock.get.return_value = self.volume + self.snapshots_mock.create.return_value = self.new_snapshot # Get the command object to test self.cmd = snapshot.CreateSnapshot(self.app, None) def test_snapshot_create(self): arglist = [ - volume_fakes.volume_id, - "--name", volume_fakes.snapshot_name, - "--description", volume_fakes.snapshot_description, - "--force" + "--name", self.new_snapshot.name, + "--description", self.new_snapshot.description, + "--force", + self.new_snapshot.volume_id, ] verifylist = [ - ("volume", volume_fakes.volume_id), - ("name", volume_fakes.snapshot_name), - ("description", volume_fakes.snapshot_description), - ("force", True) + ("name", self.new_snapshot.name), + ("description", self.new_snapshot.description), + ("force", True), + ("volume", self.new_snapshot.volume_id), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) self.snapshots_mock.create.assert_called_with( - volume_fakes.volume_id, + self.new_snapshot.volume_id, force=True, - name=volume_fakes.snapshot_name, - description=volume_fakes.snapshot_description + name=self.new_snapshot.name, + description=self.new_snapshot.description ) - self.assertEqual(columns, volume_fakes.SNAPSHOT_columns) - self.assertEqual(data, volume_fakes.SNAPSHOT_data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) def test_snapshot_create_without_name(self): arglist = [ - volume_fakes.volume_id, - "--description", volume_fakes.snapshot_description, + self.new_snapshot.volume_id, + "--description", self.new_snapshot.description, "--force" ] verifylist = [ - ("volume", volume_fakes.volume_id), - ("description", volume_fakes.snapshot_description), + ("volume", self.new_snapshot.volume_id), + ("description", self.new_snapshot.description), ("force", True) ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -91,24 +106,23 @@ class TestSnapshotCreate(TestSnapshot): columns, data = self.cmd.take_action(parsed_args) self.snapshots_mock.create.assert_called_with( - volume_fakes.volume_id, + self.new_snapshot.volume_id, force=True, name=None, - description=volume_fakes.snapshot_description + description=self.new_snapshot.description ) - self.assertEqual(columns, volume_fakes.SNAPSHOT_columns) - self.assertEqual(data, volume_fakes.SNAPSHOT_data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) class TestSnapshotDelete(TestSnapshot): + snapshot = volume_fakes.FakeSnapshot.create_one_snapshot() + def setUp(self): super(TestSnapshotDelete, self).setUp() - self.snapshots_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(volume_fakes.SNAPSHOT), - loaded=True) + self.snapshots_mock.get.return_value = self.snapshot self.snapshots_mock.delete.return_value = None # Get the command object to mock @@ -116,21 +130,25 @@ class TestSnapshotDelete(TestSnapshot): def test_snapshot_delete(self): arglist = [ - volume_fakes.snapshot_id + self.snapshot.id ] verifylist = [ - ("snapshots", [volume_fakes.snapshot_id]) + ("snapshots", [self.snapshot.id]) ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) - self.snapshots_mock.delete.assert_called_with(volume_fakes.snapshot_id) + self.snapshots_mock.delete.assert_called_with(self.snapshot.id) self.assertIsNone(result) class TestSnapshotList(TestSnapshot): + volume = volume_fakes.FakeVolume.create_one_volume() + snapshots = volume_fakes.FakeSnapshot.create_snapshots( + attrs={'volume_id': volume.name}, count=3) + columns = [ "ID", "Name", @@ -138,24 +156,39 @@ class TestSnapshotList(TestSnapshot): "Status", "Size" ] + columns_long = columns + [ + "Created At", + "Volume", + "Properties" + ] + + data = [] + for s in snapshots: + data.append(( + s.id, + s.name, + s.description, + s.status, + s.size, + )) + data_long = [] + for s in snapshots: + data_long.append(( + s.id, + s.name, + s.description, + s.status, + s.size, + s.created_at, + s.volume_id, + utils.format_dict(s.metadata), + )) def setUp(self): super(TestSnapshotList, self).setUp() - self.volumes_mock.list.return_value = [ - fakes.FakeResource( - None, - copy.deepcopy(volume_fakes.VOLUME), - loaded=True - ) - ] - self.snapshots_mock.list.return_value = [ - fakes.FakeResource( - None, - copy.deepcopy(volume_fakes.SNAPSHOT), - loaded=True - ) - ] + self.volumes_mock.list.return_value = [self.volume] + self.snapshots_mock.list.return_value = self.snapshots # Get the command to test self.cmd = snapshot.ListSnapshot(self.app, None) @@ -169,14 +202,7 @@ class TestSnapshotList(TestSnapshot): columns, data = self.cmd.take_action(parsed_args) self.assertEqual(self.columns, columns) - datalist = (( - volume_fakes.snapshot_id, - volume_fakes.snapshot_name, - volume_fakes.snapshot_description, - "available", - volume_fakes.snapshot_size - ),) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.data, list(data)) def test_snapshot_list_with_options(self): arglist = ["--long"] @@ -185,24 +211,8 @@ class TestSnapshotList(TestSnapshot): columns, data = self.cmd.take_action(parsed_args) - columns = self.columns + [ - "Created At", - "Volume", - "Properties" - ] - self.assertEqual(columns, columns) - - datalist = (( - volume_fakes.snapshot_id, - volume_fakes.snapshot_name, - volume_fakes.snapshot_description, - "available", - volume_fakes.snapshot_size, - "2015-06-03T18:49:19.000000", - volume_fakes.volume_name, - volume_fakes.EXPECTED_SNAPSHOT.get("properties") - ),) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.columns_long, columns) + self.assertEqual(self.data_long, list(data)) def test_snapshot_list_all_projects(self): arglist = [ @@ -217,26 +227,17 @@ class TestSnapshotList(TestSnapshot): columns, data = self.cmd.take_action(parsed_args) self.assertEqual(self.columns, columns) - - datalist = (( - volume_fakes.snapshot_id, - volume_fakes.snapshot_name, - volume_fakes.snapshot_description, - "available", - volume_fakes.snapshot_size - ), ) - self.assertEqual(datalist, tuple(data)) + self.assertEqual(self.data, list(data)) class TestSnapshotSet(TestSnapshot): + + snapshot = volume_fakes.FakeSnapshot.create_one_snapshot() + def setUp(self): super(TestSnapshotSet, self).setUp() - self.snapshots_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(volume_fakes.SNAPSHOT), - loaded=True - ) + self.snapshots_mock.get.return_value = self.snapshot self.snapshots_mock.set_metadata.return_value = None self.snapshots_mock.update.return_value = None # Get the command object to mock @@ -244,16 +245,16 @@ class TestSnapshotSet(TestSnapshot): def test_snapshot_set(self): arglist = [ - volume_fakes.snapshot_id, "--name", "new_snapshot", "--property", "x=y", - "--property", "foo=foo" + "--property", "foo=foo", + self.snapshot.id, ] new_property = {"x": "y", "foo": "foo"} verifylist = [ - ("snapshot", volume_fakes.snapshot_id), ("name", "new_snapshot"), - ("property", new_property) + ("property", new_property), + ("snapshot", self.snapshot.id), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -263,79 +264,99 @@ class TestSnapshotSet(TestSnapshot): "name": "new_snapshot", } self.snapshots_mock.update.assert_called_with( - volume_fakes.snapshot_id, **kwargs) + self.snapshot.id, **kwargs) self.snapshots_mock.set_metadata.assert_called_with( - volume_fakes.snapshot_id, new_property + self.snapshot.id, new_property ) self.assertIsNone(result) def test_snapshot_set_state_to_error(self): arglist = [ "--state", "error", - volume_fakes.snapshot_id + self.snapshot.id ] verifylist = [ ("state", "error"), - ("snapshot", volume_fakes.snapshot_id) + ("snapshot", self.snapshot.id) ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) result = self.cmd.take_action(parsed_args) self.snapshots_mock.reset_state.assert_called_with( - volume_fakes.snapshot_id, "error") + self.snapshot.id, "error") self.assertIsNone(result) class TestSnapshotShow(TestSnapshot): + columns = ( + 'created_at', + 'description', + 'id', + 'name', + 'properties', + 'size', + 'status', + 'volume_id', + ) + def setUp(self): super(TestSnapshotShow, self).setUp() - self.snapshots_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(volume_fakes.SNAPSHOT), - loaded=True) + self.snapshot = volume_fakes.FakeSnapshot.create_one_snapshot() + + self.data = ( + self.snapshot.created_at, + self.snapshot.description, + self.snapshot.id, + self.snapshot.name, + utils.format_dict(self.snapshot.metadata), + self.snapshot.size, + self.snapshot.status, + self.snapshot.volume_id, + ) + + self.snapshots_mock.get.return_value = self.snapshot # Get the command object to test self.cmd = snapshot.ShowSnapshot(self.app, None) def test_snapshot_show(self): arglist = [ - volume_fakes.snapshot_id + self.snapshot.id ] verifylist = [ - ("snapshot", volume_fakes.snapshot_id) + ("snapshot", self.snapshot.id) ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) columns, data = self.cmd.take_action(parsed_args) - self.snapshots_mock.get.assert_called_with(volume_fakes.snapshot_id) + self.snapshots_mock.get.assert_called_with(self.snapshot.id) - self.assertEqual(volume_fakes.SNAPSHOT_columns, columns) - self.assertEqual(volume_fakes.SNAPSHOT_data, data) + self.assertEqual(self.columns, columns) + self.assertEqual(self.data, data) class TestSnapshotUnset(TestSnapshot): + + snapshot = volume_fakes.FakeSnapshot.create_one_snapshot() + def setUp(self): super(TestSnapshotUnset, self).setUp() - self.snapshots_mock.get.return_value = fakes.FakeResource( - None, - copy.deepcopy(volume_fakes.SNAPSHOT), - loaded=True - ) + self.snapshots_mock.get.return_value = self.snapshot self.snapshots_mock.delete_metadata.return_value = None # Get the command object to mock self.cmd = snapshot.UnsetSnapshot(self.app, None) def test_snapshot_unset(self): arglist = [ - volume_fakes.snapshot_id, - "--property", "foo" + "--property", "foo", + self.snapshot.id, ] verifylist = [ - ("snapshot", volume_fakes.snapshot_id), - ("property", ["foo"]) + ("property", ["foo"]), + ("snapshot", self.snapshot.id), ] parsed_args = self.check_parser(self.cmd, arglist, verifylist) @@ -343,6 +364,6 @@ class TestSnapshotUnset(TestSnapshot): result = self.cmd.take_action(parsed_args) self.snapshots_mock.delete_metadata.assert_called_with( - volume_fakes.snapshot_id, ["foo"] + self.snapshot.id, ["foo"] ) self.assertIsNone(result)