From: aude Date: Thu, 26 Feb 2015 14:53:08 +0000 (+0100) Subject: Introduce HashSiteStore, mainly for use in tests X-Git-Tag: 1.31.0-rc.0~12256^2 X-Git-Url: https://git.cyclocoop.org/%7B%24admin_url%7Dcompta/operations/modifier.php?a=commitdiff_plain;h=df3ac3d09e11d0685df78ff07c7758ade963ebd6;p=lhc%2Fweb%2Fwiklou.git 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 --- diff --git a/autoload.php b/autoload.php index b85ac466a1..90fab64926 100644 --- a/autoload.php +++ b/autoload.php @@ -498,6 +498,7 @@ $wgAutoloadLocalClasses = array( 'HashBagOStuff' => __DIR__ . '/includes/libs/objectcache/HashBagOStuff.php', 'HashConfig' => __DIR__ . '/includes/config/HashConfig.php', 'HashRing' => __DIR__ . '/includes/libs/HashRing.php', + 'HashSiteStore' => __DIR__ . '/includes/site/HashSiteStore.php', 'HashtableReplacer' => __DIR__ . '/includes/libs/replacers/HashtableReplacer.php', 'HistoryAction' => __DIR__ . '/includes/actions/HistoryAction.php', 'HistoryBlob' => __DIR__ . '/includes/HistoryBlob.php', diff --git a/includes/site/HashSiteStore.php b/includes/site/HashSiteStore.php new file mode 100644 index 0000000000..38528d6fe6 --- /dev/null +++ b/includes/site/HashSiteStore.php @@ -0,0 +1,117 @@ + + * + * @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 0000000000..caa33fb3d0 --- /dev/null +++ b/tests/phpunit/includes/site/HashSiteStoreTest.php @@ -0,0 +1,106 @@ + + */ +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->assertCount( 0, $store->getSites(), '0 sites in store' ); + + $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->assertCount( 0, $store->getSites(), '0 sites in store' ); + + $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->assertCount( 0, $store->getSites(), '0 sites in store' ); + } +}