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