1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
<?php
namespace MediaWiki\Tests\Site;
use MediaWiki\MediaWikiServices;
use MediaWiki\Site\CachingSiteStore;
use MediaWiki\Site\HashSiteStore;
use MediaWiki\Site\MediaWikiSite;
use MediaWiki\Site\Site;
use MediaWiki\Site\SiteList;
use MediaWiki\Site\SiteStore;
use MediaWikiIntegrationTestCase;
/**
* @covers \MediaWiki\Site\CachingSiteStore
* @group Site
* @group Database
* @author Jeroen De Dauw < jeroendedauw@gmail.com >
*/
class CachingSiteStoreTest extends MediaWikiIntegrationTestCase {
public function testGetSites() {
$testSites = TestSites::getSites();
$services = MediaWikiServices::getInstance();
$store = new CachingSiteStore(
$this->getHashSiteStore( $testSites ),
$services->getObjectCacheFActory()
->getLocalClusterInstance()
);
$sites = $store->getSites();
$this->assertInstanceOf( SiteList::class, $sites );
/** @var Site $site */
foreach ( $sites as $site ) {
$this->assertInstanceOf( Site::class, $site );
}
foreach ( $testSites as $site ) {
if ( $site->getGlobalId() !== null ) {
$this->assertTrue( $sites->hasSite( $site->getGlobalId() ) );
}
}
}
public function testSaveSites() {
$services = MediaWikiServices::getInstance();
$store = new CachingSiteStore(
new HashSiteStore(),
$services->getObjectCacheFActory()->getLocalClusterInstance()
);
$sites = [];
$site = new Site();
$site->setGlobalId( 'ertrywuutr' );
$site->setLanguageCode( 'en' );
$sites[] = $site;
$site = new MediaWikiSite();
$site->setGlobalId( 'sdfhxujgkfpth' );
$site->setLanguageCode( 'nl' );
$sites[] = $site;
$this->assertTrue( $store->saveSites( $sites ) );
$site = $store->getSite( 'ertrywuutr' );
$this->assertInstanceOf( Site::class, $site );
$this->assertEquals( 'en', $site->getLanguageCode() );
$site = $store->getSite( 'sdfhxujgkfpth' );
$this->assertInstanceOf( Site::class, $site );
$this->assertEquals( 'nl', $site->getLanguageCode() );
}
public function testReset() {
$dbSiteStore = $this->createMock( SiteStore::class );
$dbSiteStore->method( 'getSite' )
->willReturn( $this->getTestSite() );
$services = MediaWikiServices::getInstance()->getObjectCacheFactory();
$dbSiteStore->method( 'getSites' )
->willReturnCallback( function () {
$siteList = new SiteList();
$siteList->setSite( $this->getTestSite() );
return $siteList;
} );
$store = new CachingSiteStore( $dbSiteStore, $services->getLocalClusterInstance() );
// initialize internal cache
$this->assertGreaterThan( 0, $store->getSites()->count(), 'count sites' );
$store->getSite( 'enwiki' )->setLanguageCode( 'en-ca' );
// check: $store should have the new language code for 'enwiki'
$this->assertEquals( 'en-ca', $store->getSite( 'enwiki' )->getLanguageCode() );
// purge cache
$store->reset();
// the internal cache of $store should be updated, and now pulling
// the site from the 'fallback' DBSiteStore with the original language code.
$this->assertEquals( 'en', $store->getSite( 'enwiki' )->getLanguageCode(), 'reset' );
}
public function getTestSite() {
$enwiki = new MediaWikiSite();
$enwiki->setGlobalId( 'enwiki' );
$enwiki->setLanguageCode( 'en' );
return $enwiki;
}
public function testClear() {
$services = MediaWikiServices::getInstance()->getObjectCacheFactory();
$store = new CachingSiteStore(
new HashSiteStore(), $services->getLocalClusterInstance()
);
$this->assertTrue( $store->clear() );
$site = $store->getSite( 'enwiki' );
$this->assertNull( $site );
$sites = $store->getSites();
$this->assertSame( 0, $sites->count() );
}
/**
* @param Site[] $sites
* @return SiteStore
*/
private function getHashSiteStore( array $sites ) {
$siteStore = new HashSiteStore();
$siteStore->saveSites( $sites );
return $siteStore;
}
}
|