wiki.techinc.nl/tests/phpunit/integration/includes/Rest/Handler/MediaLinksHandlerTest.php
Matthias Mullie c4a36b0023 Introduce SearchResultThumbnailProvider & move hook + NS_FILE thumbs in
What was previously a REST API-only feature (the thumbnails
hook allowing for thumbnails for non-file pages via the
PageImages extension) is now also being adopted in the main
search page.

That hook will now be called with NS_FILE result thumbnails
pre-filled, which was not the case previously. PageImages
essentially duplicated NS_FILE thumbnail logic that was
already present in Special:Search, so that can (and will
in a follow-up patch) then be removed there. Special:Search
will then simply take whatever is produced from the provider
(which will include both NS_FILE thumbs - which it handled
already - as well as whatever else it receives from the hook),
as will the REST API (which already received both)

Since thumbnails can now come in for multiple namespaces &
having some of those results with & others without a thumbnail
can be quite jarring, it was decided that we'd display
placeholder images (for certain namespaces). This is now
controlled by $wgThumbnailNamespaces.

I also split up a few things in FullSearchResultWidget::
generateFileHtml for more clarity.

Meanwhile also updated mediawiki.special.search.styles.less
to use variables for known colors.

Also implemented a 'transform' (required for testing this
change properly) and 'getDisplayWidthHeight' (it became
needed after implementing transform) callback function for
mock Files, and updated some existing tests in response to
these changes.

And some more Rest test files have been updated to allow
passing around a HookContainer instead of only an array of
hooks (from which a new HookContainer would then be created)
to allow the same container to be used across all relevant
objects, who may have it injected as dependency.

Bug: T306883
Change-Id: I2a679b51758020d3e822da01a1bde1ae632b0b0a
2022-10-03 10:52:50 +00:00

143 lines
4.1 KiB
PHP

<?php
namespace MediaWiki\Tests\Rest\Handler;
use MediaWiki\Rest\Handler\MediaLinksHandler;
use MediaWiki\Rest\LocalizedHttpException;
use MediaWiki\Rest\RequestData;
use RequestContext;
use Title;
use Wikimedia\Message\MessageValue;
/**
* @covers \MediaWiki\Rest\Handler\MediaLinksHandler
*
* @group Database
*/
class MediaLinksHandlerTest extends \MediaWikiIntegrationTestCase {
use MediaTestTrait;
public function addDBDataOnce() {
$this->editPage( __CLASS__ . '_Foo', 'Foo [[Image:Existing.jpg]] [[Image:Missing.jpg]]' );
}
private function newHandler() {
return new MediaLinksHandler(
$this->getServiceContainer()->getDBLoadBalancer(),
$this->makeMockRepoGroup( [ 'Existing.jpg' ] ),
$this->getServiceContainer()->getPageStore()
);
}
private function assertLink( $expected, $actual ) {
foreach ( $expected as $key => $value ) {
$this->assertArrayHasKey( $key, $actual );
$this->assertSame( $value, $actual[$key], $key );
}
}
public function testExecute() {
$title = __CLASS__ . '_Foo';
$request = new RequestData( [ 'pathParams' => [ 'title' => $title ] ] );
$user = RequestContext::getMain()->getUser();
$userOptionsManager = $this->getServiceContainer()->getUserOptionsManager();
$this->setMwGlobals( 'wgImageLimits', [
$userOptionsManager->getIntOption( $user, 'imagesize' ) => [ 100, 100 ],
] );
$handler = $this->newHandler();
$data = $this->executeHandlerAndGetBodyData( $handler, $request );
$this->assertArrayHasKey( 'files', $data );
$this->assertCount( 2, $data['files'] );
$links = [];
foreach ( $data['files'] as $row ) {
$links[$row['title']] = $row;
}
$this->assertArrayHasKey( 'Existing.jpg', $links );
$this->assertArrayHasKey( 'Missing.jpg', $links );
// NOTE: See MediaTestTrait::makeMockFile() for hard-coded values.
$this->assertLink( [
'title' => 'Existing.jpg',
// File repo mocks will end up calling File namespace ns6
'file_description_url' => 'https://example.com/wiki/ns6:Existing.jpg',
'latest' => [
'timestamp' => '2020-01-02T03:04:05Z',
'user' => [ 'id' => 7, 'name' => 'Alice' ]
],
'preferred' => [
'mediatype' => 'test',
'size' => null,
'width' => 100,
'height' => 67,
'duration' => 678,
'url' => 'https://media.example.com/static/thumb/Existing.jpg',
],
'original' => [
'mediatype' => 'test',
'size' => 12345,
'width' => 600,
'height' => 400,
'duration' => 678,
'url' => 'https://media.example.com/static/Existing.jpg',
],
], $links['Existing.jpg'] );
// NOTE: MediaTestTrait::makeMockRepoGroup() treats files with "missing" in the
// name as non-existent.
$this->assertLink( [
'title' => 'Missing.jpg',
// File repo mocks will end up calling File namespace ns6
'file_description_url' => 'https://example.com/wiki/ns6:Missing.jpg',
'latest' => null,
'preferred' => null,
'original' => null,
], $links['Missing.jpg'] );
}
public function testCacheControl() {
$title = Title::newFromText( __METHOD__ );
$this->editPage( $title->getPrefixedDBkey(), 'First' );
$request = new RequestData( [ 'pathParams' => [ 'title' => $title->getPrefixedDBkey() ] ] );
$handler = $this->newHandler();
$response = $this->executeHandler( $handler, $request );
$firstETag = $response->getHeaderLine( 'ETag' );
$this->assertSame(
wfTimestamp( TS_RFC2822, $title->getTouched() ),
$response->getHeaderLine( 'Last-Modified' )
);
$this->editPage( $title->getPrefixedDBkey(), 'Second' );
Title::clearCaches();
$handler = $this->newHandler();
$response = $this->executeHandler( $handler, $request );
$this->assertNotEquals( $response->getHeaderLine( 'ETag' ), $firstETag );
$this->assertSame(
wfTimestamp( TS_RFC2822, $title->getTouched() ),
$response->getHeaderLine( 'Last-Modified' )
);
}
public function testExecute_notFound() {
$title = __CLASS__ . '_Xyzzy';
$request = new RequestData( [ 'pathParams' => [ 'title' => $title ] ] );
$handler = $this->newHandler();
$this->expectExceptionObject(
new LocalizedHttpException( new MessageValue( 'rest-nonexistent-title' ), 404 )
);
$this->executeHandler( $handler, $request );
}
}