* @covers ChangesListSpecialPage
*/
class ChangesListSpecialPageTest extends AbstractChangesListSpecialPageTestCase {
- protected function setUp() {
- parent::setUp();
-
- # setup the rc object
- $this->changesListSpecialPage = $this->getPage();
- }
-
protected function getPage() {
- return TestingAccessWrapper::newFromObject(
- $this->getMockForAbstractClass(
- 'ChangesListSpecialPage',
+ $mock = $this->getMockBuilder( ChangesListSpecialPage::class )
+ ->setConstructorArgs(
[
'ChangesListSpecialPage',
''
]
)
+ ->setMethods( [ 'getPageTitle' ] )
+ ->getMockForAbstractClass();
+
+ $mock->method( 'getPageTitle' )->willReturn(
+ Title::makeTitle( NS_SPECIAL, 'ChangesListSpecialPage' )
);
+
+ $mock = TestingAccessWrapper::newFromObject(
+ $mock
+ );
+
+ return $mock;
}
- /** helper to test SpecialRecentchanges::buildMainQueryConds() */
- private function assertConditions(
- $expected,
+ private function buildQuery(
$requestOptions = null,
- $message = '',
$user = null
) {
$context = new RequestContext;
}
$this->changesListSpecialPage->setContext( $context );
+ $this->changesListSpecialPage->filterGroups = [];
$formOptions = $this->changesListSpecialPage->setup( null );
# Filter out rc_timestamp conditions which depends on the test runtime
'ChangesListSpecialPageTest::filterOutRcTimestampCondition'
);
+ return $queryConditions;
+ }
+
+ /** helper to test SpecialRecentchanges::buildQuery() */
+ private function assertConditions(
+ $expected,
+ $requestOptions = null,
+ $message = '',
+ $user = null
+ ) {
+ $queryConditions = $this->buildQuery( $requestOptions, $user );
+
$this->assertEquals(
self::normalizeCondition( $expected ),
self::normalizeCondition( $queryConditions ),
"rc_namespace IN ('1','2','3')",
],
[
- 'namespace' => '1,2,3',
+ 'namespace' => '1;2;3',
],
"rc conditions with multiple namespaces"
);
"rc_namespace IN ('0','1','4','5','6','7')",
],
[
- 'namespace' => '1,4,7',
+ 'namespace' => '1;4;7',
'associated' => 1,
],
"rc conditions with multiple namespaces and associated"
"rc_namespace NOT IN ('2','3','8','9')",
],
[
- 'namespace' => '2,3,9',
+ 'namespace' => '2;3;9',
'associated' => 1,
'invert' => 1
],
"rc_namespace NOT IN ('1','2','3')",
],
[
- 'namespace' => '1,2,3',
+ 'namespace' => '1;2;3',
'invert' => 1,
],
"rc conditions with multiple namespaces inverted"
);
}
- public function testRcHidemyselfHidebyothersFilter() {
- $user = $this->getTestUser()->getUser();
- $this->assertConditions(
- [ # expected
- "rc_user_text != '{$user->getName()}'",
- "rc_user_text = '{$user->getName()}'",
- ],
- [
- 'hidemyself' => 1,
- 'hidebyothers' => 1,
- ],
- "rc conditions: hidemyself=1 hidebyothers=1 (logged in)",
- $user
- );
- }
-
public function testRcHidepageedits() {
$this->assertConditions(
[ # expected
}
public function testRcHidepatrolledDisabledFilter() {
+ $this->setMwGlobals( 'wgUseRCPatrol', false );
$user = $this->getTestUser()->getUser();
$this->assertConditions(
[ # expected
}
public function testRcHideunpatrolledDisabledFilter() {
+ $this->setMwGlobals( 'wgUseRCPatrol', false );
$user = $this->getTestUser()->getUser();
$this->assertConditions(
[ # expected
);
}
- public function testRcHidepatrolledHideunpatrolledFilter() {
- $user = $this->getTestSysop()->getUser();
+ public function testHideCategorization() {
$this->assertConditions(
- [ # expected
- "rc_patrolled = 0",
- "rc_patrolled = 1",
+ [
+ # expected
+ "rc_type != '6'"
],
[
- 'hidepatrolled' => 1,
- 'hideunpatrolled' => 1,
+ 'hidecategorization' => 1
],
- "rc conditions: hidepatrolled=1 hideunpatrolled=1",
- $user
+ "rc conditions: hidecategorization=1"
);
}
- public function testHideCategorization() {
+ public function testFilterUserExpLevelAll() {
$this->assertConditions(
[
# expected
- "rc_type != '6'"
],
[
- 'hidecategorization' => 1
+ 'userExpLevel' => 'registered;unregistered;newcomer;learner;experienced',
],
- "rc conditions: hidecategorization=1"
+ "rc conditions: userExpLevel=registered;unregistered;newcomer;learner;experienced"
+ );
+ }
+
+ public function testFilterUserExpLevelRegisteredUnregistered() {
+ $this->assertConditions(
+ [
+ # expected
+ ],
+ [
+ 'userExpLevel' => 'registered;unregistered',
+ ],
+ "rc conditions: userExpLevel=registered;unregistered"
+ );
+ }
+
+ public function testFilterUserExpLevelRegisteredUnregisteredLearner() {
+ $this->assertConditions(
+ [
+ # expected
+ ],
+ [
+ 'userExpLevel' => 'registered;unregistered;learner',
+ ],
+ "rc conditions: userExpLevel=registered;unregistered;learner"
+ );
+ }
+
+ public function testFilterUserExpLevelAllExperienceLevels() {
+ $this->assertConditions(
+ [
+ # expected
+ 'rc_user != 0',
+ ],
+ [
+ 'userExpLevel' => 'newcomer;learner;experienced',
+ ],
+ "rc conditions: userExpLevel=newcomer;learner;experienced"
+ );
+ }
+
+ public function testFilterUserExpLevelRegistrered() {
+ $this->assertConditions(
+ [
+ # expected
+ 'rc_user != 0',
+ ],
+ [
+ 'userExpLevel' => 'registered',
+ ],
+ "rc conditions: userExpLevel=registered"
+ );
+ }
+
+ public function testFilterUserExpLevelUnregistrered() {
+ $this->assertConditions(
+ [
+ # expected
+ 'rc_user' => 0,
+ ],
+ [
+ 'userExpLevel' => 'unregistered',
+ ],
+ "rc conditions: userExpLevel=unregistered"
+ );
+ }
+
+ public function testFilterUserExpLevelRegistreredOrLearner() {
+ $this->assertConditions(
+ [
+ # expected
+ 'rc_user != 0',
+ ],
+ [
+ 'userExpLevel' => 'registered;learner',
+ ],
+ "rc conditions: userExpLevel=registered;learner"
+ );
+ }
+
+ public function testFilterUserExpLevelUnregistreredOrExperienced() {
+ $conds = $this->buildQuery( [ 'userExpLevel' => 'unregistered;experienced' ] );
+
+ $this->assertRegExp(
+ '/\(rc_user = 0\) OR \(\(user_editcount >= 500\) AND \(user_registration <= \'[^\']+\'\)\)/',
+ reset( $conds ),
+ "rc conditions: userExpLevel=unregistered;experienced"
);
}
$this->fetchUsers( [ 'learner', 'experienced' ], $now ),
'Learner and more experienced'
);
-
- // newcomers, learner, and more experienced
- // TOOD: Fix test. This needs to test that anons are excluded,
- // and right now the join fails.
- /* $this->assertArrayEquals( */
- /* [ */
- /* 'Newcomer1', 'Newcomer2', 'Newcomer3', */
- /* 'Learner1', 'Learner2', 'Learner3', 'Learner4', */
- /* 'Experienced1', */
- /* ], */
- /* $this->fetchUsers( [ 'newcomer', 'learner', 'experienced' ], $now ) */
- /* ); */
}
private function createUsers( $specs, $now ) {
}
public function testGetStructuredFilterJsData() {
+ $this->changesListSpecialPage->filterGroups = [];
+
$definition = [
[
'name' => 'gub-group',
"hideliu" => true,
"userExpLevel" => "newcomer",
],
- "expectedConflicts" => true,
+ "expectedConflicts" => false,
],
[
"parameters" => [
$this->changesListSpecialPage->areFiltersInConflict()
);
}
+
+ public function validateOptionsProvider() {
+ return [
+ [
+ [ 'hideanons' => 1, 'hideliu' => 1, 'hidebots' => 1 ],
+ true,
+ [ 'hideliu' => 1, 'hidebots' => 1, ],
+ ],
+
+ [
+ [ 'hideanons' => 1, 'hideliu' => 1, 'hidebots' => 0 ],
+ true,
+ [ 'hidebots' => 0, 'hidehumans' => 1 ],
+ ],
+
+ [
+ [ 'hidemyself' => 1, 'hidebyothers' => 1 ],
+ true,
+ [],
+ ],
+ [
+ [ 'hidebots' => 1, 'hidehumans' => 1 ],
+ true,
+ [],
+ ],
+ [
+ [ 'hidepatrolled' => 1, 'hideunpatrolled' => 1 ],
+ true,
+ [],
+ ],
+ [
+ [ 'hideminor' => 1, 'hidemajor' => 1 ],
+ true,
+ [],
+ ],
+ [
+ // changeType
+ [ 'hidepageedits' => 1, 'hidenewpages' => 1, 'hidecategorization' => 1, 'hidelog' => 1, ],
+ true,
+ [],
+ ],
+ ];
+ }
}