diff options
Diffstat (limited to 'Echo/tests/phpunit/includes/UserLocatorTest.php')
-rw-r--r-- | Echo/tests/phpunit/includes/UserLocatorTest.php | 270 |
1 files changed, 270 insertions, 0 deletions
diff --git a/Echo/tests/phpunit/includes/UserLocatorTest.php b/Echo/tests/phpunit/includes/UserLocatorTest.php new file mode 100644 index 00000000..47d86edd --- /dev/null +++ b/Echo/tests/phpunit/includes/UserLocatorTest.php @@ -0,0 +1,270 @@ +<?php + +/** + * @Database + */ +class EchoUserLocatorTest extends MediaWikiTestCase { + + protected $tablesUsed = array( 'user', 'watchlist' ); + + public function testLocateUsersWatchingTitle() { + $title = Title::makeTitleSafe( NS_USER_TALK, 'Something_something_something' ); + $key = $title->getDBkey(); + + for ( $i = 1000; $i < 1050; ++$i ) { + $rows[] = array( + 'wl_user' => $i, + 'wl_namespace' => NS_USER_TALK, + 'wl_title' => $key + ); + } + wfGetDB( DB_MASTER )->insert( 'watchlist', $rows, __METHOD__ ); + + $event = $this->getMockBuilder( 'EchoEvent' ) + ->disableOriginalConstructor() + ->getMock(); + $event->expects( $this->any() ) + ->method( 'getTitle' ) + ->will( $this->returnValue( $title ) ); + + $it = EchoUserLocator::locateUsersWatchingTitle( $event, 10 ); + $count = 0; + foreach ( $it as $user ) { + ++$count; + } + $this->assertEquals( 50, $count ); + // @todo assert more than one query was issued + } + + 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(); + } +} |