UnknownContentHandler can be configued to handle models that belong to extensions that have been undeployed: $wgContentHandlers['xyzzy'] = 'UnknownContentHandler'; This way, no errors will be thrown when trying to access pages with the unsupported model. Instead, an error message is shown, and editing is prevented. This patch also improves handling of non-editable content in EditPage and in DifferenceEngine. Bug: T220608 Change-Id: Ia94521b786c0a5225a674e4dc3cb6761a723d75b
259 lines
6.1 KiB
PHP
259 lines
6.1 KiB
PHP
<?php
|
|
|
|
/**
|
|
* @group ContentHandler
|
|
*/
|
|
class UnknownContentTest extends MediaWikiLangTestCase {
|
|
|
|
/**
|
|
* @param string $data
|
|
* @return UnknownContent
|
|
*/
|
|
public function newContent( $data, $type = 'xyzzy' ) {
|
|
return new UnknownContent( $data, $type );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::getParserOutput
|
|
*/
|
|
public function testGetParserOutput() {
|
|
$this->setUserLang( 'en' );
|
|
$this->setContentLang( 'qqx' );
|
|
|
|
$title = Title::newFromText( 'Test' );
|
|
$content = $this->newContent( 'Horkyporky' );
|
|
|
|
$po = $content->getParserOutput( $title );
|
|
$html = $po->getText();
|
|
$html = preg_replace( '#<!--.*?-->#sm', '', $html ); // strip comments
|
|
|
|
$this->assertNotContains( 'Horkyporky', $html );
|
|
$this->assertNotContains( '(unsupported-content-model)', $html );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::preSaveTransform
|
|
*/
|
|
public function testPreSaveTransform() {
|
|
$title = Title::newFromText( 'Test' );
|
|
$user = $this->getTestUser()->getUser();
|
|
$content = $this->newContent( 'Horkyporky ~~~' );
|
|
|
|
$options = new ParserOptions();
|
|
|
|
$this->assertSame( $content, $content->preSaveTransform( $title, $user, $options ) );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::preloadTransform
|
|
*/
|
|
public function testPreloadTransform() {
|
|
$title = Title::newFromText( 'Test' );
|
|
$content = $this->newContent( 'Horkyporky ~~~' );
|
|
|
|
$options = new ParserOptions();
|
|
|
|
$this->assertSame( $content, $content->preloadTransform( $title, $options ) );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::getRedirectTarget
|
|
*/
|
|
public function testGetRedirectTarget() {
|
|
$content = $this->newContent( '#REDIRECT [[Horkyporky]]' );
|
|
$this->assertNull( $content->getRedirectTarget() );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::isRedirect
|
|
*/
|
|
public function testIsRedirect() {
|
|
$content = $this->newContent( '#REDIRECT [[Horkyporky]]' );
|
|
$this->assertFalse( $content->isRedirect() );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::isCountable
|
|
*/
|
|
public function testIsCountable() {
|
|
$content = $this->newContent( '[[Horkyporky]]' );
|
|
$this->assertFalse( $content->isCountable( true ) );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::getTextForSummary
|
|
*/
|
|
public function testGetTextForSummary() {
|
|
$content = $this->newContent( 'Horkyporky' );
|
|
$this->assertSame( '', $content->getTextForSummary() );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::getTextForSearchIndex
|
|
*/
|
|
public function testGetTextForSearchIndex() {
|
|
$content = $this->newContent( 'Horkyporky' );
|
|
$this->assertSame( '', $content->getTextForSearchIndex() );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::copy
|
|
*/
|
|
public function testCopy() {
|
|
$content = $this->newContent( 'hello world.' );
|
|
$copy = $content->copy();
|
|
|
|
$this->assertSame( $content, $copy );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::getSize
|
|
*/
|
|
public function testGetSize() {
|
|
$content = $this->newContent( 'hello world.' );
|
|
|
|
$this->assertEquals( 12, $content->getSize() );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::getData
|
|
*/
|
|
public function testGetData() {
|
|
$content = $this->newContent( 'hello world.' );
|
|
|
|
$this->assertEquals( 'hello world.', $content->getData() );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::getNativeData
|
|
*/
|
|
public function testGetNativeData() {
|
|
$content = $this->newContent( 'hello world.' );
|
|
|
|
$this->assertEquals( 'hello world.', $content->getNativeData() );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::getWikitextForTransclusion
|
|
*/
|
|
public function testGetWikitextForTransclusion() {
|
|
$content = $this->newContent( 'hello world.' );
|
|
|
|
$this->assertEquals( '', $content->getWikitextForTransclusion() );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::getModel
|
|
*/
|
|
public function testGetModel() {
|
|
$content = $this->newContent( "hello world.", 'horkyporky' );
|
|
|
|
$this->assertEquals( 'horkyporky', $content->getModel() );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::getContentHandler
|
|
*/
|
|
public function testGetContentHandler() {
|
|
$this->mergeMwGlobalArrayValue(
|
|
'wgContentHandlers',
|
|
[ 'horkyporky' => 'UnknownContentHandler' ]
|
|
);
|
|
|
|
$content = $this->newContent( "hello world.", 'horkyporky' );
|
|
|
|
$this->assertInstanceOf( UnknownContentHandler::class, $content->getContentHandler() );
|
|
$this->assertEquals( 'horkyporky', $content->getContentHandler()->getModelID() );
|
|
}
|
|
|
|
public static function dataIsEmpty() {
|
|
return [
|
|
[ '', true ],
|
|
[ ' ', false ],
|
|
[ '0', false ],
|
|
[ 'hallo welt.', false ],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider dataIsEmpty
|
|
* @covers UnknownContent::isEmpty
|
|
*/
|
|
public function testIsEmpty( $text, $empty ) {
|
|
$content = $this->newContent( $text );
|
|
|
|
$this->assertEquals( $empty, $content->isEmpty() );
|
|
}
|
|
|
|
public function provideEquals() {
|
|
return [
|
|
[ new UnknownContent( "hallo", 'horky' ), null, false ],
|
|
[ new UnknownContent( "hallo", 'horky' ), new UnknownContent( "hallo", 'horky' ), true ],
|
|
[ new UnknownContent( "hallo", 'horky' ), new UnknownContent( "hallo", 'xyzzy' ), false ],
|
|
[ new UnknownContent( "hallo", 'horky' ), new JavaScriptContent( "hallo" ), false ],
|
|
[ new UnknownContent( "hallo", 'horky' ), new WikitextContent( "hallo" ), false ],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideEquals
|
|
* @covers UnknownContent::equals
|
|
*/
|
|
public function testEquals( Content $a, Content $b = null, $equal = false ) {
|
|
$this->assertEquals( $equal, $a->equals( $b ) );
|
|
}
|
|
|
|
public static function provideConvert() {
|
|
return [
|
|
[ // #0
|
|
'Hallo Welt',
|
|
CONTENT_MODEL_WIKITEXT,
|
|
'lossless',
|
|
'Hallo Welt'
|
|
],
|
|
[ // #1
|
|
'Hallo Welt',
|
|
CONTENT_MODEL_WIKITEXT,
|
|
'lossless',
|
|
'Hallo Welt'
|
|
],
|
|
[ // #1
|
|
'Hallo Welt',
|
|
CONTENT_MODEL_CSS,
|
|
'lossless',
|
|
'Hallo Welt'
|
|
],
|
|
[ // #1
|
|
'Hallo Welt',
|
|
CONTENT_MODEL_JAVASCRIPT,
|
|
'lossless',
|
|
'Hallo Welt'
|
|
],
|
|
];
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::convert
|
|
*/
|
|
public function testConvert() {
|
|
$content = $this->newContent( 'More horkyporky?' );
|
|
|
|
$this->assertFalse( $content->convert( CONTENT_MODEL_TEXT ) );
|
|
}
|
|
|
|
/**
|
|
* @covers UnknownContent::__construct
|
|
* @covers UnknownContentHandler::serializeContent
|
|
*/
|
|
public function testSerialize() {
|
|
$this->mergeMwGlobalArrayValue(
|
|
'wgContentHandlers',
|
|
[ 'horkyporky' => 'UnknownContentHandler' ]
|
|
);
|
|
|
|
$content = $this->newContent( 'Hörkypörky', 'horkyporky' );
|
|
|
|
$this->assertSame( 'Hörkypörky', $content->serialize() );
|
|
}
|
|
|
|
}
|