Exemple #1
0
def test_scoped_services_context_used_more_than_once_manual_dispose():
    container = Container()

    container.add_instance('value')

    provider = container.build_provider()
    context = GetServiceContext(provider)

    context.dispose()
    assert context.provider is None
Exemple #2
0
def test_add_singleton_by_factory_given_type(method_name):
    container = Container()

    def factory(a):
        return Cat('Celine')

    method = getattr(container, method_name)

    method(factory, Cat)

    provider = container.build_provider()

    cat = provider.get(Cat)

    assert cat is not None
    assert cat.name == 'Celine'

    if method_name == 'add_singleton_by_factory':
        cat_2 = provider.get(Cat)
        assert cat_2 is cat

    if method_name == 'add_transient_by_factory':
        assert provider.get(Cat) is not cat
        assert provider.get(Cat) is not cat
        assert provider.get(Cat) is not cat

    if method_name == 'add_scoped_by_factory':
        with GetServiceContext() as context:
            cat_2 = provider.get(Cat, context)
            assert cat_2 is not cat

            assert provider.get(Cat, context) is cat_2
            assert provider.get(Cat, context) is cat_2
            assert provider.get(Cat, context) is cat_2
Exemple #3
0
def test_factories_activating_singleton_type_consistency(method_name):
    container = Container()

    class ABase(ABC):
        pass

    class BBase(ABC):
        pass

    class A(ABase):
        def __init__(self, b: BBase):
            self.b = b

    class B(BBase):
        def __init__(self):
            pass

    def bbase_factory(context: Services, activating_type: Type) -> BBase:
        assert isinstance(context, Services)
        assert activating_type is A
        return B()

    container.add_singleton(ABase, A)

    method = getattr(container, method_name)
    method(bbase_factory)

    provider = container.build_provider()
    context = GetServiceContext(provider)

    a = provider.get(ABase, context)
    assert isinstance(a, A)
    assert isinstance(a.b, B)
Exemple #4
0
def test_scoped_services_exact():
    container = Container()

    class A:
        def __init__(self, b):
            self.b = b

    class B:
        def __init__(self, c):
            self.c = c

    class C:
        def __init__(self):
            pass

    container.add_exact_scoped(A)
    container.add_exact_scoped(B)
    container.add_exact_scoped(C)

    provider = container.build_provider()
    context = GetServiceContext(provider)

    a = provider.get(A, context)
    assert isinstance(a, A)
    assert isinstance(a.b, B)
    assert isinstance(a.b.c, C)

    a2 = provider.get(A, context)
    assert a is a2
    assert a.b is a2.b
    assert a.b.c is a2.b.c
Exemple #5
0
def test_scoped_services_with_shortcut():
    container = Container()
    container.add_scoped(IdGetter)
    provider = container.build_provider()

    with GetServiceContext() as context:
        a = provider.get(IdGetter, context)
        b = provider.get(IdGetter, context)
        c = provider.get(IdGetter, context)
    d = provider.get(IdGetter)

    assert a is b
    assert b is c
    assert a is not d
    assert b is not d
Exemple #6
0
def test_singleton_services():
    container = Container()
    container.add_exact_singleton(IdGetter)
    provider = container.build_provider()

    with GetServiceContext() as context:
        a = provider.get(IdGetter, context)
        b = provider.get(IdGetter, context)
        c = provider.get(IdGetter, context)
    d = provider.get(IdGetter)

    assert a is b
    assert a is c
    assert b is c
    assert d is a
Exemple #7
0
def test_transient_services():
    container = Container()
    container.add_exact_transient(IdGetter)
    provider = container.build_provider()

    with GetServiceContext() as context:
        a = provider.get(IdGetter, context)
        b = provider.get(IdGetter, context)
        c = provider.get(IdGetter, context)
    d = provider.get(IdGetter)

    assert a is not b
    assert a is not c
    assert b is not c
    assert d is not a
    assert d is not b
    assert d is not c
Exemple #8
0
def test_scoped_services_context_used_more_than_once():
    container = Container()

    class C:
        def __init__(self):
            pass

    class B2:
        def __init__(self, c: C):
            self.c = c

    class B1:
        def __init__(self, c: C):
            self.c = c

    class A:
        def __init__(self, b1: B1, b2: B2):
            self.b1 = b1
            self.b2 = b2

    container.add_exact_scoped(C)
    container.add_exact_transient(B1)
    container.add_exact_transient(B2)
    container.add_exact_transient(A)

    provider = container.build_provider()

    context = GetServiceContext(provider)

    with context:
        a = provider.get(A, context)
        first_c = provider.get(C)
        a.b1.c is first_c
        a.b2.c is first_c

    with context:
        a = provider.get(A, context)
        second_c = provider.get(C)
        a.b1.c is second_c
        a.b2.c is second_c

    assert first_c is not None
    assert second_c is not None
    assert first_c is not second_c
Exemple #9
0
def test_factories_type_singleton_consistency_nested(method_name):
    container = Container()

    class ABase(ABC):
        pass

    class BBase(ABC):
        pass

    class CBase(ABC):
        pass

    class A(ABase):
        def __init__(self, b: BBase):
            self.b = b

    class B(BBase):
        def __init__(self, c: CBase):
            self.c = c

    class C(CBase):
        def __init__(self):
            pass

    def cbase_factory(context: Services, activating_type: Type) -> CBase:
        assert isinstance(context, Services)
        assert activating_type is B
        return C()

    container.add_singleton(ABase, A)
    container.add_singleton(BBase, B)

    method = getattr(container, method_name)
    method(cbase_factory)

    provider = container.build_provider()
    context = GetServiceContext(provider)

    a = provider.get(ABase, context)
    assert isinstance(a, A)
    assert isinstance(a.b, B)
    assert isinstance(a.b.c, C)
Exemple #10
0
def test_scoped_services_abstract():
    container = Container()

    class ABase(ABC):
        pass

    class BBase(ABC):
        pass

    class CBase(ABC):
        pass

    class A(ABase):
        def __init__(self, b: BBase):
            self.b = b

    class B(BBase):
        def __init__(self, c: CBase):
            self.c = c

    class C(CBase):
        def __init__(self):
            pass

    container.add_scoped(ABase, A)
    container.add_scoped(BBase, B)
    container.add_scoped(CBase, C)

    provider = container.build_provider()
    context = GetServiceContext(provider)

    a = provider.get(ABase, context)
    assert isinstance(a, A)
    assert isinstance(a.b, B)
    assert isinstance(a.b.c, C)

    a2 = provider.get(ABase, context)
    assert a is a2
    assert a.b is a2.b
    assert a.b.c is a2.b.c
Exemple #11
0
async def dependency_injection_middleware(
    request: Request, handler: Callable[[Request], Awaitable[Response]]
) -> Response:
    with GetServiceContext() as context:
        request.services_context = context  # type: ignore
        return await handler(request)
Exemple #12
0
async def dependency_injection_middleware(request, handler):
    with GetServiceContext() as context:
        request.services_context = context
        return await handler(request)