WatchedItemStore::setNotificationTimestampsForUser(): Allow clearing timestamp

ApiSetNotificationTimestamp expects to be able to clear the timestamp by
passing null. Allow that to work as expected.

Bug: T153482
Change-Id: Ibf4ba56f0abd3b72283f7a33e4665d5999a70b82
This commit is contained in:
Brad Jorsch 2016-12-16 14:31:24 -05:00
parent bf3a60743d
commit 05ca28bba0
2 changed files with 35 additions and 2 deletions

View file

@ -668,7 +668,7 @@ class WatchedItemStore implements StatsdAwareInterface {
/**
* @param User $user The user to set the timestamp for
* @param string $timestamp Set the update timestamp to this value
* @param string|null $timestamp Set the update timestamp to this value
* @param LinkTarget[] $targets List of targets to update. Default to all targets
*
* @return bool success
@ -687,9 +687,13 @@ class WatchedItemStore implements StatsdAwareInterface {
$conds[] = $batch->constructSet( 'wl', $dbw );
}
if ( $timestamp !== null ) {
$timestamp = $dbw->timestamp( $timestamp );
}
$success = $dbw->update(
'watchlist',
[ 'wl_notificationtimestamp' => $dbw->timestamp( $timestamp ) ],
[ 'wl_notificationtimestamp' => $timestamp ],
$conds,
__METHOD__
);

View file

@ -2404,6 +2404,35 @@ class WatchedItemStoreUnitTest extends MediaWikiTestCase {
);
}
public function testSetNotificationTimestampsForUser_nullTimestamp() {
$user = $this->getMockNonAnonUserWithId( 1 );
$timestamp = null;
$mockDb = $this->getMockDb();
$mockDb->expects( $this->once() )
->method( 'update' )
->with(
'watchlist',
[ 'wl_notificationtimestamp' => null ],
[ 'wl_user' => 1 ]
)
->will( $this->returnValue( true ) );
$mockDb->expects( $this->exactly( 0 ) )
->method( 'timestamp' )
->will( $this->returnCallback( function( $value ) {
return 'TS' . $value . 'TS';
} ) );
$store = $this->newWatchedItemStore(
$this->getMockLoadBalancer( $mockDb ),
$this->getMockCache()
);
$this->assertTrue(
$store->setNotificationTimestampsForUser( $user, $timestamp )
);
}
public function testSetNotificationTimestampsForUser_specificTargets() {
$user = $this->getMockNonAnonUserWithId( 1 );
$timestamp = '20100101010101';