summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrian Evans <grknight@gentoo.org>2020-10-02 14:32:39 -0400
committerBrian Evans <grknight@gentoo.org>2020-10-02 14:32:39 -0400
commit1f029fca0e032ee20673003d136f8603984b0841 (patch)
tree50d3a1748543abec2e7bbc3d94a7290cb57a78d2 /AbuseFilter/tests/phpunit/AbuseFilterSaveTest.php
parentUpdate Echo to 1.35 (diff)
downloadextensions-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.php586
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
+ ]
+ ]
+ ]
];
}
}