@@ -156,6 +156,124 @@ public function __invoke(ServerRequestInterface $request)
156156 $ this ->assertEquals ('null ' , (string ) $ response ->getBody ());
157157 }
158158
159+ public function testCallableReturnsCallableForClassWithNullDefaultViaAutowiringWillDefaultToNullValue ()
160+ {
161+ $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
162+
163+ $ controller = new class (null ) {
164+ private $ data = false ;
165+
166+ public function __construct (\stdClass $ data = null )
167+ {
168+ $ this ->data = $ data ;
169+ }
170+
171+ public function __invoke (ServerRequestInterface $ request )
172+ {
173+ return new Response (200 , [], json_encode ($ this ->data ));
174+ }
175+ };
176+
177+ $ container = new Container ([]);
178+
179+ $ callable = $ container ->callable (get_class ($ controller ));
180+ $ this ->assertInstanceOf (\Closure::class, $ callable );
181+
182+ $ response = $ callable ($ request );
183+ $ this ->assertInstanceOf (ResponseInterface::class, $ response );
184+ $ this ->assertEquals (200 , $ response ->getStatusCode ());
185+ $ this ->assertEquals ('null ' , (string ) $ response ->getBody ());
186+ }
187+
188+ public function testCallableReturnsCallableForClassWithNullDefaultViaContainerConfiguration ()
189+ {
190+ $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
191+
192+ $ controller = new class (null ) {
193+ private $ data = false ;
194+
195+ public function __construct (\stdClass $ data = null )
196+ {
197+ $ this ->data = $ data ;
198+ }
199+
200+ public function __invoke (ServerRequestInterface $ request )
201+ {
202+ return new Response (200 , [], json_encode ($ this ->data ));
203+ }
204+ };
205+
206+ $ container = new Container ([
207+ \stdClass::class => (object ) []
208+ ]);
209+
210+ $ callable = $ container ->callable (get_class ($ controller ));
211+ $ this ->assertInstanceOf (\Closure::class, $ callable );
212+
213+ $ response = $ callable ($ request );
214+ $ this ->assertInstanceOf (ResponseInterface::class, $ response );
215+ $ this ->assertEquals (200 , $ response ->getStatusCode ());
216+ $ this ->assertEquals ('{} ' , (string ) $ response ->getBody ());
217+ }
218+
219+ /**
220+ * @requires PHP 8
221+ */
222+ public function testCallableReturnsCallableForUnionWithIntDefaultValueViaAutowiringWillDefaultToIntValue ()
223+ {
224+ $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
225+
226+ $ controller = new class (null ) {
227+ private $ data = false ;
228+
229+ #[PHP8 ] public function __construct (string |int |null $ data = 42 ) { $ this ->data = $ data ; }
230+
231+ public function __invoke (ServerRequestInterface $ request )
232+ {
233+ return new Response (200 , [], json_encode ($ this ->data ));
234+ }
235+ };
236+
237+ $ container = new Container ([]);
238+
239+ $ callable = $ container ->callable (get_class ($ controller ));
240+ $ this ->assertInstanceOf (\Closure::class, $ callable );
241+
242+ $ response = $ callable ($ request );
243+ $ this ->assertInstanceOf (ResponseInterface::class, $ response );
244+ $ this ->assertEquals (200 , $ response ->getStatusCode ());
245+ $ this ->assertEquals ('42 ' , (string ) $ response ->getBody ());
246+ }
247+
248+ public function testCallableReturnsCallableForUndefaultWithStringDefaultViaAutowiringWillDefaultToStringValue ()
249+ {
250+ $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
251+
252+ $ controller = new class (null ) {
253+ private $ data = false ;
254+
255+ public function __construct ($ data = 'empty ' )
256+ {
257+ $ this ->data = $ data ;
258+ }
259+
260+ public function __invoke (ServerRequestInterface $ request )
261+ {
262+ return new Response (200 , [], json_encode ($ this ->data ));
263+ }
264+ };
265+
266+ $ container = new Container ([]);
267+
268+ $ callable = $ container ->callable (get_class ($ controller ));
269+ $ this ->assertInstanceOf (\Closure::class, $ callable );
270+
271+ $ response = $ callable ($ request );
272+ $ this ->assertInstanceOf (ResponseInterface::class, $ response );
273+ $ this ->assertEquals (200 , $ response ->getStatusCode ());
274+ $ this ->assertEquals ('"empty" ' , (string ) $ response ->getBody ());
275+ }
276+
159277 public function testCallableReturnsCallableForClassNameViaAutowiringWithFactoryFunctionForDependency ()
160278 {
161279 $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
@@ -469,6 +587,40 @@ public function __invoke()
469587 $ this ->assertEquals ('{"user":{},"data":null} ' , (string ) $ response ->getBody ());
470588 }
471589
590+ public function testCallableReturnsCallableForClassNameWithDependencyMappedWithFactoryThatRequiresContainerVariablesWithDefaultValues ()
591+ {
592+ $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
593+
594+ $ controller = new class (new Response ()) {
595+ private $ response ;
596+
597+ public function __construct (ResponseInterface $ response )
598+ {
599+ $ this ->response = $ response ;
600+ }
601+
602+ public function __invoke ()
603+ {
604+ return $ this ->response ;
605+ }
606+ };
607+
608+ $ container = new Container ([
609+ ResponseInterface::class => function (string $ name = 'Alice ' , int $ age = 0 ) {
610+ return new Response (200 , [], json_encode (['name ' => $ name , 'age ' => $ age ]));
611+ },
612+ 'age ' => 42
613+ ]);
614+
615+ $ callable = $ container ->callable (get_class ($ controller ));
616+ $ this ->assertInstanceOf (\Closure::class, $ callable );
617+
618+ $ response = $ callable ($ request );
619+ $ this ->assertInstanceOf (ResponseInterface::class, $ response );
620+ $ this ->assertEquals (200 , $ response ->getStatusCode ());
621+ $ this ->assertEquals ('{"name":"Alice","age":42} ' , (string ) $ response ->getBody ());
622+ }
623+
472624 public function testCallableReturnsCallableForClassNameWithDependencyMappedWithFactoryThatRequiresScalarVariables ()
473625 {
474626 $ request = new ServerRequest ('GET ' , 'http://example.com/ ' );
0 commit comments