From ab2bf12cf886dd8664fcb0696e24911d15dae0a2 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Tue, 27 Feb 2018 18:01:02 -0800 Subject: [PATCH] Add test for WikiPage post-edit stats update Bug: T187585 Change-Id: I734b7f42799a9bfe77a1fb1269bb3d48b3852ffd --- includes/deferred/SiteStatsUpdate.php | 6 ++ .../includes/deferred/SiteStatsUpdateTest.php | 77 +++++++++++++++++++ 2 files changed, 83 insertions(+) create mode 100644 tests/phpunit/includes/deferred/SiteStatsUpdateTest.php diff --git a/includes/deferred/SiteStatsUpdate.php b/includes/deferred/SiteStatsUpdate.php index 79aab7d099..7cb2950942 100644 --- a/includes/deferred/SiteStatsUpdate.php +++ b/includes/deferred/SiteStatsUpdate.php @@ -66,6 +66,12 @@ class SiteStatsUpdate implements DeferrableUpdate, MergeableUpdate { public static function factory( array $deltas ) { $update = new self( 0, 0, 0 ); + foreach ( $deltas as $name => $unused ) { + if ( !in_array( $name, self::$counters ) ) { // T187585 + throw new UnexpectedValueException( __METHOD__ . ": no field called '$name'" ); + } + } + foreach ( self::$counters as $field ) { if ( isset( $deltas[$field] ) && $deltas[$field] ) { $update->$field = $deltas[$field]; diff --git a/tests/phpunit/includes/deferred/SiteStatsUpdateTest.php b/tests/phpunit/includes/deferred/SiteStatsUpdateTest.php new file mode 100644 index 0000000000..83e9a47ca6 --- /dev/null +++ b/tests/phpunit/includes/deferred/SiteStatsUpdateTest.php @@ -0,0 +1,77 @@ + 1, 'users' => 2 ] ); + $update2 = SiteStatsUpdate::factory( [ 'users' => 1, 'images' => 1 ] ); + + $update1->merge( $update2 ); + $wrapped = TestingAccessWrapper::newFromObject( $update1 ); + + $this->assertEquals( 1, $wrapped->pages ); + $this->assertEquals( 3, $wrapped->users ); + $this->assertEquals( 1, $wrapped->images ); + $this->assertEquals( 0, $wrapped->edits ); + $this->assertEquals( 0, $wrapped->articles ); + } + + /** + * @covers SiteStatsUpdate::doUpdate() + * @covers SiteStatsInit::refresh() + */ + public function testDoUpdate() { + $this->setMwGlobals( 'wgSiteStatsAsyncFactor', false ); + $this->setMwGlobals( 'wgCommandLineMode', false ); // disable opportunistic updates + + $dbw = wfGetDB( DB_MASTER ); + $statsInit = new SiteStatsInit( $dbw ); + $statsInit->refresh(); + + $ei = SiteStats::edits(); // trigger load + $pi = SiteStats::pages(); + $ui = SiteStats::users(); + $fi = SiteStats::images(); + $ai = SiteStats::articles(); + + $dbw->begin( __METHOD__ ); // block opportunistic updates + + $update = SiteStatsUpdate::factory( [ 'pages' => 2, 'images' => 1, 'edits' => 2 ] ); + $this->assertEquals( 0, DeferredUpdates::pendingUpdatesCount() ); + $update->doUpdate(); + $this->assertEquals( 1, DeferredUpdates::pendingUpdatesCount() ); + + // Still the same + SiteStats::unload(); + $this->assertEquals( $pi, SiteStats::pages(), 'page count' ); + $this->assertEquals( $ei, SiteStats::edits(), 'edit count' ); + $this->assertEquals( $ui, SiteStats::users(), 'user count' ); + $this->assertEquals( $fi, SiteStats::images(), 'file count' ); + $this->assertEquals( $ai, SiteStats::articles(), 'article count' ); + $this->assertEquals( 1, DeferredUpdates::pendingUpdatesCount() ); + + $dbw->commit( __METHOD__ ); + + $this->assertEquals( 1, DeferredUpdates::pendingUpdatesCount() ); + DeferredUpdates::doUpdates(); + $this->assertEquals( 0, DeferredUpdates::pendingUpdatesCount() ); + + SiteStats::unload(); + $this->assertEquals( $pi + 2, SiteStats::pages(), 'page count' ); + $this->assertEquals( $ei + 2, SiteStats::edits(), 'edit count' ); + $this->assertEquals( $ui, SiteStats::users(), 'user count' ); + $this->assertEquals( $fi + 1, SiteStats::images(), 'file count' ); + $this->assertEquals( $ai, SiteStats::articles(), 'article count' ); + + $statsInit = new SiteStatsInit(); + $statsInit->refresh(); + } +} -- 2.20.1