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