wiki.techinc.nl/tests/phpunit/maintenance/FindDeprecatedTest.php
Dreamy Jazz e2b6281d6d Test findDeprecated.php
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
2024-10-15 17:08:23 +00:00

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' ) . "/"
);
}
}