tests.test_dep_definition_functions   A
last analyzed

Complexity

Total Complexity 13

Size/Duplication

Total Lines 141
Duplicated Lines 0 %

Importance

Changes 0
Metric Value
wmc 13
eloc 92
dl 0
loc 141
rs 10
c 0
b 0
f 0

11 Functions

Rating   Name   Duplication   Size   Complexity  
A test_when_yielding_finally_can_be_used() 0 14 1
A test_the_functions_return_new_instances_each_time() 0 8 1
A test_definition_functions_get_an_instance_of_the_container() 0 8 1
A test_functions_can_be_made_into_singletons() 0 8 1
A test_functions_that_are_typed_can_be_used_by_a_container() 0 6 1
A test_definition_functions_can_yield_instead_of_returning() 0 7 1
A test_functions_that_are_not_typed_raise_an_error() 0 6 2
A test_context_managers_can_be_defined_from_a_generator() 0 10 2
A test_singleton_definition_functions_get_an_instance_of_the_container() 0 10 1
A test_defining_a_context_manager_does_not_define_the_managed_type_itself() 0 12 1
A test_yielding_definition_functions_get_an_instance_of_the_container() 0 10 1
1
from dataclasses import dataclass
2
from typing import Iterator, Generator, ContextManager, ClassVar
3
4
import pytest
5
6
from lagom import Container, UnresolvableTypeDefinition
7
from lagom.decorators import dependency_definition, context_dependency_definition
8
from lagom.exceptions import MissingReturnType
9
10
11
@dataclass
12
class MyComplexDep:
13
    finally_was_executed: ClassVar[bool] = False
14
    some_number: int
15
16
17
@dataclass
18
class WrapperOfSomeKind:
19
    inner: MyComplexDep
20
21
22
def test_functions_that_are_typed_can_be_used_by_a_container(container: Container):
23
    @dependency_definition(container)
24
    def my_constructor() -> MyComplexDep:
25
        return MyComplexDep(some_number=5)
26
27
    assert container[MyComplexDep] == MyComplexDep(some_number=5)
28
29
30
def test_the_functions_return_new_instances_each_time(container: Container):
31
    @dependency_definition(container)
32
    def my_constructor() -> MyComplexDep:
33
        return MyComplexDep(some_number=5)
34
35
    first = container[MyComplexDep]
36
    second = container[MyComplexDep]
37
    assert first is not second
38
39
40
def test_definition_functions_can_yield_instead_of_returning(container: Container):
41
    @dependency_definition(container)
42
    def my_constructor() -> Iterator[MyComplexDep]:
43
        yield MyComplexDep(some_number=5)
44
45
    first = container[MyComplexDep]
46
    assert first.some_number == 5
47
48
49
@pytest.mark.pypy_failing
50
def test_when_yielding_finally_can_be_used(container: Container):
51
    MyComplexDep.finally_was_executed = False
52
53
    @dependency_definition(container)
54
    def my_constructor() -> Iterator[MyComplexDep]:
55
        try:
56
            yield MyComplexDep(some_number=5)
57
        finally:
58
            MyComplexDep.finally_was_executed = True
59
60
    dep = container.resolve(MyComplexDep)
61
    assert isinstance(dep, MyComplexDep)
62
    assert MyComplexDep.finally_was_executed is True
63
64
65
def test_functions_can_be_made_into_singletons(container: Container):
66
    @dependency_definition(container, singleton=True)
67
    def my_constructor() -> MyComplexDep:
68
        return MyComplexDep(some_number=5)
69
70
    first = container[MyComplexDep]
71
    second = container[MyComplexDep]
72
    assert first is second
73
74
75
def test_definition_functions_get_an_instance_of_the_container(container: Container):
76
    container[MyComplexDep] = MyComplexDep(some_number=3)
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable MyComplexDep does not seem to be defined.
Loading history...
77
78
    @dependency_definition(container)
79
    def my_constructor(c: Container) -> WrapperOfSomeKind:
80
        return WrapperOfSomeKind(c[MyComplexDep])
81
82
    assert container[WrapperOfSomeKind].inner == container[MyComplexDep]
83
84
85
def test_yielding_definition_functions_get_an_instance_of_the_container(
86
    container: Container,
87
):
88
    container[MyComplexDep] = MyComplexDep(some_number=3)
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable MyComplexDep does not seem to be defined.
Loading history...
89
90
    @dependency_definition(container)
91
    def my_constructor(c: Container) -> Generator[WrapperOfSomeKind, None, None]:
92
        yield WrapperOfSomeKind(c[MyComplexDep])
93
94
    assert container[WrapperOfSomeKind].inner == container[MyComplexDep]
95
96
97
def test_singleton_definition_functions_get_an_instance_of_the_container(
98
    container: Container,
99
):
100
    container[MyComplexDep] = MyComplexDep(some_number=3)
0 ignored issues
show
Comprehensibility Best Practice introduced by
The variable MyComplexDep does not seem to be defined.
Loading history...
101
102
    @dependency_definition(container, singleton=True)
103
    def my_constructor(c: Container) -> WrapperOfSomeKind:
104
        return WrapperOfSomeKind(c[MyComplexDep])
105
106
    assert container[WrapperOfSomeKind].inner == container[MyComplexDep]
107
108
109
def test_functions_that_are_not_typed_raise_an_error(container: Container):
110
    with pytest.raises(MissingReturnType):
111
112
        @dependency_definition(container)
113
        def my_constructor():
114
            return MyComplexDep(some_number=5)
115
116
117
def test_context_managers_can_be_defined_from_a_generator(container: Container):
118
    @context_dependency_definition(container)
119
    def my_constructor() -> Iterator[MyComplexDep]:
120
        try:
121
            yield MyComplexDep(some_number=3)
122
        finally:
123
            pass
124
125
    with container[ContextManager[MyComplexDep]] as dep:  # type: ignore
126
        assert dep.some_number == 3
127
128
129
def test_defining_a_context_manager_does_not_define_the_managed_type_itself(
130
    container: Container,
131
):
132
    @context_dependency_definition(container)
133
    def my_constructor() -> Iterator[MyComplexDep]:
134
        try:
135
            yield MyComplexDep(some_number=3)
136
        finally:
137
            pass
138
139
    definition = container.get_definition(MyComplexDep)
140
    assert isinstance(definition, UnresolvableTypeDefinition) or definition is None
141