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:
		@@ -74,6 +74,10 @@ def find_resource(manager, name_or_id):
 | 
				
			|||||||
            msg = "No %s with a name or ID of '%s' exists." % \
 | 
					            msg = "No %s with a name or ID of '%s' exists." % \
 | 
				
			||||||
                (manager.resource_class.__name__.lower(), name_or_id)
 | 
					                (manager.resource_class.__name__.lower(), name_or_id)
 | 
				
			||||||
            raise exceptions.CommandError(msg)
 | 
					            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:
 | 
					        else:
 | 
				
			||||||
            raise
 | 
					            raise
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -57,3 +57,75 @@ class TestUtils(test_utils.TestCase):
 | 
				
			|||||||
            self.assertRaises(exceptions.CommandError,
 | 
					            self.assertRaises(exceptions.CommandError,
 | 
				
			||||||
                              utils.get_password,
 | 
					                              utils.get_password,
 | 
				
			||||||
                              mock_stdin)
 | 
					                              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)
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user