3 namespace Tests\Wallabag\CoreBundle\Helper
;
5 use Psr\Log\NullLogger
;
7 use Monolog\Handler\TestHandler
;
8 use Wallabag\CoreBundle\Helper\ContentProxy
;
9 use Wallabag\CoreBundle\Entity\Entry
;
10 use Wallabag\CoreBundle\Entity\Tag
;
11 use Wallabag\UserBundle\Entity\User
;
12 use Wallabag\CoreBundle\Helper\RuleBasedTagger
;
14 use Monolog\Handler\TestHandler
;
17 class ContentProxyTest
extends \PHPUnit_Framework_TestCase
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>.';
21 public function testWithBadUrl()
23 $tagger = $this->getTaggerMock();
24 $tagger->expects($this->once())
27 $graby = $this->getMockBuilder('Graby\Graby')
28 ->setMethods(['fetchContent'])
29 ->disableOriginalConstructor()
32 $graby->expects($this->any())
33 ->method('fetchContent')
42 $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage
);
43 $entry = new Entry(new User());
44 $proxy->updateEntry($entry, 'http://user@:80');
46 $this->assertEquals('http://user@:80', $entry->getUrl());
47 $this->assertEmpty($entry->getTitle());
48 $this->assertEquals($this->fetchingErrorMessage
, $entry->getContent());
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());
56 public function testWithEmptyContent()
58 $tagger = $this->getTaggerMock();
59 $tagger->expects($this->once())
62 $graby = $this->getMockBuilder('Graby\Graby')
63 ->setMethods(['fetchContent'])
64 ->disableOriginalConstructor()
67 $graby->expects($this->any())
68 ->method('fetchContent')
77 $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage
);
78 $entry = new Entry(new User());
79 $proxy->updateEntry($entry, 'http://0.0.0.0');
81 $this->assertEquals('http://0.0.0.0', $entry->getUrl());
82 $this->assertEmpty($entry->getTitle());
83 $this->assertEquals($this->fetchingErrorMessage
, $entry->getContent());
84 $this->assertEmpty($entry->getPreviewPicture());
85 $this->assertEmpty($entry->getMimetype());
86 $this->assertEmpty($entry->getLanguage());
87 $this->assertEquals(0.0, $entry->getReadingTime());
88 $this->assertEquals('0.0.0.0', $entry->getDomainName());
91 public function testWithEmptyContentButOG()
93 $tagger = $this->getTaggerMock();
94 $tagger->expects($this->once())
97 $graby = $this->getMockBuilder('Graby\Graby')
98 ->setMethods(['fetchContent'])
99 ->disableOriginalConstructor()
102 $graby->expects($this->any())
103 ->method('fetchContent')
108 'content_type' => '',
112 'og_title' => 'my title',
113 'og_description' => 'desc',
117 $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage
);
118 $entry = new Entry(new User());
119 $proxy->updateEntry($entry, 'http://domain.io');
121 $this->assertEquals('http://domain.io', $entry->getUrl());
122 $this->assertEquals('my title', $entry->getTitle());
123 $this->assertEquals($this->fetchingErrorMessage
.'<p><i>But we found a short description: </i></p>desc', $entry->getContent());
124 $this->assertEmpty($entry->getPreviewPicture());
125 $this->assertEmpty($entry->getLanguage());
126 $this->assertEmpty($entry->getHttpStatus());
127 $this->assertEmpty($entry->getMimetype());
128 $this->assertEquals(0.0, $entry->getReadingTime());
129 $this->assertEquals('domain.io', $entry->getDomainName());
132 public function testWithContent()
134 $tagger = $this->getTaggerMock();
135 $tagger->expects($this->once())
138 $graby = $this->getMockBuilder('Graby\Graby')
139 ->setMethods(['fetchContent'])
140 ->disableOriginalConstructor()
143 $graby->expects($this->any())
144 ->method('fetchContent')
146 'html' => str_repeat('this is my content', 325),
147 'title' => 'this is my title',
148 'url' => 'http://1.1.1.1',
149 'content_type' => 'text/html',
153 'og_title' => 'my OG title',
154 'og_description' => 'OG desc',
155 'og_image' => 'http://3.3.3.3/cover.jpg',
159 $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage
);
160 $entry = new Entry(new User());
161 $proxy->updateEntry($entry, 'http://0.0.0.0');
163 $this->assertEquals('http://1.1.1.1', $entry->getUrl());
164 $this->assertEquals('this is my title', $entry->getTitle());
165 $this->assertContains('this is my content', $entry->getContent());
166 $this->assertEquals('http://3.3.3.3/cover.jpg', $entry->getPreviewPicture());
167 $this->assertEquals('text/html', $entry->getMimetype());
168 $this->assertEquals('fr', $entry->getLanguage());
169 $this->assertEquals('200', $entry->getHttpStatus());
170 $this->assertEquals(4.0, $entry->getReadingTime());
171 $this->assertEquals('1.1.1.1', $entry->getDomainName());
174 public function testWithContentAndNoOgImage()
176 $tagger = $this->getTaggerMock();
177 $tagger->expects($this->once())
180 $graby = $this->getMockBuilder('Graby\Graby')
181 ->setMethods(['fetchContent'])
182 ->disableOriginalConstructor()
185 $graby->expects($this->any())
186 ->method('fetchContent')
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',
195 'og_title' => 'my OG title',
196 'og_description' => 'OG desc',
201 $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage
);
202 $entry = new Entry(new User());
203 $proxy->updateEntry($entry, 'http://0.0.0.0');
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());
216 public function testWithForcedContent()
218 $tagger = $this->getTaggerMock();
219 $tagger->expects($this->once())
222 $proxy = new ContentProxy((new Graby()), $tagger, $this->getLogger(), $this->fetchingErrorMessage
);
223 $entry = new Entry(new User());
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',
233 'date' => '1395635872',
234 'authors' => ['Jeremy', 'Nico', 'Thomas'],
236 'Cache-Control' => 'no-cache',
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());
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());
255 public function testWithForcedContentAndDatetime()
257 $tagger = $this->getTaggerMock();
258 $tagger->expects($this->once())
261 $logHandler = new TestHandler();
262 $logger = new Logger('test', array($logHandler));
264 $proxy = new ContentProxy((new Graby()), $tagger, $logger, $this->fetchingErrorMessage
);
265 $entry = new Entry(new User());
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',
274 'date' => '2016-09-08T11:55:58+0200',
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'));
288 public function testWithForcedContentAndBadDate()
290 $tagger = $this->getTaggerMock();
291 $tagger->expects($this->once())
294 $logger = new Logger('foo');
295 $handler = new TestHandler();
296 $logger->pushHandler($handler);
298 $proxy = new ContentProxy((new Graby()), $tagger, $logger, $this->fetchingErrorMessage
);
299 $entry = new Entry(new User());
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',
308 'date' => '01 02 2012',
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());
321 $records = $handler->getRecords();
323 $this->assertCount(1, $records);
324 $this->assertContains('Error while defining date', $records[0]['message']);
327 public function testTaggerThrowException()
329 $graby = $this->getMockBuilder('Graby\Graby')
330 ->disableOriginalConstructor()
333 $tagger = $this->getTaggerMock();
334 $tagger->expects($this->once())
336 ->will($this->throwException(new \
Exception()));
338 $proxy = new ContentProxy($graby, $tagger, $this->getLogger(), $this->fetchingErrorMessage
);
340 $entry = new Entry(new User());
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',
348 $proxy->importEntry($entry, $content, true);
350 $this->assertCount(0, $entry->getTags());
353 public function dataForCrazyHtml()
356 'script and comment' => [
357 '<strong>Script inside:</strong> <!--[if gte IE 4]><script>alert(\'lol\');</script><![endif]--><br />',
361 '<strong>Script inside:</strong><script>alert(\'lol\');</script>',
368 * @dataProvider dataForCrazyHtml
370 public function testWithCrazyHtmlContent($html, $escapedString)
372 $tagger = $this->getTaggerMock();
373 $tagger->expects($this->once())
376 $proxy = new ContentProxy((new Graby()), $tagger, $this->getLogger(), $this->fetchingErrorMessage
);
377 $entry = $proxy->updateEntry(
378 new Entry(new User()),
382 'title' => 'this is my title',
383 'url' => 'http://1.1.1.1',
384 'content_type' => 'text/html',
388 'og_title' => 'my OG title',
389 'og_description' => 'OG desc',
390 'og_image' => 'http://3.3.3.3/cover.jpg',
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());
405 private function getTaggerMock()
407 return $this->getMockBuilder(RuleBasedTagger
::class)
408 ->setMethods(['tag'])
409 ->disableOriginalConstructor()
413 private function getLogger()
415 return new NullLogger();