wiki.techinc.nl/tests/phpunit/suites/ExtensionsTestSuite.php
Daimona Eaytoy 539023e3cb phpunit: Make getPHPUnitExtensionsAndSkins run the UnitTestsList hook
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
2023-11-13 15:12:55 +01:00

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;
}
}