In a future with a single bootstrap and config, we won't be able to run hooks as early as in ExtensionTestSuite::suite. On top of that, if the config file does not fully load the MW config (as is the case with bootstrap.php), it won't even be possible to run hooks at all. So move the relevant code from ExtensionsTestSuite to getPHPUnitExtensionsAndSkins, collect the output in bootstrap.php and pass it to ExtensionsTestSuite. This hack wouldn't be necessary if the UnitTestList hook didn't exist, but fortunately there are plans to get rid of it (T298509). Keep the old code in place when entering from an entry point that doesn't load bootstrap.php (i.e., phpunit.php and composer phpunit:entrypoint). Bug: T227900 Change-Id: Idf72db24dbd66bb66baf51564a7504d2bc035e8c
49 lines
1.4 KiB
PHP
49 lines
1.4 KiB
PHP
<?php
|
|
|
|
use MediaWiki\HookContainer\HookRunner;
|
|
use MediaWiki\MediaWikiServices;
|
|
use PHPUnit\Framework\TestSuite;
|
|
use SebastianBergmann\FileIterator\Facade;
|
|
|
|
/**
|
|
* This test suite runs unit tests registered by extensions.
|
|
* See https://www.mediawiki.org/wiki/Manual:Hooks/UnitTestsList for details of
|
|
* how to register your tests.
|
|
*/
|
|
|
|
class ExtensionsTestSuite extends TestSuite {
|
|
public function __construct() {
|
|
parent::__construct();
|
|
|
|
if ( defined( 'MW_PHPUNIT_EXTENSIONS_TEST_PATHS' ) ) {
|
|
$paths = MW_PHPUNIT_EXTENSIONS_TEST_PATHS;
|
|
} else {
|
|
$paths = [];
|
|
// Autodiscover extension unit tests
|
|
$registry = ExtensionRegistry::getInstance();
|
|
foreach ( $registry->getAllThings() as $info ) {
|
|
$paths[] = dirname( $info['path'] ) . '/tests/phpunit';
|
|
}
|
|
// Extensions can return a list of files or directories
|
|
( new HookRunner( MediaWikiServices::getInstance()->getHookContainer() ) )->onUnitTestsList( $paths );
|
|
}
|
|
|
|
foreach ( array_unique( $paths ) as $path ) {
|
|
if ( is_dir( $path ) ) {
|
|
// If the path is a directory, search for test cases.
|
|
// @since 1.24
|
|
$suffixes = [ 'Test.php' ];
|
|
$fileIterator = new Facade();
|
|
$matchingFiles = $fileIterator->getFilesAsArray( $path, $suffixes );
|
|
$this->addTestFiles( $matchingFiles );
|
|
} elseif ( is_file( $path ) ) {
|
|
// Add a single test case or suite class
|
|
$this->addTestFile( $path );
|
|
}
|
|
}
|
|
}
|
|
|
|
public static function suite() {
|
|
return new self;
|
|
}
|
|
}
|