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