mirror of
https://gerrit.wikimedia.org/r/mediawiki/extensions/Echo
synced 2024-12-04 12:18:30 +00:00
06f0a7a6d5
This cache was only used so that, if we're told to clear the newtalk flag and we already know there are no edit-user-talk notifications, we won't try to delete them. But that's not a good justification for such a confusingly-written cache that would have been hard to convert to getWithSetCallback(), and I'm concerned that using cached data to make this decision could lead to inconsistencies. Also remove the notifCountHasReachedMax() check, which made no sense: if the user has >99 notifications, that is no justification for not marking their user talk notifications as read when they visit their user talk page. Whether the displayed notification count will change has no bearing on whether these notifications should be marked as read (and now that bundled notifications are counted individually, the displayed count actually could change). Bug: T164860 Change-Id: I3ff5c9b31307839b9336bd8856015db9baa52fad
180 lines
5.1 KiB
PHP
180 lines
5.1 KiB
PHP
<?php
|
|
use MediaWiki\MediaWikiServices;
|
|
|
|
/**
|
|
* @covers MWEchoNotifUser
|
|
* @group Echo
|
|
*/
|
|
class MWEchoNotifUserTest extends MediaWikiTestCase {
|
|
|
|
/**
|
|
* @var WANObjectCache
|
|
*/
|
|
private $cache;
|
|
|
|
protected function setUp() {
|
|
parent::setUp();
|
|
$this->cache = new WANObjectCache( [
|
|
'cache' => MediaWikiServices::getInstance()->getMainObjectStash(),
|
|
] );
|
|
}
|
|
|
|
public function testNewFromUser() {
|
|
$exception = false;
|
|
try {
|
|
MWEchoNotifUser::newFromUser( User::newFromId( 0 ) );
|
|
} catch ( Exception $e ) {
|
|
$exception = true;
|
|
$this->assertEquals( "User must be logged in to view notification!",
|
|
$e->getMessage() );
|
|
}
|
|
$this->assertTrue( $exception, "Got exception" );
|
|
|
|
$notifUser = MWEchoNotifUser::newFromUser( User::newFromId( 2 ) );
|
|
$this->assertInstanceOf( 'MWEchoNotifUser', $notifUser );
|
|
}
|
|
|
|
public function testGetEmailFormat() {
|
|
$user = User::newFromId( 2 );
|
|
$notifUser = MWEchoNotifUser::newFromUser( $user );
|
|
|
|
$this->setMwGlobals( 'wgAllowHTMLEmail', true );
|
|
$this->assertEquals( $notifUser->getEmailFormat(), $user->getOption( 'echo-email-format' ) );
|
|
$this->setMwGlobals( 'wgAllowHTMLEmail', false );
|
|
$this->assertEquals( $notifUser->getEmailFormat(), EchoEmailFormat::PLAIN_TEXT );
|
|
}
|
|
|
|
public function testMarkRead() {
|
|
$notifUser = new MWEchoNotifUser(
|
|
User::newFromId( 2 ),
|
|
$this->cache,
|
|
$this->mockEchoUserNotificationGateway( [ 'markRead' => true ] ),
|
|
$this->mockEchoNotificationMapper(),
|
|
$this->mockEchoTargetPageMapper()
|
|
);
|
|
$this->assertFalse( $notifUser->markRead( [] ) );
|
|
$this->assertTrue( $notifUser->markRead( [ 1 ] ) );
|
|
|
|
$notifUser = new MWEchoNotifUser(
|
|
User::newFromId( 2 ),
|
|
$this->cache,
|
|
$this->mockEchoUserNotificationGateway( [ 'markRead' => false ] ),
|
|
$this->mockEchoNotificationMapper(),
|
|
$this->mockEchoTargetPageMapper()
|
|
);
|
|
$this->assertFalse( $notifUser->markRead( [] ) );
|
|
$this->assertFalse( $notifUser->markRead( [ 1 ] ) );
|
|
}
|
|
|
|
public function testMarkAllRead() {
|
|
// Successful mark as read & non empty fetch
|
|
$notifUser = new MWEchoNotifUser(
|
|
User::newFromId( 2 ),
|
|
$this->cache,
|
|
$this->mockEchoUserNotificationGateway( [ 'markRead' => true ] ),
|
|
$this->mockEchoNotificationMapper( [ $this->mockEchoNotification() ] ),
|
|
$this->mockEchoTargetPageMapper()
|
|
);
|
|
$this->assertTrue( $notifUser->markAllRead() );
|
|
|
|
// Unsuccessful mark as read & non empty fetch
|
|
$notifUser = new MWEchoNotifUser(
|
|
User::newFromId( 2 ),
|
|
$this->cache,
|
|
$this->mockEchoUserNotificationGateway( [ 'markRead' => false ] ),
|
|
$this->mockEchoNotificationMapper( [ $this->mockEchoNotification() ] ),
|
|
$this->mockEchoTargetPageMapper()
|
|
);
|
|
$this->assertFalse( $notifUser->markAllRead() );
|
|
|
|
// Successful mark as read & empty fetch
|
|
$notifUser = new MWEchoNotifUser(
|
|
User::newFromId( 2 ),
|
|
$this->cache,
|
|
$this->mockEchoUserNotificationGateway( [ 'markRead' => true ] ),
|
|
$this->mockEchoNotificationMapper(),
|
|
$this->mockEchoTargetPageMapper()
|
|
);
|
|
$this->assertFalse( $notifUser->markAllRead() );
|
|
|
|
// Unsuccessful mark as read & empty fetch
|
|
$notifUser = new MWEchoNotifUser(
|
|
User::newFromId( 2 ),
|
|
$this->cache,
|
|
$this->mockEchoUserNotificationGateway( [ 'markRead' => false ] ),
|
|
$this->mockEchoNotificationMapper(),
|
|
$this->mockEchoTargetPageMapper()
|
|
);
|
|
$this->assertFalse( $notifUser->markAllRead() );
|
|
}
|
|
|
|
public function mockEchoUserNotificationGateway( array $dbResult = [] ) {
|
|
$dbResult += [
|
|
'markRead' => true
|
|
];
|
|
$gateway = $this->getMockBuilder( 'EchoUserNotificationGateway' )
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
$gateway->expects( $this->any() )
|
|
->method( 'markRead' )
|
|
->will( $this->returnValue( $dbResult['markRead'] ) );
|
|
$gateway->expects( $this->any() )
|
|
->method( 'getDB' )
|
|
->will( $this->returnValue(
|
|
$this->getMockBuilder( Database::class )
|
|
->disableOriginalConstructor()->getMock()
|
|
) );
|
|
|
|
return $gateway;
|
|
}
|
|
|
|
public function mockEchoNotificationMapper( array $result = [] ) {
|
|
$mapper = $this->getMockBuilder( 'EchoNotificationMapper' )
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
$mapper->expects( $this->any() )
|
|
->method( 'fetchUnreadByUser' )
|
|
->will( $this->returnValue( $result ) );
|
|
|
|
return $mapper;
|
|
}
|
|
|
|
public function mockEchoTargetPageMapper() {
|
|
return $this->getMockBuilder( EchoTargetPageMapper::class )
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
}
|
|
|
|
protected function mockEchoNotification() {
|
|
$notification = $this->getMockBuilder( 'EchoNotification' )
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
$notification->expects( $this->any() )
|
|
->method( 'getEvent' )
|
|
->will( $this->returnValue( $this->mockEchoEvent() ) );
|
|
|
|
return $notification;
|
|
}
|
|
|
|
protected function mockEchoEvent() {
|
|
$event = $this->getMockBuilder( 'EchoEvent' )
|
|
->disableOriginalConstructor()
|
|
->getMock();
|
|
$event->expects( $this->any() )
|
|
->method( 'getId' )
|
|
->will( $this->returnValue( 1 ) );
|
|
|
|
return $event;
|
|
}
|
|
|
|
protected function newNotifUser() {
|
|
return new MWEchoNotifUser(
|
|
User::newFromId( 2 ),
|
|
$this->cache,
|
|
$this->mockEchoUserNotificationGateway(),
|
|
$this->mockEchoNotificationMapper(),
|
|
$this->mockEchoTargetPageMapper()
|
|
);
|
|
}
|
|
}
|