* This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
*
* @param callable $callback
+ *
* @see DeferredUpdates::addCallableUpdate for callback signiture
*
+ * @return ScopedCallback to reset the overridden value
* @throws MWException
*/
public function overrideDeferredUpdatesAddCallableUpdateCallback( $callback ) {
);
}
Assert::parameterType( 'callable', $callback, '$callback' );
+
+ $previousValue = $this->deferredUpdatesAddCallableUpdateCallback;
$this->deferredUpdatesAddCallableUpdateCallback = $callback;
+ return new ScopedCallback( function() use ( $previousValue ) {
+ $this->deferredUpdatesAddCallableUpdateCallback = $previousValue;
+ } );
}
/**
* @param callable $callback
* @see Revision::getTimestampFromId for callback signiture
*
+ * @return ScopedCallback to reset the overridden value
* @throws MWException
*/
public function overrideRevisionGetTimestampFromIdCallback( $callback ) {
);
}
Assert::parameterType( 'callable', $callback, '$callback' );
+
+ $previousValue = $this->revisionGetTimestampFromIdCallback;
$this->revisionGetTimestampFromIdCallback = $callback;
+ return new ScopedCallback( function() use ( $previousValue ) {
+ $this->revisionGetTimestampFromIdCallback = $previousValue;
+ } );
}
/**
* Overrides the default instance of this class
* This is intended for use while testing and will fail if MW_PHPUNIT_TEST is not defined.
*
- * @param WatchedItemStore $store
+ * If this method is used it MUST also be called with null after a test to ensure a new
+ * default instance is created next time getDefaultInstance is called.
*
+ * @param WatchedItemStore|null $store
+ *
+ * @return ScopedCallback to reset the overridden value
* @throws MWException
*/
- public static function overrideDefaultInstance( WatchedItemStore $store ) {
+ public static function overrideDefaultInstance( WatchedItemStore $store = null ) {
if ( !defined( 'MW_PHPUNIT_TEST' ) ) {
throw new MWException(
'Cannot override ' . __CLASS__ . 'default instance in operation.'
);
}
+
+ $previousValue = self::$instance;
self::$instance = $store;
+ return new ScopedCallback( function() use ( $previousValue ) {
+ self::$instance = $previousValue;
+ } );
}
/**
$this->assertSame( $instanceOne, $instanceTwo );
}
+ public function testOverrideDefaultInstance() {
+ $instance = WatchedItemStore::getDefaultInstance();
+ $scopedOverride = $instance->overrideDefaultInstance( null );
+
+ $this->assertNotSame( $instance, WatchedItemStore::getDefaultInstance() );
+
+ unset( $scopedOverride );
+
+ $this->assertSame( $instance, WatchedItemStore::getDefaultInstance() );
+ }
+
public function testCountWatchers() {
$titleValue = new TitleValue( 0, 'SomeDbKey' );
$callableCallCounter++;
$this->assertInternalType( 'callable', $callable );
};
- $store->overrideDeferredUpdatesAddCallableUpdateCallback( $mockCallback );
+ $scopedOverride = $store->overrideDeferredUpdatesAddCallableUpdateCallback( $mockCallback );
$this->assertTrue(
$store->resetNotificationTimestamp(
)
);
$this->assertEquals( 1, $callableCallCounter );
+
+ ScopedCallback::consume( $scopedOverride );
}
public function testResetNotificationTimestamp_noItemForced() {
$callableCallCounter++;
$this->assertInternalType( 'callable', $callable );
};
- $store->overrideDeferredUpdatesAddCallableUpdateCallback( $mockCallback );
+ $scopedOverride = $store->overrideDeferredUpdatesAddCallableUpdateCallback( $mockCallback );
$this->assertTrue(
$store->resetNotificationTimestamp(
)
);
$this->assertEquals( 1, $callableCallCounter );
+
+ ScopedCallback::consume( $scopedOverride );
}
/**
// Note: This does not actually assert the job is correct
$callableCallCounter = 0;
- $store->overrideDeferredUpdatesAddCallableUpdateCallback(
+ $scopedOverride = $store->overrideDeferredUpdatesAddCallableUpdateCallback(
function( $callable ) use ( &$callableCallCounter ) {
$callableCallCounter++;
$this->assertInternalType( 'callable', $callable );
)
);
$this->assertEquals( 1, $callableCallCounter );
+
+ ScopedCallback::consume( $scopedOverride );
}
public function testResetNotificationTimestamp_oldidSpecifiedNotLatestRevisionForced() {
// Note: This does not actually assert the job is correct
$addUpdateCallCounter = 0;
- $store->overrideDeferredUpdatesAddCallableUpdateCallback(
+ $scopedOverrideDeferred = $store->overrideDeferredUpdatesAddCallableUpdateCallback(
function( $callable ) use ( &$addUpdateCallCounter ) {
$addUpdateCallCounter++;
$this->assertInternalType( 'callable', $callable );
);
$getTimestampCallCounter = 0;
- $store->overrideRevisionGetTimestampFromIdCallback(
+ $scopedOverrideRevision = $store->overrideRevisionGetTimestampFromIdCallback(
function( $titleParam, $oldidParam ) use ( &$getTimestampCallCounter, $title, $oldid ) {
$getTimestampCallCounter++;
$this->assertEquals( $title, $titleParam );
);
$this->assertEquals( 1, $addUpdateCallCounter );
$this->assertEquals( 1, $getTimestampCallCounter );
+
+ ScopedCallback::consume( $scopedOverrideDeferred );
+ ScopedCallback::consume( $scopedOverrideRevision );
}
public function testUpdateNotificationTimestamp_watchersExist() {
->method( 'loadWatchedItem' )
->with( $user, $linkTarget )
->will( $this->returnValue( new WatchedItem( $user, $linkTarget, $timestamp ) ) );
- WatchedItemStore::overrideDefaultInstance( $store );
+ $scopedOverride = WatchedItemStore::overrideDefaultInstance( $store );
$item = WatchedItem::fromUserTitle( $user, $linkTarget, User::IGNORE_USER_RIGHTS );
$this->assertEquals( $user, $item->getUser() );
$this->assertEquals( $linkTarget, $item->getLinkTarget() );
$this->assertEquals( $timestamp, $item->getNotificationTimestamp() );
+
+ ScopedCallback::consume( $scopedOverride );
}
/**
return true;
}
) );
- WatchedItemStore::overrideDefaultInstance( $store );
+ $scopedOverride = WatchedItemStore::overrideDefaultInstance( $store );
$item = new WatchedItem( $user, $linkTarget, $timestamp );
$item->resetNotificationTimestamp( $force, $oldid );
+
+ ScopedCallback::consume( $scopedOverride );
}
public function testAddWatch() {
$store->expects( $this->once() )
->method( 'duplicateAllAssociatedEntries' )
->with( $oldTitle, $newTitle );
- WatchedItemStore::overrideDefaultInstance( $store );
+ $scopedOverride = WatchedItemStore::overrideDefaultInstance( $store );
WatchedItem::duplicateEntries( $oldTitle, $newTitle );
+
+ ScopedCallback::consume( $scopedOverride );
}
public function testBatchAddWatch() {
$store->expects( $this->once() )
->method( 'addWatchBatch' )
->with( $userTargetCombinations );
- WatchedItemStore::overrideDefaultInstance( $store );
+ $scopedOverride = WatchedItemStore::overrideDefaultInstance( $store );
WatchedItem::batchAddWatch( $items );
+
+ ScopedCallback::consume( $scopedOverride );
}
}