3 namespace Tests\Wallabag\CoreBundle\Controller
;
5 use Tests\Wallabag\CoreBundle\WallabagCoreTestCase
;
6 use Wallabag\CoreBundle\Entity\Config
;
7 use Wallabag\CoreBundle\Entity\Entry
;
8 use Wallabag\CoreBundle\Entity\SiteCredential
;
9 use Wallabag\CoreBundle\Entity\Tag
;
10 use Wallabag\CoreBundle\Helper\ContentProxy
;
12 class EntryControllerTest
extends WallabagCoreTestCase
14 const AN_URL_CONTAINING_AN_ARTICLE_WITH_IMAGE
= 'https://www.lemonde.fr/judo/article/2017/11/11/judo-la-decima-de-teddy-riner_5213605_1556020.html';
15 public $downloadImagesEnabled = false;
16 public $url = 'https://www.lemonde.fr/pixels/article/2019/06/18/ce-qu-il-faut-savoir-sur-le-libra-la-cryptomonnaie-de-facebook_5477887_4408996.html';
21 * Ensure download_images_enabled is disabled after each script
23 public function tearDownImagesEnabled()
25 if ($this->downloadImagesEnabled
) {
26 $client = static::createClient();
27 $client->getContainer()->get('craue_config')->set('download_images_enabled', 0);
29 $this->downloadImagesEnabled
= false;
33 public function testLogin()
35 $client = $this->getClient();
37 $client->request('GET', '/new');
39 $this->assertSame(302, $client->getResponse()->getStatusCode());
40 $this->assertContains('login', $client->getResponse()->headers
->get('location'));
46 public function testQuickstart()
48 $this->logInAs('empty');
49 $client = $this->getClient();
51 $client->request('GET', '/unread/list');
52 $this->assertSame(302, $client->getResponse()->getStatusCode());
53 $crawler = $client->followRedirect();
55 $this->assertSame(200, $client->getResponse()->getStatusCode());
56 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
57 $this->assertContains('quickstart.intro.title', $body[0]);
59 // Test if quickstart is disabled when user has 1 entry
60 $crawler = $client->request('GET', '/new');
62 $this->assertSame(200, $client->getResponse()->getStatusCode());
64 $form = $crawler->filter('form[name=entry]')->form();
67 'entry[url]' => $this->url
,
70 $client->submit($form, $data);
71 $this->assertSame(302, $client->getResponse()->getStatusCode());
72 $client->followRedirect();
74 $crawler = $client->request('GET', '/unread/list');
75 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
76 $this->assertContains('entry.list.number_on_the_page', $body[0]);
79 public function testGetNew()
81 $this->logInAs('admin');
82 $this->useTheme('baggy');
83 $client = $this->getClient();
85 $crawler = $client->request('GET', '/new');
87 $this->assertSame(200, $client->getResponse()->getStatusCode());
89 $this->assertCount(1, $crawler->filter('input[type=url]'));
90 $this->assertCount(1, $crawler->filter('form[name=entry]'));
96 public function testPostNewViaBookmarklet()
98 $this->logInAs('admin');
99 $client = $this->getClient();
101 $crawler = $client->request('GET', '/');
103 $this->assertCount(4, $crawler->filter('li.entry'));
106 $client->request('GET', '/bookmarklet', ['url' => $this->url
]);
107 $this->assertSame(302, $client->getResponse()->getStatusCode());
108 $client->followRedirect();
109 $crawler = $client->request('GET', '/');
110 $this->assertCount(5, $crawler->filter('li.entry'));
112 $em = $client->getContainer()
113 ->get('doctrine.orm.entity_manager');
115 ->getRepository('WallabagCoreBundle:Entry')
116 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
121 public function testPostNewEmpty()
123 $this->logInAs('admin');
124 $client = $this->getClient();
126 $crawler = $client->request('GET', '/new');
128 $this->assertSame(200, $client->getResponse()->getStatusCode());
130 $form = $crawler->filter('form[name=entry]')->form();
132 $crawler = $client->submit($form);
134 $this->assertSame(200, $client->getResponse()->getStatusCode());
135 $this->assertCount(1, $alert = $crawler->filter('form ul li')->extract(['_text']));
136 $this->assertSame('This value should not be blank.', $alert[0]);
140 * @group NetworkCalls
142 public function testPostNewOk()
144 $this->logInAs('admin');
145 $client = $this->getClient();
147 $client->getContainer()->get('craue_config')->set('store_article_headers', 1);
149 $crawler = $client->request('GET', '/new');
151 $this->assertSame(200, $client->getResponse()->getStatusCode());
153 $form = $crawler->filter('form[name=entry]')->form();
156 'entry[url]' => $this->url
,
159 $client->submit($form, $data);
161 $this->assertSame(302, $client->getResponse()->getStatusCode());
163 $content = $client->getContainer()
164 ->get('doctrine.orm.entity_manager')
165 ->getRepository('WallabagCoreBundle:Entry')
166 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
168 $author = $content->getPublishedBy();
170 $this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $content);
171 $this->assertSame($this->url
, $content->getUrl());
172 $this->assertContains('la cryptomonnaie de Facebook', $content->getTitle());
173 $this->assertSame('fr', $content->getLanguage());
174 $this->assertArrayHasKey('x-frame-options', $content->getHeaders());
175 $client->getContainer()->get('craue_config')->set('store_article_headers', 0);
179 * @group NetworkCalls
181 public function testPostWithMultipleAuthors()
183 $url = 'https://www.liberation.fr/planete/2017/04/05/donald-trump-et-xi-jinping-tentative-de-flirt-en-floride_1560768';
184 $this->logInAs('admin');
185 $client = $this->getClient();
187 $crawler = $client->request('GET', '/new');
189 $this->assertSame(200, $client->getResponse()->getStatusCode());
191 $form = $crawler->filter('form[name=entry]')->form();
194 'entry[url]' => $url,
197 $client->submit($form, $data);
199 $this->assertSame(302, $client->getResponse()->getStatusCode());
201 $content = $client->getContainer()
202 ->get('doctrine.orm.entity_manager')
203 ->getRepository('WallabagCoreBundle:Entry')
204 ->findByUrlAndUserId($url, $this->getLoggedInUserId());
206 $this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $content);
207 $authors = $content->getPublishedBy();
208 $this->assertSame('2017-04-05 19:26:13', $content->getPublishedAt()->format('Y-m-d H:i:s'));
209 $this->assertSame('fr', $content->getLanguage());
210 $this->assertSame('Raphaël Balenieri', $authors[0]);
211 $this->assertSame('Frédéric Autran', $authors[1]);
214 public function testPostNewOkUrlExist()
216 $this->logInAs('admin');
218 $entry = new Entry($this->getLoggedInUser());
219 $entry->setUrl($this->url
);
220 $this->getEntityManager()->persist($entry);
221 $this->getEntityManager()->flush();
223 $client = $this->getClient();
225 $crawler = $client->request('GET', '/new');
227 $this->assertSame(200, $client->getResponse()->getStatusCode());
229 $form = $crawler->filter('form[name=entry]')->form();
232 'entry[url]' => $this->url
,
235 $client->submit($form, $data);
237 $this->assertSame(302, $client->getResponse()->getStatusCode());
238 $this->assertContains('/view/', $client->getResponse()->getTargetUrl());
242 * @group NetworkCalls
244 public function testPostNewOkUrlExistWithAccent()
246 $this->logInAs('admin');
247 $client = $this->getClient();
249 $url = 'https://www.aritylabs.com/post/106091708292/des-contr%C3%B4leurs-optionnels-gr%C3%A2ce-%C3%A0-constmissing';
251 $crawler = $client->request('GET', '/new');
253 $this->assertSame(200, $client->getResponse()->getStatusCode());
255 $form = $crawler->filter('form[name=entry]')->form();
258 'entry[url]' => $url,
261 $client->submit($form, $data);
263 $crawler = $client->request('GET', '/new');
265 $this->assertSame(200, $client->getResponse()->getStatusCode());
267 $form = $crawler->filter('form[name=entry]')->form();
270 'entry[url]' => $url,
273 $client->submit($form, $data);
275 $this->assertSame(302, $client->getResponse()->getStatusCode());
276 $this->assertContains('/view/', $client->getResponse()->getTargetUrl());
280 * @group NetworkCalls
282 public function testPostNewOkUrlExistWithRedirection()
284 $this->logInAs('admin');
285 $client = $this->getClient();
287 $url = 'https://wllbg.org/test-redirect/c51c';
289 $crawler = $client->request('GET', '/new');
291 $this->assertSame(200, $client->getResponse()->getStatusCode());
293 $form = $crawler->filter('form[name=entry]')->form();
296 'entry[url]' => $url,
299 $client->submit($form, $data);
301 $crawler = $client->request('GET', '/new');
303 $this->assertSame(200, $client->getResponse()->getStatusCode());
305 $form = $crawler->filter('form[name=entry]')->form();
308 'entry[url]' => $url,
311 $client->submit($form, $data);
313 $this->assertSame(302, $client->getResponse()->getStatusCode());
314 $this->assertContains('/view/', $client->getResponse()->getTargetUrl());
318 * @group NetworkCalls
320 public function testPostNewThatWillBeTagged()
322 $this->logInAs('admin');
323 $client = $this->getClient();
325 $crawler = $client->request('GET', '/new');
327 $this->assertSame(200, $client->getResponse()->getStatusCode());
329 $form = $crawler->filter('form[name=entry]')->form();
332 'entry[url]' => $url = 'https://github.com/wallabag/wallabag',
335 $client->submit($form, $data);
337 $this->assertSame(302, $client->getResponse()->getStatusCode());
338 $this->assertContains('/', $client->getResponse()->getTargetUrl());
340 $em = $client->getContainer()
341 ->get('doctrine.orm.entity_manager');
343 ->getRepository('WallabagCoreBundle:Entry')
344 ->findOneByUrl($url);
345 $tags = $entry->getTags();
347 $this->assertCount(2, $tags);
348 $this->assertContains('wallabag', $tags);
349 $this->assertSame('en', $entry->getLanguage());
354 // and now re-submit it to test the cascade persistence for tags after entry removal
355 // related https://github.com/wallabag/wallabag/issues/2121
356 $crawler = $client->request('GET', '/new');
358 $this->assertSame(200, $client->getResponse()->getStatusCode());
360 $form = $crawler->filter('form[name=entry]')->form();
363 'entry[url]' => $url = 'https://github.com/wallabag/wallabag/tree/master',
366 $client->submit($form, $data);
368 $this->assertSame(302, $client->getResponse()->getStatusCode());
369 $this->assertContains('/', $client->getResponse()->getTargetUrl());
372 ->getRepository('WallabagCoreBundle:Entry')
373 ->findOneByUrl($url);
375 $tags = $entry->getTags();
377 $this->assertCount(2, $tags);
378 $this->assertContains('wallabag', $tags);
384 public function testArchive()
386 $this->logInAs('admin');
387 $client = $this->getClient();
389 $client->request('GET', '/archive/list');
391 $this->assertSame(200, $client->getResponse()->getStatusCode());
394 public function testUntagged()
396 $this->logInAs('admin');
397 $client = $this->getClient();
399 $client->request('GET', '/untagged/list');
401 $this->assertSame(200, $client->getResponse()->getStatusCode());
404 public function testStarred()
406 $this->logInAs('admin');
407 $client = $this->getClient();
409 $client->request('GET', '/starred/list');
411 $this->assertSame(200, $client->getResponse()->getStatusCode());
414 public function testRangeException()
416 $this->logInAs('admin');
417 $client = $this->getClient();
419 $client->request('GET', '/all/list/900');
421 $this->assertSame(302, $client->getResponse()->getStatusCode());
422 $this->assertSame('/all/list', $client->getResponse()->getTargetUrl());
425 public function testView()
427 $this->logInAs('admin');
428 $client = $this->getClient();
430 $entry = new Entry($this->getLoggedInUser());
431 $entry->setUrl('http://example.com/foo');
432 $entry->setTitle('title foo');
433 $entry->setContent('foo bar baz');
434 $this->getEntityManager()->persist($entry);
435 $this->getEntityManager()->flush();
437 $crawler = $client->request('GET', '/view/' . $entry->getId());
439 $this->assertSame(200, $client->getResponse()->getStatusCode());
440 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
441 $this->assertContains($entry->getTitle(), $body[0]);
445 * @group NetworkCalls
447 public function testReload()
449 $this->logInAs('admin');
450 $client = $this->getClient();
452 $entry = new Entry($this->getLoggedInUser());
453 $entry->setUrl($this->url
);
454 $entry->setTitle('title foo');
455 $entry->setContent('');
456 $this->getEntityManager()->persist($entry);
457 $this->getEntityManager()->flush();
458 $this->getEntityManager()->clear();
460 $client->request('GET', '/reload/' . $entry->getId());
462 $this->assertSame(302, $client->getResponse()->getStatusCode());
464 $entry = $this->getEntityManager()
465 ->getRepository('WallabagCoreBundle:Entry')
466 ->find($entry->getId());
468 $this->assertNotEmpty($entry->getContent());
471 public function testReloadWithFetchingFailed()
473 $this->logInAs('admin');
474 $client = $this->getClient();
476 $entry = new Entry($this->getLoggedInUser());
477 $entry->setUrl('http://0.0.0.0/failed.html');
478 $this->getEntityManager()->persist($entry);
479 $this->getEntityManager()->flush();
481 $client->request('GET', '/reload/' . $entry->getId());
483 $this->assertSame(302, $client->getResponse()->getStatusCode());
485 // force EntityManager to clear previous entity
486 // otherwise, retrieve the same entity will retrieve change from the previous request :0
487 $this->getEntityManager()->clear();
488 $newContent = $this->getEntityManager()
489 ->getRepository('WallabagCoreBundle:Entry')
490 ->find($entry->getId());
492 $this->assertNotSame($client->getContainer()->getParameter('wallabag_core.fetching_error_message'), $newContent->getContent());
495 public function testEdit()
497 $this->logInAs('admin');
498 $client = $this->getClient();
500 $entry = new Entry($this->getLoggedInUser());
501 $entry->setUrl($this->url
);
502 $this->getEntityManager()->persist($entry);
503 $this->getEntityManager()->flush();
505 $crawler = $client->request('GET', '/edit/' . $entry->getId());
507 $this->assertSame(200, $client->getResponse()->getStatusCode());
509 $this->assertCount(1, $crawler->filter('input[id=entry_title]'));
510 $this->assertCount(1, $crawler->filter('button[id=entry_save]'));
513 public function testEditUpdate()
515 $this->logInAs('admin');
516 $client = $this->getClient();
518 $entry = new Entry($this->getLoggedInUser());
519 $entry->setUrl($this->url
);
520 $this->getEntityManager()->persist($entry);
521 $this->getEntityManager()->flush();
523 $crawler = $client->request('GET', '/edit/' . $entry->getId());
525 $this->assertSame(200, $client->getResponse()->getStatusCode());
527 $form = $crawler->filter('button[id=entry_save]')->form();
530 'entry[title]' => 'My updated title hehe :)',
531 'entry[origin_url]' => 'https://example.io',
534 $client->submit($form, $data);
536 $this->assertSame(302, $client->getResponse()->getStatusCode());
538 $crawler = $client->followRedirect();
540 $this->assertGreaterThan(1, $title = $crawler->filter('div[id=article] h1')->extract(['_text']));
541 $this->assertContains('My updated title hehe :)', $title[0]);
542 $this->assertGreaterThan(1, $stats = $crawler->filter('div[class="tools grey-text"] ul[class=stats] li a[class="tool grey-text"]')->extract(['_text']));
543 $this->assertContains('example.io', trim($stats[1]));
546 public function testEditRemoveOriginUrl()
548 $this->logInAs('admin');
549 $client = $this->getClient();
551 $entry = new Entry($this->getLoggedInUser());
552 $entry->setUrl($this->url
);
553 $this->getEntityManager()->persist($entry);
554 $this->getEntityManager()->flush();
556 $crawler = $client->request('GET', '/edit/' . $entry->getId());
558 $this->assertSame(200, $client->getResponse()->getStatusCode());
560 $form = $crawler->filter('button[id=entry_save]')->form();
563 'entry[title]' => 'My updated title hehe :)',
564 'entry[origin_url]' => '',
567 $client->submit($form, $data);
569 $this->assertSame(302, $client->getResponse()->getStatusCode());
571 $crawler = $client->followRedirect();
573 $title = $crawler->filter('div[id=article] h1')->extract(['_text']);
574 $this->assertGreaterThan(1, $title);
575 $this->assertContains('My updated title hehe :)', $title[0]);
577 $stats = $crawler->filter('div[class="tools grey-text"] ul[class=stats] li a[class="tool grey-text"]')->extract(['_text']);
578 $this->assertCount(1, $stats);
579 $this->assertNotContains('example.io', trim($stats[0]));
582 public function testToggleArchive()
584 $this->logInAs('admin');
585 $client = $this->getClient();
587 $entry = new Entry($this->getLoggedInUser());
588 $entry->setUrl($this->url
);
589 $this->getEntityManager()->persist($entry);
590 $this->getEntityManager()->flush();
591 $this->getEntityManager()->clear();
593 $client->request('GET', '/archive/' . $entry->getId());
595 $this->assertSame(302, $client->getResponse()->getStatusCode());
597 $res = $client->getContainer()
598 ->get('doctrine.orm.entity_manager')
599 ->getRepository('WallabagCoreBundle:Entry')
600 ->find($entry->getId());
602 $this->assertSame(1, $res->isArchived());
605 public function testToggleStar()
607 $this->logInAs('admin');
608 $client = $this->getClient();
610 $entry = new Entry($this->getLoggedInUser());
611 $entry->setUrl($this->url
);
612 $this->getEntityManager()->persist($entry);
613 $this->getEntityManager()->flush();
614 $this->getEntityManager()->clear();
616 $client->request('GET', '/star/' . $entry->getId());
618 $this->assertSame(302, $client->getResponse()->getStatusCode());
620 $res = $client->getContainer()
621 ->get('doctrine.orm.entity_manager')
622 ->getRepository('WallabagCoreBundle:Entry')
623 ->findOneById($entry->getId());
625 $this->assertSame(1, $res->isStarred());
628 public function testDelete()
630 $this->logInAs('admin');
631 $client = $this->getClient();
633 $entry = new Entry($this->getLoggedInUser());
634 $entry->setUrl($this->url
);
635 $this->getEntityManager()->persist($entry);
636 $this->getEntityManager()->flush();
638 $client->request('GET', '/delete/' . $entry->getId());
640 $this->assertSame(302, $client->getResponse()->getStatusCode());
642 $client->request('GET', '/delete/' . $entry->getId());
644 $this->assertSame(404, $client->getResponse()->getStatusCode());
648 * It will create a new entry.
652 * And it'll check that user won't be redirected to the view page of the content when it had been removed
654 public function testViewAndDelete()
656 $this->logInAs('admin');
657 $client = $this->getClient();
659 $em = $client->getContainer()
660 ->get('doctrine.orm.entity_manager');
662 // add a new content to be removed later
664 ->getRepository('WallabagUserBundle:User')
665 ->findOneByUserName('admin');
667 $content = new Entry($user);
668 $content->setUrl('http://1.1.1.1/entry');
669 $content->setReadingTime(12);
670 $content->setDomainName('domain.io');
671 $content->setMimetype('text/html');
672 $content->setTitle('test title entry');
673 $content->setContent('This is my content /o/');
674 $content->updateArchived(true);
675 $content->setLanguage('fr');
677 $em->persist($content);
680 $client->request('GET', '/view/' . $content->getId());
681 $this->assertSame(200, $client->getResponse()->getStatusCode());
683 $client->request('GET', '/delete/' . $content->getId());
684 $this->assertSame(302, $client->getResponse()->getStatusCode());
686 $client->followRedirect();
687 $this->assertSame(200, $client->getResponse()->getStatusCode());
690 public function testViewOtherUserEntry()
692 $this->logInAs('admin');
693 $client = $this->getClient();
695 $content = $client->getContainer()
696 ->get('doctrine.orm.entity_manager')
697 ->getRepository('WallabagCoreBundle:Entry')
698 ->findOneByUsernameAndNotArchived('bob');
700 $client->request('GET', '/view/' . $content->getId());
702 $this->assertSame(403, $client->getResponse()->getStatusCode());
705 public function testFilterOnReadingTime()
707 $this->logInAs('admin');
708 $client = $this->getClient();
709 $entry = new Entry($this->getLoggedInUser());
710 $entry->setUrl($this->url
);
711 $entry->setReadingTime(22);
712 $this->getEntityManager()->persist($entry);
713 $this->getEntityManager()->flush();
715 $crawler = $client->request('GET', '/unread/list');
717 $form = $crawler->filter('button[id=submit-filter]')->form();
720 'entry_filter[readingTime][right_number]' => 22,
721 'entry_filter[readingTime][left_number]' => 22,
724 $crawler = $client->submit($form, $data);
726 $this->assertCount(1, $crawler->filter('li.entry'));
729 public function testFilterOnReadingTimeWithNegativeValue()
731 $this->logInAs('admin');
732 $client = $this->getClient();
734 $crawler = $client->request('GET', '/unread/list');
736 $form = $crawler->filter('button[id=submit-filter]')->form();
739 'entry_filter[readingTime][right_number]' => -22,
740 'entry_filter[readingTime][left_number]' => -22,
743 $crawler = $client->submit($form, $data);
745 // forcing negative value results in no entry displayed
746 $this->assertCount(0, $crawler->filter('li.entry'));
749 public function testFilterOnReadingTimeOnlyUpper()
751 $this->logInAs('admin');
752 $client = $this->getClient();
754 $crawler = $client->request('GET', '/all/list');
755 $this->assertCount(5, $crawler->filter('li.entry'));
757 $entry = new Entry($this->getLoggedInUser());
758 $entry->setUrl($this->url
);
759 $entry->setReadingTime(23);
760 $this->getEntityManager()->persist($entry);
761 $this->getEntityManager()->flush();
763 $crawler = $client->request('GET', '/all/list');
764 $this->assertCount(6, $crawler->filter('li.entry'));
766 $form = $crawler->filter('button[id=submit-filter]')->form();
769 'entry_filter[readingTime][right_number]' => 22,
772 $crawler = $client->submit($form, $data);
774 $this->assertCount(5, $crawler->filter('li.entry'));
777 public function testFilterOnReadingTimeOnlyLower()
779 $this->logInAs('admin');
780 $client = $this->getClient();
782 $crawler = $client->request('GET', '/unread/list');
784 $form = $crawler->filter('button[id=submit-filter]')->form();
787 'entry_filter[readingTime][left_number]' => 22,
790 $crawler = $client->submit($form, $data);
792 $this->assertCount(0, $crawler->filter('li.entry'));
794 $entry = new Entry($this->getLoggedInUser());
795 $entry->setUrl($this->url
);
796 $entry->setReadingTime(23);
797 $this->getEntityManager()->persist($entry);
798 $this->getEntityManager()->flush();
800 $crawler = $client->submit($form, $data);
801 $this->assertCount(1, $crawler->filter('li.entry'));
804 public function testFilterOnUnreadStatus()
806 $this->logInAs('admin');
807 $client = $this->getClient();
809 $crawler = $client->request('GET', '/all/list');
811 $form = $crawler->filter('button[id=submit-filter]')->form();
814 'entry_filter[isUnread]' => true,
817 $crawler = $client->submit($form, $data);
819 $this->assertCount(4, $crawler->filter('li.entry'));
821 $entry = new Entry($this->getLoggedInUser());
822 $entry->setUrl($this->url
);
823 $entry->updateArchived(false);
824 $this->getEntityManager()->persist($entry);
825 $this->getEntityManager()->flush();
827 $crawler = $client->submit($form, $data);
829 $this->assertCount(5, $crawler->filter('li.entry'));
832 public function testFilterOnCreationDate()
834 $this->logInAs('admin');
835 $client = $this->getClient();
837 $em = $this->getEntityManager();
839 $today = new \
DateTimeImmutable();
840 $tomorrow = $today->add(new \
DateInterval('P1D'));
841 $yesterday = $today->sub(new \
DateInterval('P1D'));
843 $entry = new Entry($this->getLoggedInUser());
844 $entry->setUrl('http://0.0.0.0/testFilterOnCreationDate');
845 $entry->setCreatedAt($yesterday);
846 $em->persist($entry);
849 $crawler = $client->request('GET', '/unread/list');
851 $form = $crawler->filter('button[id=submit-filter]')->form();
854 'entry_filter[createdAt][left_date]' => $today->format('Y-m-d'),
855 'entry_filter[createdAt][right_date]' => $tomorrow->format('Y-m-d'),
858 $crawler = $client->submit($form, $data);
860 $this->assertCount(5, $crawler->filter('li.entry'));
863 'entry_filter[createdAt][left_date]' => $today->format('Y-m-d'),
864 'entry_filter[createdAt][right_date]' => $today->format('Y-m-d'),
867 $crawler = $client->submit($form, $data);
869 $this->assertCount(5, $crawler->filter('li.entry'));
872 'entry_filter[createdAt][left_date]' => '1970-01-01',
873 'entry_filter[createdAt][right_date]' => '1970-01-01',
876 $crawler = $client->submit($form, $data);
878 $this->assertCount(0, $crawler->filter('li.entry'));
881 public function testPaginationWithFilter()
883 $this->logInAs('admin');
884 $client = $this->getClient();
885 $crawler = $client->request('GET', '/config');
887 $form = $crawler->filter('button[id=config_save]')->form();
890 'config[items_per_page]' => '1',
893 $client->submit($form, $data);
895 $parameters = '?entry_filter%5BreadingTime%5D%5Bleft_number%5D=&entry_filter%5BreadingTime%5D%5Bright_number%5D=';
897 $client->request('GET', 'unread/list' . $parameters);
899 $this->assertContains($parameters, $client->getResponse()->getContent());
902 $crawler = $client->request('GET', '/config');
903 $form = $crawler->filter('button[id=config_save]')->form();
905 'config[items_per_page]' => '12',
907 $client->submit($form, $data);
910 public function testFilterOnDomainName()
912 $this->logInAs('admin');
913 $client = $this->getClient();
915 $crawler = $client->request('GET', '/unread/list');
916 $form = $crawler->filter('button[id=submit-filter]')->form();
918 'entry_filter[domainName]' => 'domain',
921 $crawler = $client->submit($form, $data);
922 $this->assertCount(5, $crawler->filter('li.entry'));
924 $crawler = $client->request('GET', '/unread/list');
925 $form = $crawler->filter('button[id=submit-filter]')->form();
927 'entry_filter[domainName]' => 'dOmain',
930 $crawler = $client->submit($form, $data);
931 $this->assertCount(5, $crawler->filter('li.entry'));
933 $form = $crawler->filter('button[id=submit-filter]')->form();
935 'entry_filter[domainName]' => 'wallabag',
938 $crawler = $client->submit($form, $data);
939 $this->assertCount(0, $crawler->filter('li.entry'));
942 public function testFilterOnStatus()
944 $this->logInAs('admin');
945 $client = $this->getClient();
947 $crawler = $client->request('GET', '/unread/list');
948 $form = $crawler->filter('button[id=submit-filter]')->form();
949 $form['entry_filter[isArchived]']->tick();
950 $form['entry_filter[isStarred]']->untick();
952 $crawler = $client->submit($form);
953 $this->assertCount(1, $crawler->filter('li.entry'));
955 $form = $crawler->filter('button[id=submit-filter]')->form();
956 $form['entry_filter[isArchived]']->untick();
957 $form['entry_filter[isStarred]']->tick();
959 $crawler = $client->submit($form);
960 $this->assertCount(1, $crawler->filter('li.entry'));
963 public function testFilterOnIsPublic()
965 $this->logInAs('admin');
966 $client = $this->getClient();
968 $crawler = $client->request('GET', '/unread/list');
969 $form = $crawler->filter('button[id=submit-filter]')->form();
970 $form['entry_filter[isPublic]']->tick();
972 $crawler = $client->submit($form);
973 $this->assertCount(0, $crawler->filter('li.entry'));
976 public function testPreviewPictureFilter()
978 $this->logInAs('admin');
979 $client = $this->getClient();
981 $crawler = $client->request('GET', '/unread/list');
982 $form = $crawler->filter('button[id=submit-filter]')->form();
983 $form['entry_filter[previewPicture]']->tick();
985 $crawler = $client->submit($form);
986 $this->assertCount(1, $crawler->filter('li.entry'));
989 public function testFilterOnLanguage()
991 $this->logInAs('admin');
992 $client = $this->getClient();
994 $entry = new Entry($this->getLoggedInUser());
995 $entry->setUrl($this->url
);
996 $entry->setLanguage('fr');
997 $this->getEntityManager()->persist($entry);
998 $this->getEntityManager()->flush();
1000 $crawler = $client->request('GET', '/unread/list');
1001 $form = $crawler->filter('button[id=submit-filter]')->form();
1003 'entry_filter[language]' => 'fr',
1006 $crawler = $client->submit($form, $data);
1007 $this->assertCount(3, $crawler->filter('li.entry'));
1009 $form = $crawler->filter('button[id=submit-filter]')->form();
1011 'entry_filter[language]' => 'en',
1014 $crawler = $client->submit($form, $data);
1015 $this->assertCount(2, $crawler->filter('li.entry'));
1018 public function testSortOnTitle()
1020 $this->logInAs('admin');
1021 $client = $this->getClient();
1023 $crawler = $client->request('GET', '/unread/list');
1024 $form = $crawler->filter('button[id=submit-sort]')->form();
1026 'entry_sort[sortType]' => 'title',
1027 'entry_sort[sortOrder]' => 'asc',
1029 $crawler = $client->submit($form, $data);
1031 $this->assertCount(4, $crawler->filter('li.entry'));
1034 preg_match_all('/test title entry([0-9])/', $client->getResponse()->getContent(), $matches);
1036 $results = array_values(array_unique($matches[0]));
1038 $ids = [1, 2, 4, 5];
1040 foreach ($results as $key => $result) {
1041 $this->assertSame('test title entry' . $ids[$key], $result);
1044 $ids = array_reverse($ids);
1046 $crawler = $client->request('GET', '/unread/list');
1047 $form = $crawler->filter('button[id=submit-sort]')->form();
1049 'entry_sort[sortType]' => 'title',
1050 'entry_sort[sortOrder]' => 'desc',
1052 $crawler = $client->submit($form, $data);
1055 preg_match_all('/test title entry([0-9])/', $client->getResponse()->getContent(), $matches);
1057 $results = array_values(array_unique($matches[0]));
1059 foreach ($results as $key => $result) {
1060 $this->assertSame('test title entry' . $ids[$key], $result);
1064 public function testSortOnCreationDate()
1066 $this->logInAs('admin');
1067 $client = $this->getClient();
1069 $entry1 = new Entry($this->getLoggedInUser());
1070 $entry1->setTitle('test title entry7');
1071 $entry1->setCreatedAt(new \
DateTime('2013-04-03T13:37:00'));
1072 $this->getEntityManager()->persist($entry1);
1074 $entry2 = new Entry($this->getLoggedInUser());
1075 $entry2->setTitle('test title entry8');
1076 $entry2->setCreatedAt(new \
DateTime('2012-04-03T13:37:00'));
1077 $this->getEntityManager()->persist($entry2);
1079 $entry3 = new Entry($this->getLoggedInUser());
1080 $entry3->setTitle('test title entry9');
1081 $entry3->setCreatedAt(new \
DateTime('2014-04-03T13:37:00'));
1082 $this->getEntityManager()->persist($entry3);
1084 $this->getEntityManager()->flush();
1086 $crawler = $client->request('GET', '/unread/list');
1087 $form = $crawler->filter('button[id=submit-sort]')->form();
1089 'entry_sort[sortType]' => 'createdAt',
1090 'entry_sort[sortOrder]' => 'asc',
1092 $crawler = $client->submit($form, $data);
1094 $this->assertCount(7, $crawler->filter('li.entry'));
1097 preg_match_all('/test title entry([0-9])/', $client->getResponse()->getContent(), $matches);
1099 $results = array_values(array_unique($matches[0]));
1101 $ids = [8, 7, 9, 1, 2, 4, 5];
1103 foreach ($results as $key => $result) {
1104 $this->assertSame('test title entry' . $ids[$key], $result);
1107 $ids = array_reverse($ids);
1109 $crawler = $client->request('GET', '/unread/list');
1110 $form = $crawler->filter('button[id=submit-sort]')->form();
1112 'entry_sort[sortType]' => 'createdAt',
1113 'entry_sort[sortOrder]' => 'desc',
1115 $crawler = $client->submit($form, $data);
1118 preg_match_all('/test title entry([0-9])/', $client->getResponse()->getContent(), $matches);
1120 $results = array_values(array_unique($matches[0]));
1122 foreach ($results as $key => $result) {
1123 $this->assertSame('test title entry' . $ids[$key], $result);
1127 public function testSortOnStarredDate()
1129 $this->logInAs('admin');
1130 $client = $this->getClient();
1132 $entry1 = new Entry($this->getLoggedInUser());
1133 $entry1->setTitle('test title entry7');
1134 $entry1->setStarred(true);
1135 $entry1->setStarredAt(new \
DateTime('2013-04-03T13:37:00'));
1136 $this->getEntityManager()->persist($entry1);
1138 $entry2 = new Entry($this->getLoggedInUser());
1139 $entry2->setTitle('test title entry8');
1140 $entry2->setStarred(true);
1141 $entry2->setStarredAt(new \
DateTime('2012-04-03T13:37:00'));
1142 $this->getEntityManager()->persist($entry2);
1144 $entry3 = new Entry($this->getLoggedInUser());
1145 $entry3->setTitle('test title entry9');
1146 $entry3->setStarred(true);
1147 $entry3->setStarredAt(new \
DateTime('2014-04-03T13:37:00'));
1148 $this->getEntityManager()->persist($entry3);
1150 $this->getEntityManager()->flush();
1152 $crawler = $client->request('GET', '/starred/list');
1153 $form = $crawler->filter('button[id=submit-sort]')->form();
1155 'entry_sort[sortType]' => 'starredAt',
1156 'entry_sort[sortOrder]' => 'asc',
1158 $crawler = $client->submit($form, $data);
1160 $this->assertCount(4, $crawler->filter('li.entry'));
1163 preg_match_all('/test title entry([0-9])/', $client->getResponse()->getContent(), $matches);
1165 $results = array_values(array_unique($matches[0]));
1167 $ids = [8, 7, 9, 5];
1169 foreach ($results as $key => $result) {
1170 $this->assertSame('test title entry' . $ids[$key], $result);
1173 $ids = array_reverse($ids);
1175 $crawler = $client->request('GET', '/starred/list');
1176 $form = $crawler->filter('button[id=submit-sort]')->form();
1178 'entry_sort[sortType]' => 'starredAt',
1179 'entry_sort[sortOrder]' => 'desc',
1181 $crawler = $client->submit($form, $data);
1184 preg_match_all('/test title entry([0-9])/', $client->getResponse()->getContent(), $matches);
1186 $results = array_values(array_unique($matches[0]));
1188 foreach ($results as $key => $result) {
1189 $this->assertSame('test title entry' . $ids[$key], $result);
1193 public function testSortOnArchivedDate()
1195 $this->logInAs('admin');
1196 $client = $this->getClient();
1198 $entry1 = new Entry($this->getLoggedInUser());
1199 $entry1->setTitle('test title entry7');
1200 $entry1->setArchived(true);
1201 $entry1->setArchivedAt(new \
DateTime('2010-04-03T13:37:00'));
1202 $this->getEntityManager()->persist($entry1);
1204 $entry2 = new Entry($this->getLoggedInUser());
1205 $entry2->setTitle('test title entry8');
1206 $entry2->setArchived(true);
1207 $entry2->setArchivedAt(new \
DateTime('2000-04-03T13:37:00'));
1208 $this->getEntityManager()->persist($entry2);
1210 $entry3 = new Entry($this->getLoggedInUser());
1211 $entry3->setTitle('test title entry9');
1212 $entry3->setArchived(true);
1213 $entry3->setArchivedAt(new \
DateTime('2020-04-03T13:37:00'));
1214 $this->getEntityManager()->persist($entry3);
1216 $this->getEntityManager()->flush();
1218 $crawler = $client->request('GET', '/archive/list');
1219 $form = $crawler->filter('button[id=submit-sort]')->form();
1221 'entry_sort[sortType]' => 'archivedAt',
1222 'entry_sort[sortOrder]' => 'asc',
1224 $crawler = $client->submit($form, $data);
1226 $this->assertCount(4, $crawler->filter('li.entry'));
1229 preg_match_all('/test title entry([0-9])/', $client->getResponse()->getContent(), $matches);
1231 $results = array_values(array_unique($matches[0]));
1233 $ids = [8, 7, 9, 6];
1235 foreach ($results as $key => $result) {
1236 $this->assertSame('test title entry' . $ids[$key], $result);
1239 $ids = array_reverse($ids);
1241 $crawler = $client->request('GET', '/archive/list');
1242 $form = $crawler->filter('button[id=submit-sort]')->form();
1244 'entry_sort[sortType]' => 'archivedAt',
1245 'entry_sort[sortOrder]' => 'desc',
1247 $crawler = $client->submit($form, $data);
1250 preg_match_all('/test title entry([0-9])/', $client->getResponse()->getContent(), $matches);
1252 $results = array_values(array_unique($matches[0]));
1254 foreach ($results as $key => $result) {
1255 $this->assertSame('test title entry' . $ids[$key], $result);
1259 public function testShareEntryPublicly()
1261 $this->logInAs('admin');
1262 $client = $this->getClient();
1264 // sharing is enabled
1265 $client->getContainer()->get('craue_config')->set('share_public', 1);
1267 $content = new Entry($this->getLoggedInUser());
1268 $content->setUrl($this->url
);
1269 $this->getEntityManager()->persist($content);
1270 $this->getEntityManager()->flush();
1271 $this->getEntityManager()->clear();
1274 $client->request('GET', '/share/' . $content->getUid());
1275 $this->assertSame(404, $client->getResponse()->getStatusCode());
1277 // generating the uid
1278 $client->request('GET', '/share/' . $content->getId());
1279 $this->assertSame(302, $client->getResponse()->getStatusCode());
1281 $shareUrl = $client->getResponse()->getTargetUrl();
1283 // use a new client to have a fresh empty session (instead of a logged one from the previous client)
1286 $client->request('GET', $shareUrl);
1288 $this->assertSame(200, $client->getResponse()->getStatusCode());
1289 $this->assertContains('max-age=25200', $client->getResponse()->headers
->get('cache-control'));
1290 $this->assertContains('public', $client->getResponse()->headers
->get('cache-control'));
1291 $this->assertContains('s-maxage=25200', $client->getResponse()->headers
->get('cache-control'));
1292 $this->assertNotContains('no-cache', $client->getResponse()->headers
->get('cache-control'));
1293 $this->assertContains('og:title', $client->getResponse()->getContent());
1294 $this->assertContains('og:type', $client->getResponse()->getContent());
1295 $this->assertContains('og:url', $client->getResponse()->getContent());
1296 $this->assertContains('og:image', $client->getResponse()->getContent());
1298 // sharing is now disabled
1299 $client->getContainer()->get('craue_config')->set('share_public', 0);
1300 $client->request('GET', '/share/' . $content->getUid());
1301 $this->assertSame(404, $client->getResponse()->getStatusCode());
1303 // removing the share
1304 $client->request('GET', '/share/delete/' . $content->getId());
1305 $this->assertSame(302, $client->getResponse()->getStatusCode());
1307 // share is now disable
1308 $client->request('GET', '/share/' . $content->getUid());
1309 $this->assertSame(404, $client->getResponse()->getStatusCode());
1313 * @group NetworkCalls
1315 public function testNewEntryWithDownloadImagesEnabled()
1317 $this->downloadImagesEnabled
= true;
1318 $this->logInAs('admin');
1319 $client = $this->getClient();
1321 $url = self
::AN_URL_CONTAINING_AN_ARTICLE_WITH_IMAGE
;
1322 $client->getContainer()->get('craue_config')->set('download_images_enabled', 1);
1324 $crawler = $client->request('GET', '/new');
1326 $this->assertSame(200, $client->getResponse()->getStatusCode());
1328 $form = $crawler->filter('form[name=entry]')->form();
1331 'entry[url]' => $url,
1334 $client->submit($form, $data);
1336 $this->assertSame(302, $client->getResponse()->getStatusCode());
1338 $em = $client->getContainer()
1339 ->get('doctrine.orm.entity_manager');
1342 ->getRepository('WallabagCoreBundle:Entry')
1343 ->findByUrlAndUserId($url, $this->getLoggedInUserId());
1345 $this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $entry);
1346 $this->assertSame($url, $entry->getUrl());
1347 $this->assertContains('Judo', $entry->getTitle());
1348 // instead of checking for the filename (which might change) check that the image is now local
1349 $this->assertContains(rtrim($client->getContainer()->getParameter('domain_name'), '/') . '/assets/images/', $entry->getContent());
1351 $client->getContainer()->get('craue_config')->set('download_images_enabled', 0);
1355 * @depends testNewEntryWithDownloadImagesEnabled
1357 public function testRemoveEntryWithDownloadImagesEnabled()
1359 $this->downloadImagesEnabled
= true;
1360 $this->logInAs('admin');
1361 $client = $this->getClient();
1363 $url = self
::AN_URL_CONTAINING_AN_ARTICLE_WITH_IMAGE
;
1364 $client->getContainer()->get('craue_config')->set('download_images_enabled', 1);
1366 $crawler = $client->request('GET', '/new');
1368 $this->assertSame(200, $client->getResponse()->getStatusCode());
1370 $form = $crawler->filter('form[name=entry]')->form();
1373 'entry[url]' => $url,
1376 $client->submit($form, $data);
1378 $this->assertSame(302, $client->getResponse()->getStatusCode());
1380 $content = $client->getContainer()
1381 ->get('doctrine.orm.entity_manager')
1382 ->getRepository('WallabagCoreBundle:Entry')
1383 ->findByUrlAndUserId($url, $this->getLoggedInUserId());
1385 $client->request('GET', '/delete/' . $content->getId());
1387 $this->assertSame(302, $client->getResponse()->getStatusCode());
1389 $client->getContainer()->get('craue_config')->set('download_images_enabled', 0);
1392 public function testRedirectToHomepage()
1394 $this->logInAs('empty');
1395 $client = $this->getClient();
1397 // Redirect to homepage
1398 $config = $this->getLoggedInUser()->getConfig();
1399 $config->setActionMarkAsRead(Config
::REDIRECT_TO_HOMEPAGE
);
1400 $this->getEntityManager()->persist($config);
1402 $entry = new Entry($this->getLoggedInUser());
1403 $entry->setUrl($this->url
);
1404 $this->getEntityManager()->persist($entry);
1406 $this->getEntityManager()->flush();
1408 $client->request('GET', '/view/' . $entry->getId());
1409 $client->request('GET', '/archive/' . $entry->getId());
1411 $this->assertSame(302, $client->getResponse()->getStatusCode());
1412 $this->assertSame('/', $client->getResponse()->headers
->get('location'));
1415 public function testRedirectToCurrentPage()
1417 $this->logInAs('empty');
1418 $client = $this->getClient();
1420 // Redirect to current page
1421 $config = $this->getLoggedInUser()->getConfig();
1422 $config->setActionMarkAsRead(Config
::REDIRECT_TO_CURRENT_PAGE
);
1423 $this->getEntityManager()->persist($config);
1425 $entry = new Entry($this->getLoggedInUser());
1426 $entry->setUrl($this->url
);
1427 $this->getEntityManager()->persist($entry);
1429 $this->getEntityManager()->flush();
1431 $client->request('GET', '/view/' . $entry->getId());
1432 $client->request('GET', '/archive/' . $entry->getId());
1434 $this->assertSame(302, $client->getResponse()->getStatusCode());
1435 $this->assertContains('/view/' . $entry->getId(), $client->getResponse()->headers
->get('location'));
1438 public function testFilterOnHttpStatus()
1440 $this->logInAs('admin');
1441 $client = $this->getClient();
1443 $entry = new Entry($this->getLoggedInUser());
1444 $entry->setUrl('https://www.lemonde.fr/incorrect-url/');
1445 $entry->setHttpStatus(404);
1446 $this->getEntityManager()->persist($entry);
1448 $this->getEntityManager()->flush();
1450 $crawler = $client->request('GET', '/all/list');
1451 $form = $crawler->filter('button[id=submit-filter]')->form();
1454 'entry_filter[httpStatus]' => 404,
1457 $crawler = $client->submit($form, $data);
1459 $this->assertCount(1, $crawler->filter('li.entry'));
1461 $entry = new Entry($this->getLoggedInUser());
1462 $entry->setUrl($this->url
);
1463 $entry->setHttpStatus(200);
1464 $this->getEntityManager()->persist($entry);
1466 $entry = new Entry($this->getLoggedInUser());
1467 $entry->setUrl('http://www.nextinpact.com/news/101235-wallabag-alternative-libre-a-pocket-creuse-petit-a-petit-son-nid.htm');
1468 $entry->setHttpStatus(200);
1469 $this->getEntityManager()->persist($entry);
1471 $this->getEntityManager()->flush();
1473 $crawler = $client->request('GET', '/all/list');
1474 $form = $crawler->filter('button[id=submit-filter]')->form();
1477 'entry_filter[httpStatus]' => 200,
1480 $crawler = $client->submit($form, $data);
1482 $this->assertCount(2, $crawler->filter('li.entry'));
1484 $crawler = $client->request('GET', '/all/list');
1485 $form = $crawler->filter('button[id=submit-filter]')->form();
1488 'entry_filter[httpStatus]' => 1024,
1491 $crawler = $client->submit($form, $data);
1493 $this->assertCount(8, $crawler->filter('li.entry'));
1496 public function testSearch()
1498 $this->logInAs('admin');
1499 $client = $this->getClient();
1501 $entry = new Entry($this->getLoggedInUser());
1502 $entry->setUrl($this->url
);
1503 $entry->setTitle('test');
1504 $this->getEntityManager()->persist($entry);
1505 $this->getEntityManager()->flush();
1507 // Search on unread list
1508 $crawler = $client->request('GET', '/unread/list');
1510 $form = $crawler->filter('form[name=search]')->form();
1512 'search_entry[term]' => 'title',
1515 $crawler = $client->submit($form, $data);
1517 $this->assertCount(4, $crawler->filter('li.entry'));
1519 // Search on starred list
1520 $crawler = $client->request('GET', '/starred/list');
1522 $entry = new Entry($this->getLoggedInUser());
1523 $entry->setUrl('http://localhost/foo/bar');
1524 $entry->setTitle('testeur');
1525 $entry->setStarred(true);
1526 $this->getEntityManager()->persist($entry);
1527 $this->getEntityManager()->flush();
1529 $form = $crawler->filter('form[name=search]')->form();
1531 'search_entry[term]' => 'testeur',
1534 $crawler = $client->submit($form, $data);
1536 $this->assertCount(1, $crawler->filter('li.entry'));
1538 $crawler = $client->request('GET', '/archive/list');
1540 // Added new article to test on archive list
1541 $entry = new Entry($this->getLoggedInUser());
1542 $entry->setUrl('http://0.0.0.0/foo/baz/qux');
1543 $entry->setTitle('Le manège');
1544 $entry->updateArchived(true);
1545 $this->getEntityManager()->persist($entry);
1546 $this->getEntityManager()->flush();
1548 $form = $crawler->filter('form[name=search]')->form();
1550 'search_entry[term]' => 'manège',
1553 $crawler = $client->submit($form, $data);
1555 $this->assertCount(1, $crawler->filter('li.entry'));
1556 $client->request('GET', '/delete/' . $entry->getId());
1558 // test on list of all articles
1559 $crawler = $client->request('GET', '/all/list');
1561 $form = $crawler->filter('form[name=search]')->form();
1563 'search_entry[term]' => 'wxcvbnqsdf', // a string not available in the database
1566 $crawler = $client->submit($form, $data);
1568 $this->assertCount(0, $crawler->filter('li.entry'));
1570 // test url search on list of all articles
1571 $entry = new Entry($this->getLoggedInUser());
1572 $entry->setUrl('http://domain/qux');
1573 $entry->setTitle('Le manège');
1574 $entry->updateArchived(true);
1575 $this->getEntityManager()->persist($entry);
1576 $this->getEntityManager()->flush();
1578 $crawler = $client->request('GET', '/all/list');
1580 $form = $crawler->filter('form[name=search]')->form();
1582 'search_entry[term]' => 'domain', // the search will match an entry with 'domain' in its url
1585 $crawler = $client->submit($form, $data);
1587 $this->assertCount(1, $crawler->filter('li.entry'));
1589 // same as previous test but for case-sensitivity
1590 $crawler = $client->request('GET', '/all/list');
1592 $form = $crawler->filter('form[name=search]')->form();
1594 'search_entry[term]' => 'doMain', // the search will match an entry with 'domain' in its url
1597 $crawler = $client->submit($form, $data);
1599 $this->assertCount(1, $crawler->filter('li.entry'));
1602 public function dataForLanguage()
1606 'https://www.pravda.ru/world/09-06-2017/1337283-qatar-0/',
1610 'https://fr.wikipedia.org/wiki/Wallabag',
1614 'https://www.bild.de/politik/ausland/theresa-may/wahlbeben-grossbritannien-analyse-52108924.bild.html',
1618 'https://www.ansa.it/sito/notizie/mondo/europa/2017/06/08/voto-gb-seggi-aperti-misure-sicurezza-rafforzate_0cb71f7f-e23b-4d5f-95ca-bc12296419f0.html',
1622 'http://www.hao123.com/shequ?__noscript__-=1',
1626 'https://politica.estadao.com.br/noticias/eleicoes,campanha-catatonica,70002491983',
1629 'fucked_list_of_languages' => [
1630 'http://geocatalog.webservice-energy.org/geonetwork/srv/eng/main.home',
1634 'https://www.20minutos.es/noticia/3360685/0/gobierno-sanchez-primero-historia-mas-mujeres-que-hombres/',
1641 * @dataProvider dataForLanguage
1642 * @group NetworkCalls
1644 public function testLanguageValidation($url, $expectedLanguage)
1646 $this->logInAs('admin');
1647 $client = $this->getClient();
1649 $crawler = $client->request('GET', '/new');
1651 $this->assertSame(200, $client->getResponse()->getStatusCode());
1653 $form = $crawler->filter('form[name=entry]')->form();
1656 'entry[url]' => $url,
1659 $client->submit($form, $data);
1661 $this->assertSame(302, $client->getResponse()->getStatusCode());
1663 $content = $client->getContainer()
1664 ->get('doctrine.orm.entity_manager')
1665 ->getRepository('WallabagCoreBundle:Entry')
1666 ->findByUrlAndUserId($url, $this->getLoggedInUserId());
1668 $this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $content);
1669 $this->assertSame($url, $content->getUrl());
1670 $this->assertSame($expectedLanguage, $content->getLanguage());
1674 * @group NetworkCalls
1676 public function testRestrictedArticle()
1678 $url = 'https://www.monde-diplomatique.fr/2017/05/BONNET/57475';
1679 $this->logInAs('admin');
1680 $client = $this->getClient();
1681 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
1683 // enable restricted access
1684 $client->getContainer()->get('craue_config')->set('restricted_access', 1);
1686 // create a new site_credential
1687 $user = $client->getContainer()->get('security.token_storage')->getToken()->getUser();
1688 $credential = new SiteCredential($user);
1689 $credential->setHost('monde-diplomatique.fr');
1690 $credential->setUsername($client->getContainer()->get('wallabag_core.helper.crypto_proxy')->crypt('foo'));
1691 $credential->setPassword($client->getContainer()->get('wallabag_core.helper.crypto_proxy')->crypt('bar'));
1693 $em->persist($credential);
1696 $crawler = $client->request('GET', '/new');
1698 $this->assertSame(200, $client->getResponse()->getStatusCode());
1700 $form = $crawler->filter('form[name=entry]')->form();
1703 'entry[url]' => $url,
1706 $client->submit($form, $data);
1708 $this->assertSame(302, $client->getResponse()->getStatusCode());
1710 $crawler = $client->followRedirect();
1712 $this->assertSame(200, $client->getResponse()->getStatusCode());
1713 $this->assertContains('flashes.entry.notice.entry_saved', $crawler->filter('body')->extract(['_text'])[0]);
1716 ->getRepository('WallabagCoreBundle:Entry')
1717 ->findByUrlAndUserId($url, $this->getLoggedInUserId());
1719 $this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $content);
1720 $this->assertSame('Crimes et réformes aux Philippines', $content->getTitle());
1722 $client->getContainer()->get('craue_config')->set('restricted_access', 0);
1725 public function testPostEntryWhenFetchFails()
1727 $url = 'http://example.com/papers/email_tracking.pdf';
1728 $this->logInAs('admin');
1729 $client = $this->getClient();
1731 $container = $client->getContainer();
1732 $contentProxy = $this->getMockBuilder(ContentProxy
::class)
1733 ->disableOriginalConstructor()
1734 ->setMethods(['updateEntry'])
1736 $contentProxy->expects($this->any())
1737 ->method('updateEntry')
1738 ->willThrowException(new \
Exception('Test Fetch content fails'));
1740 $crawler = $client->request('GET', '/new');
1742 $this->assertSame(200, $client->getResponse()->getStatusCode());
1744 $form = $crawler->filter('form[name=entry]')->form();
1747 'entry[url]' => $url,
1751 * We generate a new client to be able to use Mock ContentProxy
1752 * Also we reinject the cookie from the previous client to keep the
1755 $cookie = $client->getCookieJar()->all();
1756 $client = $this->getNewClient();
1757 $client->getCookieJar()->set($cookie[0]);
1758 $client->getContainer()->set('wallabag_core.content_proxy', $contentProxy);
1759 $client->submit($form, $data);
1761 $this->assertSame(302, $client->getResponse()->getStatusCode());
1763 $content = $client->getContainer()
1764 ->get('doctrine.orm.entity_manager')
1765 ->getRepository('WallabagCoreBundle:Entry')
1766 ->findByUrlAndUserId($url, $this->getLoggedInUserId());
1768 $authors = $content->getPublishedBy();
1769 $this->assertSame('email_tracking.pdf', $content->getTitle());
1770 $this->assertSame('example.com', $content->getDomainName());
1773 public function testEntryDeleteTagLink()
1775 $this->logInAs('admin');
1776 $client = $this->getClient();
1778 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
1779 $entry = $em->getRepository('WallabagCoreBundle:Entry')->findByUrlAndUserId('http://0.0.0.0/entry1', $this->getLoggedInUserId());
1780 $tag = $entry->getTags()[0];
1782 $crawler = $client->request('GET', '/view/' . $entry->getId());
1784 // As long as the deletion link of a tag is following
1785 // a link to the tag view, we take the second one to retrieve
1786 // the deletion link of the first tag
1787 $link = $crawler->filter('body div#article div.tools ul.tags li.chip a')->extract('href')[1];
1789 $this->assertSame(sprintf('/remove-tag/%s/%s', $entry->getId(), $tag->getId()), $link);
1792 public function testRandom()
1794 $this->logInAs('admin');
1795 $client = $this->getClient();
1797 $client->request('GET', '/unread/random');
1798 $this->assertSame(302, $client->getResponse()->getStatusCode());
1799 $this->assertContains('/view/', $client->getResponse()->getTargetUrl(), 'Unread random');
1801 $client->request('GET', '/starred/random');
1802 $this->assertSame(302, $client->getResponse()->getStatusCode());
1803 $this->assertContains('/view/', $client->getResponse()->getTargetUrl(), 'Starred random');
1805 $client->request('GET', '/archive/random');
1806 $this->assertSame(302, $client->getResponse()->getStatusCode());
1807 $this->assertContains('/view/', $client->getResponse()->getTargetUrl(), 'Archive random');
1809 $client->request('GET', '/untagged/random');
1810 $this->assertSame(302, $client->getResponse()->getStatusCode());
1811 $this->assertContains('/view/', $client->getResponse()->getTargetUrl(), 'Untagged random');
1813 $client->request('GET', '/all/random');
1814 $this->assertSame(302, $client->getResponse()->getStatusCode());
1815 $this->assertContains('/view/', $client->getResponse()->getTargetUrl(), 'All random');
1818 public function testMass()
1820 $this->logInAs('admin');
1821 $client = $this->getClient();
1823 $entry1 = new Entry($this->getLoggedInUser());
1824 $entry1->setUrl($this->url
);
1825 $this->getEntityManager()->persist($entry1);
1827 $entry2 = new Entry($this->getLoggedInUser());
1828 $entry2->setUrl($this->url
);
1829 $this->getEntityManager()->persist($entry2);
1831 $this->getEntityManager()->flush();
1832 $this->getEntityManager()->clear();
1835 $entries[] = $entry1->getId();
1836 $entries[] = $entry2->getId();
1838 // Mass actions : archive
1839 $client->request('POST', '/mass', [
1840 'toggle-archive' => '',
1841 'entry-checkbox' => $entries,
1844 $this->assertSame(302, $client->getResponse()->getStatusCode());
1846 $res = $client->getContainer()
1847 ->get('doctrine.orm.entity_manager')
1848 ->getRepository('WallabagCoreBundle:Entry')
1849 ->find($entry1->getId());
1851 $this->assertSame(1, $res->isArchived());
1853 $res = $client->getContainer()
1854 ->get('doctrine.orm.entity_manager')
1855 ->getRepository('WallabagCoreBundle:Entry')
1856 ->find($entry2->getId());
1858 $this->assertSame(1, $res->isArchived());
1860 // Mass actions : star
1861 $client->request('POST', '/mass', [
1862 'toggle-star' => '',
1863 'entry-checkbox' => $entries,
1866 $this->assertSame(302, $client->getResponse()->getStatusCode());
1868 $res = $client->getContainer()
1869 ->get('doctrine.orm.entity_manager')
1870 ->getRepository('WallabagCoreBundle:Entry')
1871 ->find($entry1->getId());
1873 $this->assertSame(1, $res->isStarred());
1875 $res = $client->getContainer()
1876 ->get('doctrine.orm.entity_manager')
1877 ->getRepository('WallabagCoreBundle:Entry')
1878 ->find($entry2->getId());
1880 $this->assertSame(1, $res->isStarred());
1882 // Mass actions : delete
1883 $client->request('POST', '/mass', [
1885 'entry-checkbox' => $entries,
1888 $client->request('GET', '/delete/' . $entry1->getId());
1889 $this->assertSame(404, $client->getResponse()->getStatusCode());
1891 $client->request('GET', '/delete/' . $entry2->getId());
1892 $this->assertSame(404, $client->getResponse()->getStatusCode());