Skip to content

Commit a8b1425

Browse files
committed
injector_test: Add tests demonstrating handling of optional parameters
1 parent 0503467 commit a8b1425

1 file changed

Lines changed: 52 additions & 1 deletion

File tree

injector_test.py

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2031,7 +2031,7 @@ def test_get_bindings_for_pep_604():
20312031
def function1(a: int | None) -> None:
20322032
pass
20332033

2034-
assert get_bindings(function1) == {'a': int}
2034+
assert get_bindings(function1) == {'a': Union[int, None]}
20352035

20362036
@inject
20372037
def function1(a: int | str) -> None:
@@ -2246,3 +2246,54 @@ def provide_second(self) -> Annotated[str, 'second']:
22462246
injector = Injector(module)
22472247
assert injector.get(Annotated[str, 'first']) == 'Bob'
22482248
assert injector.get(Annotated[str, 'second']) == 'Iger'
2249+
2250+
2251+
@pytest.mark.parametrize(
2252+
"provide",
2253+
[True, False]
2254+
)
2255+
def test_optional_parameter_optional_provider(provide: bool) -> None:
2256+
class Dependency:
2257+
pass
2258+
2259+
class Dependent:
2260+
@inject
2261+
def __init__(self, dependency: Dependency | None = None) -> None:
2262+
self.dependency = dependency
2263+
2264+
class MyModule(Module):
2265+
@provider
2266+
def optional(self) -> Dependency | None:
2267+
return Dependency() if provide else None
2268+
2269+
injector = Injector([MyModule()])
2270+
instance = injector.get(Dependent)
2271+
assert instance.dependency or not provide
2272+
2273+
2274+
@pytest.mark.parametrize(
2275+
"provide",
2276+
[True, False]
2277+
)
2278+
def test_required_parameter_optional_provider(provide: bool) -> None:
2279+
class Dependency:
2280+
def __init__(self, transitive: object = object()) -> None:
2281+
self.dependency = transitive
2282+
2283+
class Dependent:
2284+
@inject
2285+
def __init__(self, dependency: Dependency) -> None:
2286+
self.dependency = dependency
2287+
2288+
class MyModule(Module):
2289+
@provider
2290+
def optional(self) -> Dependency | None:
2291+
return Dependency(transitive="from provider") if provide else None
2292+
2293+
injector = Injector([MyModule()])
2294+
instance = injector.get(Dependent)
2295+
# the Dependency | None provider should never be used, and instead
2296+
# the default behavior of providing instances of Dependency should be
2297+
# used meaning in both provider branches this will be true
2298+
assert instance.dependency is not None
2299+
assert instance.dependency.dependency != "from provider"

0 commit comments

Comments
 (0)