wiki.techinc.nl/tests/phpunit/includes/content/FallbackContentHandlerTest.php
daniel a67cad6d0f Create fallback for undefined content models.
This causes RevisionStore to use FallbackContent instances to represent
content for which no content handler is defined.

This may happen when loading revisions using a model that was defined
by an extension that has since been uninstalled.

Bug: T220594
Bug: T220793
Bug: T228921
Change-Id: I5cc9e61223ab22406091479617b077512aa6ae2d
2020-07-22 19:59:09 +02:00

119 lines
3.4 KiB
PHP

<?php
use MediaWiki\Revision\SlotRecord;
use MediaWiki\Revision\SlotRenderingProvider;
/**
* @group ContentHandler
*/
class FallbackContentHandlerTest extends MediaWikiLangTestCase {
/**
* @covers FallbackContentHandler::supportsDirectEditing
*/
public function testSupportsDirectEditing() {
$handler = new FallbackContentHandler( 'horkyporky' );
$this->assertFalse( $handler->supportsDirectEditing(), 'direct editing supported' );
}
/**
* @covers FallbackContentHandler::serializeContent
*/
public function testSerializeContent() {
$handler = new FallbackContentHandler( 'horkyporky' );
$content = new FallbackContent( 'hello world', 'horkyporky' );
$this->assertEquals( 'hello world', $handler->serializeContent( $content ) );
$this->assertEquals(
'hello world',
$handler->serializeContent( $content, 'application/horkyporky' )
);
}
/**
* @covers FallbackContentHandler::unserializeContent
*/
public function testUnserializeContent() {
$handler = new FallbackContentHandler( 'horkyporky' );
$content = $handler->unserializeContent( 'hello world' );
$this->assertEquals( 'hello world', $content->getData() );
$content = $handler->unserializeContent( 'hello world', 'application/horkyporky' );
$this->assertEquals( 'hello world', $content->getData() );
}
/**
* @covers FallbackContentHandler::makeEmptyContent
*/
public function testMakeEmptyContent() {
$handler = new FallbackContentHandler( 'horkyporky' );
$content = $handler->makeEmptyContent();
$this->assertTrue( $content->isEmpty() );
$this->assertSame( '', $content->getData() );
}
public static function dataIsSupportedFormat() {
return [
[ null, true ],
[ 'application/octet-stream', true ],
[ 'unknown/unknown', true ],
[ 'text/plain', false ],
[ 99887766, false ],
];
}
/**
* @dataProvider dataIsSupportedFormat
* @covers FallbackContentHandler::isSupportedFormat
*/
public function testIsSupportedFormat( $format, $supported ) {
$handler = new FallbackContentHandler( 'horkyporky' );
$this->assertEquals( $supported, $handler->isSupportedFormat( $format ) );
}
/**
* @covers ContentHandler::getSecondaryDataUpdates
*/
public function testGetSecondaryDataUpdates() {
$title = Title::newFromText( 'Somefile.jpg', NS_FILE );
$content = new FallbackContent( '', 'horkyporky' );
/** @var SlotRenderingProvider $srp */
$srp = $this->createMock( SlotRenderingProvider::class );
$handler = new FallbackContentHandler( 'horkyporky' );
$updates = $handler->getSecondaryDataUpdates( $title, $content, SlotRecord::MAIN, $srp );
$this->assertEquals( [], $updates );
}
/**
* @covers ContentHandler::getDeletionUpdates
*/
public function testGetDeletionUpdates() {
$title = Title::newFromText( 'Somefile.jpg', NS_FILE );
$handler = new FallbackContentHandler( 'horkyporky' );
$updates = $handler->getDeletionUpdates( $title, SlotRecord::MAIN );
$this->assertEquals( [], $updates );
}
/**
* @covers ContentHandler::getDeletionUpdates
*/
public function testGetSlotDiffRenderer() {
$context = new RequestContext();
$context->setRequest( new FauxRequest() );
$handler = new FallbackContentHandler( 'horkyporky' );
$slotDiffRenderer = $handler->getSlotDiffRenderer( $context );
$oldContent = $handler->unserializeContent( 'Foo' );
$newContent = $handler->unserializeContent( 'Foo bar' );
$diff = $slotDiffRenderer->getDiff( $oldContent, $newContent );
$this->assertNotEmpty( $diff );
}
}