mediawiki-extensions-Echo/tests/UserLocatorTest.php
Erik Bernhardson 74a56e6fc4 Convert existing notifications to use user-locators
Replace implementation specific code with generalized user-locator
implementations that can be re-used by more notifications in other
extensions.

This patch adjusts the `user-locators` notification parameter to allow
arrays which facilitate passing options to the locator.

Previously(still works):

    'user-locators' => array( 'foo', 'bar' ),

New functionality:

    'user-locators' => array(
	'foo',
	array( 'bar', 42 )
    )

In the second example the callback specified by `bar` will receive
an EchoEvent as the first argument and array( 42 ) as its second
argument.

Change-Id: I7305279bc91d1e40e7054e2fd42a819a35526b82
2014-08-04 11:16:34 -07:00

242 lines
5.6 KiB
PHP

<?php
/**
* @Database
*/
class EchoUserLocatorTest extends MediaWikiTestCase {
protected $tablesUsed = array( 'user' );
public function locateTalkPageOwnerProvider() {
return array(
array(
'Allows null event title',
// expected user id's
array(),
// event title
null
),
array(
'No users selected for non-user talk namespace',
// expected user id's
array(),
// event title
Title::newMainPage(),
),
array(
'Selects user from NS_USER_TALK',
// callback returning expected user ids and event title.
// required because database insert must be inside test.
function() {
$user = User::newFromName( 'UTUser' );
$user->addToDatabase();
return array(
array( $user->getId() ),
$user->getTalkPage(),
);
}
),
);
}
/**
* @dataProvider locateTalkPageOwnerProvider
*/
public function testLocateTalkPageOwner( $message, $expect, Title $title = null ) {
if ( $expect instanceof Closure ) {
list( $expect, $title ) = $expect();
}
$event = $this->mockEchoEvent();
$event->expects( $this->any() )
->method( 'getTitle' )
->will( $this->returnValue( $title ) );
$users = EchoUserLocator::locateTalkPageOwner( $event );
$this->assertEquals( $expect, array_keys( $users ), $message );
}
public function locateArticleCreatorProvider() {
return array(
array(
'Something',
function() {
$user = User::newFromName( 'UTUser' );
$user->addToDatabase();
return array(
array( $user->getId() ),
$user->getTalkPage(),
$user
);
}
),
);
}
/**
* @dataProvider locateArticleCreatorProvider
*/
public function testLocateArticleCreator( $message, $initialize ) {
list( $expect, $title, $user ) = $initialize();
WikiPage::factory( $title )->doEditContent(
/* $content = */ ContentHandler::makeContent( 'content', $title ),
/* $summary = */ 'summary',
/* $flags = */ 0,
/* $baseRevId = */ false,
/* $user = */ $user
);
$event = $this->mockEchoEvent();
$event->expects( $this->any() )
->method( 'getTitle' )
->will( $this->returnValue( $title ) );
$event->expects( $this->any() )
->method( 'getAgent' )
->will( $this->returnValue( User::newFromId( 123 ) ) );
$users = EchoUserLocator::locateArticleCreator( $event );
$this->assertEquals( $expect, array_keys( $users ), $message );
}
public static function locateEventAgentProvider() {
return array(
array(
'Null event agent returns no users',
// expected result user id's
array(),
// event agent
null,
),
array(
'Anonymous event agent returns no users',
// expected result user id's
array(),
// event agent
User::newFromName( '4.5.6.7', /* $validate = */ false ),
),
array(
'Registed event agent returned as user',
// expected result user id's
array( 42 ),
// event agent
User::newFromId( 42 ),
),
);
}
/**
* @dataProvider locateEventAgentProvider
*/
public function testLocateEventAgent( $message, $expect, User $agent = null ) {
$event = $this->mockEchoEvent();
$event->expects( $this->any() )
->method( 'getAgent' )
->will( $this->returnValue( $agent ) );
$users = EchoUserLocator::locateEventAgent( $event );
$this->assertEquals( $expect, array_keys( $users ), $message );
}
public function locateFromEventExtraProvider() {
return array(
array(
'Event without extra data returns empty result',
// expected user list
array(),
// event extra data
array(),
// extra keys to get ids from
array( 'foo' ),
),
array(
'Event with specified extra data returns expected result',
// expected user list
array( 123 ),
// event extra data
array( 'foo' => 123 ),
// extra keys to get ids from
array( 'foo' ),
),
array(
'Accepts User objects instead of user ids',
// expected user list
array( 123 ),
// event extra data
array( 'foo' => User::newFromId( 123 ) ),
// extra keys to get ids from
array( 'foo' ),
),
array(
'Allows inner key to be array of ids',
// expected user list
array( 123, 321 ),
// event extra data
array( 'foo' => array( 123, 321 ) ),
// extra keys to get ids from
array( 'foo' ),
),
array(
'Empty inner array causes no error',
// expected user list
array(),
// event extra data
array( 'foo' => array() ),
// extra keys to get ids from
array( 'foo' ),
),
array(
'Accepts User object at inner level',
// expected user list
array( 123 ),
// event extra data
array( 'foo' => array( User::newFromId( 123 ) ) ),
// extra keys to get ids from
array( 'foo' ),
),
);
}
/**
* @dataProvider locateFromEventExtraProvider
*/
public function testLocateFromEventExtra( $message, $expect, array $extra, array $keys ) {
$event = $this->mockEchoEvent();
$event->expects( $this->any() )
->method( 'getExtra' )
->will( $this->returnValue( $extra ) );
$event->expects( $this->any() )
->method( 'getExtraParam' )
->will( $this->returnValueMap( self::arrayToValueMap( $extra ) ) );
$users = EchoUserLocator::locateFromEventExtra( $event, $keys );
$this->assertEquals( $expect, array_keys( $users ), $message );
}
protected static function arrayToValueMap( array $array ) {
$result = array();
foreach ( $array as $key => $value ) {
// EchoEvent::getExtraParam second argument defaults to null
$result[] = array( $key, null, $value );
}
return $result;
}
protected function mockEchoEvent() {
return $this->getMockBuilder( 'EchoEvent' )
->disableOriginalConstructor()
->getMock();
}
}