]> git.immae.eu Git - github/wallabag/wallabag.git/blame - tests/Wallabag/CoreBundle/Helper/ContentProxyTest.php
Merge pull request #3187 from wallabag/api-client-credentials
[github/wallabag/wallabag.git] / tests / Wallabag / CoreBundle / Helper / ContentProxyTest.php
CommitLineData
558d9aab
JB
1<?php
2
a2c1b94e 3namespace Tests\Wallabag\CoreBundle\Helper;
558d9aab 4
0c5bcd82 5use Psr\Log\NullLogger;
d5c2cc54
JB
6use Monolog\Logger;
7use Monolog\Handler\TestHandler;
558d9aab 8use Wallabag\CoreBundle\Helper\ContentProxy;
c2656f96
JB
9use Wallabag\CoreBundle\Entity\Entry;
10use Wallabag\CoreBundle\Entity\Tag;
619cc453 11use Wallabag\UserBundle\Entity\User;
6bc6fb1f 12use Wallabag\CoreBundle\Helper\RuleBasedTagger;
74a75f7d 13use Graby\Graby;
558d9aab 14
a2c1b94e 15class ContentProxyTest extends \PHPUnit_Framework_TestCase
558d9aab 16{
ac1509a6 17 private $fetchingErrorMessage = 'wallabag can\'t retrieve contents for this article. Please <a href="http://doc.wallabag.org/en/user/errors_during_fetching.html#how-can-i-help-to-fix-that">troubleshoot this issue</a>.';
a2c1b94e 18
4d0ec0e7
JB
19 public function testWithBadUrl()
20 {
21 $tagger = $this->getTaggerMock();
22 $tagger->expects($this->once())
23 ->method('tag');
24
25 $graby = $this->getMockBuilder('Graby\Graby')
4094ea47 26 ->setMethods(['fetchContent'])
4d0ec0e7
JB
27 ->disableOriginalConstructor()
28 ->getMock();
29
30 $graby->expects($this->any())
31 ->method('fetchContent')
4094ea47 32 ->willReturn([
4d0ec0e7
JB
33 'html' => false,
34 'title' => '',
35 'url' => '',
36 'content_type' => '',
37 'language' => '',
4094ea47 38 ]);
4d0ec0e7 39
6bc6fb1f 40 $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage);
7aba665e
JC
41 $entry = new Entry(new User());
42 $proxy->updateEntry($entry, 'http://user@:80');
4d0ec0e7
JB
43
44 $this->assertEquals('http://user@:80', $entry->getUrl());
45 $this->assertEmpty($entry->getTitle());
fc2b7bda 46 $this->assertEquals($this->fetchingErrorMessage, $entry->getContent());
4d0ec0e7
JB
47 $this->assertEmpty($entry->getPreviewPicture());
48 $this->assertEmpty($entry->getMimetype());
49 $this->assertEmpty($entry->getLanguage());
50 $this->assertEquals(0.0, $entry->getReadingTime());
51 $this->assertEquals(false, $entry->getDomainName());
52 }
53
558d9aab
JB
54 public function testWithEmptyContent()
55 {
f530f7f5
KG
56 $tagger = $this->getTaggerMock();
57 $tagger->expects($this->once())
58 ->method('tag');
59
558d9aab 60 $graby = $this->getMockBuilder('Graby\Graby')
4094ea47 61 ->setMethods(['fetchContent'])
558d9aab
JB
62 ->disableOriginalConstructor()
63 ->getMock();
64
65 $graby->expects($this->any())
66 ->method('fetchContent')
4094ea47 67 ->willReturn([
98f0929f
JB
68 'html' => false,
69 'title' => '',
70 'url' => '',
71 'content_type' => '',
72 'language' => '',
4094ea47 73 ]);
558d9aab 74
6bc6fb1f 75 $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage);
7aba665e
JC
76 $entry = new Entry(new User());
77 $proxy->updateEntry($entry, 'http://0.0.0.0');
558d9aab
JB
78
79 $this->assertEquals('http://0.0.0.0', $entry->getUrl());
80 $this->assertEmpty($entry->getTitle());
fc2b7bda 81 $this->assertEquals($this->fetchingErrorMessage, $entry->getContent());
558d9aab
JB
82 $this->assertEmpty($entry->getPreviewPicture());
83 $this->assertEmpty($entry->getMimetype());
98f0929f 84 $this->assertEmpty($entry->getLanguage());
da3d4998
JB
85 $this->assertEquals(0.0, $entry->getReadingTime());
86 $this->assertEquals('0.0.0.0', $entry->getDomainName());
558d9aab
JB
87 }
88
89 public function testWithEmptyContentButOG()
90 {
f530f7f5
KG
91 $tagger = $this->getTaggerMock();
92 $tagger->expects($this->once())
93 ->method('tag');
94
558d9aab 95 $graby = $this->getMockBuilder('Graby\Graby')
4094ea47 96 ->setMethods(['fetchContent'])
558d9aab
JB
97 ->disableOriginalConstructor()
98 ->getMock();
99
100 $graby->expects($this->any())
101 ->method('fetchContent')
4094ea47 102 ->willReturn([
98f0929f
JB
103 'html' => false,
104 'title' => '',
105 'url' => '',
106 'content_type' => '',
107 'language' => '',
10b35097 108 'status' => '',
4094ea47 109 'open_graph' => [
98f0929f
JB
110 'og_title' => 'my title',
111 'og_description' => 'desc',
4094ea47
JB
112 ],
113 ]);
558d9aab 114
6bc6fb1f 115 $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage);
7aba665e
JC
116 $entry = new Entry(new User());
117 $proxy->updateEntry($entry, 'http://domain.io');
558d9aab 118
da3d4998 119 $this->assertEquals('http://domain.io', $entry->getUrl());
558d9aab 120 $this->assertEquals('my title', $entry->getTitle());
d09fe4d2 121 $this->assertEquals($this->fetchingErrorMessage.'<p><i>But we found a short description: </i></p>desc', $entry->getContent());
558d9aab 122 $this->assertEmpty($entry->getPreviewPicture());
98f0929f 123 $this->assertEmpty($entry->getLanguage());
10b35097 124 $this->assertEmpty($entry->getHttpStatus());
558d9aab 125 $this->assertEmpty($entry->getMimetype());
da3d4998
JB
126 $this->assertEquals(0.0, $entry->getReadingTime());
127 $this->assertEquals('domain.io', $entry->getDomainName());
558d9aab
JB
128 }
129
130 public function testWithContent()
131 {
f530f7f5
KG
132 $tagger = $this->getTaggerMock();
133 $tagger->expects($this->once())
134 ->method('tag');
135
558d9aab 136 $graby = $this->getMockBuilder('Graby\Graby')
4094ea47 137 ->setMethods(['fetchContent'])
558d9aab
JB
138 ->disableOriginalConstructor()
139 ->getMock();
140
141 $graby->expects($this->any())
142 ->method('fetchContent')
4094ea47 143 ->willReturn([
da3d4998 144 'html' => str_repeat('this is my content', 325),
558d9aab
JB
145 'title' => 'this is my title',
146 'url' => 'http://1.1.1.1',
147 'content_type' => 'text/html',
98f0929f 148 'language' => 'fr',
10b35097 149 'status' => '200',
4094ea47 150 'open_graph' => [
558d9aab
JB
151 'og_title' => 'my OG title',
152 'og_description' => 'OG desc',
f1e29e69 153 'og_image' => 'http://3.3.3.3/cover.jpg',
4094ea47
JB
154 ],
155 ]);
558d9aab 156
6bc6fb1f 157 $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage);
7aba665e
JC
158 $entry = new Entry(new User());
159 $proxy->updateEntry($entry, 'http://0.0.0.0');
558d9aab
JB
160
161 $this->assertEquals('http://1.1.1.1', $entry->getUrl());
162 $this->assertEquals('this is my title', $entry->getTitle());
da3d4998 163 $this->assertContains('this is my content', $entry->getContent());
558d9aab
JB
164 $this->assertEquals('http://3.3.3.3/cover.jpg', $entry->getPreviewPicture());
165 $this->assertEquals('text/html', $entry->getMimetype());
98f0929f 166 $this->assertEquals('fr', $entry->getLanguage());
10b35097 167 $this->assertEquals('200', $entry->getHttpStatus());
da3d4998
JB
168 $this->assertEquals(4.0, $entry->getReadingTime());
169 $this->assertEquals('1.1.1.1', $entry->getDomainName());
558d9aab 170 }
f530f7f5 171
3d71d403
JB
172 public function testWithContentAndNoOgImage()
173 {
174 $tagger = $this->getTaggerMock();
175 $tagger->expects($this->once())
176 ->method('tag');
177
178 $graby = $this->getMockBuilder('Graby\Graby')
179 ->setMethods(['fetchContent'])
180 ->disableOriginalConstructor()
181 ->getMock();
182
183 $graby->expects($this->any())
184 ->method('fetchContent')
185 ->willReturn([
186 'html' => str_repeat('this is my content', 325),
187 'title' => 'this is my title',
188 'url' => 'http://1.1.1.1',
189 'content_type' => 'text/html',
190 'language' => 'fr',
191 'status' => '200',
192 'open_graph' => [
193 'og_title' => 'my OG title',
194 'og_description' => 'OG desc',
195 'og_image' => false,
196 ],
197 ]);
198
6bc6fb1f 199 $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage);
d5c2cc54
JB
200 $entry = new Entry(new User());
201 $proxy->updateEntry($entry, 'http://0.0.0.0');
3d71d403
JB
202
203 $this->assertEquals('http://1.1.1.1', $entry->getUrl());
204 $this->assertEquals('this is my title', $entry->getTitle());
205 $this->assertContains('this is my content', $entry->getContent());
206 $this->assertNull($entry->getPreviewPicture());
207 $this->assertEquals('text/html', $entry->getMimetype());
208 $this->assertEquals('fr', $entry->getLanguage());
209 $this->assertEquals('200', $entry->getHttpStatus());
210 $this->assertEquals(4.0, $entry->getReadingTime());
211 $this->assertEquals('1.1.1.1', $entry->getDomainName());
212 }
213
4d0ec0e7
JB
214 public function testWithForcedContent()
215 {
216 $tagger = $this->getTaggerMock();
217 $tagger->expects($this->once())
218 ->method('tag');
219
0d6cfb88 220 $proxy = new ContentProxy((new Graby()), $tagger, $this->getLogger(), $this->fetchingErrorMessage);
7aba665e
JC
221 $entry = new Entry(new User());
222 $proxy->updateEntry(
223 $entry,
0d6cfb88
JB
224 'http://0.0.0.0',
225 [
226 'html' => str_repeat('this is my content', 325),
227 'title' => 'this is my title',
228 'url' => 'http://1.1.1.1',
229 'content_type' => 'text/html',
230 'language' => 'fr',
f0378b4d
JB
231 'date' => '1395635872',
232 'authors' => ['Jeremy', 'Nico', 'Thomas'],
233 'all_headers' => [
234 'Cache-Control' => 'no-cache',
38a04dee 235 ],
0d6cfb88
JB
236 ]
237 );
4d0ec0e7
JB
238
239 $this->assertEquals('http://1.1.1.1', $entry->getUrl());
240 $this->assertEquals('this is my title', $entry->getTitle());
241 $this->assertContains('this is my content', $entry->getContent());
242 $this->assertEquals('text/html', $entry->getMimetype());
243 $this->assertEquals('fr', $entry->getLanguage());
244 $this->assertEquals(4.0, $entry->getReadingTime());
245 $this->assertEquals('1.1.1.1', $entry->getDomainName());
f0378b4d
JB
246 $this->assertEquals('24/03/2014', $entry->getPublishedAt()->format('d/m/Y'));
247 $this->assertContains('Jeremy', $entry->getPublishedBy());
248 $this->assertContains('Nico', $entry->getPublishedBy());
249 $this->assertContains('Thomas', $entry->getPublishedBy());
250 $this->assertContains('no-cache', $entry->getHeaders());
251 }
252
253 public function testWithForcedContentAndDatetime()
254 {
255 $tagger = $this->getTaggerMock();
256 $tagger->expects($this->once())
257 ->method('tag');
258
d5c2cc54 259 $logHandler = new TestHandler();
6acadf8e 260 $logger = new Logger('test', [$logHandler]);
d5c2cc54
JB
261
262 $proxy = new ContentProxy((new Graby()), $tagger, $logger, $this->fetchingErrorMessage);
7aba665e 263 $entry = new Entry(new User());
6acadf8e 264 $proxy->updateEntry(
7aba665e 265 $entry,
6acadf8e 266 'http://1.1.1.1',
f0378b4d
JB
267 [
268 'html' => str_repeat('this is my content', 325),
269 'title' => 'this is my title',
270 'url' => 'http://1.1.1.1',
271 'content_type' => 'text/html',
272 'language' => 'fr',
273 'date' => '2016-09-08T11:55:58+0200',
274 ]
275 );
276
277 $this->assertEquals('http://1.1.1.1', $entry->getUrl());
278 $this->assertEquals('this is my title', $entry->getTitle());
279 $this->assertContains('this is my content', $entry->getContent());
280 $this->assertEquals('text/html', $entry->getMimetype());
281 $this->assertEquals('fr', $entry->getLanguage());
282 $this->assertEquals(4.0, $entry->getReadingTime());
283 $this->assertEquals('1.1.1.1', $entry->getDomainName());
284 $this->assertEquals('08/09/2016', $entry->getPublishedAt()->format('d/m/Y'));
285 }
286
287 public function testWithForcedContentAndBadDate()
288 {
289 $tagger = $this->getTaggerMock();
290 $tagger->expects($this->once())
291 ->method('tag');
292
293 $logger = new Logger('foo');
294 $handler = new TestHandler();
295 $logger->pushHandler($handler);
296
695af588 297 $proxy = new ContentProxy((new Graby()), $tagger, $logger, $this->fetchingErrorMessage);
7aba665e
JC
298 $entry = new Entry(new User());
299 $proxy->updateEntry(
300 $entry,
6acadf8e 301 'http://1.1.1.1',
f0378b4d
JB
302 [
303 'html' => str_repeat('this is my content', 325),
304 'title' => 'this is my title',
305 'url' => 'http://1.1.1.1',
306 'content_type' => 'text/html',
307 'language' => 'fr',
308 'date' => '01 02 2012',
309 ]
310 );
311
312 $this->assertEquals('http://1.1.1.1', $entry->getUrl());
313 $this->assertEquals('this is my title', $entry->getTitle());
314 $this->assertContains('this is my content', $entry->getContent());
315 $this->assertEquals('text/html', $entry->getMimetype());
316 $this->assertEquals('fr', $entry->getLanguage());
317 $this->assertEquals(4.0, $entry->getReadingTime());
318 $this->assertEquals('1.1.1.1', $entry->getDomainName());
319 $this->assertNull($entry->getPublishedAt());
320
321 $records = $handler->getRecords();
322
323 $this->assertCount(1, $records);
324 $this->assertContains('Error while defining date', $records[0]['message']);
4d0ec0e7
JB
325 }
326
327 public function testTaggerThrowException()
328 {
4d0ec0e7
JB
329 $tagger = $this->getTaggerMock();
330 $tagger->expects($this->once())
331 ->method('tag')
332 ->will($this->throwException(new \Exception()));
333
6acadf8e 334 $proxy = new ContentProxy((new Graby()), $tagger, $this->getLogger(), $this->fetchingErrorMessage);
7aba665e 335 $entry = new Entry(new User());
6acadf8e
JB
336 $proxy->updateEntry(
337 $entry,
338 'http://1.1.1.1',
339 [
340 'html' => str_repeat('this is my content', 325),
341 'title' => 'this is my title',
342 'url' => 'http://1.1.1.1',
343 'content_type' => 'text/html',
344 'language' => 'fr',
345 ]
d0e9b3d6 346 );
4d0ec0e7
JB
347
348 $this->assertCount(0, $entry->getTags());
349 }
350
74a75f7d
JB
351 public function dataForCrazyHtml()
352 {
353 return [
354 'script and comment' => [
355 '<strong>Script inside:</strong> <!--[if gte IE 4]><script>alert(\'lol\');</script><![endif]--><br />',
38a04dee 356 'lol',
74a75f7d
JB
357 ],
358 'script' => [
359 '<strong>Script inside:</strong><script>alert(\'lol\');</script>',
38a04dee 360 'script',
74a75f7d
JB
361 ],
362 ];
363 }
364
365 /**
366 * @dataProvider dataForCrazyHtml
367 */
368 public function testWithCrazyHtmlContent($html, $escapedString)
369 {
370 $tagger = $this->getTaggerMock();
371 $tagger->expects($this->once())
372 ->method('tag');
373
0d6cfb88 374 $proxy = new ContentProxy((new Graby()), $tagger, $this->getLogger(), $this->fetchingErrorMessage);
6acadf8e
JB
375 $entry = new Entry(new User());
376 $proxy->updateEntry(
377 $entry,
74a75f7d
JB
378 'http://1.1.1.1',
379 [
380 'html' => $html,
381 'title' => 'this is my title',
382 'url' => 'http://1.1.1.1',
383 'content_type' => 'text/html',
384 'language' => 'fr',
385 'status' => '200',
386 'open_graph' => [
387 'og_title' => 'my OG title',
388 'og_description' => 'OG desc',
389 'og_image' => 'http://3.3.3.3/cover.jpg',
390 ],
391 ]
392 );
393
394 $this->assertEquals('http://1.1.1.1', $entry->getUrl());
395 $this->assertEquals('this is my title', $entry->getTitle());
396 $this->assertNotContains($escapedString, $entry->getContent());
397 $this->assertEquals('http://3.3.3.3/cover.jpg', $entry->getPreviewPicture());
398 $this->assertEquals('text/html', $entry->getMimetype());
399 $this->assertEquals('fr', $entry->getLanguage());
400 $this->assertEquals('200', $entry->getHttpStatus());
401 $this->assertEquals('1.1.1.1', $entry->getDomainName());
402 }
403
f530f7f5
KG
404 private function getTaggerMock()
405 {
6bc6fb1f 406 return $this->getMockBuilder(RuleBasedTagger::class)
4094ea47 407 ->setMethods(['tag'])
f530f7f5
KG
408 ->disableOriginalConstructor()
409 ->getMock();
410 }
1c9cd2a7 411
0c5bcd82 412 private function getLogger()
1c9cd2a7 413 {
0c5bcd82 414 return new NullLogger();
1c9cd2a7 415 }
558d9aab 416}