Completed
Push — master ( 9e1461...cdd4b1 )
by
unknown
13:17
created

testValidLanguageCodeByLowerCaseComparison()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 28

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 0
Metric Value
dl 0
loc 28
rs 9.472
c 2
b 0
f 0
cc 1
nc 1
nop 0
1
<?php
2
3
namespace SIL\Tests;
4
5
use SIL\InterlanguageLinkParserFunction;
6
7
/**
8
 * @covers \SIL\InterlanguageLinkParserFunction
9
 * @group semantic-interlanguage-links
10
 *
11
 * @license GNU GPL v2+
12
 * @since 1.0
13
 *
14
 * @author mwjames
15
 */
16
class InterlanguageLinkParserFunctionTest extends \PHPUnit_Framework_TestCase {
17
18
	private $languageLinkAnnotator;
19
	private $siteLanguageLinksParserOutputAppender;
20
	private $pageContentLanguageOnTheFlyModifier;
21
	private $pageContentLanguageDbModifier;
22
23
	protected function setUp() {
24
		parent::setUp();
25
26
		$this->languageLinkAnnotator = $this->getMockBuilder( '\SIL\LanguageLinkAnnotator' )
27
			->disableOriginalConstructor()
28
			->getMock();
29
30
		$this->languageLinkAnnotator->expects( $this->any() )
31
			->method( 'canAddAnnotation' )
32
			->will( $this->returnValue( true ) );
33
34
		$this->siteLanguageLinksParserOutputAppender = $this->getMockBuilder( '\SIL\SiteLanguageLinksParserOutputAppender' )
35
			->disableOriginalConstructor()
36
			->getMock();
37
38
		$this->pageContentLanguageOnTheFlyModifier = $this->getMockBuilder( '\SIL\PageContentLanguageOnTheFlyModifier' )
39
			->disableOriginalConstructor()
40
			->getMock();
41
42
		$this->pageContentLanguageDbModifier = $this->getMockBuilder( '\SIL\PageContentLanguageDbModifier' )
43
			->disableOriginalConstructor()
44
			->getMock();
45
	}
46
47
	public function testCanConstruct() {
48
49
		$title = $this->getMockBuilder( '\Title' )
50
			->disableOriginalConstructor()
51
			->getMock();
52
53
		$this->assertInstanceOf(
54
			'\SIL\InterlanguageLinkParserFunction',
55
			new InterlanguageLinkParserFunction(
56
				$title,
57
				$this->languageLinkAnnotator,
58
				$this->siteLanguageLinksParserOutputAppender,
59
				$this->pageContentLanguageOnTheFlyModifier,
60
				$this->pageContentLanguageDbModifier
61
			)
62
		);
63
	}
64
65
	public function testTryParseThatCausesErrorMessage() {
66
67
		$title = $this->getMockBuilder( '\Title' )
68
			->disableOriginalConstructor()
69
			->getMock();
70
71
		$instance = new InterlanguageLinkParserFunction(
72
			$title,
73
			$this->languageLinkAnnotator,
74
			$this->siteLanguageLinksParserOutputAppender,
75
			$this->pageContentLanguageOnTheFlyModifier,
76
			$this->pageContentLanguageDbModifier
77
		);
78
79
		$instance->setInterlanguageLinksHideState( true );
80
81
		$this->assertInternalType(
82
			'string',
83
			$instance->parse( 'en', 'Foo' )
84
		);
85
86
		$instance->setInterlanguageLinksHideState( false );
87
88
		$this->assertInternalType(
89
			'string',
90
			$instance->parse( '%42$', 'Foo' )
91
		);
92
93
		$this->assertContains(
94
			'-error',
95
			$instance->parse( '', 'Foo' )
96
		);
97
98
		$this->assertContains(
99
			'-error',
100
			$instance->parse( 'en', '{[[:Template:Foo]]' )
101
		);
102
	}
103
104
	public function testParseToCreateErrorMessageForKnownTarget() {
105
106
		$title = \Title::newFromText( __METHOD__ );
107
108
		$this->languageLinkAnnotator->expects( $this->never() )
109
			->method( 'addAnnotationForInterlanguageLink' );
110
111
		$this->siteLanguageLinksParserOutputAppender->expects( $this->once() )
112
			->method( 'getRedirectTargetFor' )
113
			->with(	$this->equalTo( \Title::newFromText( 'Foo' ) ) )
114
			->will( $this->returnValue( $title ) );
115
116
		$this->siteLanguageLinksParserOutputAppender->expects( $this->once() )
117
			->method( 'tryAddLanguageTargetLinksToOutput' )
118
			->with(
119
				$this->anything(),
120
				$this->equalTo( $title ) )
121
			->will( $this->returnValue( 'Foo' ) );
122
123
		$instance = new InterlanguageLinkParserFunction(
124
			$title,
125
			$this->languageLinkAnnotator,
126
			$this->siteLanguageLinksParserOutputAppender,
127
			$this->pageContentLanguageOnTheFlyModifier,
128
			$this->pageContentLanguageDbModifier
129
		);
130
131
		$instance->setInterlanguageLinksHideState( false );
132
133
		$this->assertContains(
134
			'-error',
135
			$instance->parse( 'en', 'Foo' )
136
		);
137
	}
138
139
	public function testMultipleParseCalls() {
140
141
		$title = \Title::newFromText( __METHOD__ );
142
143
		$this->siteLanguageLinksParserOutputAppender->expects( $this->any() )
144
			->method( 'getRedirectTargetFor' )
145
			->will( $this->returnValue( $title ) );
146
147
		$instance = new InterlanguageLinkParserFunction(
148
			$title,
149
			$this->languageLinkAnnotator,
150
			$this->siteLanguageLinksParserOutputAppender,
151
			$this->pageContentLanguageOnTheFlyModifier,
152
			$this->pageContentLanguageDbModifier
153
		);
154
155
		$this->assertContains(
156
			'div class="sil-interlanguagelink"',
157
			$instance->parse( 'en', 'Foo' )
158
		);
159
160
		$this->assertContains(
161
			'div class="sil-interlanguagelink"',
162
			$instance->parse( 'en', 'Foo' )
163
		);
164
	}
165
166
	public function testMultipleParseCallsWithDifferentLanguagesTriggersErrorMessage() {
167
168
		$title = \Title::newFromText( __METHOD__ );
169
170
		$this->languageLinkAnnotator->expects( $this->any() )
171
			->method( 'hasDifferentLanguageAnnotation' )
172
			->will( $this->onConsecutiveCalls( false, true ) );
173
174
		$this->siteLanguageLinksParserOutputAppender->expects( $this->any() )
175
			->method( 'getRedirectTargetFor' )
176
			->will( $this->returnValue( $title ) );
177
178
		$instance = new InterlanguageLinkParserFunction(
179
			$title,
180
			$this->languageLinkAnnotator,
181
			$this->siteLanguageLinksParserOutputAppender,
182
			$this->pageContentLanguageOnTheFlyModifier,
183
			$this->pageContentLanguageDbModifier
184
		);
185
186
		$instance->parse( 'en', 'Foo' );
187
188
		$this->assertContains(
189
			'-error',
190
			$instance->parse( 'fr', 'Foo' )
191
		);
192
	}
193
194
	public function testParse() {
195
196
		$title = $this->getMockBuilder( '\Title' )
197
			->disableOriginalConstructor()
198
			->getMock();
199
200
		$this->languageLinkAnnotator->expects( $this->once() )
201
			->method( 'addAnnotationForInterlanguageLink' );
202
203
		$this->siteLanguageLinksParserOutputAppender->expects( $this->any() )
204
			->method( 'getRedirectTargetFor' )
205
			->will( $this->returnValue( $title ) );
206
207
		$instance = new InterlanguageLinkParserFunction(
208
			$title,
209
			$this->languageLinkAnnotator,
210
			$this->siteLanguageLinksParserOutputAppender,
211
			$this->pageContentLanguageOnTheFlyModifier,
212
			$this->pageContentLanguageDbModifier
213
		);
214
215
		$instance->setInterlanguageLinksHideState( false );
216
217
		$this->assertContains(
218
			'div class="sil-interlanguagelink"',
219
			$instance->parse( 'en', 'Foo' )
220
		);
221
	}
222
223
	public function testValidLanguageCodeByLowerCaseComparison() {
224
225
		$title = $this->getMockBuilder( '\Title' )
226
			->disableOriginalConstructor()
227
			->getMock();
228
229
		$this->languageLinkAnnotator->expects( $this->once() )
230
			->method( 'addAnnotationForInterlanguageLink' );
231
232
		$this->siteLanguageLinksParserOutputAppender->expects( $this->any() )
233
			->method( 'getRedirectTargetFor' )
234
			->will( $this->returnValue( $title ) );
235
236
		$instance = new InterlanguageLinkParserFunction(
237
			$title,
238
			$this->languageLinkAnnotator,
239
			$this->siteLanguageLinksParserOutputAppender,
240
			$this->pageContentLanguageOnTheFlyModifier,
241
			$this->pageContentLanguageDbModifier
242
		);
243
244
		$instance->setInterlanguageLinksHideState( false );
245
246
		$this->assertContains(
247
			'div class="sil-interlanguagelink"',
248
			$instance->parse( 'zh-Hans', 'Foo' )
249
		);
250
	}
251
252
	public function testRevisionMode() {
253
254
		$title = $this->getMockBuilder( '\Title' )
255
			->disableOriginalConstructor()
256
			->getMock();
257
258
		$this->siteLanguageLinksParserOutputAppender->expects( $this->any() )
259
			->method( 'getRedirectTargetFor' )
260
			->will( $this->returnValue( $title ) );
261
262
		$instance = new InterlanguageLinkParserFunction(
263
			$title,
264
			$this->languageLinkAnnotator,
265
			$this->siteLanguageLinksParserOutputAppender,
266
			$this->pageContentLanguageOnTheFlyModifier,
267
			$this->pageContentLanguageDbModifier
268
		);
269
270
		$instance->setRevisionModeState( true );
271
272
		$this->assertEmpty(
273
			$instance->parse( 'en', 'Foo' )
274
		);
275
	}
276
277
	public function testAnnotationModeIsDisabled() {
278
279
		$title = $this->getMockBuilder( '\Title' )
280
			->disableOriginalConstructor()
281
			->getMock();
282
283
		$languageLinkAnnotator = $this->getMockBuilder( '\SIL\LanguageLinkAnnotator' )
284
			->disableOriginalConstructor()
285
			->getMock();
286
287
		$languageLinkAnnotator->expects( $this->once() )
288
			->method( 'canAddAnnotation' )
289
			->will( $this->returnValue( false ) );
290
291
		$instance = new InterlanguageLinkParserFunction(
292
			$title,
293
			$languageLinkAnnotator,
294
			$this->siteLanguageLinksParserOutputAppender,
295
			$this->pageContentLanguageOnTheFlyModifier,
296
			$this->pageContentLanguageDbModifier
297
		);
298
299
		$this->assertEmpty(
300
			$instance->parse( 'en', 'Foo' )
301
		);
302
	}
303
304
	public function testAddLanguageCodeToPageContentLanguageIntermediaryCache() {
305
306
		$title = $this->getMockBuilder( '\Title' )
307
			->disableOriginalConstructor()
308
			->getMock();
309
310
		$languageLinkAnnotator = $this->getMockBuilder( '\SIL\LanguageLinkAnnotator' )
311
			->disableOriginalConstructor()
312
			->getMock();
313
314
		$this->pageContentLanguageOnTheFlyModifier->expects( $this->once() )
315
			->method( 'addToIntermediaryCache' );
316
317
		$instance = new InterlanguageLinkParserFunction(
318
			$title,
319
			$languageLinkAnnotator,
320
			$this->siteLanguageLinksParserOutputAppender,
321
			$this->pageContentLanguageOnTheFlyModifier,
322
			$this->pageContentLanguageDbModifier
323
		);
324
325
		$instance->setRevisionModeState( true );
326
		$instance->parse( 'en', 'Foo' );
327
	}
328
329
}
330