wiki.techinc.nl/tests/phpunit/includes/interwiki/InterwikiTest.php
daniel ff764440da Introduce InterwikiTest
This test class verifies that Interwiki currectly handles information
from the database, CDB files, and plain arrays. This is intended to
allow confident refactoring when implementing T113034.

Bug: T113034
Change-Id: I2b68d11e3e946d81fa5f5f65a28fc399e7936c0f
2016-04-23 21:44:59 +02:00

254 lines
6.9 KiB
PHP

<?php
/**
* @covers Interwiki
*
* @group MediaWiki
* @group Database
*/
class InterwikiTest extends MediaWikiTestCase {
public function testConstructor() {
$interwiki = new Interwiki(
'xyz',
'http://xyz.acme.test/wiki/$1',
'http://xyz.acme.test/w/api.php',
'xyzwiki',
1,
0
);
$this->setContentLang( 'qqx' );
$this->assertSame( '(interwiki-name-xyz)', $interwiki->getName() );
$this->assertSame( '(interwiki-desc-xyz)', $interwiki->getDescription() );
$this->assertSame( 'http://xyz.acme.test/w/api.php', $interwiki->getAPI() );
$this->assertSame( 'http://xyz.acme.test/wiki/$1', $interwiki->getURL() );
$this->assertSame( 'xyzwiki', $interwiki->getWikiID() );
$this->assertTrue( $interwiki->isLocal() );
$this->assertFalse( $interwiki->isTranscludable() );
}
public function testGetUrl() {
$interwiki = new Interwiki(
'xyz',
'http://xyz.acme.test/wiki/$1'
);
$this->assertSame( 'http://xyz.acme.test/wiki/$1', $interwiki->getURL() );
$this->assertSame( 'http://xyz.acme.test/wiki/Foo%26Bar', $interwiki->getURL( 'Foo&Bar' ) );
}
//// tests for static data access methods below ///////////////////////////////////////////////
private function populateDB( $iwrows ) {
$dbw = wfGetDB( DB_MASTER );
$dbw->delete( 'interwiki', '*', __METHOD__ );
$dbw->insert( 'interwiki', array_values( $iwrows ), __METHOD__ );
$this->tablesUsed[] = 'interwiki';
}
public function testDatabaseStorage() {
// NOTE: database setup is expensive, so we only do
// it once and run all the tests in one go.
$dewiki = [
'iw_prefix' => 'de',
'iw_url' => 'http://de.wikipedia.org/wiki/',
'iw_api' => 'http://de.wikipedia.org/w/api.php',
'iw_wikiid' => 'dewiki',
'iw_local' => 1,
'iw_trans' => 0
];
$zzwiki = [
'iw_prefix' => 'zz',
'iw_url' => 'http://zzwiki.org/wiki/',
'iw_api' => 'http://zzwiki.org/w/api.php',
'iw_wikiid' => 'zzwiki',
'iw_local' => 0,
'iw_trans' => 0
];
$this->populateDB( [ $dewiki, $zzwiki ] );
Interwiki::resetLocalCache();
$this->setMwGlobals( 'wgInterwikiCache', false );
$this->assertEquals(
[ $dewiki, $zzwiki ],
Interwiki::getAllPrefixes(),
'getAllPrefixes()'
);
$this->assertEquals(
[ $dewiki ],
Interwiki::getAllPrefixes( true ),
'getAllPrefixes()'
);
$this->assertEquals(
[ $zzwiki ],
Interwiki::getAllPrefixes( false ),
'getAllPrefixes()'
);
$this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
$this->assertFalse( Interwiki::isValidInterwiki( 'xyz' ), 'unknown prefix is valid' );
$this->assertNull( Interwiki::fetch( null ), 'no prefix' );
$this->assertFalse( Interwiki::fetch( 'xyz' ), 'unknown prefix' );
$interwiki = Interwiki::fetch( 'de' );
$this->assertInstanceOf( 'Interwiki', $interwiki );
$this->assertSame( $interwiki, Interwiki::fetch( 'de' ), 'in-process caching' );
$this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
$this->assertSame( 'http://de.wikipedia.org/w/api.php', $interwiki->getAPI(), 'getAPI' );
$this->assertSame( 'dewiki', $interwiki->getWikiID(), 'getWikiID' );
$this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
$this->assertSame( false, $interwiki->isTranscludable(), 'isTranscludable' );
Interwiki::invalidateCache( 'de' );
$this->assertNotSame( $interwiki, Interwiki::fetch( 'de' ), 'invalidate cache' );
}
/**
* @param string $thisSite
* @param string[] $local
* @param string[] $global
*
* @return string[]
*/
private function populateHash( $thisSite, $local, $global ) {
$hash = [];
$hash[ '__sites:' . wfWikiID() ] = $thisSite;
$globals = [];
$locals = [];
foreach ( $local as $row ) {
$prefix = $row['iw_prefix'];
$data = $row['iw_local'] . ' ' . $row['iw_url'];
$locals[] = $prefix;
$hash[ "_{$thisSite}:{$prefix}" ] = $data;
}
foreach ( $global as $row ) {
$prefix = $row['iw_prefix'];
$data = $row['iw_local'] . ' ' . $row['iw_url'];
$globals[] = $prefix;
$hash[ "__global:{$prefix}" ] = $data;
}
$hash[ '__list:__global' ] = implode( ' ', $globals );
$hash[ '__list:_' . $thisSite ] = implode( ' ', $locals );
return $hash;
}
private function populateCDB( $thisSite, $local, $global ) {
$cdbFile = tempnam( wfTempDir(), 'MW-ClassicInterwikiLookupTest-' ) . '.cdb';
$cdb = CdbWriter::open( $cdbFile );
$hash = $this->populateHash( $thisSite, $local, $global );
foreach ( $hash as $key => $value ) {
$cdb->set( $key, $value );
}
$cdb->close();
return $cdbFile;
}
public function testCDBStorage() {
// NOTE: CDB setup is expensive, so we only do
// it once and run all the tests in one go.
$dewiki = [
'iw_prefix' => 'de',
'iw_url' => 'http://de.wikipedia.org/wiki/',
'iw_local' => 1
];
$zzwiki = [
'iw_prefix' => 'zz',
'iw_url' => 'http://zzwiki.org/wiki/',
'iw_local' => 0
];
$cdbFile = $this->populateCDB(
'en',
[ $dewiki ],
[ $zzwiki ]
);
Interwiki::resetLocalCache();
$this->setMwGlobals( 'wgInterwikiCache', $cdbFile );
$this->assertEquals(
[ $dewiki, $zzwiki ],
Interwiki::getAllPrefixes(),
'getAllPrefixes()'
);
$this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
$this->assertTrue( Interwiki::isValidInterwiki( 'zz' ), 'known prefix is valid' );
$interwiki = Interwiki::fetch( 'de' );
$this->assertInstanceOf( 'Interwiki', $interwiki );
$this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
$this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
$interwiki = Interwiki::fetch( 'zz' );
$this->assertInstanceOf( 'Interwiki', $interwiki );
$this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
$this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
// cleanup temp file
unlink( $cdbFile );
}
public function testArrayStorage() {
$dewiki = [
'iw_prefix' => 'de',
'iw_url' => 'http://de.wikipedia.org/wiki/',
'iw_local' => 1
];
$zzwiki = [
'iw_prefix' => 'zz',
'iw_url' => 'http://zzwiki.org/wiki/',
'iw_local' => 0
];
$cdbData = $this->populateHash(
'en',
[ $dewiki ],
[ $zzwiki ]
);
Interwiki::resetLocalCache();
$this->setMwGlobals( 'wgInterwikiCache', $cdbData );
$this->assertEquals(
[ $dewiki, $zzwiki ],
Interwiki::getAllPrefixes(),
'getAllPrefixes()'
);
$this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
$this->assertTrue( Interwiki::isValidInterwiki( 'zz' ), 'known prefix is valid' );
$interwiki = Interwiki::fetch( 'de' );
$this->assertInstanceOf( 'Interwiki', $interwiki );
$this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
$this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
$interwiki = Interwiki::fetch( 'zz' );
$this->assertInstanceOf( 'Interwiki', $interwiki );
$this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
$this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
}
}