2014-07-22 21:33:22 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
class EchoAttributeManagerTest extends MediaWikiTestCase {
|
|
|
|
|
|
|
|
public function testNewFromGlobalVars() {
|
|
|
|
$this->assertInstanceOf( 'EchoAttributeManager', EchoAttributeManager::newFromGlobalVars() );
|
|
|
|
}
|
|
|
|
|
2014-07-29 23:54:00 +00:00
|
|
|
public static function getUserLocatorsProvider() {
|
|
|
|
return array(
|
|
|
|
array(
|
|
|
|
'No errors when requesting unknown type',
|
|
|
|
// expected result
|
|
|
|
array(),
|
|
|
|
// event type
|
|
|
|
'foo',
|
|
|
|
// notification configuration
|
|
|
|
array(),
|
|
|
|
),
|
|
|
|
|
|
|
|
array(
|
|
|
|
'Returns selected notification configuration',
|
|
|
|
// expected result
|
|
|
|
array( 'woot!' ),
|
|
|
|
// event type
|
|
|
|
'magic',
|
|
|
|
// notification configuration
|
|
|
|
array(
|
|
|
|
'foo' => array(
|
Allow certain users to be excluded
Right now, if certain users should be excluded, that would have
to be part of the user-locators already. This is annoying because
it's hard to write "generic" user locators when you want to exclude
just a couple of people in certain cases.
In Flow, for example, we have user-locators for users watching a
board or topic. We don't want to send the notification to people
that have also been mentioned in that post (they'll get a separate
notification). We could build that exception into those
user-locators, but then we couldn't re-use them in other places...
This basically means we couldn't use EchoUserLocator::locateUsersWatchingTitle,
we would have to roll our own that also excludes mentioned users.
Instead, this lets you add 'user-filters' (that functionality
actually exists already, but is not currently exposed), which
lists users to not send the notification to, even though they could
be in a user-locator.
Bug: T125428
Change-Id: Ifa0e2d3283f57624af4c5ec264f9f66223508e83
2016-02-02 13:16:39 +00:00
|
|
|
EchoAttributeManager::ATTR_LOCATORS => array( 'frown' ),
|
2014-07-29 23:54:00 +00:00
|
|
|
),
|
|
|
|
'magic' => array(
|
Allow certain users to be excluded
Right now, if certain users should be excluded, that would have
to be part of the user-locators already. This is annoying because
it's hard to write "generic" user locators when you want to exclude
just a couple of people in certain cases.
In Flow, for example, we have user-locators for users watching a
board or topic. We don't want to send the notification to people
that have also been mentioned in that post (they'll get a separate
notification). We could build that exception into those
user-locators, but then we couldn't re-use them in other places...
This basically means we couldn't use EchoUserLocator::locateUsersWatchingTitle,
we would have to roll our own that also excludes mentioned users.
Instead, this lets you add 'user-filters' (that functionality
actually exists already, but is not currently exposed), which
lists users to not send the notification to, even though they could
be in a user-locator.
Bug: T125428
Change-Id: Ifa0e2d3283f57624af4c5ec264f9f66223508e83
2016-02-02 13:16:39 +00:00
|
|
|
EchoAttributeManager::ATTR_LOCATORS => array( 'woot!' ),
|
2014-07-29 23:54:00 +00:00
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
|
|
|
|
array(
|
|
|
|
'Accepts user-locators as string and returns array',
|
|
|
|
// expected result
|
|
|
|
array( 'sagen' ),
|
|
|
|
// event type
|
|
|
|
'challah',
|
|
|
|
// notification configuration
|
|
|
|
array(
|
|
|
|
'challah' => array(
|
Allow certain users to be excluded
Right now, if certain users should be excluded, that would have
to be part of the user-locators already. This is annoying because
it's hard to write "generic" user locators when you want to exclude
just a couple of people in certain cases.
In Flow, for example, we have user-locators for users watching a
board or topic. We don't want to send the notification to people
that have also been mentioned in that post (they'll get a separate
notification). We could build that exception into those
user-locators, but then we couldn't re-use them in other places...
This basically means we couldn't use EchoUserLocator::locateUsersWatchingTitle,
we would have to roll our own that also excludes mentioned users.
Instead, this lets you add 'user-filters' (that functionality
actually exists already, but is not currently exposed), which
lists users to not send the notification to, even though they could
be in a user-locator.
Bug: T125428
Change-Id: Ifa0e2d3283f57624af4c5ec264f9f66223508e83
2016-02-02 13:16:39 +00:00
|
|
|
EchoAttributeManager::ATTR_LOCATORS => 'sagen',
|
2014-07-29 23:54:00 +00:00
|
|
|
),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @dataProvider getUserLocatorsProvider
|
|
|
|
*/
|
2015-10-01 13:48:52 +00:00
|
|
|
public function testGetUserLocators( $message, $expect, $type, $notifications ) {
|
2014-07-29 23:54:00 +00:00
|
|
|
$manager = new EchoAttributeManager( $notifications, array() );
|
|
|
|
|
Allow certain users to be excluded
Right now, if certain users should be excluded, that would have
to be part of the user-locators already. This is annoying because
it's hard to write "generic" user locators when you want to exclude
just a couple of people in certain cases.
In Flow, for example, we have user-locators for users watching a
board or topic. We don't want to send the notification to people
that have also been mentioned in that post (they'll get a separate
notification). We could build that exception into those
user-locators, but then we couldn't re-use them in other places...
This basically means we couldn't use EchoUserLocator::locateUsersWatchingTitle,
we would have to roll our own that also excludes mentioned users.
Instead, this lets you add 'user-filters' (that functionality
actually exists already, but is not currently exposed), which
lists users to not send the notification to, even though they could
be in a user-locator.
Bug: T125428
Change-Id: Ifa0e2d3283f57624af4c5ec264f9f66223508e83
2016-02-02 13:16:39 +00:00
|
|
|
$result = $manager->getUserCallable( $type, EchoAttributeManager::ATTR_LOCATORS );
|
2014-07-29 23:54:00 +00:00
|
|
|
$this->assertEquals( $expect, $result, $message );
|
|
|
|
}
|
|
|
|
|
2014-07-22 21:33:22 +00:00
|
|
|
public function testGetCategoryEligibility() {
|
|
|
|
$notif = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_one' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'category' => 'category_one'
|
|
|
|
),
|
|
|
|
);
|
|
|
|
$category = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_one' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'priority' => 10
|
|
|
|
)
|
|
|
|
);
|
|
|
|
$manager = new EchoAttributeManager( $notif, $category );
|
|
|
|
$this->assertTrue( $manager->getCategoryEligibility( $this->mockUser(), 'category_one' ) );
|
|
|
|
$category = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_one' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'priority' => 10,
|
|
|
|
'usergroups' => array(
|
|
|
|
'sysop'
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
$manager = new EchoAttributeManager( $notif, $category );
|
|
|
|
$this->assertFalse( $manager->getCategoryEligibility( $this->mockUser(), 'category_one' ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testGetNotificationCategory() {
|
|
|
|
$notif = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_one' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'category' => 'category_one'
|
|
|
|
),
|
|
|
|
);
|
|
|
|
$category = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_one' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'priority' => 10
|
|
|
|
)
|
|
|
|
);
|
|
|
|
$manager = new EchoAttributeManager( $notif, $category );
|
|
|
|
$this->assertEquals( $manager->getNotificationCategory( 'event_one' ), 'category_one' );
|
|
|
|
|
|
|
|
$manager = new EchoAttributeManager( $notif, array() );
|
|
|
|
$this->assertEquals( $manager->getNotificationCategory( 'event_one' ), 'other' );
|
|
|
|
|
|
|
|
$notif = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_one' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'category' => 'category_two'
|
|
|
|
),
|
|
|
|
);
|
|
|
|
$category = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_one' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'priority' => 10
|
|
|
|
)
|
|
|
|
);
|
|
|
|
$manager = new EchoAttributeManager( $notif, $category );
|
|
|
|
$this->assertEquals( $manager->getNotificationCategory( 'event_one' ), 'other' );
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testGetCategoryPriority() {
|
|
|
|
$notif = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_one' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'category' => 'category_two'
|
|
|
|
),
|
|
|
|
);
|
|
|
|
$category = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_one' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'priority' => 6
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_two' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'priority' => 100
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_three' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'priority' => -10
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_four' => array()
|
2014-07-22 21:33:22 +00:00
|
|
|
);
|
|
|
|
$manager = new EchoAttributeManager( $notif, $category );
|
|
|
|
$this->assertEquals( 6, $manager->getCategoryPriority( 'category_one' ) );
|
|
|
|
$this->assertEquals( 10, $manager->getCategoryPriority( 'category_two' ) );
|
|
|
|
$this->assertEquals( 10, $manager->getCategoryPriority( 'category_three' ) );
|
|
|
|
$this->assertEquals( 10, $manager->getCategoryPriority( 'category_four' ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testGetNotificationPriority() {
|
|
|
|
$notif = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_one' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'category' => 'category_one'
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_two' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'category' => 'category_two'
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_three' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'category' => 'category_three'
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_four' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'category' => 'category_four'
|
|
|
|
)
|
|
|
|
);
|
|
|
|
$category = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_one' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'priority' => 6
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_two' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'priority' => 100
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_three' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'priority' => -10
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_four' => array()
|
2014-07-22 21:33:22 +00:00
|
|
|
);
|
|
|
|
$manager = new EchoAttributeManager( $notif, $category );
|
|
|
|
$this->assertEquals( 6, $manager->getNotificationPriority( 'event_one' ) );
|
|
|
|
$this->assertEquals( 10, $manager->getNotificationPriority( 'event_two' ) );
|
|
|
|
$this->assertEquals( 10, $manager->getNotificationPriority( 'event_three' ) );
|
|
|
|
$this->assertEquals( 10, $manager->getNotificationPriority( 'event_four' ) );
|
|
|
|
}
|
|
|
|
|
2014-08-05 21:50:54 +00:00
|
|
|
public function testGetMessageEvents() {
|
|
|
|
$notif = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_one' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'category' => 'category_one',
|
|
|
|
'section' => 'message'
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_two' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'category' => 'category_two'
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_three' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'category' => 'category_three',
|
|
|
|
'section' => 'message'
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_four' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'category' => 'category_four'
|
|
|
|
)
|
|
|
|
);
|
|
|
|
$category = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_one' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'priority' => 6
|
|
|
|
)
|
|
|
|
);
|
|
|
|
$manager = new EchoAttributeManager( $notif, $category );
|
|
|
|
$this->assertEquals( $manager->getMessageEvents(), array( 'event_one', 'event_three' ) );
|
|
|
|
}
|
|
|
|
|
|
|
|
public function testGetAlertEvents() {
|
|
|
|
$notif = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_one' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'category' => 'category_one',
|
|
|
|
'section' => 'message'
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_two' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'category' => 'category_two'
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_three' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'category' => 'category_three',
|
|
|
|
'section' => 'alert'
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_four' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'category' => 'category_four'
|
|
|
|
)
|
|
|
|
);
|
|
|
|
$category = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_one' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'priority' => 6
|
|
|
|
)
|
|
|
|
);
|
|
|
|
$manager = new EchoAttributeManager( $notif, $category );
|
|
|
|
$this->assertEquals( $manager->getAlertEvents(), array( 'event_two', 'event_three', 'event_four' ) );
|
|
|
|
}
|
|
|
|
|
2014-07-22 21:33:22 +00:00
|
|
|
public function testGetUserEnabledEvents() {
|
|
|
|
$notif = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_one' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'category' => 'category_one'
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_two' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'category' => 'category_two'
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_three' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'category' => 'category_three'
|
|
|
|
),
|
|
|
|
);
|
|
|
|
$category = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_one' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'priority' => 10,
|
|
|
|
'usergroups' => array(
|
|
|
|
'sysop'
|
|
|
|
)
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_two' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'priority' => 10,
|
|
|
|
'usergroups' => array(
|
|
|
|
'echo_group'
|
|
|
|
)
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_three' => array(
|
2014-07-22 21:33:22 +00:00
|
|
|
'priority' => 10,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
$manager = new EchoAttributeManager( $notif, $category );
|
|
|
|
$this->assertEquals( $manager->getUserEnabledEvents( $this->mockUser(), 'web' ), array( 'event_two', 'event_three' ) );
|
|
|
|
}
|
|
|
|
|
2014-08-05 21:50:54 +00:00
|
|
|
public function testGetUserEnabledEventsbySections() {
|
|
|
|
$notif = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_one' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'category' => 'category_one'
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_two' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'category' => 'category_two',
|
|
|
|
'section' => 'message'
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_three' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'category' => 'category_three',
|
|
|
|
'section' => 'alert'
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'event_four' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'category' => 'category_three',
|
|
|
|
),
|
|
|
|
);
|
|
|
|
$category = array(
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_one' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'priority' => 10,
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_two' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'priority' => 10,
|
|
|
|
),
|
2015-10-01 13:48:52 +00:00
|
|
|
'category_three' => array(
|
2014-08-05 21:50:54 +00:00
|
|
|
'priority' => 10
|
|
|
|
),
|
|
|
|
);
|
|
|
|
$manager = new EchoAttributeManager( $notif, $category );
|
|
|
|
$expected = array( 'event_one', 'event_three', 'event_four' );
|
|
|
|
$actual = $manager->getUserEnabledEventsBySections( $this->mockUser(), 'web', array( 'alert' ) );
|
|
|
|
sort( $expected );
|
|
|
|
sort( $actual );
|
|
|
|
$this->assertEquals( $actual, $expected );
|
|
|
|
|
|
|
|
$expected = array( 'event_two' );
|
|
|
|
$actual = $manager->getUserEnabledEventsBySections( $this->mockUser(), 'web', array( 'message' ) );
|
|
|
|
sort( $expected );
|
|
|
|
sort( $actual );
|
|
|
|
$this->assertEquals( $actual, $expected );
|
|
|
|
|
|
|
|
$expected = array( 'event_one', 'event_two', 'event_three', 'event_four' );
|
|
|
|
$actual = $manager->getUserEnabledEventsBySections( $this->mockUser(), 'web', array( 'message', 'alert' ) );
|
|
|
|
sort( $expected );
|
|
|
|
sort( $actual );
|
|
|
|
$this->assertEquals( $actual, $expected );
|
|
|
|
}
|
|
|
|
|
2014-07-22 21:33:22 +00:00
|
|
|
/**
|
|
|
|
* Mock object of User
|
|
|
|
*/
|
|
|
|
protected function mockUser() {
|
|
|
|
$user = $this->getMockBuilder( 'User' )
|
|
|
|
->disableOriginalConstructor()
|
|
|
|
->getMock();
|
|
|
|
$user->expects( $this->any() )
|
|
|
|
->method( 'getID' )
|
|
|
|
->will( $this->returnValue( 1 ) );
|
|
|
|
$user->expects( $this->any() )
|
|
|
|
->method( 'getOption' )
|
|
|
|
->will( $this->returnValue( true ) );
|
|
|
|
$user->expects( $this->any() )
|
|
|
|
->method( 'getGroups' )
|
|
|
|
->will( $this->returnValue( array( 'echo_group' ) ) );
|
2015-10-01 13:48:52 +00:00
|
|
|
|
2014-07-22 21:33:22 +00:00
|
|
|
return $user;
|
|
|
|
}
|
|
|
|
}
|