1010
1111namespace Test \Http \Client ;
1212
13- use GuzzleHttp \Client as GuzzleClient ;
14- use GuzzleHttp \Handler \CurlHandler ;
13+ use GuzzleHttp \Handler \MockHandler ;
1514use GuzzleHttp \HandlerStack ;
16- use GuzzleHttp \Middleware ;
15+ use GuzzleHttp \Psr7 \ Response ;
1716use OC \Http \Client \Client ;
1817use OC \Http \Client \ClientService ;
1918use OC \Http \Client \DnsPinMiddleware ;
2221use OCP \IConfig ;
2322use OCP \Security \IRemoteHostValidator ;
2423use OCP \ServerVersion ;
25- use Psr \Http \Message \RequestInterface ;
2624use Psr \Log \LoggerInterface ;
2725
2826/**
@@ -32,21 +30,38 @@ class ClientServiceTest extends \Test\TestCase {
3230 public function testNewClient (): void {
3331 /** @var IConfig $config */
3432 $ config = $ this ->createMock (IConfig::class);
35- $ config ->method ('getSystemValueBool ' )
36- ->with ('dns_pinning ' , true )
37- ->willReturn (true );
33+ $ config ->method ('getSystemValueBool ' )->willReturnMap ([
34+ ['dns_pinning ' , true , true ],
35+ ['installed ' , false , false ],
36+ ['allow_local_remote_servers ' , false , false ],
37+ ['http_client_add_user_agent_url ' , false , false ],
38+ ]);
3839 /** @var ICertificateManager $certificateManager */
3940 $ certificateManager = $ this ->createMock (ICertificateManager::class);
4041 $ dnsPinMiddleware = $ this ->createMock (DnsPinMiddleware::class);
42+ $ dnsMiddleware = static fn (callable $ handler ): callable => $ handler ;
4143 $ dnsPinMiddleware
4244 ->expects ($ this ->atLeastOnce ())
4345 ->method ('addDnsPinning ' )
44- ->willReturn (function (): void {
45- });
46+ ->willReturn ($ dnsMiddleware );
4647 $ remoteHostValidator = $ this ->createMock (IRemoteHostValidator::class);
48+ $ remoteHostValidator ->method ('isValid ' )->willReturn (true );
4749 $ eventLogger = $ this ->createMock (IEventLogger::class);
50+ $ eventLogger ->expects ($ this ->once ())
51+ ->method ('start ' )
52+ ->with ('http:request ' , 'GET request to / ' );
53+ $ eventLogger ->expects ($ this ->once ())
54+ ->method ('end ' )
55+ ->with ('http:request ' );
4856 $ logger = $ this ->createMock (LoggerInterface::class);
4957 $ serverVersion = $ this ->createMock (ServerVersion::class);
58+ $ serverVersion ->method ('getVersionString ' )->willReturn ('1.0.0 ' );
59+ $ config ->method ('getSystemValueString ' )->willReturnMap ([
60+ ['proxy ' , '' , '' ],
61+ ['overwrite.cli.url ' , '' , '' ],
62+ ]);
63+ $ config ->method ('getSystemValue ' )->with ('proxyexclude ' , [])->willReturn ([]);
64+ $ certificateManager ->method ('getDefaultCertificatesBundlePath ' )->willReturn ('/tmp/certificates.crt ' );
5065
5166 $ clientService = new ClientService (
5267 $ config ,
@@ -58,27 +73,22 @@ public function testNewClient(): void {
5873 $ serverVersion ,
5974 );
6075
61- $ handler = new CurlHandler ();
62- $ stack = HandlerStack::create ($ handler );
63- $ stack ->push ($ dnsPinMiddleware ->addDnsPinning ());
64- $ stack ->push (Middleware::tap (function (RequestInterface $ request ) use ($ eventLogger ): void {
65- $ eventLogger ->start ('http:request ' , $ request ->getMethod () . ' request to ' . $ request ->getRequestTarget ());
66- }, function () use ($ eventLogger ): void {
67- $ eventLogger ->end ('http:request ' );
68- }), 'event logger ' );
69- $ guzzleClient = new GuzzleClient (['handler ' => $ stack ]);
76+ $ client = $ clientService ->newClient ();
77+ $ this ->assertEquals (new Client (
78+ $ config ,
79+ $ certificateManager ,
80+ $ this ->getGuzzleClient ($ client ),
81+ $ remoteHostValidator ,
82+ $ logger ,
83+ $ serverVersion ,
84+ ), $ client );
85+
86+ $ stack = $ this ->getHandlerStack ($ client );
87+ $ this ->assertStringContainsString ("Name: '' " , (string )$ stack );
88+ $ this ->assertStringContainsString ("Name: 'event logger' " , (string )$ stack );
7089
71- $ this ->assertEquals (
72- new Client (
73- $ config ,
74- $ certificateManager ,
75- $ guzzleClient ,
76- $ remoteHostValidator ,
77- $ logger ,
78- $ serverVersion ,
79- ),
80- $ clientService ->newClient ()
81- );
90+ $ stack ->setHandler (new MockHandler ([new Response (200 )]));
91+ $ this ->assertSame (200 , $ client ->get ('https://example.com ' )->getStatusCode ());
8292 }
8393
8494 public function testDisableDnsPinning (): void {
@@ -93,12 +103,25 @@ public function testDisableDnsPinning(): void {
93103 $ dnsPinMiddleware
94104 ->expects ($ this ->never ())
95105 ->method ('addDnsPinning ' )
96- ->willReturn (function (): void {
97- });
106+ ->willReturn (static fn (callable $ handler ): callable => $ handler );
98107 $ remoteHostValidator = $ this ->createMock (IRemoteHostValidator::class);
108+ $ remoteHostValidator ->method ('isValid ' )->willReturn (true );
99109 $ eventLogger = $ this ->createMock (IEventLogger::class);
100110 $ logger = $ this ->createMock (LoggerInterface::class);
101111 $ serverVersion = $ this ->createMock (ServerVersion::class);
112+ $ serverVersion ->method ('getVersionString ' )->willReturn ('1.0.0 ' );
113+ $ config ->method ('getSystemValueBool ' )->willReturnMap ([
114+ ['dns_pinning ' , true , false ],
115+ ['installed ' , false , false ],
116+ ['allow_local_remote_servers ' , false , false ],
117+ ['http_client_add_user_agent_url ' , false , false ],
118+ ]);
119+ $ config ->method ('getSystemValueString ' )->willReturnMap ([
120+ ['proxy ' , '' , '' ],
121+ ['overwrite.cli.url ' , '' , '' ],
122+ ]);
123+ $ config ->method ('getSystemValue ' )->with ('proxyexclude ' , [])->willReturn ([]);
124+ $ certificateManager ->method ('getDefaultCertificatesBundlePath ' )->willReturn ('/tmp/certificates.crt ' );
102125
103126 $ clientService = new ClientService (
104127 $ config ,
@@ -110,25 +133,28 @@ public function testDisableDnsPinning(): void {
110133 $ serverVersion ,
111134 );
112135
113- $ handler = new CurlHandler ();
114- $ stack = HandlerStack::create ($ handler );
115- $ stack ->push (Middleware::tap (function (RequestInterface $ request ) use ($ eventLogger ): void {
116- $ eventLogger ->start ('http:request ' , $ request ->getMethod () . ' request to ' . $ request ->getRequestTarget ());
117- }, function () use ($ eventLogger ): void {
118- $ eventLogger ->end ('http:request ' );
119- }), 'event logger ' );
120- $ guzzleClient = new GuzzleClient (['handler ' => $ stack ]);
136+ $ client = $ clientService ->newClient ();
137+ $ this ->assertEquals (new Client (
138+ $ config ,
139+ $ certificateManager ,
140+ $ this ->getGuzzleClient ($ client ),
141+ $ remoteHostValidator ,
142+ $ logger ,
143+ $ serverVersion ,
144+ ), $ client );
121145
122- $ this ->assertEquals (
123- new Client (
124- $ config ,
125- $ certificateManager ,
126- $ guzzleClient ,
127- $ remoteHostValidator ,
128- $ logger ,
129- $ serverVersion ,
130- ),
131- $ clientService ->newClient ()
132- );
146+ $ stack = $ this ->getHandlerStack ($ client );
147+ $ this ->assertStringNotContainsString ("Name: '' " , (string )$ stack );
148+ $ this ->assertStringContainsString ("Name: 'event logger' " , (string )$ stack );
149+ }
150+
151+ private function getGuzzleClient (Client $ client ): \GuzzleHttp \Client {
152+ return self ::invokePrivate ($ client , 'client ' );
153+ }
154+
155+ private function getHandlerStack (Client $ client ): HandlerStack {
156+ /** @var HandlerStack $stack */
157+ $ stack = $ this ->getGuzzleClient ($ client )->getConfig ('handler ' );
158+ return $ stack ;
133159 }
134160}
0 commit comments