Produce a useful error message for NoUniqueMatch
Most of the CLIs use a NoUniqueMatch, so produce a useful error message if that happens. Added some tests for find_resource as well. Change-Id: I85ba61d5f6d1be5bd336a1cc4b02501492905f33 Closes-Bug: #1293846
This commit is contained in:
parent
0c0803d363
commit
4900c64d09
openstackclient
@ -74,6 +74,10 @@ def find_resource(manager, name_or_id):
|
||||
msg = "No %s with a name or ID of '%s' exists." % \
|
||||
(manager.resource_class.__name__.lower(), name_or_id)
|
||||
raise exceptions.CommandError(msg)
|
||||
if type(ex).__name__ == 'NoUniqueMatch':
|
||||
msg = "More than one %s exists with the name '%s'." % \
|
||||
(manager.resource_class.__name__.lower(), name_or_id)
|
||||
raise exceptions.CommandError(msg)
|
||||
else:
|
||||
raise
|
||||
|
||||
|
@ -57,3 +57,75 @@ class TestUtils(test_utils.TestCase):
|
||||
self.assertRaises(exceptions.CommandError,
|
||||
utils.get_password,
|
||||
mock_stdin)
|
||||
|
||||
|
||||
class NoUniqueMatch(Exception):
|
||||
pass
|
||||
|
||||
|
||||
class TestFindResource(test_utils.TestCase):
|
||||
def setUp(self):
|
||||
super(TestFindResource, self).setUp()
|
||||
self.name = 'legos'
|
||||
self.expected = mock.Mock()
|
||||
self.manager = mock.Mock()
|
||||
self.manager.resource_class = mock.Mock()
|
||||
self.manager.resource_class.__name__ = 'lego'
|
||||
|
||||
def test_find_resource_get_int(self):
|
||||
self.manager.get = mock.Mock(return_value=self.expected)
|
||||
result = utils.find_resource(self.manager, 1)
|
||||
self.assertEqual(self.expected, result)
|
||||
self.manager.get.assert_called_with(1)
|
||||
|
||||
def test_find_resource_get_int_string(self):
|
||||
self.manager.get = mock.Mock(return_value=self.expected)
|
||||
result = utils.find_resource(self.manager, "2")
|
||||
self.assertEqual(self.expected, result)
|
||||
self.manager.get.assert_called_with(2)
|
||||
|
||||
def test_find_resource_get_uuid(self):
|
||||
uuid = '9a0dc2a0-ad0d-11e3-a5e2-0800200c9a66'
|
||||
self.manager.get = mock.Mock(return_value=self.expected)
|
||||
result = utils.find_resource(self.manager, uuid)
|
||||
self.assertEqual(self.expected, result)
|
||||
self.manager.get.assert_called_with(uuid)
|
||||
|
||||
def test_find_resource_get_whatever(self):
|
||||
self.manager.get = mock.Mock(return_value=self.expected)
|
||||
result = utils.find_resource(self.manager, 'whatever')
|
||||
self.assertEqual(self.expected, result)
|
||||
self.manager.get.assert_called_with('whatever')
|
||||
|
||||
def test_find_resource_find(self):
|
||||
self.manager.get = mock.Mock(side_effect=Exception('Boom!'))
|
||||
self.manager.find = mock.Mock(return_value=self.expected)
|
||||
result = utils.find_resource(self.manager, self.name)
|
||||
self.assertEqual(self.expected, result)
|
||||
self.manager.get.assert_called_with(self.name)
|
||||
self.manager.find.assert_called_with(name=self.name)
|
||||
|
||||
def test_find_resource_find_not_found(self):
|
||||
self.manager.get = mock.Mock(side_effect=Exception('Boom!'))
|
||||
self.manager.find = mock.Mock(side_effect=
|
||||
exceptions.NotFound(404, "2"))
|
||||
result = self.assertRaises(exceptions.CommandError,
|
||||
utils.find_resource,
|
||||
self.manager,
|
||||
self.name)
|
||||
self.assertEqual("No lego with a name or ID of 'legos' exists.",
|
||||
str(result))
|
||||
self.manager.get.assert_called_with(self.name)
|
||||
self.manager.find.assert_called_with(display_name=self.name)
|
||||
|
||||
def test_find_resource_find_no_unique(self):
|
||||
self.manager.get = mock.Mock(side_effect=Exception('Boom!'))
|
||||
self.manager.find = mock.Mock(side_effect=NoUniqueMatch())
|
||||
result = self.assertRaises(exceptions.CommandError,
|
||||
utils.find_resource,
|
||||
self.manager,
|
||||
self.name)
|
||||
self.assertEqual("More than one lego exists with the name 'legos'.",
|
||||
str(result))
|
||||
self.manager.get.assert_called_with(self.name)
|
||||
self.manager.find.assert_called_with(display_name=self.name)
|
||||
|
Loading…
x
Reference in New Issue
Block a user