|
| 1 | +import dataclasses |
1 | 2 | import datetime |
2 | 3 |
|
3 | | -from modern_di import Container, Scope, providers |
| 4 | +import pytest |
| 5 | + |
| 6 | +from modern_di import Container, Group, Scope, providers |
4 | 7 |
|
5 | 8 |
|
6 | | -context_provider = providers.ContextProvider(scope=Scope.APP, context_type=datetime.datetime) |
7 | 9 | request_context_provider = providers.ContextProvider(scope=Scope.REQUEST, context_type=datetime.datetime) |
8 | 10 |
|
9 | 11 |
|
| 12 | +@dataclasses.dataclass(kw_only=True, slots=True, frozen=True) |
| 13 | +class SomeFactory: |
| 14 | + arg1: datetime.datetime |
| 15 | + |
| 16 | + |
| 17 | +class MyGroup(Group): |
| 18 | + context_provider = providers.ContextProvider(scope=Scope.APP, context_type=datetime.datetime) |
| 19 | + some_factory = providers.Factory(creator=SomeFactory) |
| 20 | + |
| 21 | + |
10 | 22 | def test_context_provider() -> None: |
11 | 23 | now = datetime.datetime.now(tz=datetime.timezone.utc) |
12 | 24 | app_container = Container(context={datetime.datetime: now}) |
13 | | - app_container.validate_provider(context_provider) |
14 | | - instance1 = app_container.resolve_provider(context_provider) |
15 | | - instance2 = app_container.resolve_provider(context_provider) |
| 25 | + app_container.validate_provider(MyGroup.context_provider) |
| 26 | + instance1 = app_container.resolve_provider(MyGroup.context_provider) |
| 27 | + instance2 = app_container.resolve_provider(MyGroup.context_provider) |
16 | 28 | assert instance1 is instance2 is now |
17 | 29 |
|
18 | 30 |
|
19 | 31 | def test_context_provider_set_context_after_creation() -> None: |
20 | 32 | now = datetime.datetime.now(tz=datetime.timezone.utc) |
21 | 33 | app_container = Container() |
22 | 34 | app_container.set_context(datetime.datetime, now) |
23 | | - instance1 = app_container.resolve_provider(context_provider) |
24 | | - instance2 = app_container.resolve_provider(context_provider) |
| 35 | + instance1 = app_container.resolve_provider(MyGroup.context_provider) |
| 36 | + instance2 = app_container.resolve_provider(MyGroup.context_provider) |
25 | 37 | assert instance1 is instance2 is now |
26 | 38 |
|
27 | 39 |
|
28 | 40 | def test_context_provider_not_found() -> None: |
29 | 41 | app_container = Container() |
30 | | - assert app_container.resolve_provider(context_provider) is None |
| 42 | + assert app_container.resolve_provider(MyGroup.context_provider) is None |
| 43 | + |
| 44 | + |
| 45 | +def test_context_provider_not_found_but_required() -> None: |
| 46 | + app_container = Container(groups=[MyGroup]) |
| 47 | + with pytest.raises(RuntimeError, match=r"Argument arg1 of type <class 'datetime.datetime'> cannot be resolved"): |
| 48 | + app_container.resolve(SomeFactory) |
31 | 49 |
|
32 | 50 |
|
33 | 51 | def test_context_provider_in_request_scope() -> None: |
|
0 commit comments