From c7f54d83ceb7ee119020254e81a18ebe9aca6ec0 Mon Sep 17 00:00:00 2001 From: Philipp Date: Tue, 24 Aug 2021 13:19:17 +0200 Subject: [PATCH] Introduce DiceTestTrait for partial mocking DI:: calls --- tests/DiceTestTrait.php | 70 +++++++++++++++++++++ tests/src/Network/HTTPRequestTest.php | 89 --------------------------- tests/src/Util/ImagesTest.php | 62 ++++++++++++++++++- 3 files changed, 130 insertions(+), 91 deletions(-) create mode 100644 tests/DiceTestTrait.php delete mode 100644 tests/src/Network/HTTPRequestTest.php diff --git a/tests/DiceTestTrait.php b/tests/DiceTestTrait.php new file mode 100644 index 0000000000..2426c20dc0 --- /dev/null +++ b/tests/DiceTestTrait.php @@ -0,0 +1,70 @@ +. + * + */ + +namespace Friendica\Test; + +use Friendica\DI; +use Friendica\Network\HTTPClient; +use Friendica\Network\IHTTPClient; +use GuzzleHttp\Client; +use GuzzleHttp\HandlerStack; +use mattwright\URLResolver; + +/** + * This class mocks some DICE dependencies because they're not direct usable for test environments + * (Like fetching data from external endpoints) + */ +trait DiceTestTrait +{ + /** + * Handler for mocking requests anywhere for testing purpose + * + * @var HandlerStack + */ + protected static $httpRequestHandler; + + protected static function setUpDice(): void + { + if (!empty(self::$httpRequestHandler) && self::$httpRequestHandler instanceof HandlerStack) { + return; + } + + self::$httpRequestHandler = HandlerStack::create(); + + $client = new Client(['handler' => self::$httpRequestHandler]); + + $resolver = \Mockery::mock(URLResolver::class); + + $httpClient = new HTTPClient(DI::logger(), DI::profiler(), $client, $resolver); + + $dice = DI::getDice(); + $newDice = \Mockery::mock($dice)->makePartial(); + $newDice->shouldReceive('create')->with(IHTTPClient::class)->andReturn($httpClient); + DI::init($newDice); + } + + protected function tearDown() : void + { + \Mockery::close(); + + parent::tearDown(); + } +} diff --git a/tests/src/Network/HTTPRequestTest.php b/tests/src/Network/HTTPRequestTest.php deleted file mode 100644 index 230dc3eec3..0000000000 --- a/tests/src/Network/HTTPRequestTest.php +++ /dev/null @@ -1,89 +0,0 @@ -handler = HandlerStack::create(); - - $client = new Client(['handler' => $this->handler]); - - $resolver = \Mockery::mock(URLResolver::class); - - $profiler = \Mockery::mock(Profiler::class); - $profiler->shouldReceive('startRecording')->andReturnTrue(); - $profiler->shouldReceive('stopRecording')->andReturnTrue(); - - $httpClient = new HTTPClient(new NullLogger(), $profiler, $client, $resolver); - - $dice = DI::getDice(); - $newDice = \Mockery::mock($dice)->makePartial(); - $newDice->shouldReceive('create')->with(IHTTPClient::class)->andReturn($httpClient); - DI::init($newDice); - } - - 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', - ] - ] - ]; - } - - /** - * @dataProvider dataImages - */ - public function testGetInfoFromURL(string $url, array $headers, string $data, array $assertion) - { - $this->handler->setHandler(new MockHandler([ - new Response(200, $headers, $data), - ])); - - self::assertArraySubset($assertion, Images::getInfoFromURL($url)); - } -} diff --git a/tests/src/Util/ImagesTest.php b/tests/src/Util/ImagesTest.php index d35f9c4eca..a7cc682f98 100644 --- a/tests/src/Util/ImagesTest.php +++ b/tests/src/Util/ImagesTest.php @@ -2,12 +2,70 @@ namespace Friendica\Test\src\Util; +use Friendica\Test\DiceTestTrait; use Friendica\Test\MockedTest; +use Friendica\Util\Images; +use GuzzleHttp\Handler\MockHandler; +use GuzzleHttp\Psr7\Response; class ImagesTest extends MockedTest { - public function testGetInfoFromURL() - { + use DiceTestTrait; + public static function setUpBeforeClass(): void + { + parent::setUpBeforeClass(); + + self::setUpDice(); + } + + public function dataImages() + { + return [ + 'image' => [ + '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', + ] + ], + 'emptyUrl' => [ + 'url' => '', + 'headers' => [], + 'data' => '', + 'assertion' => [], + ], + ]; + } + + /** + * Test the Images::getInfoFromURL() method + * + * @dataProvider dataImages + */ + public function testGetInfoFromURL(string $url, array $headers, string $data, array $assertion) + { + self::$httpRequestHandler->setHandler(new MockHandler([ + new Response(200, $headers, $data), + ])); + + self::assertArraySubset($assertion, Images::getInfoFromURL($url)); } }