diff options
author | Brian Evans <grknight@gentoo.org> | 2020-10-02 14:32:39 -0400 |
---|---|---|
committer | Brian Evans <grknight@gentoo.org> | 2020-10-02 14:32:39 -0400 |
commit | 1f029fca0e032ee20673003d136f8603984b0841 (patch) | |
tree | 50d3a1748543abec2e7bbc3d94a7290cb57a78d2 /AbuseFilter/tests/phpunit/AbuseFilterSaveTest.php | |
parent | Update Echo to 1.35 (diff) | |
download | extensions-1f029fca0e032ee20673003d136f8603984b0841.tar.gz extensions-1f029fca0e032ee20673003d136f8603984b0841.tar.bz2 extensions-1f029fca0e032ee20673003d136f8603984b0841.zip |
Update AbuseFilter to 1.35
Signed-off-by: Brian Evans <grknight@gentoo.org>
Diffstat (limited to 'AbuseFilter/tests/phpunit/AbuseFilterSaveTest.php')
-rw-r--r-- | AbuseFilter/tests/phpunit/AbuseFilterSaveTest.php | 586 |
1 files changed, 244 insertions, 342 deletions
diff --git a/AbuseFilter/tests/phpunit/AbuseFilterSaveTest.php b/AbuseFilter/tests/phpunit/AbuseFilterSaveTest.php index 6a5b3121..e226a3c2 100644 --- a/AbuseFilter/tests/phpunit/AbuseFilterSaveTest.php +++ b/AbuseFilter/tests/phpunit/AbuseFilterSaveTest.php @@ -22,47 +22,52 @@ * @license GPL-2.0-or-later */ +use MediaWiki\Linker\LinkRenderer; +use PHPUnit\Framework\MockObject\MockObject; +use Wikimedia\Rdbms\IDatabase; + /** * @group Test * @group AbuseFilter * @group AbuseFilterSave - * @group Database * * @covers AbuseFilter * @covers AbuseFilterViewEdit - * @covers AbuseFilterParser */ class AbuseFilterSaveTest extends MediaWikiTestCase { - protected static $mUser, $mParameters; - - /** - * @var array This tables will be deleted in parent::tearDown - */ - protected $tablesUsed = [ - 'abuse_filter', - 'abuse_filter_action', - 'abuse_filter_history', - 'abuse_filter_log' + private static $defaultFilterRow = [ + 'af_pattern' => '/**/', + 'af_user' => 0, + 'af_user_text' => 'FilterTester', + 'af_timestamp' => '20190826000000', + 'af_enabled' => 1, + 'af_comments' => '', + 'af_public_comments' => 'Mock filter', + 'af_hidden' => 0, + 'af_hit_count' => 0, + 'af_throttled' => 0, + 'af_deleted' => 0, + 'af_actions' => '', + 'af_global' => 0, + 'af_group' => 'default' ]; /** - * @see MediaWikiTestCase::setUp + * Gets an instance of AbuseFilterViewEdit ready for creating or editing filter + * + * @param User $user + * @param array $params + * @param bool $existing Whether the filter already exists + * @return AbuseFilterViewEdit|MockObject */ - protected function setUp() { - parent::setUp(); - $user = User::newFromName( 'FilterTester' ); - $user->addToDatabase(); - $user->addGroup( 'filterEditor' ); - RequestContext::getMain()->setUser( $user ); - self::$mUser = $user; - // Make sure that the config we're using is the one we're expecting - $this->setMwGlobals( [ - 'wgUser' => $user, - 'wgAbuseFilterRestrictions' => [ - 'degroup' => true - ], - 'wgAbuseFilterIsCentral' => true, - 'wgAbuseFilterActions' => [ + private function getViewEdit( User $user, array $params, $existing ) { + $special = new SpecialAbuseFilter(); + $context = new RequestContext(); + $context->setRequest( $this->getRequest( $params ) ); + $context->setUser( $user ); + $cfgOpts = [ + 'LanguageCode' => 'en', + 'AbuseFilterActions' => [ 'throttle' => true, 'warn' => true, 'disallow' => true, @@ -72,40 +77,50 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { 'degroup' => true, 'tag' => true ], - 'wgAbuseFilterValidGroups' => [ + 'AbuseFilterValidGroups' => [ 'default', 'flow' - ] - ] ); - $this->setGroupPermissions( [ - 'filterEditor' => [ - 'abusefilter-modify' => true, - 'abusefilter-modify-restricted' => false, - 'abusefilter-modify-global' => false, ], - 'filterEditorGlobal' => [ - 'abusefilter-modify' => true, - 'abusefilter-modify-global' => true, - ] - ] ); - } + 'AbuseFilterRestrictions' => [ + 'degroup' => true + ], + 'AbuseFilterIsCentral' => true, + ]; - /** - * Gets an instance of AbuseFilterViewEdit ready for creating or editing filter - * - * @param string $filter 'new' for a new filter, its ID otherwise - * @return AbuseFilterViewEdit - */ - private static function getViewEdit( $filter ) { - $special = new SpecialAbuseFilter(); - $context = RequestContext::getMain( self::getRequest() ); - $context->setRequest( self::getRequest() ); + $context->setConfig( new HashConfig( $cfgOpts ) ); $special->setContext( $context ); + $filter = $params['id']; $special->mFilter = $filter; - $viewEdit = new AbuseFilterViewEdit( $special, [ $filter ] ); - // Being a static property, it's not deleted between tests - $viewEdit::$mLoadedRow = null; + /** @var LinkRenderer|MockObject $lr */ + $lr = $this->getMockBuilder( LinkRenderer::class ) + ->disableOriginalConstructor() + ->getMock(); + $special->setLinkRenderer( $lr ); + /** @var AbuseFilterViewEdit|MockObject $viewEdit */ + $viewEdit = $this->getMockBuilder( AbuseFilterViewEdit::class ) + ->setConstructorArgs( [ $special, [ $filter ] ] ) + ->setMethods( [ 'loadFilterData' ] ) + ->getMock(); + + if ( $existing ) { + $origValues = [ (object)( self::$defaultFilterRow + [ 'af_id' => 1 ] ), [] ]; + } else { + $origValues = [ + (object)[ + 'af_pattern' => '', + 'af_enabled' => 1, + 'af_hidden' => 0, + 'af_global' => 0, + 'af_throttled' => 0, + 'af_hit_count' => 0, + ], + [] + ]; + } + $viewEdit->expects( $this->once() ) + ->method( 'loadFilterData' ) + ->willReturn( $origValues ); return $viewEdit; } @@ -113,79 +128,70 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { /** * Creates a FauxRequest object * + * @param array $params * @return FauxRequest */ - private static function getRequest() { - $params = [ - 'wpFilterRules' => self::$mParameters['rules'], - 'wpFilterDescription' => self::$mParameters['description'], - 'wpFilterNotes' => self::$mParameters['notes'], - 'wpFilterGroup' => self::$mParameters['group'], - 'wpFilterEnabled' => self::$mParameters['enabled'], - 'wpFilterHidden' => self::$mParameters['hidden'], - 'wpFilterDeleted' => self::$mParameters['deleted'], - 'wpFilterGlobal' => self::$mParameters['global'], - 'wpFilterActionThrottle' => self::$mParameters['throttleEnabled'], - 'wpFilterThrottleCount' => self::$mParameters['throttleCount'], - 'wpFilterThrottlePeriod' => self::$mParameters['throttlePeriod'], - 'wpFilterThrottleGroups' => self::$mParameters['throttleGroups'], - 'wpFilterActionWarn' => self::$mParameters['warnEnabled'], - 'wpFilterWarnMessage' => self::$mParameters['warnMessage'], - 'wpFilterWarnMessageOther' => self::$mParameters['warnMessageOther'], - 'wpFilterActionDisallow' => self::$mParameters['disallowEnabled'], - 'wpFilterActionBlockautopromote' => self::$mParameters['blockautopromoteEnabled'], - 'wpFilterActionDegroup' => self::$mParameters['degroupEnabled'], - 'wpFilterActionBlock' => self::$mParameters['blockEnabled'], - 'wpFilterBlockTalk' => self::$mParameters['blockTalk'], - 'wpBlockAnonDuration' => self::$mParameters['blockAnons'], - 'wpBlockUserDuration' => self::$mParameters['blockUsers'], - 'wpFilterActionRangeblock' => self::$mParameters['rangeblockEnabled'], - 'wpFilterActionTag' => self::$mParameters['tagEnabled'], - 'wpFilterTags' => self::$mParameters['tagTags'], + private function getRequest( array $params ) { + $reqParams = [ + 'wpFilterRules' => $params['rules'], + 'wpFilterDescription' => $params['description'], + 'wpFilterNotes' => $params['notes'] ?? '', + 'wpFilterGroup' => $params['group'] ?? 'default', + 'wpFilterEnabled' => $params['enabled'] ?? true, + 'wpFilterHidden' => $params['hidden'] ?? false, + 'wpFilterDeleted' => $params['deleted'] ?? false, + 'wpFilterGlobal' => $params['global'] ?? false, + 'wpFilterActionThrottle' => $params['throttleEnabled'] ?? false, + 'wpFilterThrottleCount' => $params['throttleCount'] ?? 0, + 'wpFilterThrottlePeriod' => $params['throttlePeriod'] ?? 0, + 'wpFilterThrottleGroups' => $params['throttleGroups'] ?? '', + 'wpFilterActionWarn' => $params['warnEnabled'] ?? false, + 'wpFilterWarnMessage' => $params['warnMessage'] ?? 'abusefilter-warning', + 'wpFilterWarnMessageOther' => $params['warnMessageOther'] ?? '', + 'wpFilterActionDisallow' => $params['disallowEnabled'] ?? false, + 'wpFilterDisallowMessage' => $params['disallowMessage'] ?? 'abusefilter-disallowed', + 'wpFilterDisallowMessageOther' => $params['disallowMessageOther'] ?? '', + 'wpFilterActionBlockautopromote' => $params['blockautopromoteEnabled'] ?? false, + 'wpFilterActionDegroup' => $params['degroupEnabled'] ?? false, + 'wpFilterActionBlock' => $params['blockEnabled'] ?? false, + 'wpFilterBlockTalk' => $params['blockTalk'] ?? false, + 'wpBlockAnonDuration' => $params['blockAnons'] ?? 'infinity', + 'wpBlockUserDuration' => $params['blockUsers'] ?? 'infinity', + 'wpFilterActionRangeblock' => $params['rangeblockEnabled'] ?? false, + 'wpFilterActionTag' => $params['tagEnabled'] ?? false, + 'wpFilterTags' => $params['tagTags'] ?? '', ]; // Checkboxes aren't included at all if they aren't selected. We can remove them // this way (instead of iterating a hardcoded list) since they're the only false values - $params = array_filter( $params, function ( $el ) { + $reqParams = array_filter( $reqParams, function ( $el ) { return $el !== false; } ); - $request = new FauxRequest( $params, true ); - return $request; + return new FauxRequest( $reqParams, true ); } /** - * Creates $amount new filters, in case we need to test updating an existing one - * - * @param int $amount How many filters to create + * @param array $testPerms + * @return User|MockObject */ - private static function createNewFilters( $amount ) { - $defaultRow = [ - 'af_pattern' => '/**/', - 'af_user' => 0, - 'af_user_text' => 'FilterTester', - 'af_timestamp' => wfTimestampNow(), - 'af_enabled' => 1, - 'af_comments' => '', - 'af_public_comments' => 'Mock filter', - 'af_hidden' => 0, - 'af_hit_count' => 0, - 'af_throttled' => 0, - 'af_deleted' => 0, - 'af_actions' => '', - 'af_global' => 0, - 'af_group' => 'default' - ]; + private function getUserMock( $testPerms ) { + $perms = array_merge( $testPerms, [ 'abusefilter-modify' ] ); + $user = $this->getMockBuilder( User::class ) + ->setMethods( [ 'getBlock', 'getName', 'getId', 'getActorId' ] ) + ->getMock(); - $dbw = wfGetDB( DB_MASTER ); - for ( $i = 1; $i <= $amount; $i++ ) { - $dbw->replace( - 'abuse_filter', - [ 'af_id' ], - $defaultRow, - __METHOD__ - ); - } + $user->expects( $this->any() ) + ->method( 'getName' ) + ->willReturn( 'FilterUser' ); + $user->expects( $this->any() ) + ->method( 'getId' ) + ->willReturn( 1 ); + $user->expects( $this->any() ) + ->method( 'getActorId' ) + ->willReturn( 1 ); + $this->overrideUserPermissions( $user, $perms ); + return $user; } /** @@ -196,93 +202,54 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { * @dataProvider provideFilters */ public function testSaveFilter( $args ) { - // Preliminar stuff for the test - if ( $args['testData']['customUserGroup'] ) { - self::$mUser->addGroup( $args['testData']['customUserGroup'] ); - } + $user = $this->getUserMock( $args['testData']['userPerms'] ?? [] ); - if ( $args['testData']['needsOtherFilters'] ) { - self::createNewFilters( $args['testData']['needsOtherFilters'] ); - } - - $fixedParameters = [ - 'id' => 'new', - 'notes' => '', - 'group' => 'default', - 'enabled' => true, - 'hidden' => false, - 'global' => false, - 'deleted' => false, - 'throttled' => 0, - 'throttleEnabled' => false, - 'throttleCount' => 0, - 'throttlePeriod' => 0, - 'throttleGroups' => '', - 'warnEnabled' => false, - 'warnMessage' => 'abusefilter-warning', - 'warnMessageOther' => '', - 'disallowEnabled' => false, - 'blockautopromoteEnabled' => false, - 'degroupEnabled' => false, - 'blockEnabled' => false, - 'blockTalk' => false, - 'blockAnons' => 'infinity', - 'blockUsers' => 'infinity', - 'rangeblockEnabled' => false, - 'tagEnabled' => false, - 'tagTags' => '' - ]; + $params = $args['filterParameters']; + $filter = $params['id'] = $params['id'] ?? 'new'; + $existing = isset( $args['testData']['existing'] ); + $viewEdit = $this->getViewEdit( $user, $params, $existing ); - // Extract parameters from testset and build what we need to save a filter - // The values specified in the testset will overwrite the fixed ones. - self::$mParameters = $args['filterParameters'] + $fixedParameters; - $filter = self::$mParameters['id']; - $viewEdit = self::getViewEdit( $filter ); - $request = self::getRequest(); - list( $newRow, $actions ) = $viewEdit->loadRequest( $filter ); - self::$mParameters['rowActions'] = implode( ',', array_keys( array_filter( $actions ) ) ); - - // Send data for validation and saving - $status = AbuseFilter::saveFilter( $viewEdit, $filter, $request, $newRow, $actions ); - - // Must be removed for the next test - if ( $args['testData']['customUserGroup'] ) { - self::$mUser->removeGroup( $args['testData']['customUserGroup'] ); + $reqStatus = $viewEdit->loadRequest( $filter ); + if ( !$reqStatus->isGood() ) { + $this->fail( 'Cannot retrieve request data correctly' ); } + list( $newRow, $actions ) = $reqStatus->getValue(); - $shouldFail = $args['testData']['shouldFail']; - $shouldBeSaved = $args['testData']['shouldBeSaved']; - $furtherInfo = null; - $expected = true; - if ( $shouldFail ) { - if ( $status->isGood() ) { - $furtherInfo = 'The filter validation returned a valid status.'; - $result = false; - } else { - $result = $status->getErrors(); - $result = $result[0]['message']; - $expected = $args['testData']['expectedMessage']; - } + /** @var IDatabase|MockObject $dbw */ + $dbw = $this->getMockForAbstractClass( IDatabase::class ); + $dbw->expects( $this->any() ) + ->method( 'insertId' ) + ->willReturn( 1 ); + $row = new stdClass(); + $row->actor_id = '1'; + $dbw->expects( $this->any() ) + ->method( 'selectRow' ) + ->willReturn( $row ); + $status = AbuseFilter::saveFilter( $viewEdit, $filter, $newRow, $actions, $dbw ); + + if ( $args['testData']['shouldFail'] ) { + $this->assertFalse( $status->isGood(), 'The filter validation returned a valid status.' ); + $actual = $status->getErrors()[0]['message']; + $expected = $args['testData']['expectedMessage']; + $this->assertEquals( $expected, $actual ); } else { - if ( $shouldBeSaved ) { + if ( $args['testData']['shouldBeSaved'] ) { + $this->assertTrue( + $status->isGood(), + "Save failed with status: $status" + ); $value = $status->getValue(); - $result = $status->isGood() && is_array( $value ) && count( $value ) === 2 && - is_numeric( $value[0] ) && is_numeric( $value[1] ); + $this->assertIsArray( $value ); + $this->assertCount( 2, $value ); + $this->assertContainsOnly( 'int', $value ); } else { - $result = $status->isGood() && $status->getValue() === false; + $this->assertTrue( + $status->isGood(), + "Got a non-good status: $status" + ); + $this->assertFalse( $status->getValue(), 'Status value should be false' ); } } - - $errorMessage = $args['testData']['doingWhat'] . '. Expected: ' . - $args['testData']['expectedResult'] . '.'; - if ( $furtherInfo ) { - $errorMessage .= "\nFurther info: " . $furtherInfo; - } - $this->assertEquals( - $expected, - $result, - $errorMessage - ); } /** @@ -291,7 +258,7 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { */ public function provideFilters() { return [ - [ + 'Fail due to empty description and rules' => [ [ 'filterParameters' => [ 'rules' => '', @@ -299,17 +266,13 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { 'blockautopromoteEnabled' => true, ], 'testData' => [ - 'doingWhat' => 'Trying to save a filter without description and rules', - 'expectedResult' => 'a "missing required fields" error message', 'expectedMessage' => 'abusefilter-edit-missingfields', 'shouldFail' => true, - 'shouldBeSaved' => false, - 'customUserGroup' => '', - 'needsOtherFilters' => false + 'shouldBeSaved' => false ] ] ], - [ + 'Success for only rules and description' => [ [ 'filterParameters' => [ 'rules' => '/* My rules */', @@ -318,17 +281,12 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { 'deleted' => true, ], 'testData' => [ - 'doingWhat' => 'Trying to save a filter with only rules and description', - 'expectedResult' => 'the saving to be successful', - 'expectedMessage' => '', 'shouldFail' => false, - 'shouldBeSaved' => true, - 'customUserGroup' => '', - 'needsOtherFilters' => false + 'shouldBeSaved' => true ] ] ], - [ + 'Fail due to syntax error' => [ [ 'filterParameters' => [ 'rules' => 'rlike', @@ -338,17 +296,13 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { 'blockAnons' => '8 hours', ], 'testData' => [ - 'doingWhat' => 'Trying to save a filter with wrong syntax', - 'expectedResult' => 'a "wrong syntax" error message', 'expectedMessage' => 'abusefilter-edit-badsyntax', 'shouldFail' => true, - 'shouldBeSaved' => false, - 'customUserGroup' => '', - 'needsOtherFilters' => false + 'shouldBeSaved' => false ] ] ], - [ + 'Fail due to both "enabled" and "deleted" selected' => [ [ 'filterParameters' => [ 'rules' => '1==1', @@ -359,17 +313,13 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { 'blockAnons' => '8 hours', ], 'testData' => [ - 'doingWhat' => 'Trying to save a filter marking it both enabled and deleted', - 'expectedResult' => 'an error message', 'expectedMessage' => 'abusefilter-edit-deleting-enabled', 'shouldFail' => true, - 'shouldBeSaved' => false, - 'customUserGroup' => '', - 'needsOtherFilters' => false + 'shouldBeSaved' => false ] ] ], - [ + 'Fail due to a reserved tag' => [ [ 'filterParameters' => [ 'rules' => '1==1', @@ -380,17 +330,13 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { 'tagTags' => 'mw-undo' ], 'testData' => [ - 'doingWhat' => 'Trying to save a filter with a reserved tag', - 'expectedResult' => 'an error message saying that the tag cannot be used', 'expectedMessage' => 'abusefilter-edit-bad-tags', 'shouldFail' => true, - 'shouldBeSaved' => false, - 'customUserGroup' => '', - 'needsOtherFilters' => false + 'shouldBeSaved' => false ] ] ], - [ + 'Fail due to an invalid tag' => [ [ 'filterParameters' => [ 'rules' => '1==1', @@ -400,17 +346,29 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { 'tagTags' => 'some|tag' ], 'testData' => [ - 'doingWhat' => 'Trying to save a filter with an invalid tag', - 'expectedResult' => 'an error message saying that the tag cannot be used', 'expectedMessage' => 'tags-create-invalid-chars', 'shouldFail' => true, - 'shouldBeSaved' => false, - 'customUserGroup' => '', - 'needsOtherFilters' => false + 'shouldBeSaved' => false ] ] ], - [ + 'Fail due to an empty tag' => [ + [ + 'filterParameters' => [ + 'rules' => '1!=0', + 'description' => 'Empty tag', + 'notes' => '', + 'tagEnabled' => true, + 'tagTags' => '' + ], + 'testData' => [ + 'expectedMessage' => 'tags-create-no-name', + 'shouldFail' => true, + 'shouldBeSaved' => false + ] + ] + ], + 'Fail due to lack of modify-global right' => [ [ 'filterParameters' => [ 'rules' => '1==1', @@ -419,17 +377,13 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { 'disallowEnabled' => true, ], 'testData' => [ - 'doingWhat' => 'Trying to save a global filter without enough rights', - 'expectedResult' => 'an error message saying that I do not have the required rights', 'expectedMessage' => 'abusefilter-edit-notallowed-global', 'shouldFail' => true, - 'shouldBeSaved' => false, - 'customUserGroup' => '', - 'needsOtherFilters' => false + 'shouldBeSaved' => false ] ] ], - [ + 'Fail due to custom warn message on global filter' => [ [ 'filterParameters' => [ 'rules' => '1==1', @@ -439,18 +393,31 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { 'warnMessage' => 'abusefilter-beautiful-warning', ], 'testData' => [ - 'doingWhat' => 'Trying to save a global filter with a custom warn message', - 'expectedResult' => 'an error message saying that custom warn messages ' . - 'cannot be used for global rules', 'expectedMessage' => 'abusefilter-edit-notallowed-global-custom-msg', 'shouldFail' => true, 'shouldBeSaved' => false, - 'customUserGroup' => 'filterEditorGlobal', - 'needsOtherFilters' => false + 'userPerms' => [ 'abusefilter-modify-global' ] ] ] ], - [ + 'Fail due to custom disallow message on global filter' => [ + [ + 'filterParameters' => [ + 'rules' => '1==1', + 'description' => 'Global with invalid disallow message', + 'global' => true, + 'disallowEnabled' => true, + 'disallowMessage' => 'abusefilter-disallowed-something', + ], + 'testData' => [ + 'expectedMessage' => 'abusefilter-edit-notallowed-global-custom-msg', + 'shouldFail' => true, + 'shouldBeSaved' => false, + 'userPerms' => [ 'abusefilter-modify-global' ] + ] + ] + ], + 'Fail due to a restricted action' => [ [ 'filterParameters' => [ 'rules' => '1==1', @@ -458,17 +425,13 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { 'degroupEnabled' => true, ], 'testData' => [ - 'doingWhat' => 'Trying to save a filter with a restricted action', - 'expectedResult' => 'an error message saying that the action is restricted', 'expectedMessage' => 'abusefilter-edit-restricted', 'shouldFail' => true, - 'shouldBeSaved' => false, - 'customUserGroup' => '', - 'needsOtherFilters' => false + 'shouldBeSaved' => false ] ] ], - [ + 'Pass validation but do not save when there are no changes' => [ [ 'filterParameters' => [ 'id' => '1', @@ -476,17 +439,13 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { 'description' => 'Mock filter', ], 'testData' => [ - 'doingWhat' => 'Trying to save a filter without changing anything', - 'expectedResult' => 'the validation to pass without the filter being saved', - 'expectedMessage' => '', 'shouldFail' => false, 'shouldBeSaved' => false, - 'customUserGroup' => '', - 'needsOtherFilters' => 1 + 'existing' => true ] ] ], - [ + 'Fail due to invalid throttle groups' => [ [ 'filterParameters' => [ 'rules' => '1==1', @@ -498,99 +457,42 @@ class AbuseFilterSaveTest extends MediaWikiTestCase { 'throttleGroups' => 'user\nfoo' ], 'testData' => [ - 'doingWhat' => 'Trying to save a filter with invalid throttle groups', - 'expectedResult' => 'an error message saying that throttle groups are invalid', 'expectedMessage' => 'abusefilter-edit-invalid-throttlegroups', 'shouldFail' => true, - 'shouldBeSaved' => false, - 'customUserGroup' => '', - 'needsOtherFilters' => false + 'shouldBeSaved' => false ] ] - ] - ]; - } - - /** - * Check that our tag validation is working properly. Note that we only need one test - * for each called function. Consistency within ChangeTags functions should be - * assured by tests in core. The test for canAddTagsAccompanyingChange and canCreateTag - * are missing because they won't actually fail, never. Resolving T173917 would - * greatly improve the situation and could help writing better tests. - * - * @param string $tag The tag to validate - * @param string|null $error The expected error message. Null if validations should pass - * @covers AbuseFilter::isAllowedTag - * @dataProvider provideTags - */ - public function testIsAllowedTag( $tag, $error ) { - $status = AbuseFilter::isAllowedTag( $tag ); - - if ( !$status->isGood() ) { - $actualError = $status->getErrors(); - $actualError = $actualError[0]['message']; - } else { - $actualError = null; - if ( $error !== null ) { - $this->fail( "Tag validation returned a valid status instead of the expected '$error' error." ); - } - } - - $this->assertSame( - $error, - $actualError, - "Expected message '$error', got '$actualError' while validating the tag '$tag'." - ); - } - - /** - * Data provider for testIsAllowedTag - * @return array - */ - public function provideTags() { - return [ - [ 'a|b', 'tags-create-invalid-chars' ], - [ 'mw-undo', 'abusefilter-edit-bad-tags' ], - [ 'abusefilter-condition-limit', 'abusefilter-tag-reserved' ], - [ 'my_tag', null ], - ]; - } - - /** - * Check that throttle parameters validation works fine - * - * @param array $params Throttle parameters - * @param string|null $error The expected error message. Null if validations should pass - * @covers AbuseFilter::checkThrottleParameters - * @dataProvider provideThrottleParameters - */ - public function testCheckThrottleParameters( $params, $error ) { - $result = AbuseFilter::checkThrottleParameters( $params ); - $this->assertSame( $error, $result, 'Throttle parameter validation does not work as expected.' ); - } - - /** - * Data provider for testCheckThrottleParameters - * @return array - */ - public function provideThrottleParameters() { - return [ - [ [ '1', '5,23', 'user', 'ip', 'page,range', 'ip,user', 'range,ip' ], null ], - [ [ '1', '5.3,23', 'user', 'ip' ], 'abusefilter-edit-invalid-throttlecount' ], - [ [ '1', '-3,23', 'user', 'ip' ], 'abusefilter-edit-invalid-throttlecount' ], - [ [ '1', '5,2.3', 'user', 'ip' ], 'abusefilter-edit-invalid-throttleperiod' ], - [ [ '1', '4,-14', 'user', 'ip' ], 'abusefilter-edit-invalid-throttleperiod' ], - [ [ '1', '3,33' ], 'abusefilter-edit-empty-throttlegroups' ], - [ [ '1', '3,33', 'user', 'ip,foo,user' ], 'abusefilter-edit-invalid-throttlegroups' ], - [ [ '1', '3,33', 'foo', 'ip,user' ], 'abusefilter-edit-invalid-throttlegroups' ], - [ [ '1', '3,33', 'foo', 'ip,user,bar' ], 'abusefilter-edit-invalid-throttlegroups' ], - [ [ '1', '3,33', 'user', 'ip,page,user' ], null ], - [ - [ '1', '3,33', 'ip', 'user','user,ip', 'ip,user', 'user,ip,user', 'user', 'ip,ip,user' ], - 'abusefilter-edit-duplicated-throttlegroups' ], - [ [ '1', '3,33', 'ip,ip,user' ], 'abusefilter-edit-duplicated-throttlegroups' ], - [ [ '1', '3,33', 'user,ip', 'ip,user' ], 'abusefilter-edit-duplicated-throttlegroups' ], + 'Fail due to empty warning message' => [ + [ + 'filterParameters' => [ + 'rules' => '1==1', + 'description' => 'Empty warning message', + 'warnEnabled' => true, + 'warnMessage' => '', + ], + 'testData' => [ + 'expectedMessage' => 'abusefilter-edit-invalid-warn-message', + 'shouldFail' => true, + 'shouldBeSaved' => false + ] + ] + ], + 'Fail due to empty disallow message' => [ + [ + 'filterParameters' => [ + 'rules' => '1==1', + 'description' => 'Empty disallow message', + 'disallowEnabled' => true, + 'disallowMessage' => '', + ], + 'testData' => [ + 'expectedMessage' => 'abusefilter-edit-invalid-disallow-message', + 'shouldFail' => true, + 'shouldBeSaved' => false + ] + ] + ] ]; } } |