Completed
Push — master ( 7dc2d1...548dfc )
by mw
19:12
created

testTryToGetLanguageTargetLinksFromCacheOnNullLinkReference()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 21
Code Lines 11

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
c 1
b 0
f 0
dl 0
loc 21
rs 9.3142
cc 1
eloc 11
nc 1
nop 0
1
<?php
2
3
namespace SIL\Tests;
4
5
use SIL\LanguageTargetLinksCache;
6
use SIL\InterlanguageLink;
7
use SIL\CacheKeyProvider;
8
use SMW\DIWikiPage;
9
use Onoi\Cache\CacheFactory;
10
use HashBagOStuff;
11
use Title;
12
13
/**
14
 * @covers \SIL\LanguageTargetLinksCache
15
 * @group semantic-interlanguage-links
16
 *
17
 * @license GNU GPL v2+
18
 * @since 1.0
19
 *
20
 * @author mwjames
21
 */
22
class LanguageTargetLinksCacheTest extends \PHPUnit_Framework_TestCase {
23
24
	private $cache;
25
	private $cacheKeyProvider;
26
27
	protected function setUp() {
28
		parent::setUp();
29
30
		$this->cache = CacheFactory::getInstance()->newMediaWikiCache( new HashBagOStuff() );
31
		$this->cacheKeyProvider = new CacheKeyProvider( 'foo' );
32
	}
33
34
	public function testCanConstruct() {
35
36
		$cache = $this->getMockBuilder( '\Onoi\Cache\Cache' )
37
			->disableOriginalConstructor()
38
			->getMockForAbstractClass();
39
40
		$cacheKeyProvider = $this->getMockBuilder( '\SIL\CacheKeyProvider' )
41
			->disableOriginalConstructor()
42
			->getMock();
43
44
		$this->assertInstanceOf(
45
			'\SIL\LanguageTargetLinksCache',
46
			new LanguageTargetLinksCache( $cache, $cacheKeyProvider )
47
		);
48
	}
49
50
	/**
51
	 * @dataProvider pageLanguageCacheStrategyProvider
52
	 */
53
	public function testRoundtrip( $pageLanguageCacheStrategy ) {
54
55
		$interlanguageLink = new InterlanguageLink( 'en', 'Foo' );
56
57
		$languageTargetLinks = array(
58
			'bo' => 'Bar',
59
			'en' => Title::newFromText( 'Foo' )
60
		);
61
62
		$instance = new LanguageTargetLinksCache(
63
			$this->cache,
64
			$this->cacheKeyProvider
65
		);
66
67
		$instance->setPageLanguageCacheStrategy( $pageLanguageCacheStrategy );
68
69
		$instance->saveLanguageTargetLinksToCache(
70
			$interlanguageLink,
71
			$languageTargetLinks
72
		);
73
74
		$this->assertEquals(
75
			'bo',
76
			$instance->getPageLanguageFromCache( Title::newFromText( 'Bar' ) )
77
		);
78
79
		$this->assertEquals(
80
			$languageTargetLinks,
81
			$instance->getLanguageTargetLinksFromCache( $interlanguageLink )
82
		);
83
84
		$linkReferences = array();
85
86
		$instance->deleteLanguageTargetLinksFromCache( $linkReferences );
87
		$instance->deletePageLanguageForTargetFromCache( Title::newFromText( 'Bar' ) );
88
89
		$this->assertFalse(
90
			$instance->getPageLanguageFromCache( Title::newFromText( 'Bar' ) )
91
		);
92
	}
93
94
	/**
95
	 * @dataProvider pageLanguageCacheStrategyProvider
96
	 */
97
	public function testTryToGetLanguageTargetLinksForUnknownLanguageCode( $pageLanguageCacheStrategy ) {
98
99
		$interlanguageLink = new InterlanguageLink( 'en', 'Foo' );
100
101
		$languageTargetLinks = array(
102
			'bo' => 'Bar'
103
		);
104
105
		$instance = new LanguageTargetLinksCache(
106
			$this->cache,
107
			$this->cacheKeyProvider
108
		);
109
110
		$instance->setPageLanguageCacheStrategy( $pageLanguageCacheStrategy );
111
112
		$instance->saveLanguageTargetLinksToCache(
113
			$interlanguageLink,
114
			$languageTargetLinks
115
		);
116
117
		$this->assertFalse(
118
			$instance->getLanguageTargetLinksFromCache( $interlanguageLink )
119
		);
120
	}
121
122
	/**
123
	 * @dataProvider pageLanguageCacheStrategyProvider
124
	 */
125
	public function testTryToGetLanguageTargetLinksForNullLanguageCode( $pageLanguageCacheStrategy ) {
126
127
		$interlanguageLink = new InterlanguageLink( null, 'Foo' );
128
129
		$languageTargetLinks = array(
130
			'bo' => 'Bar'
131
		);
132
133
		$instance = new LanguageTargetLinksCache(
134
			$this->cache,
135
			$this->cacheKeyProvider
136
		);
137
138
		$instance->setPageLanguageCacheStrategy( $pageLanguageCacheStrategy );
139
140
		$instance->saveLanguageTargetLinksToCache(
141
			$interlanguageLink,
142
			$languageTargetLinks
143
		);
144
145
		$this->assertEquals(
146
			$languageTargetLinks,
147
			$instance->getLanguageTargetLinksFromCache( $interlanguageLink )
148
		);
149
	}
150
151
	/**
152
	 * @dataProvider pageLanguageCacheStrategyProvider
153
	 */
154
	public function testTryToGetLanguageTargetLinksFromEmptyLinksCache( $pageLanguageCacheStrategy ) {
155
156
		$interlanguageLink = new InterlanguageLink( 'en', 'Foo' );
157
		$languageTargetLinks = array();
158
159
		$instance = new LanguageTargetLinksCache(
160
			$this->cache,
161
			$this->cacheKeyProvider
162
		);
163
164
		$instance->setPageLanguageCacheStrategy( $pageLanguageCacheStrategy );
165
166
		$instance->saveLanguageTargetLinksToCache(
167
			$interlanguageLink,
168
			$languageTargetLinks
169
		);
170
171
		$this->assertFalse(
172
			$instance->getLanguageTargetLinksFromCache( $interlanguageLink )
173
		);
174
	}
175
176
	/**
177
	 * @dataProvider pageLanguageCacheStrategyProvider
178
	 */
179
	public function testDeleteLanguageTargetLinks( $pageLanguageCacheStrategy ) {
180
181
		$interlanguageLink = new InterlanguageLink( 'en', 'Foo' );
182
183
		$languageTargetLinks = array(
184
			'bo' => 'Help:Bar',
185
			'en' => Title::newFromText( 'Foo' )
186
		);
187
188
		$instance = new LanguageTargetLinksCache(
189
			$this->cache,
190
			$this->cacheKeyProvider
191
		);
192
193
		$instance->setPageLanguageCacheStrategy( $pageLanguageCacheStrategy );
194
195
		$instance->saveLanguageTargetLinksToCache(
196
			$interlanguageLink,
197
			$languageTargetLinks
198
		);
199
200
		$linkReferences = array(
201
			new DIWikiPage( 'Foo', NS_MAIN )
202
		);
203
204
		$instance->deleteLanguageTargetLinksFromCache( $linkReferences );
205
206
		$this->assertFalse(
207
			$instance->getLanguageTargetLinksFromCache( $interlanguageLink )
208
		);
209
	}
210
211
	/**
212
	 * @dataProvider pageLanguageCacheStrategyProvider
213
	 */
214
	public function testDeletePageLanguageForMatchedTarget( $pageLanguageCacheStrategy ) {
215
216
		$helpNS = $GLOBALS['wgContLang']->getNsText( NS_HELP );
217
218
		$title = Title::newFromText( 'Bar', NS_HELP );
219
		$interlanguageLink = new InterlanguageLink( 'en', 'Foo' );
220
221
		$languageTargetLinks = array(
222
			'bo' => "$helpNS:Bar",
223
			'en' => Title::newFromText( 'Foo' )
224
		);
225
226
		$instance = new LanguageTargetLinksCache(
227
			$this->cache,
228
			$this->cacheKeyProvider
229
		);
230
231
		$instance->setPageLanguageCacheStrategy( $pageLanguageCacheStrategy );
232
233
		$instance->saveLanguageTargetLinksToCache(
234
			$interlanguageLink,
235
			$languageTargetLinks
236
		);
237
238
		$this->assertEquals(
239
			'bo',
240
			$instance->getPageLanguageFromCache( $title )
241
		);
242
243
		$instance->deletePageLanguageForTargetFromCache( $title );
244
245
		$this->assertFalse(
246
			$instance->getPageLanguageFromCache( $title )
247
		);
248
249
		$this->assertEquals(
250
			'en',
251
			$instance->getPageLanguageFromCache( Title::newFromText( 'Foo' ) )
252
		);
253
	}
254
255
	/**
256
	 * @dataProvider pageLanguageCacheStrategyProvider
257
	 */
258
	public function testNoLanguageTargetLinksDeleteForNonMatchedTarget( $pageLanguageCacheStrategy ) {
259
260
		$interlanguageLink = new InterlanguageLink( 'en', 'Foo' );
261
262
		$languageTargetLinks = array(
263
			'bo' => 'Bar',
264
			'en' => Title::newFromText( 'Foo' )
265
		);
266
267
		$instance = new LanguageTargetLinksCache(
268
			$this->cache,
269
			$this->cacheKeyProvider
270
		);
271
272
		$instance->setPageLanguageCacheStrategy( $pageLanguageCacheStrategy );
273
274
		$instance->saveLanguageTargetLinksToCache(
275
			$interlanguageLink,
276
			$languageTargetLinks
277
		);
278
279
		$linkReferences = array(
280
			new DIWikiPage( 'canNotBeMatched', NS_MAIN ),
281
			Title::newFromText( 'invalidMatch' ),
282
			'invalidMatch'
283
		);
284
285
		$instance->deleteLanguageTargetLinksFromCache( $linkReferences );
286
287
		$this->assertEquals(
288
			$languageTargetLinks,
289
			$instance->getLanguageTargetLinksFromCache( $interlanguageLink )
290
		);
291
	}
292
293
	/**
294
	 * @dataProvider pageLanguageCacheStrategyProvider
295
	 */
296
	public function testUpdatePageLanguageToCache( $pageLanguageCacheStrategy ) {
297
298
		$id = 'foo:sil:page:';
299
		$data = 'bo';
300
301
		if ( $pageLanguageCacheStrategy === 'blob' ) {
302
			$id = 'foo:sil:blob:';
303
			$data = array( 'foo:sil:page:ddc35f88fa71b6ef142ae61f35364653' => 'bo' );
304
		}
305
306
		$title = Title::newFromText( 'Bar', NS_MAIN );
307
308
		$cache = $this->getMockBuilder( '\Onoi\Cache\Cache' )
309
			->disableOriginalConstructor()
310
			->getMockForAbstractClass();
311
312
		$cache->expects( $this->once() )
313
			->method( 'save' )
314
			->with(
315
				$this->stringContains( $id ) ,
316
				$this->equalTo( $data ) );
317
318
		$cacheKeyProvider = $this->cacheKeyProvider;
319
320
		$instance = new LanguageTargetLinksCache( $cache, $cacheKeyProvider );
321
		$instance->setPageLanguageCacheStrategy( $pageLanguageCacheStrategy );
322
323
		$instance->updatePageLanguageToCache( $title, 'bo' );
324
	}
325
326
	public function testTryToGetLanguageTargetLinksFromCacheOnNullLinkReference() {
327
328
		$interlanguageLink = $this->getMockBuilder( '\SIL\InterlanguageLink' )
329
			->disableOriginalConstructor()
330
			->getMock();
331
332
		$interlanguageLink->expects( $this->once() )
333
			->method( 'getLinkReference' );
334
335
		// Can occur on an invalid title
336
		// $interlanguageLink = new InterlanguageLink( 'en', '<>Foo' );
337
338
		$instance = new LanguageTargetLinksCache(
339
			$this->cache,
340
			$this->cacheKeyProvider
341
		);
342
343
		$this->assertFalse(
344
			$instance->getLanguageTargetLinksFromCache( $interlanguageLink )
345
		);
346
	}
347
348
	public function pageLanguageCacheStrategyProvider() {
349
350
		$provider = array(
351
			array( 'blob' ),
352
			array( 'non-blob' )
353
		);
354
355
		return $provider;
356
	}
357
358
}
359