def test_init(self) -> None: session_mock = MagicMock() service_name_mock = MagicMock() shape_parser = ShapeParser(session_mock, service_name_mock) self.assertEqual(shape_parser.service_name, service_name_mock) session_mock._loader.load_service_model.side_effect = UnknownServiceError( service_name="service_name", known_service_names="known_service_names", ) ShapeParser(session_mock, service_name_mock)
def test_bad_resource_name_with_no_client_has_simple_err_msg(self): mock_bc_session = mock.Mock() loader = mock.Mock(spec=loaders.Loader) loader.load_service_model.side_effect = UnknownServiceError( service_name='foo', known_service_names='asdf') mock_bc_session.get_component.return_value = loader loader.list_available_services.return_value = ['good-resource'] mock_bc_session.get_available_services.return_value = ['good-client'] session = Session(botocore_session=mock_bc_session) with self.assertRaises(ResourceNotExistsError) as e: session.resource('bad-client') err_msg = str(e.exception) # Shouldn't mention anything about clients because # 'bad-client' it not a valid boto3.client(...) self.assertNotIn('boto3.client', err_msg)
def load_service_model(self, service_name, type_name, api_version=None): """Load a botocore service model This is the main method for loading botocore outputs (e.g. a service model, pagination configs, waiter configs, etc.). :type service_name: str :param service_name: The name of the service (e.g ``ec2``, ``s3``). :type type_name: str :param type_name: The model type. Valid types include, but are not limited to: ``service-2``, ``paginators-1``, ``waiters-2``. :type api_version: str :param api_version: The API version to load. If this is not provided, then the latest API version will be used. :type load_extras: bool :param load_extras: Whether or not to load the tool extras which contain additional data to be added to the model. :raises: UnknownServiceError if there is no known service with the provided service_name. :raises: DataNotFoundError if no data could be found for the service_name/type_name/api_version. :return: The loaded data, as a python type (e.g. dict, list, etc). """ # Wrapper around the load_data. This will calculate the path # to call load_data with. known_services = self.list_available_services(type_name) if service_name not in known_services: raise UnknownServiceError(service_name=service_name, known_service_names=', '.join( sorted(known_services))) if api_version is None: api_version = self.determine_latest_version( service_name, type_name) full_path = os.path.join(service_name, api_version, type_name) model = self.load_data(full_path) # Load in all the extras extras_data = self._find_extras(service_name, type_name, api_version) self._extras_processor.process(model, extras_data) return model
def test_bad_resource_name(self): mock_bc_session = mock.Mock() loader = mock.Mock(spec=loaders.Loader) loader.load_service_model.side_effect = UnknownServiceError( service_name='foo', known_service_names='asdf') mock_bc_session.get_component.return_value = loader loader.list_available_services.return_value = ['good-resource'] mock_bc_session.get_available_services.return_value = ['sqs'] session = Session(botocore_session=mock_bc_session) with self.assertRaises(ResourceNotExistsError) as e: session.resource('sqs') err_msg = str(e.exception) # 1. should say the resource doesn't exist. self.assertIn('resource does not exist', err_msg) self.assertIn('sqs', err_msg) # 2. Should list available resources you can choose. self.assertIn('good-resource', err_msg) # 3. Should list client if available. self.assertIn('client', err_msg)
def get_unknown_service_exception(self, name="Error"): return UnknownServiceError(service_name=name, known_service_names=[name])
def _get_unknowservice(self, client_type): return MagicMock(side_effect=UnknownServiceError( service_name=client_type, known_service_names=['rds']))
def test_handle_service_model_load_failure(self): self.session.get_service_model.side_effect = (UnknownServiceError( service_name='s3', known_service_names='')) self.completer.set_shape_dict('s3api', 'list_buckets') self.assertEqual(self.completer._shape_dict, None)