mediawiki-extensions-PageIm.../tests/phpunit/Hooks/SearchResultProvideThumbnailHookHandlerTest.php
Matthias Mullie 5dcd4d13e2 Only provide free images for search purposes
Bug: T320661
Change-Id: Ic26e7e815365f6aa81b6fbfb464d0f41b80e4ae8
2022-11-10 13:26:56 +01:00

172 lines
4.7 KiB
PHP

<?php
namespace PageImages\Tests\Hooks;
use LocalFile;
use MediaWiki\Page\PageIdentity;
use MediaWiki\Page\PageIdentityValue;
use MediaWiki\Search\SearchResultThumbnailProvider;
use MediaWikiIntegrationTestCase;
use PageImages\Hooks\SearchResultProvideThumbnailHookHandler;
use PageImages\PageImages;
use PageProps;
use PHPUnit\Framework\MockObject\Stub\ReturnCallback;
use RepoGroup;
use ThumbnailImage;
/**
* @covers \PageImages\Hooks\SearchResultProvideThumbnailHookHandler
*
* @group PageImages
*/
class SearchResultProvideThumbnailHookHandlerTest extends MediaWikiIntegrationTestCase {
/**
* Creates mock object for LocalFile
* @param int $size
* @param LocalFile $file
* @param string $thumbFilePath
* @return ThumbnailImage
*/
private function getMockThumbnailImage(
int $size,
LocalFile $file,
$thumbFilePath
): ThumbnailImage {
$thumbnail = $this->getMockBuilder( ThumbnailImage::class )
->disableOriginalConstructor()
->onlyMethods( [
'getLocalCopyPath',
'getWidth',
'getHeight',
'getFile',
'getUrl'
] )
->getMock();
$thumbnail->expects( $this->once() )
->method( 'getLocalCopyPath' )
->willReturn( $thumbFilePath );
$thumbnail->expects( $this->once() )
->method( 'getUrl' )
->willReturn( 'https://example.org/test.url' );
$thumbnail->expects( $this->once() )
->method( 'getWidth' )
->willReturn( $size );
$thumbnail->expects( $this->once() )
->method( 'getHeight' )
->willReturn( $size );
$thumbnail->expects( $this->once() )
->method( 'getFile' )
->willReturn( $file );
return $thumbnail;
}
/**
* Creates mock object for LocalFile
* @param int $size
* @param string $thumbFilePath
* @param string $filename
* @return LocalFile
*/
private function getMockLocalFile( int $size, $thumbFilePath, $filename ): LocalFile {
$file = $this->getMockBuilder( LocalFile::class )
->disableOriginalConstructor()
->onlyMethods( [
'getName',
'transform',
'getMimeType'
] )
->getMock();
$file->expects( $this->once() )
->method( 'getName' )
->willReturn( $filename );
$file->expects( $this->once() )
->method( 'transform' )
->with( [ 'width' => $size , 'height' => $size ] )
->willReturn( $this->getMockThumbnailImage( $size, $file, $thumbFilePath ) );
$file->expects( $this->once() )
->method( 'getMimeType' )
->willReturn( 'image/jpg' );
return $file;
}
public function testProvideThumbnail() {
$pageProps = $this->getMockBuilder( PageProps::class )
->disableOriginalConstructor()
->onlyMethods( [ 'getProperties' ] )
->getMock();
$pageIdentities = [
1 => new PageIdentityValue( 1, NS_MAIN, 'dbKey1', PageIdentity::LOCAL ),
2 => new PageIdentityValue( 2, NS_MAIN, 'dbKey2', PageIdentity::LOCAL ),
3 => new PageIdentityValue( 3, NS_FILE, 'dbKey3', PageIdentity::LOCAL ),
4 => new PageIdentityValue( 4, NS_FILE, 'dbKey4', PageIdentity::LOCAL )
];
$pageProps->expects( $this->once() )
->method( 'getProperties' )
->with(
$this->anything(),
PageImages::getPropNames( PageImages::LICENSE_FREE )
)->willReturn( [
1 => [
PageImages::getPropName( true ) => 'File1_free.jpg'
],
2 => [
PageImages::getPropName( true ) => 'File2_free.jpg',
] ] );
$repoGroup = $this->getMockBuilder( RepoGroup::class )
->disableOriginalConstructor()
->onlyMethods( [ 'findFile' ] )
->getMock();
$findFileCallback = function ( $filename ) {
return $this->getMockLocalFile(
SearchResultThumbnailProvider::THUMBNAIL_SIZE,
__FILE__,
$filename
);
};
$repoGroup->expects( $this->exactly( 2 ) )
->method( 'findFile' )
->withConsecutive( [ 'File1_free.jpg' ], [ 'File2_free.jpg' ] )
->willReturnOnConsecutiveCalls(
new ReturnCallback( $findFileCallback ),
null
);
$provider = new SearchResultThumbnailProvider( $repoGroup, $this->createHookContainer() );
$handler = new SearchResultProvideThumbnailHookHandler( $provider, $pageProps, $repoGroup );
$results = [ 1 => null, 2 => null, 3 => null, 4 => null ];
$handler->onSearchResultProvideThumbnail( $pageIdentities, $results );
$this->assertNull( $results[ 2 ] );
$this->assertNull( $results[ 3 ] );
$this->assertNull( $results[ 4 ] );
$this->assertNotNull( $results[ 1 ] );
$this->assertSame( 'File1_free.jpg', $results[ 1 ]->getName() );
$this->assertSame(
SearchResultThumbnailProvider::THUMBNAIL_SIZE,
$results[ 1 ]->getWidth()
);
$this->assertSame(
SearchResultThumbnailProvider::THUMBNAIL_SIZE,
$results[ 1 ]->getHeight()
);
$this->assertGreaterThan( 0, $results[ 1 ]->getSize() );
$this->assertSame( 'https://example.org/test.url', $results[ 1 ]->getUrl() );
}
}