wiki.techinc.nl/tests/phpunit/structure/SpecialPageFatalTest.php
daniel c01b7c7b4b Add Special:RestSandbox for exploring REST API
Special:RestSandbox presents a Swagger-UI interface for exploring REST APIs. The available APIs can be configured using RestSandboxSpecs.

For now, the default is to support no APIs, so the feature is disabled in production. In the future, it would make sense to expose the wiki's own REST API per default. The corresponding entry in $wgRestSandboxSpecs in LocalSettings.php would look like this:

	'mw' => [
		'url' => $wgScriptPath . '/rest.php/',
		'name' => 'MediaWiki REST API',
	]

Note that the spec URL may still change.

To also explore the endpoints exposed through RESTbase, we might add:

	'wmf-restbase' => [
		'url' => $wgServer . '/api/rest_v1/',
		'name' => 'Wikimedia RESTbase API',
	]

Similarly, we could expose a spec for endpoints on api.wikimedia.org, which could then be explored using the new special page.

NOTE: This adds a dependency on the swagger-ui npm library. See T325558 for the security review.

Bug: T362006
Change-Id: I1dd5ed82680a28f9c15136b446a2de0398525061
2024-06-13 21:40:36 +02:00

66 lines
1.9 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.
*
* UltimateAuthority 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
* @coversNothing
* @group Database
*/
class SpecialPageFatalTest extends MediaWikiIntegrationTestCase {
protected function setUp(): void {
parent::setUp();
// Deprecations don't matter for what this test cares about. This made browser tests fail
// on many occasions already. (T236809)
$this->filterDeprecated( '//' );
}
public static function provideSpecialPageDoesNotFatal() {
$spf = MediaWikiServices::getInstance()->getSpecialPageFactory();
foreach ( $spf->getNames() as $name ) {
yield $name => [ $name ];
}
}
/**
* @dataProvider provideSpecialPageDoesNotFatal
*/
public function testSpecialPageDoesNotFatal( string $name ) {
$spf = $this->getServiceContainer()->getSpecialPageFactory();
$page = $spf->getPage( $name );
if ( !$page ) {
$this->markTestSkipped( "Could not create special page $name" );
}
$executor = new SpecialPageExecutor();
$authority = new UltimateAuthority( new UserIdentityValue( 42, 'SpecialPageTester' ) );
try {
$executor->executeSpecialPage( $page, '', null, 'qqx', $authority );
} catch ( \PHPUnit\Framework\Error\Error $error ) {
// Let phpunit settings working:
// - convertDeprecationsToExceptions="true"
// - 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 );
}
}