33
44from pif import providers , wiring
55
6- provider = providers .Singleton [str ](lambda : "hello" )
76
7+ def provide (s : str ) -> providers .Singleton [str ]:
8+ return providers .Singleton [str ](lambda : f"{ s } _injected" )
89
9- def my_func (a : str = provider ):
10+
11+ def my_func (a : str = provide ("a" )):
1012 """
1113 Our dummy method to test wiring for the module.
1214 """
@@ -19,21 +21,21 @@ def test_patch_kwarg():
1921 """
2022 sig_before = inspect .signature (my_func )
2123 doc_before = my_func .__doc__
22- assert provider == my_func ()
24+ assert isinstance ( my_func (), providers . Singleton )
2325 assert not wiring .is_patched (my_func )
2426
2527 wiring .wire ([__name__ ])
2628 sig_wired = inspect .signature (my_func )
2729 doc_wired = my_func .__doc__
28- assert my_func () == "hello "
30+ assert my_func () == "a_injected "
2931 assert sig_before == sig_wired
3032 assert doc_before == doc_wired
3133 assert wiring .is_patched (my_func )
3234
3335 wiring .unwire ([__name__ ])
3436 sig_unwired = inspect .signature (my_func )
3537 doc_unwired = my_func .__doc__
36- assert provider == my_func ()
38+ assert isinstance ( my_func (), providers . Singleton )
3739 assert not wiring .is_patched (my_func )
3840 assert sig_before == sig_unwired
3941 assert doc_before == doc_unwired
@@ -44,17 +46,78 @@ def test_patch_lazy():
4446 Test that our wiring implementation lazily evaluates providers.
4547 """
4648 mock = MagicMock ()
47-
48- def func (v = None ):
49- return v
50-
51- assert not mock .call_count
52- patched = wiring .patch_args_decorator (func , {"v" : mock })
5349 assert not mock .call_count
5450
55- assert func () is None
51+ @wiring .injected
52+ def func (v = providers .Singleton [MagicMock ](lambda : mock )):
53+ return v ()
54+
5655 assert not mock .call_count
57- assert isinstance (patched (), MagicMock )
56+ assert isinstance (func (), MagicMock )
5857 assert mock .call_count == 1
59- assert isinstance (patched (), MagicMock )
58+ assert isinstance (func (), MagicMock )
6059 assert mock .call_count == 2
60+
61+
62+ def test_patch_positional_only ():
63+ """
64+ Test patching for POSITIONAL_ONLY arguments.
65+ """
66+
67+ @wiring .injected
68+ def p1 (a , b = provide ("b" ), c = "c_default" , / ):
69+ return a , b , c
70+
71+ assert p1 (None ) == (None , "b_injected" , "c_default" )
72+ assert p1 (None , None ) == (None , None , "c_default" )
73+
74+ @wiring .injected
75+ def p2 (a , b = None , c = provide ("c" ), / ):
76+ return a , b , c
77+
78+ assert p2 (None ) == (None , None , "c_injected" )
79+ assert p2 (None , None ) == (None , None , "c_injected" )
80+ assert p2 (None , None , "c_override" ) == (None , None , "c_override" )
81+
82+
83+ def test_patch_positional ():
84+ """
85+ Test patching for POSITIONAL_OR_KEYWORD arguments.
86+ """
87+
88+ @wiring .injected
89+ def p1 (a , b = provide ("b" ), c = "c_default" ):
90+ return a , b , c
91+
92+ assert p1 (None ) == (None , "b_injected" , "c_default" )
93+ assert p1 (None , None ) == (None , None , "c_default" )
94+ assert p1 (a = None ) == (None , "b_injected" , "c_default" )
95+ assert p1 (a = None , b = None ) == (None , None , "c_default" )
96+
97+ @wiring .injected
98+ def p2 (a , b = None , c = provide ("c" )):
99+ return a , b , c
100+
101+ assert p2 (None ) == (None , None , "c_injected" )
102+ assert p2 (None , None ) == (None , None , "c_injected" )
103+ assert p2 (None , None , "c_override" ) == (None , None , "c_override" )
104+ assert p2 (a = None ) == (None , None , "c_injected" )
105+ assert p2 (a = None , b = None ) == (None , None , "c_injected" )
106+ assert p2 (a = None , b = None , c = "c_override" ) == (None , None , "c_override" )
107+
108+
109+ def test_patch_positional_or_keyword ():
110+ """
111+ Test patching for VAR_POSITIONAL argument.
112+ """
113+
114+ @wiring .injected
115+ def p1 (a , b = provide ("b" ), * c , d = "d_default" , e = provide ("e" )):
116+ return a , b , * c , d , e
117+
118+ assert p1 ("a" ) == ("a" , "b_injected" , "d_default" , "e_injected" )
119+ assert p1 ("a" , "b" ) == ("a" , "b" , "d_default" , "e_injected" )
120+ assert p1 ("a" , "b" , "c1" ) == ("a" , "b" , "c1" , "d_default" , "e_injected" )
121+ assert p1 ("a" , "b" , "c1" , "c2" ) == ("a" , "b" , "c1" , "c2" , "d_default" , "e_injected" )
122+ assert p1 ("a" , "b" , "c1" , "c2" , d = "d" ) == ("a" , "b" , "c1" , "c2" , "d" , "e_injected" )
123+ assert p1 ("a" , "b" , "c1" , "c2" , d = "d" , e = "e" ) == ("a" , "b" , "c1" , "c2" , "d" , "e" )
0 commit comments