From 8357fe9e9836cfd948b89da32f265e5da206c330 Mon Sep 17 00:00:00 2001 From: Antoine Musso Date: Tue, 3 Jan 2017 12:49:13 +0100 Subject: [PATCH] Add accessor to DeferredUpdates Updates are stored in private variables which is not convenient when testing deferred updates. Add a getPendingUpdates() accessor. The stage can be specified to only retrieve PRE or POST ones. Change-Id: I1af730ec5e48bc0be555a8db4611a76eb9332444 --- includes/deferred/DeferredUpdates.php | 15 ++++++++ .../includes/deferred/DeferredUpdatesTest.php | 34 +++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/includes/deferred/DeferredUpdates.php b/includes/deferred/DeferredUpdates.php index 000b526f4c..0a9755d51b 100644 --- a/includes/deferred/DeferredUpdates.php +++ b/includes/deferred/DeferredUpdates.php @@ -336,6 +336,21 @@ class DeferredUpdates { return count( self::$preSendUpdates ) + count( self::$postSendUpdates ); } + /** + * @param integer $stage DeferredUpdates constant (PRESEND, POSTSEND, or ALL) + * @since 1.29 + */ + public static function getPendingUpdates( $stage = self::ALL ) { + $updates = []; + if ( $stage === self::ALL || $stage === self::PRESEND ) { + $updates = array_merge( $updates, self::$preSendUpdates ); + } + if ( $stage === self::ALL || $stage === self::POSTSEND ) { + $updates = array_merge( $updates, self::$postSendUpdates ); + } + return $updates; + } + /** * Clear all pending updates without performing them. Generally, you don't * want or need to call this. Unit tests need it though. diff --git a/tests/phpunit/includes/deferred/DeferredUpdatesTest.php b/tests/phpunit/includes/deferred/DeferredUpdatesTest.php index 4227693a2e..d7ad1d1ed6 100644 --- a/tests/phpunit/includes/deferred/DeferredUpdatesTest.php +++ b/tests/phpunit/includes/deferred/DeferredUpdatesTest.php @@ -1,6 +1,40 @@ setMwGlobals( 'wgCommandLineMode', false ); + + $pre = DeferredUpdates::PRESEND; + $post = DeferredUpdates::POSTSEND; + $all = DeferredUpdates::ALL; + + $update = $this->getMockBuilder( 'DeferrableUpdate' ) + ->getMock(); + $update->expects( $this->never() ) + ->method( 'doUpdate' ); + + DeferredUpdates::addUpdate( $update, $pre ); + $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $pre ) ); + $this->assertCount( 0, DeferredUpdates::getPendingUpdates( $post ) ); + $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $all ) ); + $this->assertCount( 1, DeferredUpdates::getPendingUpdates() ); + DeferredUpdates::clearPendingUpdates(); + $this->assertCount( 0, DeferredUpdates::getPendingUpdates() ); + + DeferredUpdates::addUpdate( $update, $post ); + $this->assertCount( 0, DeferredUpdates::getPendingUpdates( $pre ) ); + $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $post ) ); + $this->assertCount( 1, DeferredUpdates::getPendingUpdates( $all ) ); + $this->assertCount( 1, DeferredUpdates::getPendingUpdates() ); + DeferredUpdates::clearPendingUpdates(); + $this->assertCount( 0, DeferredUpdates::getPendingUpdates() ); + } + public function testDoUpdatesWeb() { $this->setMwGlobals( 'wgCommandLineMode', false ); -- 2.20.1