2019-03-19 09:44:44 +00:00
< ? php
/*
* This file is part of the Symfony package .
*
* ( c ) Fabien Potencier < fabien @ symfony . com >
*
* For the full copyright and license information , please view the LICENSE
* file that was distributed with this source code .
*/
namespace Symfony\Component\HttpClient ;
use Symfony\Component\HttpClient\Exception\TransportException ;
use Symfony\Component\HttpClient\Response\MockResponse ;
use Symfony\Component\HttpClient\Response\ResponseStream ;
use Symfony\Contracts\HttpClient\HttpClientInterface ;
use Symfony\Contracts\HttpClient\ResponseInterface ;
use Symfony\Contracts\HttpClient\ResponseStreamInterface ;
/**
* A test - friendly HttpClient that doesn ' t make actual HTTP requests .
*
* @ author Nicolas Grekas < p @ tchwork . com >
*/
class MockHttpClient implements HttpClientInterface
{
use HttpClientTrait ;
private $responseFactory ;
private $baseUri ;
/**
2019-04-03 09:23:58 +01:00
* @ param callable | ResponseInterface | ResponseInterface [] | iterable | null $responseFactory
2019-03-19 09:44:44 +00:00
*/
2019-04-03 09:23:58 +01:00
public function __construct ( $responseFactory = null , string $baseUri = null )
2019-03-19 09:44:44 +00:00
{
if ( $responseFactory instanceof ResponseInterface ) {
$responseFactory = [ $responseFactory ];
}
2019-04-08 19:49:29 +01:00
if ( ! $responseFactory instanceof \Iterator && null !== $responseFactory && ! \is_callable ( $responseFactory )) {
2019-04-03 09:23:58 +01:00
$responseFactory = ( static function () use ( $responseFactory ) {
2019-03-19 09:44:44 +00:00
yield from $responseFactory ;
})();
}
$this -> responseFactory = $responseFactory ;
$this -> baseUri = $baseUri ;
}
/**
* { @ inheritdoc }
*/
public function request ( string $method , string $url , array $options = []) : ResponseInterface
{
[ $url , $options ] = $this -> prepareRequest ( $method , $url , $options , [ 'base_uri' => $this -> baseUri ], true );
$url = implode ( '' , $url );
2019-04-03 09:23:58 +01:00
if ( null === $this -> responseFactory ) {
$response = new MockResponse ();
} elseif ( \is_callable ( $this -> responseFactory )) {
2019-03-19 09:44:44 +00:00
$response = ( $this -> responseFactory )( $method , $url , $options );
} elseif ( ! $this -> responseFactory -> valid ()) {
throw new TransportException ( 'The response factory iterator passed to MockHttpClient is empty.' );
} else {
$response = $this -> responseFactory -> current ();
$this -> responseFactory -> next ();
}
return MockResponse :: fromRequest ( $method , $url , $options , $response );
}
/**
* { @ inheritdoc }
*/
public function stream ( $responses , float $timeout = null ) : ResponseStreamInterface
{
if ( $responses instanceof ResponseInterface ) {
$responses = [ $responses ];
2019-06-13 12:03:18 +01:00
} elseif ( ! is_iterable ( $responses )) {
2019-03-19 09:44:44 +00:00
throw new \TypeError ( sprintf ( '%s() expects parameter 1 to be an iterable of MockResponse objects, %s given.' , __METHOD__ , \is_object ( $responses ) ? \get_class ( $responses ) : \gettype ( $responses )));
}
return new ResponseStream ( MockResponse :: stream ( $responses , $timeout ));
}
}