Sometimes the special page can’t be created – for example, the list of registered pages could have changed between the data provider and the test function, due to extensions conditionally registering their special pages. Skip the test in this case instead of crashing. Bug: T275661 Change-Id: I573967ac22ed3a596b4f80b76d395ac948f802e8
67 lines
2 KiB
PHP
67 lines
2 KiB
PHP
<?php
|
|
|
|
use MediaWiki\MediaWikiServices;
|
|
use MediaWiki\Permissions\UltimateAuthority;
|
|
use MediaWiki\User\UserIdentityValue;
|
|
|
|
/**
|
|
* Test that runs against all registered special pages to make sure that regular
|
|
* execution of the special page does not cause a fatal error.
|
|
*
|
|
* UTSysop is used to run as much of the special page code as possible without
|
|
* actually knowing the details of the special page.
|
|
*
|
|
* @since 1.32
|
|
* @author Addshore
|
|
*/
|
|
class SpecialPageFatalTest extends MediaWikiIntegrationTestCase {
|
|
|
|
protected function setUp() : void {
|
|
parent::setUp();
|
|
// FIXME: Acknowledge known non-fatal query (T248191)
|
|
$this->setMwGlobals( 'wgDBerrorLog', false );
|
|
// Deprecations don't matter for what this test cares about. This made browser tests fail
|
|
// on many occasions already. (T236809)
|
|
$this->filterDeprecated( '//' );
|
|
}
|
|
|
|
public function provideSpecialPages() {
|
|
$spf = MediaWikiServices::getInstance()->getSpecialPageFactory();
|
|
foreach ( $spf->getNames() as $name ) {
|
|
yield [ $name ];
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @dataProvider provideSpecialPages
|
|
*/
|
|
public function testSpecialPageDoesNotFatal( $name ) {
|
|
$spf = MediaWikiServices::getInstance()->getSpecialPageFactory();
|
|
$page = $spf->getPage( $name );
|
|
if ( !$page ) {
|
|
$this->markTestSkipped( "Could not create special page $name" );
|
|
}
|
|
|
|
$executor = new SpecialPageExecutor();
|
|
$authority = new UltimateAuthority( new UserIdentityValue( 0, 'UTSysop', 0 ) );
|
|
|
|
try {
|
|
$executor->executeSpecialPage( $page, '', null, 'qqx', $authority );
|
|
} catch ( \PHPUnit\Framework\Error\Deprecated $deprecated ) {
|
|
// Allow deprecation,
|
|
// this test want to check fatals or other things breaking the extension
|
|
} catch ( \PHPUnit\Framework\Error\Error $error ) {
|
|
// Let phpunit settings working:
|
|
// - convertErrorsToExceptions="true"
|
|
// - convertNoticesToExceptions="true"
|
|
// - convertWarningsToExceptions="true"
|
|
throw $error;
|
|
} catch ( Exception $e ) {
|
|
// Other exceptions are allowed
|
|
}
|
|
|
|
// If the page fataled phpunit will have already died
|
|
$this->addToAssertionCount( 1 );
|
|
}
|
|
|
|
}
|