Completed
Push — master ( bb3081...b26d3d )
by mw
9s
created

testAddLanguageCodeToPageContentLanguageIntermediaryCache()   B

Complexity

Conditions 1
Paths 1

Size

Total Lines 24
Code Lines 17

Duplication

Lines 0
Ratio 0 %

Importance

Changes 2
Bugs 0 Features 2
Metric Value
c 2
b 0
f 2
dl 0
loc 24
rs 8.9713
cc 1
eloc 17
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(
0 ignored issues
show
Bug introduced by
The call to InterlanguageLinkParserFunction::__construct() misses a required argument $pageContentLanguageDbModifier.

This check looks for function calls that miss required arguments.

Loading history...
237
			$title,
238
			$this->languageLinkAnnotator,
239
			$this->siteLanguageLinksParserOutputAppender,
240
			$this->pageContentLanguageModifier
241
		);
242
243
		$instance->setInterlanguageLinksHideState( false );
244
245
		$this->assertContains(
246
			'div class="sil-interlanguagelink"',
247
			$instance->parse( 'zh-Hans', 'Foo' )
248
		);
249
	}
250
251
	public function testRevisionMode() {
252
253
		$title = $this->getMockBuilder( '\Title' )
254
			->disableOriginalConstructor()
255
			->getMock();
256
257
		$this->siteLanguageLinksParserOutputAppender->expects( $this->any() )
258
			->method( 'getRedirectTargetFor' )
259
			->will( $this->returnValue( $title ) );
260
261
		$instance = new InterlanguageLinkParserFunction(
262
			$title,
263
			$this->languageLinkAnnotator,
264
			$this->siteLanguageLinksParserOutputAppender,
265
			$this->pageContentLanguageOnTheFlyModifier,
266
			$this->pageContentLanguageDbModifier
267
		);
268
269
		$instance->setRevisionModeState( true );
270
271
		$this->assertEmpty(
272
			$instance->parse( 'en', 'Foo' )
273
		);
274
	}
275
276
	public function testAnnotationModeIsDisabled() {
277
278
		$title = $this->getMockBuilder( '\Title' )
279
			->disableOriginalConstructor()
280
			->getMock();
281
282
		$languageLinkAnnotator = $this->getMockBuilder( '\SIL\LanguageLinkAnnotator' )
283
			->disableOriginalConstructor()
284
			->getMock();
285
286
		$languageLinkAnnotator->expects( $this->once() )
287
			->method( 'canAddAnnotation' )
288
			->will( $this->returnValue( false ) );
289
290
		$instance = new InterlanguageLinkParserFunction(
291
			$title,
292
			$languageLinkAnnotator,
293
			$this->siteLanguageLinksParserOutputAppender,
294
			$this->pageContentLanguageOnTheFlyModifier,
295
			$this->pageContentLanguageDbModifier
296
		);
297
298
		$this->assertEmpty(
299
			$instance->parse( 'en', 'Foo' )
300
		);
301
	}
302
303
	public function testAddLanguageCodeToPageContentLanguageIntermediaryCache() {
304
305
		$title = $this->getMockBuilder( '\Title' )
306
			->disableOriginalConstructor()
307
			->getMock();
308
309
		$languageLinkAnnotator = $this->getMockBuilder( '\SIL\LanguageLinkAnnotator' )
310
			->disableOriginalConstructor()
311
			->getMock();
312
313
		$this->pageContentLanguageOnTheFlyModifier->expects( $this->once() )
314
			->method( 'addToIntermediaryCache' );
315
316
		$instance = new InterlanguageLinkParserFunction(
317
			$title,
318
			$languageLinkAnnotator,
319
			$this->siteLanguageLinksParserOutputAppender,
320
			$this->pageContentLanguageOnTheFlyModifier,
321
			$this->pageContentLanguageDbModifier
322
		);
323
324
		$instance->setRevisionModeState( true );
325
		$instance->parse( 'en', 'Foo' );
326
	}
327
328
}
329