예제 #1
0
def test_should_pass_container_as_parameter():
    container = Container()
    container['service'] = lambda container: Service()
    container['container'] = lambda container: container

    assert container['service'] is not container
    assert container['container'] is container
예제 #2
0
def test_with_function():
    container = Container()

    def my_function(container):
        return Service()

    container['service'] = my_function

    assert isinstance(container['service'], Service)
예제 #3
0
def test_del():
    container = Container()
    container['param'] = 'value'
    container['service'] = lambda container: Service()

    del container['param'], container['service']

    assert 'param' not in container
    assert 'service' not in container
예제 #4
0
def test_callable_class_should_be_treated_as_a_factory():
    container = Container()

    service_factory = ServiceFactory()
    container['service'] = service_factory

    assert container.raw('service') is service_factory
    assert not callable(container['service'])
    assert isinstance(container['service'], Service)
예제 #5
0
def test_services_should_be_same_instance():
    container = Container()
    container['service'] = lambda container: Service()

    service_one = container['service']
    service_two = container['service']

    assert isinstance(service_one, Service)
    assert isinstance(service_two, Service)
    assert service_one is service_two
예제 #6
0
def test_raw():
    container = Container()

    def my_function(container):
        return Service()

    container['service'] = my_function

    assert callable(container.raw('service'))
    assert container.raw('service') is my_function
예제 #7
0
def test_contains():
    container = Container()
    container['param'] = 'value'
    container['service'] = lambda container: Service()
    container['None'] = None

    assert 'param' in container
    assert 'service' in container
    assert 'None' in container
    assert 'non_existent' not in container
예제 #8
0
def test_factory_services_should_be_different():
    container = Container()
    container['service'] = container.factory(lambda container: Service())

    service_one = container['service']
    service_two = container['service']

    assert isinstance(service_one, Service)
    assert isinstance(service_two, Service)
    assert service_one is not service_two
예제 #9
0
def test_non_callable_class_should_be_treated_as_a_parameter():
    non_callable = NonCallable()

    container = Container()
    container['non_callable'] = non_callable

    non_callable_one = container['non_callable']
    assert isinstance(non_callable_one, NonCallable)
    assert non_callable_one is non_callable

    non_callable_two = container['non_callable']
    assert isinstance(non_callable_two, NonCallable)
    assert non_callable_one is non_callable_two
예제 #10
0
def test_extend():
    container = Container()
    container['service'] = lambda container: Service('inner')

    def service_extension(extendedServiceResult: Service, c: Container):
        assert isinstance(c, Container)
        assert c is container

        return Service('decorates ' + extendedServiceResult.value)

    container.extend('service', service_extension)

    service_one = container['service']
    assert isinstance(service_one, Service)
    assert service_one.value == 'decorates inner'

    service_two = container['service']
    assert service_one is service_two
예제 #11
0
def test_decorator():
    container = Container()

    container['param'] = 'value'
    container['service'] = lambda container: Service()
    container['None'] = None

    test_value = 0

    @container.bind_callable(('param', 'service', 'None'))
    def decorated_service(param, service, none=True, not_injected=42):
        nonlocal test_value
        assert param == 'value'
        assert isinstance(service, Service)
        assert none is None
        assert not_injected is 42
        test_value = 1

    assert test_value == 0
    decorated_service()
    assert test_value == 1
예제 #12
0
def test_decorator_with_binded_service():
    container = Container()

    container['param'] = 'value'
    container['service'] = lambda container: Service()
    container['None'] = None

    test_value = 0

    @container.bind_callable(dependencies=('param', 'service', 'None'), injection_id='decorated')
    def decorated_service(param, service, none=True, not_injected=42):
        nonlocal test_value
        assert param == 'value'
        assert isinstance(service, Service)
        assert none is None
        assert not_injected is 42
        test_value = 1
        return Service(6)

    assert test_value == 0
    decorated_service = container['decorated']
    assert isinstance(decorated_service, Service)
    assert decorated_service.value == 6
    assert test_value == 1
예제 #13
0
import asyncio
import os
from scute import Container
from app.domain.weather.repository import WeatherRepository
from app.domain.weather.repository.external.openweather import OpenWeatherRepository

# pylint: disable=invalid-name
container = Container()

container[
    'weather.weather_provider.open_weather.url'] = 'https://api.openweathermap.org/data/2.5'
container['weather.weather_provider.open_weather.api_key'] = os.environ[
    'OPENWEATHER_API_KEY']


@container.bind_callable(
    dependencies=('weather.weather_provider.open_weather.url',
                  'weather.weather_provider.open_weather.api_key'),
    injection_id='weather_provider')
def _weather_provider(api_url: str, api_key: str) -> WeatherRepository:
    return OpenWeatherRepository(api_url, api_key)


container['loop'] = lambda c: asyncio.new_event_loop()
예제 #14
0
def test_with_string():
    container = Container()
    container['param'] = 'value'

    assert container['param'] == 'value'
예제 #15
0
def test_protect():
    container = Container()
    container['protected'] = container.protect(lambda: Service())

    assert callable(container['protected'])
    assert isinstance(container['protected'](), Service)
예제 #16
0
def test_error_if_non_existent_id():
    container = Container()

    with pytest.raises(UnknownIdentifierError) as excinfo:
        a = container['foo']
    assert excinfo.value.injection_id == 'foo'
예제 #17
0
def test_constructor_injection():
    params = {'param': 'value'}
    container = Container(params)

    assert container['param'] == 'value'
예제 #18
0
def test_non_callable_protected_should_raise_an_error():
    container = Container()
    with pytest.raises(NotCallableProtectError):
        container['protected'] = container.protect('not a callable')
예제 #19
0
def test_with_lambda():
    container = Container()
    container['service'] = lambda container: Service()

    assert isinstance(container['service'], Service)
예제 #20
0
def test_extend_error_if_non_existent_id():
    container = Container()

    with pytest.raises(UnknownIdentifierError) as excinfo:
        container.extend('foo', lambda: True)
    assert excinfo.value.injection_id == 'foo'
예제 #21
0
def test_non_callable_factory_should_raise_an_error():
    container = Container()
    with pytest.raises(NotCallableFactoryError):
        container['service'] = container.factory('not a callable')
예제 #22
0
def test_non_callable_extended_should_raise_an_error():
    container = Container()
    container['param'] = 'value'
    with pytest.raises(NotCallableExtendedServiceError):
        container.extend('param', lambda: True)
예제 #23
0
def test_non_callable_extension_should_raise_an_error():
    container = Container()
    container['service'] = lambda container: Service()
    with pytest.raises(NotCallableFactoryError):
        container.extend('service', 'not a callable')