From 3eb2abdb2aec830d0d17d1e14695273dbcde5328 Mon Sep 17 00:00:00 2001 From: Philipp Date: Mon, 23 Aug 2021 15:47:41 +0200 Subject: [PATCH] Adapt tests --- src/DI.php | 11 ++++ src/Network/HTTPClient.php | 5 -- src/Network/IHTTPClient.php | 1 - tests/datasets/curl/image.content | Bin 16946 -> 24875 bytes tests/src/Core/InstallerTest.php | 10 +-- tests/src/Core/StorageManagerTest.php | 6 +- tests/src/Network/HTTPRequestTest.php | 87 +++++++++++++++++--------- tests/src/Util/ImagesTest.php | 13 ++++ 8 files changed, 90 insertions(+), 43 deletions(-) create mode 100644 tests/src/Util/ImagesTest.php diff --git a/src/DI.php b/src/DI.php index 5c56b45e13..7f6f28f33c 100644 --- a/src/DI.php +++ b/src/DI.php @@ -39,6 +39,17 @@ abstract class DI self::$dice = $dice; } + /** + * Returns a clone of the current dice instance + * This usefull for overloading the current instance with mocked methods during tests + * + * @return Dice + */ + public static function getDice() + { + return clone self::$dice; + } + // // common instances // diff --git a/src/Network/HTTPClient.php b/src/Network/HTTPClient.php index d83b805df0..c90dbc8964 100644 --- a/src/Network/HTTPClient.php +++ b/src/Network/HTTPClient.php @@ -92,11 +92,6 @@ class HTTPClient implements IHTTPClient return CurlResult::createErrorCurl($url); } - if (Network::isRedirectBlocked($url)) { - $this->logger->info('Domain should not be redirected.', ['url' => $url]); - return CurlResult::createErrorCurl($url); - } - $conf = []; if (!empty($opts['cookiejar'])) { diff --git a/src/Network/IHTTPClient.php b/src/Network/IHTTPClient.php index 180908eede..c8611e8f5b 100644 --- a/src/Network/IHTTPClient.php +++ b/src/Network/IHTTPClient.php @@ -107,7 +107,6 @@ interface IHTTPClient * * @return string A canonical URL * @throws \Friendica\Network\HTTPException\InternalServerErrorException - * @see ParseUrl::getSiteinfo */ public function finalUrl(string $url); } diff --git a/tests/datasets/curl/image.content b/tests/datasets/curl/image.content index eea1b7e46350ecea68f98f1d84f0f8786fddf9aa..98285c3e11ad2ad3a7e0610ee356cea43f7fbb49 100644 GIT binary patch literal 24875 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'test Error'); // Mocking the CURL Request - $networkMock = Mockery::mock(IHTTPRequest::class); + $networkMock = Mockery::mock(IHTTPClient::class); $networkMock ->shouldReceive('fetchFull') ->with('https://test/install/testrewrite') @@ -342,7 +342,7 @@ class InstallerTest extends MockedTest ->andReturn($IHTTPResult); $this->dice->shouldReceive('create') - ->with(IHTTPRequest::class) + ->with(IHTTPClient::class) ->andReturn($networkMock); DI::init($this->dice); @@ -378,7 +378,7 @@ class InstallerTest extends MockedTest ->andReturn('204'); // Mocking the CURL Request - $networkMock = Mockery::mock(IHTTPRequest::class); + $networkMock = Mockery::mock(IHTTPClient::class); $networkMock ->shouldReceive('fetchFull') ->with('https://test/install/testrewrite') @@ -389,7 +389,7 @@ class InstallerTest extends MockedTest ->andReturn($IHTTPResultW); $this->dice->shouldReceive('create') - ->with(IHTTPRequest::class) + ->with(IHTTPClient::class) ->andReturn($networkMock); DI::init($this->dice); diff --git a/tests/src/Core/StorageManagerTest.php b/tests/src/Core/StorageManagerTest.php index 9e8e3aa2c2..93fc0b6648 100644 --- a/tests/src/Core/StorageManagerTest.php +++ b/tests/src/Core/StorageManagerTest.php @@ -34,7 +34,7 @@ use Friendica\Factory\ConfigFactory; use Friendica\Model\Config\Config; use Friendica\Model\Storage; use Friendica\Core\Session; -use Friendica\Network\HTTPRequest; +use Friendica\Network\HTTPClient; use Friendica\Test\DatabaseTest; use Friendica\Test\Util\Database\StaticDatabase; use Friendica\Test\Util\VFSTrait; @@ -55,7 +55,7 @@ class StorageManagerTest extends DatabaseTest private $logger; /** @var L10n */ private $l10n; - /** @var HTTPRequest */ + /** @var HTTPClient */ private $httpRequest; protected function setUp(): void @@ -84,7 +84,7 @@ class StorageManagerTest extends DatabaseTest $this->l10n = \Mockery::mock(L10n::class); - $this->httpRequest = \Mockery::mock(HTTPRequest::class); + $this->httpRequest = \Mockery::mock(HTTPClient::class); } /** diff --git a/tests/src/Network/HTTPRequestTest.php b/tests/src/Network/HTTPRequestTest.php index 4fd0ab1794..230dc3eec3 100644 --- a/tests/src/Network/HTTPRequestTest.php +++ b/tests/src/Network/HTTPRequestTest.php @@ -3,58 +3,87 @@ namespace Friendica\Test\src\Network; use Dice\Dice; -use Friendica\App\BaseURL; -use Friendica\Core\Config\IConfig; use Friendica\DI; -use Friendica\Network\HTTPRequest; -use Friendica\Network\IHTTPRequest; +use Friendica\Network\HTTPClient; +use Friendica\Network\IHTTPClient; use Friendica\Test\MockedTest; use Friendica\Util\Images; use Friendica\Util\Profiler; +use GuzzleHttp\Client; use GuzzleHttp\Handler\MockHandler; +use GuzzleHttp\HandlerStack; use GuzzleHttp\Psr7\Response; +use mattwright\URLResolver; use Psr\Log\NullLogger; require_once __DIR__ . '/../../../static/dbstructure.config.php'; class HTTPRequestTest extends MockedTest { - public function testImageFetch() + /** @var HandlerStack */ + protected $handler; + + protected function setUp(): void { - $mock = new MockHandler([ - new Response(200, [ - 'Server' => 'tsa_b', - 'Content-Type' => 'image/png', - 'Cache-Control' => 'max-age=604800, must-revalidate', - 'Content-Length' => 24875, - ], file_get_contents(__DIR__ . '/../../datasets/curl/image.content')) - ]); + parent::setUp(); - $config = \Mockery::mock(IConfig::class); - $config->shouldReceive('get')->with('system', 'curl_range_bytes', 0)->once()->andReturn(null); - $config->shouldReceive('get')->with('system', 'verifyssl')->once(); - $config->shouldReceive('get')->with('system', 'proxy')->once(); - $config->shouldReceive('get')->with('system', 'ipv4_resolve', false)->once()->andReturnFalse(); - $config->shouldReceive('get')->with('system', 'blocklist', [])->once()->andReturn([]); + $this->handler = HandlerStack::create(); - $baseUrl = \Mockery::mock(BaseURL::class); - $baseUrl->shouldReceive('get')->andReturn('http://friendica.local'); + $client = new Client(['handler' => $this->handler]); + + $resolver = \Mockery::mock(URLResolver::class); $profiler = \Mockery::mock(Profiler::class); $profiler->shouldReceive('startRecording')->andReturnTrue(); $profiler->shouldReceive('stopRecording')->andReturnTrue(); - $httpRequest = new HTTPRequest(new NullLogger(), $profiler, $config, $baseUrl); + $httpClient = new HTTPClient(new NullLogger(), $profiler, $client, $resolver); - self::assertInstanceOf(IHTTPRequest::class, $httpRequest); + $dice = DI::getDice(); + $newDice = \Mockery::mock($dice)->makePartial(); + $newDice->shouldReceive('create')->with(IHTTPClient::class)->andReturn($httpClient); + DI::init($newDice); + } - $dice = \Mockery::mock(Dice::class); - $dice->shouldReceive('create')->with(IHTTPRequest::class)->andReturn($httpRequest)->once(); - $dice->shouldReceive('create')->with(BaseURL::class)->andReturn($baseUrl); - $dice->shouldReceive('create')->with(IConfig::class)->andReturn($config)->once(); + public function dataImages() + { + return [ + 'image1' => [ + 'url' => 'https://pbs.twimg.com/profile_images/2365515285/9re7kx4xmc0eu9ppmado.png', + 'headers' => [ + 'Server' => 'tsa_b', + 'Content-Type' => 'image/png', + 'Cache-Control' => 'max-age=604800,must-revalidate', + 'Last-Modified' => 'Thu,04Nov201001:42:54GMT', + 'Content-Length' => '24875', + 'Access-Control-Allow-Origin' => '*', + 'Access-Control-Expose-Headers' => 'Content-Length', + 'Date' => 'Mon,23Aug202112:39:00GMT', + 'Connection' => 'keep-alive', + ], + 'data' => file_get_contents(__DIR__ . '/../../datasets/curl/image.content'), + 'assertion' => [ + '0' => '400', + '1' => '400', + '2' => '3', + '3' => 'width="400" height="400"', + 'bits' => '8', + 'mime' => 'image/png', + 'size' => '24875', + ] + ] + ]; + } - DI::init($dice); + /** + * @dataProvider dataImages + */ + public function testGetInfoFromURL(string $url, array $headers, string $data, array $assertion) + { + $this->handler->setHandler(new MockHandler([ + new Response(200, $headers, $data), + ])); - print_r(Images::getInfoFromURL('https://pbs.twimg.com/profile_images/2365515285/9re7kx4xmc0eu9ppmado.png')); + self::assertArraySubset($assertion, Images::getInfoFromURL($url)); } } diff --git a/tests/src/Util/ImagesTest.php b/tests/src/Util/ImagesTest.php new file mode 100644 index 0000000000..d35f9c4eca --- /dev/null +++ b/tests/src/Util/ImagesTest.php @@ -0,0 +1,13 @@ +