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