Source code for pytest_localstack.contrib.boto3

"""pytest-localstack extensions for boto3."""
from __future__ import absolute_import

import logging

import boto3.session

from pytest_localstack import constants, hookspecs

logger = logging.getLogger(__name__)


[docs]@hookspecs.pytest_localstack_hookimpl def contribute_to_session(session): """Add :class:`Boto3TestResourceFactory` to :class:`~.LocalstackSession`.""" logger.debug("patching session %r", session) session.boto3 = Boto3TestResourceFactory(session)
[docs]class Boto3TestResourceFactory(object): """Create boto3 clients and resources to interact with a :class:`~.LocalstackSession`. Args: localstack_session (:class:`.LocalstackSession`): The session that this factory should create test resources for. """ def __init__(self, localstack_session): logger.debug("Boto3TestResourceFactory.__init__") self.localstack_session = localstack_session self._default_session = None
[docs] def session(self, *args, **kwargs): """Return a boto3 Session object that will use localstack. Arguments are the same as :class:`boto3.session.Session`. """ kwargs["botocore_session"] = self.localstack_session.botocore.default_session kwargs.setdefault("aws_access_key_id", constants.DEFAULT_AWS_ACCESS_KEY_ID) kwargs.setdefault( "aws_secret_access_key", constants.DEFAULT_AWS_SECRET_ACCESS_KEY ) kwargs.setdefault("aws_session_token", constants.DEFAULT_AWS_SESSION_TOKEN) return boto3.session.Session(*args, **kwargs)
@property def default_session(self): """Return a default boto3 Localstack Session. Most applications only need one Session. """ if self._default_session is None: self._default_session = self.session() return self._default_session
[docs] def client(self, service_name): """Return a patched boto3 Client object that will use localstack. Arguments are the same as :func:`boto3.client`. """ return self.default_session.client(service_name)
[docs] def resource(self, service_name): """Return a patched boto3 Resource object that will use localstack. Arguments are the same as :func:`boto3.resource`. """ return self.default_session.resource(service_name)
# No need for a patch method. # Running the botocore patch will also patch boto3.