Add parameter to API modules to apply change tags to log entries
[lhc/web/wiklou.git] / tests / phpunit / includes / interwiki / InterwikiTest.php
1 <?php
2 use MediaWiki\MediaWikiServices;
3
4 /**
5 * @covers Interwiki
6 *
7 * @group MediaWiki
8 * @group Database
9 */
10 class InterwikiTest extends MediaWikiTestCase {
11
12 public function testConstructor() {
13 $interwiki = new Interwiki(
14 'xyz',
15 'http://xyz.acme.test/wiki/$1',
16 'http://xyz.acme.test/w/api.php',
17 'xyzwiki',
18 1,
19 0
20 );
21
22 $this->setContentLang( 'qqx' );
23
24 $this->assertSame( '(interwiki-name-xyz)', $interwiki->getName() );
25 $this->assertSame( '(interwiki-desc-xyz)', $interwiki->getDescription() );
26 $this->assertSame( 'http://xyz.acme.test/w/api.php', $interwiki->getAPI() );
27 $this->assertSame( 'http://xyz.acme.test/wiki/$1', $interwiki->getURL() );
28 $this->assertSame( 'xyzwiki', $interwiki->getWikiID() );
29 $this->assertTrue( $interwiki->isLocal() );
30 $this->assertFalse( $interwiki->isTranscludable() );
31 }
32
33 public function testGetUrl() {
34 $interwiki = new Interwiki(
35 'xyz',
36 'http://xyz.acme.test/wiki/$1'
37 );
38
39 $this->assertSame( 'http://xyz.acme.test/wiki/$1', $interwiki->getURL() );
40 $this->assertSame( 'http://xyz.acme.test/wiki/Foo%26Bar', $interwiki->getURL( 'Foo&Bar' ) );
41 }
42
43 //// tests for static data access methods below ///////////////////////////////////////////////
44
45 private function populateDB( $iwrows ) {
46 $dbw = wfGetDB( DB_MASTER );
47 $dbw->delete( 'interwiki', '*', __METHOD__ );
48 $dbw->insert( 'interwiki', array_values( $iwrows ), __METHOD__ );
49 $this->tablesUsed[] = 'interwiki';
50 }
51
52 private function setWgInterwikiCache( $interwikiCache ) {
53 $this->overrideMwServices();
54 MediaWikiServices::getInstance()->resetServiceForTesting( 'InterwikiLookup' );
55 $this->setMwGlobals( 'wgInterwikiCache', $interwikiCache );
56 }
57
58 public function testDatabaseStorage() {
59 $this->markTestSkipped( 'Needs I37b8e8018b3 <https://gerrit.wikimedia.org/r/#/c/270555/>' );
60
61 // NOTE: database setup is expensive, so we only do
62 // it once and run all the tests in one go.
63 $dewiki = [
64 'iw_prefix' => 'de',
65 'iw_url' => 'http://de.wikipedia.org/wiki/',
66 'iw_api' => 'http://de.wikipedia.org/w/api.php',
67 'iw_wikiid' => 'dewiki',
68 'iw_local' => 1,
69 'iw_trans' => 0
70 ];
71
72 $zzwiki = [
73 'iw_prefix' => 'zz',
74 'iw_url' => 'http://zzwiki.org/wiki/',
75 'iw_api' => 'http://zzwiki.org/w/api.php',
76 'iw_wikiid' => 'zzwiki',
77 'iw_local' => 0,
78 'iw_trans' => 0
79 ];
80
81 $this->populateDB( [ $dewiki, $zzwiki ] );
82
83 $this->setWgInterwikiCache( false );
84
85 $this->assertEquals(
86 [ $dewiki, $zzwiki ],
87 Interwiki::getAllPrefixes(),
88 'getAllPrefixes()'
89 );
90 $this->assertEquals(
91 [ $dewiki ],
92 Interwiki::getAllPrefixes( true ),
93 'getAllPrefixes()'
94 );
95 $this->assertEquals(
96 [ $zzwiki ],
97 Interwiki::getAllPrefixes( false ),
98 'getAllPrefixes()'
99 );
100
101 $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
102 $this->assertFalse( Interwiki::isValidInterwiki( 'xyz' ), 'unknown prefix is valid' );
103
104 $this->assertNull( Interwiki::fetch( null ), 'no prefix' );
105 $this->assertFalse( Interwiki::fetch( 'xyz' ), 'unknown prefix' );
106
107 $interwiki = Interwiki::fetch( 'de' );
108 $this->assertInstanceOf( 'Interwiki', $interwiki );
109 $this->assertSame( $interwiki, Interwiki::fetch( 'de' ), 'in-process caching' );
110
111 $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
112 $this->assertSame( 'http://de.wikipedia.org/w/api.php', $interwiki->getAPI(), 'getAPI' );
113 $this->assertSame( 'dewiki', $interwiki->getWikiID(), 'getWikiID' );
114 $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
115 $this->assertSame( false, $interwiki->isTranscludable(), 'isTranscludable' );
116
117 Interwiki::invalidateCache( 'de' );
118 $this->assertNotSame( $interwiki, Interwiki::fetch( 'de' ), 'invalidate cache' );
119 }
120
121 /**
122 * @param string $thisSite
123 * @param string[] $local
124 * @param string[] $global
125 *
126 * @return string[]
127 */
128 private function populateHash( $thisSite, $local, $global ) {
129 $hash = [];
130 $hash[ '__sites:' . wfWikiID() ] = $thisSite;
131
132 $globals = [];
133 $locals = [];
134
135 foreach ( $local as $row ) {
136 $prefix = $row['iw_prefix'];
137 $data = $row['iw_local'] . ' ' . $row['iw_url'];
138 $locals[] = $prefix;
139 $hash[ "_{$thisSite}:{$prefix}" ] = $data;
140 }
141
142 foreach ( $global as $row ) {
143 $prefix = $row['iw_prefix'];
144 $data = $row['iw_local'] . ' ' . $row['iw_url'];
145 $globals[] = $prefix;
146 $hash[ "__global:{$prefix}" ] = $data;
147 }
148
149 $hash[ '__list:__global' ] = implode( ' ', $globals );
150 $hash[ '__list:_' . $thisSite ] = implode( ' ', $locals );
151
152 return $hash;
153 }
154
155 private function populateCDB( $thisSite, $local, $global ) {
156 $cdbFile = tempnam( wfTempDir(), 'MW-ClassicInterwikiLookupTest-' ) . '.cdb';
157 $cdb = CdbWriter::open( $cdbFile );
158
159 $hash = $this->populateHash( $thisSite, $local, $global );
160
161 foreach ( $hash as $key => $value ) {
162 $cdb->set( $key, $value );
163 }
164
165 $cdb->close();
166 return $cdbFile;
167 }
168
169 public function testCDBStorage() {
170 // NOTE: CDB setup is expensive, so we only do
171 // it once and run all the tests in one go.
172
173 $dewiki = [
174 'iw_prefix' => 'de',
175 'iw_url' => 'http://de.wikipedia.org/wiki/',
176 'iw_local' => 1
177 ];
178
179 $zzwiki = [
180 'iw_prefix' => 'zz',
181 'iw_url' => 'http://zzwiki.org/wiki/',
182 'iw_local' => 0
183 ];
184
185 $cdbFile = $this->populateCDB(
186 'en',
187 [ $dewiki ],
188 [ $zzwiki ]
189 );
190
191 $this->setWgInterwikiCache( $cdbFile );
192
193 $this->assertEquals(
194 [ $dewiki, $zzwiki ],
195 Interwiki::getAllPrefixes(),
196 'getAllPrefixes()'
197 );
198
199 $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
200 $this->assertTrue( Interwiki::isValidInterwiki( 'zz' ), 'known prefix is valid' );
201
202 $interwiki = Interwiki::fetch( 'de' );
203 $this->assertInstanceOf( 'Interwiki', $interwiki );
204
205 $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
206 $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
207
208 $interwiki = Interwiki::fetch( 'zz' );
209 $this->assertInstanceOf( 'Interwiki', $interwiki );
210
211 $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
212 $this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
213
214 // cleanup temp file
215 unlink( $cdbFile );
216 }
217
218 public function testArrayStorage() {
219 $dewiki = [
220 'iw_prefix' => 'de',
221 'iw_url' => 'http://de.wikipedia.org/wiki/',
222 'iw_local' => 1
223 ];
224
225 $zzwiki = [
226 'iw_prefix' => 'zz',
227 'iw_url' => 'http://zzwiki.org/wiki/',
228 'iw_local' => 0
229 ];
230
231 $cdbData = $this->populateHash(
232 'en',
233 [ $dewiki ],
234 [ $zzwiki ]
235 );
236
237 $this->setWgInterwikiCache( $cdbData );
238
239 $this->assertEquals(
240 [ $dewiki, $zzwiki ],
241 Interwiki::getAllPrefixes(),
242 'getAllPrefixes()'
243 );
244
245 $this->assertTrue( Interwiki::isValidInterwiki( 'de' ), 'known prefix is valid' );
246 $this->assertTrue( Interwiki::isValidInterwiki( 'zz' ), 'known prefix is valid' );
247
248 $interwiki = Interwiki::fetch( 'de' );
249 $this->assertInstanceOf( 'Interwiki', $interwiki );
250
251 $this->assertSame( 'http://de.wikipedia.org/wiki/', $interwiki->getURL(), 'getURL' );
252 $this->assertSame( true, $interwiki->isLocal(), 'isLocal' );
253
254 $interwiki = Interwiki::fetch( 'zz' );
255 $this->assertInstanceOf( 'Interwiki', $interwiki );
256
257 $this->assertSame( 'http://zzwiki.org/wiki/', $interwiki->getURL(), 'getURL' );
258 $this->assertSame( false, $interwiki->isLocal(), 'isLocal' );
259 }
260
261 }