1<?php 2 3use MediaWiki\MediaWikiServices; 4 5/** 6 * @covers Interwiki 7 * @group Database 8 */ 9class InterwikiTest extends MediaWikiIntegrationTestCase { 10 11 public function testConstructor() { 12 $interwiki = new Interwiki( 13 'xyz', 14 'http://xyz.acme.test/wiki/$1', 15 'http://xyz.acme.test/w/api.php', 16 'xyzwiki', 17 1, 18 0 19 ); 20 21 $this->setContentLang( 'qqx' ); 22 23 $this->assertSame( '(interwiki-name-xyz)', $interwiki->getName() ); 24 $this->assertSame( '(interwiki-desc-xyz)', $interwiki->getDescription() ); 25 $this->assertSame( 'http://xyz.acme.test/w/api.php', $interwiki->getAPI() ); 26 $this->assertSame( 'http://xyz.acme.test/wiki/$1', $interwiki->getURL() ); 27 $this->assertSame( 'xyzwiki', $interwiki->getWikiID() ); 28 $this->assertTrue( $interwiki->isLocal() ); 29 $this->assertFalse( $interwiki->isTranscludable() ); 30 } 31 32 public function testGetUrl() { 33 $interwiki = new Interwiki( 34 'xyz', 35 'http://xyz.acme.test/wiki/$1' 36 ); 37 38 $this->assertSame( 'http://xyz.acme.test/wiki/$1', $interwiki->getURL() ); 39 $this->assertSame( 'http://xyz.acme.test/wiki/Foo%26Bar', $interwiki->getURL( 'Foo&Bar' ) ); 40 } 41 42 //// tests for static data access methods below /////////////////////////////////////////////// 43 44 private function populateDB( $iwrows ) { 45 $dbw = wfGetDB( DB_MASTER ); 46 $dbw->delete( 'interwiki', '*', __METHOD__ ); 47 $dbw->insert( 'interwiki', array_values( $iwrows ), __METHOD__ ); 48 $this->tablesUsed[] = 'interwiki'; 49 } 50 51 private function setWgInterwikiCache( $interwikiCache ) { 52 MediaWikiServices::getInstance()->resetServiceForTesting( 'InterwikiLookup' ); 53 $this->setMwGlobals( 'wgInterwikiCache', $interwikiCache ); 54 } 55 56 public function testDatabaseStorage() { 57 // NOTE: database setup is expensive, so we only do 58 // it once and run all the tests in one go. 59 $dewiki = [ 60 'iw_prefix' => 'de', 61 'iw_url' => 'http://de.wikipedia.org/wiki/', 62 'iw_api' => 'http://de.wikipedia.org/w/api.php', 63 'iw_wikiid' => 'dewiki', 64 'iw_local' => 1, 65 'iw_trans' => 0 66 ]; 67 68 $zzwiki = [ 69 'iw_prefix' => 'zz', 70 'iw_url' => 'http://zzwiki.org/wiki/', 71 'iw_api' => 'http://zzwiki.org/w/api.php', 72 'iw_wikiid' => 'zzwiki', 73 'iw_local' => 0, 74 'iw_trans' => 0 75 ]; 76 77 $this->populateDB( [ $dewiki, $zzwiki ] ); 78 79 $this->setWgInterwikiCache( false ); 80 81 $interwikiLookup = MediaWikiServices::getInstance()->getInterwikiLookup(); 82 $this->assertEquals( 83 [ $dewiki, $zzwiki ], 84 $interwikiLookup->getAllPrefixes(), 85 'getAllPrefixes()' 86 ); 87 $this->assertEquals( 88 [ $dewiki ], 89 $interwikiLookup->getAllPrefixes( true ), 90 'getAllPrefixes()' 91 ); 92 $this->assertEquals( 93 [ $zzwiki ], 94 $interwikiLookup->getAllPrefixes( false ), 95 'getAllPrefixes()' 96 ); 97 98 $this->assertTrue( $interwikiLookup->isValidInterwiki( 'de' ), 'known prefix is valid' ); 99 $this->assertFalse( $interwikiLookup->isValidInterwiki( 'xyz' ), 'unknown prefix is valid' ); 100 101 $this->assertNull( $interwikiLookup->fetch( null ), 'no prefix' ); 102 $this->assertFalse( $interwikiLookup->fetch( 'xyz' ), 'unknown prefix' ); 103 104 $interwiki = $interwikiLookup->fetch( 'de' ); 105 $this->assertInstanceOf( Interwiki::class, $interwiki ); 106 $this->assertSame( $interwiki, $interwikiLookup->fetch( 'de' ), 'in-process caching' ); 107 108 $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' ); 109 $this->assertSame( 'http://de.wikipedia.org/w/api.php', $interwiki->getAPI(), 'getAPI' ); 110 $this->assertSame( 'dewiki', $interwiki->getWikiID(), 'getWikiID' ); 111 $this->assertSame( true, $interwiki->isLocal(), 'isLocal' ); 112 $this->assertSame( false, $interwiki->isTranscludable(), 'isTranscludable' ); 113 114 $interwikiLookup->invalidateCache( 'de' ); 115 $this->assertNotSame( $interwiki, $interwikiLookup->fetch( 'de' ), 'invalidate cache' ); 116 } 117 118} 119