Aude has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/193107

Change subject: Introduce HashSiteStore, mainly for use in tests
......................................................................

Introduce HashSiteStore, mainly for use in tests

HashSiteStore comes from Wikibase (see I783bd95), where it was
called MockSiteStore.

This enables some phpunit tests, related to Site objects, to no longer
depend on a database, memcached or other external storage. This makes
tests faster and more simple.

Bug: T90874
Change-Id: I048d37bd2aaa5f17c9fe16b2855df8bf9fe7bc8c
---
A includes/site/HashSiteStore.php
A tests/phpunit/includes/site/HashSiteStoreTest.php
2 files changed, 223 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/core 
refs/changes/07/193107/1

diff --git a/includes/site/HashSiteStore.php b/includes/site/HashSiteStore.php
new file mode 100644
index 0000000..38528d6
--- /dev/null
+++ b/includes/site/HashSiteStore.php
@@ -0,0 +1,117 @@
+<?php
+/**
+ * In-memory implementation of SiteStore.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+/**
+ * In-memory SiteStore implementation, storing sites in an associative array.
+ *
+ * @author Daniel Kinzler
+ * @author Katie Filbert < aude.w...@gmail.com >
+ *
+ * @since 1.25
+ * @ingroup Site
+ */
+class HashSiteStore implements SiteStore {
+
+       /**
+        * @var Site[]
+        */
+       private $sites = array();
+
+       /**
+        * @param array $sites
+        */
+       public function __construct( $sites = array() ) {
+               $this->saveSites( $sites );
+       }
+
+       /**
+        * Saves the provided site.
+        *
+        * @since 1.25
+        *
+        * @param Site $site
+        *
+        * @return boolean Success indicator
+        */
+       public function saveSite( Site $site ) {
+               $this->sites[$site->getGlobalId()] = $site;
+       }
+
+       /**
+        * Saves the provided sites.
+        *
+        * @since 1.25
+        *
+        * @param Site[] $sites
+        *
+        * @return boolean Success indicator
+        */
+       public function saveSites( array $sites ) {
+               foreach ( $sites as $site ) {
+                       $this->saveSite( $site );
+               }
+       }
+
+       /**
+        * Returns the site with provided global id, or null if there is no 
such site.
+        *
+        * @since 1.25
+        *
+        * @param string $globalId
+        * @param string $source either 'cache' or 'recache'.
+        *                       If 'cache', the values can (but not obliged) 
come from a cache.
+        *
+        * @return Site|null
+        */
+       public function getSite( $globalId, $source = 'cache' ) {
+               if ( isset( $this->sites[$globalId] ) ) {
+                       return $this->sites[$globalId];
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * Returns a list of all sites. By default this site is
+        * fetched from the cache, which can be changed to loading
+        * the list from the database using the $useCache parameter.
+        *
+        * @since 1.25
+        *
+        * @param string $source either 'cache' or 'recache'.
+        *                       If 'cache', the values can (but not obliged) 
come from a cache.
+        *
+        * @return SiteList
+        */
+       public function getSites( $source = 'cache' ) {
+               return new SiteList( $this->sites );
+       }
+
+       /**
+        * Deletes all sites from the database. After calling clear(), 
getSites() will return an empty
+        * list and getSite() will return null until saveSite() or saveSites() 
is called.
+        */
+       public function clear() {
+               $this->sites = array();
+       }
+
+}
diff --git a/tests/phpunit/includes/site/HashSiteStoreTest.php 
b/tests/phpunit/includes/site/HashSiteStoreTest.php
new file mode 100644
index 0000000..4c1b816
--- /dev/null
+++ b/tests/phpunit/includes/site/HashSiteStoreTest.php
@@ -0,0 +1,106 @@
+<?php
+
+/**
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ * @since 1.25
+ *
+ * @ingroup Site
+ * @group Site
+ *
+ * @licence GNU GPL v2+
+ * @author Katie Filbert < aude.w...@gmail.com >
+ */
+class HashSiteStoreTest extends MediaWikiTestCase {
+
+       /**
+        * @covers HashSiteStore::getSites
+        */
+       public function testGetSites() {
+               $expectedSites = array();
+
+               foreach( TestSites::getSites() as $testSite ) {
+                       $siteId = $testSite->getGlobalId();
+                       $expectedSites[$siteId] = $testSite;
+               }
+
+               $siteStore = new HashSiteStore( $expectedSites );
+
+               $this->assertEquals( new SiteList( $expectedSites ), 
$siteStore->getSites() );
+       }
+
+    /**
+     * @covers HashSiteStore::saveSite
+     * @covers HashSiteStore::getSite
+     */
+    public function testSaveSite() {
+        $store = new HashSiteStore();
+
+        $site = new Site();
+        $site->setGlobalId( 'dewiki' );
+
+        $this->assertEmpty( $store->getSites(), 'Store has 0 sites' );
+
+        $store->saveSite( $site );
+
+        $this->assertCount( 1, $store->getSites(), 'Store has 1 sites' );
+        $this->assertEquals( $site, $store->getSite( 'dewiki' ), 'Store has 
dewiki' );
+    }
+
+       /**
+        * @covers HashSiteStore::saveSites
+        */
+       public function testSaveSites() {
+               $store = new HashSiteStore();
+
+               $sites = array();
+
+               $site = new Site();
+               $site->setGlobalId( 'enwiki' );
+               $site->setLanguageCode( 'en' );
+               $sites[] = $site;
+
+               $site = new MediaWikiSite();
+               $site->setGlobalId( 'eswiki' );
+               $site->setLanguageCode( 'es' );
+               $sites[] = $site;
+
+               $this->assertEmpty( $store->getSites(), 'Store has 0 sites' );
+
+               $store->saveSites( $sites );
+
+               $this->assertCount( 2, $store->getSites(), 'Store has 2 sites' 
);
+               $this->assertTrue( $store->getSites()->hasSite( 'enwiki' ), 
'Store has enwiki' );
+               $this->assertTrue( $store->getSites()->hasSite( 'eswiki' ), 
'Store has eswiki' );
+       }
+
+       /**
+        * @covers HashSiteStore::clear
+        */
+       public function testClear() {
+               $store = new HashSiteStore();
+
+               $site = new Site();
+               $site->setGlobalId( 'arwiki' );
+               $store->saveSite( $site );
+
+               $this->assertCount( 1, $store->getSites(), '1 site in store' );
+
+               $store->clear();
+               $this->assertEmpty( $store->getSites(), '0 sites in store' );
+       }
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/193107
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I048d37bd2aaa5f17c9fe16b2855df8bf9fe7bc8c
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/core
Gerrit-Branch: master
Gerrit-Owner: Aude <aude.w...@gmail.com>

_______________________________________________
MediaWiki-commits mailing list
MediaWiki-commits@lists.wikimedia.org
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to