Why: * Maintenance scripts in core have low test coverage * This can cause issues such as the findDeprecated.php maintenance script not working, as described in T374832 * Testing the broken script after fixing it will avoid the script breaking again. What: * Fix the findDeprecated.php maintenance script to actually show when code is hard-deprecated. * Modify the script to allow mocking of the MediaWiki install path in PHPUnit tests * Create FindDeprecatedTest which tests that the script produces an expected output, without being specific about how the code finds the methods (to allow the method to be changed as discussed in T243403) ** To do this, create a folder in the data folder for the PHPUnit tests that has a mock file structure allowing the test to use a fixed list of soft and hard deprecated methods. Bug: T374832 Bug: T371167 Change-Id: Ic4933cef95ef1af7fa3939625ac1747106c71230
49 lines
1.6 KiB
PHP
49 lines
1.6 KiB
PHP
<?php
|
|
|
|
namespace MediaWiki\Tests\Maintenance;
|
|
|
|
use FindDeprecated;
|
|
use Wikimedia\TestingAccessWrapper;
|
|
|
|
/**
|
|
* Tests that a XML file exported by {@link ExportSites} can be imported by {@link ImportSites}.
|
|
*
|
|
* @covers FindDeprecated
|
|
* @covers DeprecatedInterfaceFinder
|
|
* @covers FileAwareNodeVisitor
|
|
* @group Database
|
|
* @author Dreamy Jazz
|
|
*/
|
|
class FindDeprecatedTest extends MaintenanceBaseTestCase {
|
|
|
|
private const FIXTURE_DIRECTORY = MW_INSTALL_PATH . '/tests/phpunit/data/FindDeprecated';
|
|
|
|
protected function getMaintenanceClass() {
|
|
return FindDeprecated::class;
|
|
}
|
|
|
|
protected function createMaintenance() {
|
|
// Mock ::getMwInstallPath to return our mock path
|
|
$obj = $this->getMockBuilder( $this->getMaintenanceClass() )
|
|
->onlyMethods( [ 'getMwInstallPath' ] )
|
|
->getMock();
|
|
$obj->method( 'getMwInstallPath' )
|
|
->willReturn( self::FIXTURE_DIRECTORY );
|
|
return TestingAccessWrapper::newFromObject( $obj );
|
|
}
|
|
|
|
public function testExecute() {
|
|
// Creation of dynamic property is deprecated which is done by the script being tested.
|
|
// FIXME: Make this test work in PHP 8.2 and above.
|
|
$this->markTestSkippedIfPhp( '>=', '8.2' );
|
|
|
|
$this->maintenance->execute();
|
|
$this->expectOutputRegex(
|
|
"/Deprecated since 1.42:\n.*" . preg_quote( '+ FileWithDeprecatedCodeInSubDirectory::testMethodOne' )
|
|
. "[\s\S]*" .
|
|
"Deprecated since 1.43:\n.*" . preg_quote( '- FileWithDeprecatedCode::testMethodOne' ) . "[\s\S]*" .
|
|
"Deprecated since 1.44:\n.*" . preg_quote( '+ FileWithDeprecatedCode::testMethodTwo' ) . "[\s\S]*" .
|
|
"legend:\n.*-: soft-deprecated\n.*" . preg_quote( '+: hard-deprecated' ) . "/"
|
|
);
|
|
}
|
|
}
|