Add tests for extension.json and services

Change-Id: Ie83e4a85a408e1ba1d2cc827c4bf353bdd5500df
This commit is contained in:
Matěj Suchánek 2023-03-27 18:43:06 +02:00
parent 290dd70bb2
commit 0628dbdab6
11 changed files with 148 additions and 105 deletions

View file

@ -141,7 +141,7 @@
"class": "MediaWiki\\Extension\\AbuseFilter\\AbuseFilterPreAuthenticationProvider",
"services": [
"AbuseFilterVariableGeneratorFactory",
"AbuseFilterRunnerFactory",
"AbuseFilterFilterRunnerFactory",
"StatsdDataFactory",
"UserFactory"
],
@ -342,7 +342,7 @@
},
"FilteredActions": {
"class": "MediaWiki\\Extension\\AbuseFilter\\Hooks\\Handlers\\FilteredActionsHandler",
"services": [ "StatsdDataFactory", "AbuseFilterRunnerFactory", "AbuseFilterVariableGeneratorFactory", "AbuseFilterEditRevUpdater" ]
"services": [ "StatsdDataFactory", "AbuseFilterFilterRunnerFactory", "AbuseFilterVariableGeneratorFactory", "AbuseFilterEditRevUpdater" ]
},
"CheckUser": {
"class": "MediaWiki\\Extension\\AbuseFilter\\Hooks\\Handlers\\CheckUserHandler",

View file

@ -19,251 +19,291 @@ use MediaWiki\Extension\AbuseFilter\Variables\VariablesManager;
use MediaWiki\Extension\AbuseFilter\Watcher\EmergencyWatcher;
use MediaWiki\Extension\AbuseFilter\Watcher\UpdateHitCountWatcher;
use MediaWiki\MediaWikiServices;
use Psr\Container\ContainerInterface;
class AbuseFilterServices {
/**
* @param ContainerInterface|null $services
* @return KeywordsManager
*/
public static function getKeywordsManager(): KeywordsManager {
return MediaWikiServices::getInstance()->getService( KeywordsManager::SERVICE_NAME );
public static function getKeywordsManager( ContainerInterface $services = null ): KeywordsManager {
return ( $services ?? MediaWikiServices::getInstance() )->get( KeywordsManager::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return FilterProfiler
*/
public static function getFilterProfiler(): FilterProfiler {
return MediaWikiServices::getInstance()->getService( FilterProfiler::SERVICE_NAME );
public static function getFilterProfiler( ContainerInterface $services = null ): FilterProfiler {
return ( $services ?? MediaWikiServices::getInstance() )->get( FilterProfiler::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return AbuseFilterPermissionManager
*/
public static function getPermissionManager(): AbuseFilterPermissionManager {
return MediaWikiServices::getInstance()->getService( AbuseFilterPermissionManager::SERVICE_NAME );
public static function getPermissionManager( ContainerInterface $services = null ): AbuseFilterPermissionManager {
return ( $services ?? MediaWikiServices::getInstance() )->get( AbuseFilterPermissionManager::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return ChangeTagger
*/
public static function getChangeTagger(): ChangeTagger {
return MediaWikiServices::getInstance()->getService( ChangeTagger::SERVICE_NAME );
public static function getChangeTagger( ContainerInterface $services = null ): ChangeTagger {
return ( $services ?? MediaWikiServices::getInstance() )->get( ChangeTagger::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return ChangeTagsManager
*/
public static function getChangeTagsManager(): ChangeTagsManager {
return MediaWikiServices::getInstance()->getService( ChangeTagsManager::SERVICE_NAME );
public static function getChangeTagsManager( ContainerInterface $services = null ): ChangeTagsManager {
return ( $services ?? MediaWikiServices::getInstance() )->get( ChangeTagsManager::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return ChangeTagValidator
*/
public static function getChangeTagValidator(): ChangeTagValidator {
return MediaWikiServices::getInstance()->getService( ChangeTagValidator::SERVICE_NAME );
public static function getChangeTagValidator( ContainerInterface $services = null ): ChangeTagValidator {
return ( $services ?? MediaWikiServices::getInstance() )->get( ChangeTagValidator::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return BlockAutopromoteStore
*/
public static function getBlockAutopromoteStore(): BlockAutopromoteStore {
return MediaWikiServices::getInstance()->getService( BlockAutopromoteStore::SERVICE_NAME );
public static function getBlockAutopromoteStore( ContainerInterface $services = null ): BlockAutopromoteStore {
return ( $services ?? MediaWikiServices::getInstance() )->get( BlockAutopromoteStore::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return FilterUser
*/
public static function getFilterUser(): FilterUser {
return MediaWikiServices::getInstance()->getService( FilterUser::SERVICE_NAME );
public static function getFilterUser( ContainerInterface $services = null ): FilterUser {
return ( $services ?? MediaWikiServices::getInstance() )->get( FilterUser::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return CentralDBManager
*/
public static function getCentralDBManager(): CentralDBManager {
return MediaWikiServices::getInstance()->getService( CentralDBManager::SERVICE_NAME );
public static function getCentralDBManager( ContainerInterface $services = null ): CentralDBManager {
return ( $services ?? MediaWikiServices::getInstance() )->get( CentralDBManager::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return RuleCheckerFactory
*/
public static function getRuleCheckerFactory(): RuleCheckerFactory {
return MediaWikiServices::getInstance()->getService( RuleCheckerFactory::SERVICE_NAME );
public static function getRuleCheckerFactory( ContainerInterface $services = null ): RuleCheckerFactory {
return ( $services ?? MediaWikiServices::getInstance() )->get( RuleCheckerFactory::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return FilterLookup
*/
public static function getFilterLookup(): FilterLookup {
return MediaWikiServices::getInstance()->getService( FilterLookup::SERVICE_NAME );
public static function getFilterLookup( ContainerInterface $services = null ): FilterLookup {
return ( $services ?? MediaWikiServices::getInstance() )->get( FilterLookup::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return EmergencyCache
*/
public static function getEmergencyCache(): EmergencyCache {
return MediaWikiServices::getInstance()->getService( EmergencyCache::SERVICE_NAME );
public static function getEmergencyCache( ContainerInterface $services = null ): EmergencyCache {
return ( $services ?? MediaWikiServices::getInstance() )->get( EmergencyCache::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return EmergencyWatcher
*/
public static function getEmergencyWatcher(): EmergencyWatcher {
return MediaWikiServices::getInstance()->getService( EmergencyWatcher::SERVICE_NAME );
public static function getEmergencyWatcher( ContainerInterface $services = null ): EmergencyWatcher {
return ( $services ?? MediaWikiServices::getInstance() )->get( EmergencyWatcher::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return EchoNotifier
*/
public static function getEchoNotifier(): EchoNotifier {
return MediaWikiServices::getInstance()->getService( EchoNotifier::SERVICE_NAME );
public static function getEchoNotifier( ContainerInterface $services = null ): EchoNotifier {
return ( $services ?? MediaWikiServices::getInstance() )->get( EchoNotifier::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return FilterValidator
*/
public static function getFilterValidator(): FilterValidator {
return MediaWikiServices::getInstance()->getService( FilterValidator::SERVICE_NAME );
public static function getFilterValidator( ContainerInterface $services = null ): FilterValidator {
return ( $services ?? MediaWikiServices::getInstance() )->get( FilterValidator::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return FilterCompare
*/
public static function getFilterCompare(): FilterCompare {
return MediaWikiServices::getInstance()->getService( FilterCompare::SERVICE_NAME );
public static function getFilterCompare( ContainerInterface $services = null ): FilterCompare {
return ( $services ?? MediaWikiServices::getInstance() )->get( FilterCompare::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return FilterImporter
*/
public static function getFilterImporter(): FilterImporter {
return MediaWikiServices::getInstance()->getService( FilterImporter::SERVICE_NAME );
public static function getFilterImporter( ContainerInterface $services = null ): FilterImporter {
return ( $services ?? MediaWikiServices::getInstance() )->get( FilterImporter::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return FilterStore
*/
public static function getFilterStore(): FilterStore {
return MediaWikiServices::getInstance()->getService( FilterStore::SERVICE_NAME );
public static function getFilterStore( ContainerInterface $services = null ): FilterStore {
return ( $services ?? MediaWikiServices::getInstance() )->get( FilterStore::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return ConsequencesFactory
*/
public static function getConsequencesFactory(): ConsequencesFactory {
return MediaWikiServices::getInstance()->getService( ConsequencesFactory::SERVICE_NAME );
public static function getConsequencesFactory( ContainerInterface $services = null ): ConsequencesFactory {
return ( $services ?? MediaWikiServices::getInstance() )->get( ConsequencesFactory::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return EditBoxBuilderFactory
*/
public static function getEditBoxBuilderFactory(): EditBoxBuilderFactory {
return MediaWikiServices::getInstance()->getService( EditBoxBuilderFactory::SERVICE_NAME );
public static function getEditBoxBuilderFactory( ContainerInterface $services = null ): EditBoxBuilderFactory {
return ( $services ?? MediaWikiServices::getInstance() )->get( EditBoxBuilderFactory::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return ConsequencesLookup
*/
public static function getConsequencesLookup(): ConsequencesLookup {
return MediaWikiServices::getInstance()->getService( ConsequencesLookup::SERVICE_NAME );
public static function getConsequencesLookup( ContainerInterface $services = null ): ConsequencesLookup {
return ( $services ?? MediaWikiServices::getInstance() )->get( ConsequencesLookup::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return ConsequencesRegistry
*/
public static function getConsequencesRegistry(): ConsequencesRegistry {
return MediaWikiServices::getInstance()->getService( ConsequencesRegistry::SERVICE_NAME );
public static function getConsequencesRegistry( ContainerInterface $services = null ): ConsequencesRegistry {
return ( $services ?? MediaWikiServices::getInstance() )->get( ConsequencesRegistry::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return AbuseLoggerFactory
*/
public static function getAbuseLoggerFactory(): AbuseLoggerFactory {
return MediaWikiServices::getInstance()->getService( AbuseLoggerFactory::SERVICE_NAME );
public static function getAbuseLoggerFactory( ContainerInterface $services = null ): AbuseLoggerFactory {
return ( $services ?? MediaWikiServices::getInstance() )->get( AbuseLoggerFactory::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return UpdateHitCountWatcher
*/
public static function getUpdateHitCountWatcher(): UpdateHitCountWatcher {
return MediaWikiServices::getInstance()->getService( UpdateHitCountWatcher::SERVICE_NAME );
public static function getUpdateHitCountWatcher( ContainerInterface $services = null ): UpdateHitCountWatcher {
return ( $services ?? MediaWikiServices::getInstance() )->get( UpdateHitCountWatcher::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return VariablesBlobStore
*/
public static function getVariablesBlobStore(): VariablesBlobStore {
return MediaWikiServices::getInstance()->getService( VariablesBlobStore::SERVICE_NAME );
public static function getVariablesBlobStore( ContainerInterface $services = null ): VariablesBlobStore {
return ( $services ?? MediaWikiServices::getInstance() )->get( VariablesBlobStore::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return ConsequencesExecutorFactory
*/
public static function getConsequencesExecutorFactory(): ConsequencesExecutorFactory {
return MediaWikiServices::getInstance()->getService( ConsequencesExecutorFactory::SERVICE_NAME );
public static function getConsequencesExecutorFactory(
ContainerInterface $services = null
): ConsequencesExecutorFactory {
return ( $services ?? MediaWikiServices::getInstance() )->get( ConsequencesExecutorFactory::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return FilterRunnerFactory
*/
public static function getFilterRunnerFactory(): FilterRunnerFactory {
return MediaWikiServices::getInstance()->getService( FilterRunnerFactory::SERVICE_NAME );
public static function getFilterRunnerFactory( ContainerInterface $services = null ): FilterRunnerFactory {
return ( $services ?? MediaWikiServices::getInstance() )->get( FilterRunnerFactory::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return SpecsFormatter
*/
public static function getSpecsFormatter(): SpecsFormatter {
return MediaWikiServices::getInstance()->getService( SpecsFormatter::SERVICE_NAME );
public static function getSpecsFormatter( ContainerInterface $services = null ): SpecsFormatter {
return ( $services ?? MediaWikiServices::getInstance() )->get( SpecsFormatter::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return VariablesFormatter
*/
public static function getVariablesFormatter(): VariablesFormatter {
return MediaWikiServices::getInstance()->getService( VariablesFormatter::SERVICE_NAME );
public static function getVariablesFormatter( ContainerInterface $services = null ): VariablesFormatter {
return ( $services ?? MediaWikiServices::getInstance() )->get( VariablesFormatter::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return LazyVariableComputer
*/
public static function getLazyVariableComputer(): LazyVariableComputer {
return MediaWikiServices::getInstance()->getService( LazyVariableComputer::SERVICE_NAME );
public static function getLazyVariableComputer( ContainerInterface $services = null ): LazyVariableComputer {
return ( $services ?? MediaWikiServices::getInstance() )->get( LazyVariableComputer::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return TextExtractor
*/
public static function getTextExtractor(): TextExtractor {
return MediaWikiServices::getInstance()->getService( TextExtractor::SERVICE_NAME );
public static function getTextExtractor( ContainerInterface $services = null ): TextExtractor {
return ( $services ?? MediaWikiServices::getInstance() )->get( TextExtractor::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return VariablesManager
*/
public static function getVariablesManager(): VariablesManager {
return MediaWikiServices::getInstance()->getService( VariablesManager::SERVICE_NAME );
public static function getVariablesManager( ContainerInterface $services = null ): VariablesManager {
return ( $services ?? MediaWikiServices::getInstance() )->get( VariablesManager::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return VariableGeneratorFactory
*/
public static function getVariableGeneratorFactory(): VariableGeneratorFactory {
return MediaWikiServices::getInstance()->getService( VariableGeneratorFactory::SERVICE_NAME );
public static function getVariableGeneratorFactory(
ContainerInterface $services = null
): VariableGeneratorFactory {
return ( $services ?? MediaWikiServices::getInstance() )->get( VariableGeneratorFactory::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return EditRevUpdater
*/
public static function getEditRevUpdater(): EditRevUpdater {
return MediaWikiServices::getInstance()->getService( EditRevUpdater::SERVICE_NAME );
public static function getEditRevUpdater( ContainerInterface $services = null ): EditRevUpdater {
return ( $services ?? MediaWikiServices::getInstance() )->get( EditRevUpdater::SERVICE_NAME );
}
/**
* @param ContainerInterface|null $services
* @return AbuseFilterActorMigration
*/
public static function getAbuseFilterActorMigration(): AbuseFilterActorMigration {
return MediaWikiServices::getInstance()->getService( AbuseFilterActorMigration::SERVICE_NAME );
public static function getActorMigration( ContainerInterface $services = null ): AbuseFilterActorMigration {
return ( $services ?? MediaWikiServices::getInstance() )->get( AbuseFilterActorMigration::SERVICE_NAME );
}
}

View file

@ -89,7 +89,7 @@ class QueryAbuseFilters extends ApiQueryBase {
$this->addFieldsIf( 'af_actions', $fld_actions );
$this->addFieldsIf( 'af_comments', $fld_comments );
if ( $fld_user ) {
$actorQuery = AbuseFilterServices::getAbuseFilterActorMigration()->getJoin( 'af_user' );
$actorQuery = AbuseFilterServices::getActorMigration()->getJoin( 'af_user' );
$this->addTables( $actorQuery['tables'] );
$this->addFields( [ 'af_user_text' => $actorQuery['fields']['af_user_text'] ] );
$this->addJoinConds( $actorQuery['joins'] );

View file

@ -20,7 +20,7 @@ use Title;
use User;
class FilterRunnerFactory {
public const SERVICE_NAME = 'AbuseFilterRunnerFactory';
public const SERVICE_NAME = 'AbuseFilterFilterRunnerFactory';
/** @var AbuseFilterHookRunner */
private $hookRunner;

View file

@ -189,7 +189,7 @@ class AbuseFilterHistoryPager extends TablePager {
* @return array
*/
public function getQueryInfo() {
$afActorMigration = AbuseFilterServices::getAbuseFilterActorMigration();
$afActorMigration = AbuseFilterServices::getActorMigration();
$actorQuery = $afActorMigration->getJoin( 'afh_user' );
$info = [
'tables' => [ 'abuse_filter_history', 'abuse_filter' ] + $actorQuery['tables'],

View file

@ -96,7 +96,7 @@ class AbuseFilterPager extends TablePager {
* @return array
*/
public function getQueryInfo() {
$actorQuery = AbuseFilterServices::getAbuseFilterActorMigration()->getJoin( 'af_user' );
$actorQuery = AbuseFilterServices::getActorMigration()->getJoin( 'af_user' );
return [
'tables' => [ 'abuse_filter' ] + $actorQuery['tables'],
'fields' => [

View file

@ -372,6 +372,10 @@ return [
$services->getActorStoreFactory(),
);
},
// b/c for extensions
'AbuseFilterRunnerFactory' => static function ( MediaWikiServices $services ): FilterRunnerFactory {
return $services->get( FilterRunnerFactory::SERVICE_NAME );
},
];
// @codeCoverageIgnoreEnd

View file

@ -50,7 +50,7 @@ class AddMissingLoggingEntries extends LoggedUpdateMaintenance {
$legacyParamsLike = $db->buildLike( $logParamsConcat, $db->anyString() );
// Non-legacy entries are a serialized array with 'newId' and 'historyId' keys
$newLogParamsLike = $db->buildLike( $db->anyString(), 'historyId', $db->anyString() );
$actorQuery = AbuseFilterServices::getAbuseFilterActorMigration()->getJoin( 'afh_user' );
$actorQuery = AbuseFilterServices::getActorMigration()->getJoin( 'afh_user' );
// Find all entries in abuse_filter_history without logging entry of same timestamp
$afhResult = $db->select(
[ 'abuse_filter_history', 'logging' ] + $actorQuery['tables'],

View file

@ -149,7 +149,7 @@ class NormalizeThrottleParameters extends LoggedUpdateMaintenance {
*/
protected function normalizeParameters() {
$user = AbuseFilterServices::getFilterUser()->getUserIdentity();
$actorMigration = AbuseFilterServices::getAbuseFilterActorMigration();
$actorMigration = AbuseFilterServices::getActorMigration();
$dryRun = $this->hasOption( 'dry-run' );
// IDs of filters with invalid rate (count or period)

View file

@ -0,0 +1,17 @@
<?php
namespace MediaWiki\Extension\AbuseFilter\Tests\Integration;
use MediaWiki\Tests\ExtensionJsonTestBase;
/**
* @group Test
* @group AbuseFilter
* @coversNothing
*/
class AbuseFilterExtensionJsonTest extends ExtensionJsonTestBase {
/** @inheritDoc */
protected string $extensionJsonPath = __DIR__ . '/../../../extension.json';
}

View file

@ -2,38 +2,20 @@
namespace MediaWiki\Extension\AbuseFilter\Tests\Integration;
use Generator;
use MediaWiki\Extension\AbuseFilter\AbuseFilterServices;
use MediaWikiIntegrationTestCase;
use ReflectionClass;
use ReflectionMethod;
use MediaWiki\Tests\ExtensionServicesTestBase;
/**
* @group Test
* @group AbuseFilter
* @covers \MediaWiki\Extension\AbuseFilter\AbuseFilterServices
*/
class AbuseFilterServicesTest extends MediaWikiIntegrationTestCase {
/**
* @covers \MediaWiki\Extension\AbuseFilter\AbuseFilterServices
* @param string $getter
* @dataProvider provideGetters
*/
public function testServiceGetters( string $getter ) {
// Methods are typehinted, so no need to assert
AbuseFilterServices::$getter();
$this->addToAssertionCount( 1 );
}
class AbuseFilterServicesTest extends ExtensionServicesTestBase {
/** @inheritDoc */
protected string $className = AbuseFilterServices::class;
/** @inheritDoc */
protected string $serviceNamePrefix = 'AbuseFilter';
/**
* @return Generator
*/
public function provideGetters(): Generator {
$clazz = new ReflectionClass( AbuseFilterServices::class );
foreach ( $clazz->getMethods( ReflectionMethod::IS_PUBLIC ) as $method ) {
$name = $method->getName();
if ( strpos( $name, 'get' ) === 0 ) {
yield $name => [ $name ];
}
}
}
}