wiki.techinc.nl/tests/phpunit/suites/ExtensionsTestSuite.php
Kunal Mehta 1d7221d066 Autodiscover extension unittests
Instead of requiring every extension that wants to add unit tests to
copy the exact same boilerplate over and over, let's just automatically
discover them. We now have an extension registry, so we know exactly
which extensions are loaded (this won't work for extensions not being
loaded through extension.json).

For each extension, we check to see if the directory "tests/phpunit/"
exists, and if it does, add those unit tests. If there is a
`UnitTestsList` subscriber already set, PHPUnit will automatically
de-duplicate test cases so we won't be running anything twice.

Change-Id: I6ec654ef2d8ee3630b121b1277b4ee21ba0b6cd4
2016-08-04 09:49:43 -07:00

51 lines
1.5 KiB
PHP

<?php
/**
* 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 PHPUnit_Framework_TestSuite {
public function __construct() {
parent::__construct();
$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
Hooks::run( 'UnitTestsList', [ &$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 File_Iterator_Facade();
$matchingFiles = $fileIterator->getFilesAsArray( $path, $suffixes );
$this->addTestFiles( $matchingFiles );
} elseif ( file_exists( $path ) ) {
// Add a single test case or suite class
$this->addTestFile( $path );
}
}
if ( !$paths ) {
$this->addTest( new DummyExtensionsTest( 'testNothing' ) );
}
}
public static function suite() {
return new self;
}
}
/**
* Needed to avoid warnings like 'No tests found in class "ExtensionsTestSuite".'
* when no extensions with tests are used.
*/
class DummyExtensionsTest extends MediaWikiTestCase {
public function testNothing() {
$this->assertTrue( true );
}
}