mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Echo
synced 2024-12-04 04:09:00 +00:00
a7fbb53584
* This will be used for the unread notifications in message overlay * This will be used to "mark all as read" based on sections ( event types ), since we can't do updateJoin. We could set a max update limit like 3000, and use this to do "mark all as read", this would handle majority "mark all as read" use cases. This would also prevent updating big amount of data on a web request Change-Id: I2a9103a73d0aa91a52d5c0233e946a0ef979f96d
207 lines
6.7 KiB
PHP
207 lines
6.7 KiB
PHP
<?php
|
|
|
|
class EchoNotificationMapperTest extends MediaWikiTestCase {
|
|
|
|
/**
|
|
* @todo write this test
|
|
*/
|
|
public function testInsert() {
|
|
$this->assertTrue( true );
|
|
}
|
|
|
|
public function fetchUnreadByUser( User $user, $limit, array $eventTypes = array() ) {
|
|
// Unsuccessful select
|
|
$notifMapper = new EchoNotificationMapper( $this->mockMWEchoDbFactory( array ( 'select' => false ) ) );
|
|
$res = $notifMapper->fetchUnreadByUser( $this->mockUser(), 10, '' );
|
|
$this->assertEmpty( $res );
|
|
|
|
// Successful select
|
|
$dbResult = array(
|
|
(object)array (
|
|
'event_id' => 1,
|
|
'event_type' => 'test_event',
|
|
'event_variant' => '',
|
|
'event_extra' => '',
|
|
'event_page_id' => '',
|
|
'event_agent_id' => '',
|
|
'event_agent_ip' => '',
|
|
'notification_user' => 1,
|
|
'notification_timestamp' => '20140615101010',
|
|
'notification_read_timestamp' => '',
|
|
'notification_bundle_base' => 1,
|
|
'notification_bundle_hash' => 'testhash',
|
|
'notification_bundle_display_hash' => 'testdisplayhash'
|
|
)
|
|
);
|
|
$notifMapper = new EchoNotificationMapper( $this->mockMWEchoDbFactory( array ( 'select' => $dbResult ) ) );
|
|
$res = $notifMapper->fetchUnreadByUser( $this->mockUser(), 10, '', array() );
|
|
$this->assertEmpty( $res );
|
|
|
|
$notifMapper = new EchoNotificationMapper( $this->mockMWEchoDbFactory( array ( 'select' => $dbResult ) ) );
|
|
$res = $notifMapper->fetchUnreadByUser( $this->mockUser(), 10, '', array( 'test_event' ) );
|
|
$this->assertTrue( is_array( $res ) );
|
|
$this->assertGreaterThan( 0, count( $res ) );
|
|
foreach ( $res as $row ) {
|
|
$this->assertInstanceOf( 'EchoNotification', $row );
|
|
}
|
|
}
|
|
|
|
public function testFetchByUser() {
|
|
// Unsuccessful select
|
|
$notifMapper = new EchoNotificationMapper( $this->mockMWEchoDbFactory( array ( 'select' => false ) ) );
|
|
$res = $notifMapper->fetchByUser( $this->mockUser(), 10, '' );
|
|
$this->assertEmpty( $res );
|
|
|
|
// Successful select
|
|
$dbResult = array(
|
|
(object)array (
|
|
'event_id' => 1,
|
|
'event_type' => 'test_event',
|
|
'event_variant' => '',
|
|
'event_extra' => '',
|
|
'event_page_id' => '',
|
|
'event_agent_id' => '',
|
|
'event_agent_ip' => '',
|
|
'notification_user' => 1,
|
|
'notification_timestamp' => '20140615101010',
|
|
'notification_read_timestamp' => '20140616101010',
|
|
'notification_bundle_base' => 1,
|
|
'notification_bundle_hash' => 'testhash',
|
|
'notification_bundle_display_hash' => 'testdisplayhash'
|
|
)
|
|
);
|
|
$notifMapper = new EchoNotificationMapper( $this->mockMWEchoDbFactory( array ( 'select' => $dbResult ) ) );
|
|
$res = $notifMapper->fetchByUser( $this->mockUser(), 10, '', array() );
|
|
$this->assertEmpty( $res );
|
|
|
|
$notifMapper = new EchoNotificationMapper( $this->mockMWEchoDbFactory( array ( 'select' => $dbResult ) ) );
|
|
$res = $notifMapper->fetchByUser( $this->mockUser(), 10, '', array( 'test_event' ) );
|
|
$this->assertTrue( is_array( $res ) );
|
|
$this->assertGreaterThan( 0, count( $res ) );
|
|
foreach ( $res as $row ) {
|
|
$this->assertInstanceOf( 'EchoNotification', $row );
|
|
}
|
|
|
|
$notifMapper = new EchoNotificationMapper( $this->mockMWEchoDbFactory( array() ) );
|
|
$res = $notifMapper->fetchByUser( $this->mockUser(), 10, '' );
|
|
$this->assertEmpty( $res );
|
|
}
|
|
|
|
public function testFetchNewestByUserBundleHash() {
|
|
// Unsuccessful select
|
|
$notifMapper = new EchoNotificationMapper( $this->mockMWEchoDbFactory( array ( 'selectRow' => false ) ) );
|
|
$res = $notifMapper->fetchNewestByUserBundleHash( User::newFromId( 1 ), 'testhash' );
|
|
$this->assertFalse( $res );
|
|
|
|
// Successful select
|
|
$dbResult = (object)array (
|
|
'event_id' => 1,
|
|
'event_type' => 'test',
|
|
'event_variant' => '',
|
|
'event_extra' => '',
|
|
'event_page_id' => '',
|
|
'event_agent_id' => '',
|
|
'event_agent_ip' => '',
|
|
'notification_user' => 1,
|
|
'notification_timestamp' => '20140615101010',
|
|
'notification_read_timestamp' => '20140616101010',
|
|
'notification_bundle_base' => 1,
|
|
'notification_bundle_hash' => 'testhash',
|
|
'notification_bundle_display_hash' => 'testdisplayhash'
|
|
);
|
|
$notifMapper = new EchoNotificationMapper( $this->mockMWEchoDbFactory( array ( 'selectRow' => $dbResult ) ) );
|
|
$row = $notifMapper->fetchNewestByUserBundleHash( User::newFromId( 1 ), 'testdisplayhash' );
|
|
$this->assertInstanceOf( 'EchoNotification', $row );
|
|
}
|
|
|
|
/**
|
|
* 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' ) ) );
|
|
return $user;
|
|
}
|
|
|
|
/**
|
|
* Mock object of EchoNotification
|
|
*/
|
|
protected function mockEchoNotification() {
|
|
$event = $this->getMockBuilder( 'EchoNotification' )
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
$event->expects( $this->any() )
|
|
->method( 'toDbArray' )
|
|
->will( $this->returnValue( array() ) );
|
|
return $event;
|
|
}
|
|
|
|
/**
|
|
* Mock object of MWEchoDbFactory
|
|
*/
|
|
protected function mockMWEchoDbFactory( $dbResult ) {
|
|
$dbFactory = $this->getMockBuilder( 'MWEchoDbFactory' )
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
$dbFactory->expects( $this->any() )
|
|
->method( 'getEchoDb' )
|
|
->will( $this->returnValue( $this->mockDb( $dbResult ) ) );
|
|
return $dbFactory;
|
|
}
|
|
|
|
/**
|
|
* Mock object of DatabaseMysql ( DatabaseBase )
|
|
*/
|
|
protected function mockDb( array $dbResult ) {
|
|
$dbResult += array(
|
|
'insert' => '',
|
|
'select' => '',
|
|
'selectRow' => ''
|
|
);
|
|
$db = $this->getMockBuilder( 'DatabaseMysql' )
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
$db->expects( $this->any() )
|
|
->method( 'insert' )
|
|
->will( $this->returnValue( $dbResult['insert'] ) );
|
|
$db->expects( $this->any() )
|
|
->method( 'select' )
|
|
->will( $this->returnValue( $dbResult['select'] ) );
|
|
$db->expects( $this->any() )
|
|
->method( 'selectRow' )
|
|
->will( $this->returnValue( $dbResult['selectRow'] ) );
|
|
$db->expects ( $this->any() )
|
|
->method( 'onTransactionIdle' )
|
|
->will( new EchoExecuteFirstArgumentStub );
|
|
|
|
return $db;
|
|
}
|
|
|
|
}
|
|
|
|
class EchoExecuteFirstArgumentStub implements PHPUnit_Framework_MockObject_Stub {
|
|
public function invoke( PHPUnit_Framework_MockObject_Invocation $invocation ) {
|
|
if ( !$invocation instanceof PHPUnit_Framework_MockObject_Invocation_Static ) {
|
|
throw new PHPUnit_Framework_Exception( 'wrong invocation type' );
|
|
}
|
|
if ( !$invocation->arguments ) {
|
|
throw new PHPUnit_Framework_Exception( 'Method call must have an argument' );
|
|
}
|
|
return call_user_func( reset( $invocation->arguments ) );
|
|
}
|
|
|
|
public function toString() {
|
|
return 'return result of call_user_func on first invocation argument';
|
|
}
|
|
}
|