3 namespace Tests\Wallabag\CoreBundle\Controller
;
5 use Tests\Wallabag\CoreBundle\WallabagCoreTestCase
;
6 use Wallabag\CoreBundle\Entity\Entry
;
8 class EntryControllerTest
extends WallabagCoreTestCase
10 public $url = 'http://www.lemonde.fr/pixels/article/2015/03/28/plongee-dans-l-univers-d-ingress-le-jeu-de-google-aux-frontieres-du-reel_4601155_4408996.html';
12 public function testLogin()
14 $client = $this->getClient();
16 $client->request('GET', '/new');
18 $this->assertEquals(302, $client->getResponse()->getStatusCode());
19 $this->assertContains('login', $client->getResponse()->headers
->get('location'));
22 public function testQuickstart()
24 $this->logInAs('empty');
25 $client = $this->getClient();
27 $client->request('GET', '/unread/list');
28 $crawler = $client->followRedirect();
30 $this->assertEquals(200, $client->getResponse()->getStatusCode());
31 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
32 $this->assertContains('quickstart.intro.title', $body[0]);
34 // Test if quickstart is disabled when user has 1 entry
35 $crawler = $client->request('GET', '/new');
37 $this->assertEquals(200, $client->getResponse()->getStatusCode());
39 $form = $crawler->filter('form[name=entry]')->form();
42 'entry[url]' => $this->url
,
45 $client->submit($form, $data);
46 $this->assertEquals(302, $client->getResponse()->getStatusCode());
47 $client->followRedirect();
49 $crawler = $client->request('GET', '/unread/list');
50 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
51 $this->assertContains('entry.list.number_on_the_page', $body[0]);
54 public function testGetNew()
56 $this->logInAs('admin');
57 $client = $this->getClient();
59 $crawler = $client->request('GET', '/new');
61 $this->assertEquals(200, $client->getResponse()->getStatusCode());
63 $this->assertCount(1, $crawler->filter('input[type=url]'));
64 $this->assertCount(1, $crawler->filter('form[name=entry]'));
67 public function testPostNewViaBookmarklet()
69 $this->logInAs('admin');
70 $client = $this->getClient();
72 $crawler = $client->request('GET', '/');
74 $this->assertCount(4, $crawler->filter('div[class=entry]'));
77 $client->request('GET', '/bookmarklet', ['url' => $this->url
]);
78 $this->assertEquals(302, $client->getResponse()->getStatusCode());
79 $client->followRedirect();
80 $crawler = $client->request('GET', '/');
81 $this->assertCount(5, $crawler->filter('div[class=entry]'));
83 $em = $client->getContainer()
84 ->get('doctrine.orm.entity_manager');
86 ->getRepository('WallabagCoreBundle:Entry')
87 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
92 public function testPostNewEmpty()
94 $this->logInAs('admin');
95 $client = $this->getClient();
97 $crawler = $client->request('GET', '/new');
99 $this->assertEquals(200, $client->getResponse()->getStatusCode());
101 $form = $crawler->filter('form[name=entry]')->form();
103 $crawler = $client->submit($form);
105 $this->assertEquals(200, $client->getResponse()->getStatusCode());
106 $this->assertCount(1, $alert = $crawler->filter('form ul li')->extract(['_text']));
107 $this->assertEquals('This value should not be blank.', $alert[0]);
111 * This test will require an internet connection.
113 public function testPostNewOk()
115 $this->logInAs('admin');
116 $client = $this->getClient();
118 $crawler = $client->request('GET', '/new');
120 $this->assertEquals(200, $client->getResponse()->getStatusCode());
122 $form = $crawler->filter('form[name=entry]')->form();
125 'entry[url]' => $this->url
,
128 $client->submit($form, $data);
130 $this->assertEquals(302, $client->getResponse()->getStatusCode());
132 $content = $client->getContainer()
133 ->get('doctrine.orm.entity_manager')
134 ->getRepository('WallabagCoreBundle:Entry')
135 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
137 $this->assertInstanceOf('Wallabag\CoreBundle\Entity\Entry', $content);
138 $this->assertEquals($this->url
, $content->getUrl());
139 $this->assertContains('Google', $content->getTitle());
142 public function testPostNewOkUrlExist()
144 $this->logInAs('admin');
145 $client = $this->getClient();
147 $crawler = $client->request('GET', '/new');
149 $this->assertEquals(200, $client->getResponse()->getStatusCode());
151 $form = $crawler->filter('form[name=entry]')->form();
154 'entry[url]' => $this->url
,
157 $client->submit($form, $data);
159 $this->assertEquals(302, $client->getResponse()->getStatusCode());
160 $this->assertContains('/view/', $client->getResponse()->getTargetUrl());
163 public function testPostNewOkUrlExistWithAccent()
165 $this->logInAs('admin');
166 $client = $this->getClient();
168 $url = 'http://www.aritylabs.com/post/106091708292/des-contr%C3%B4leurs-optionnels-gr%C3%A2ce-%C3%A0-constmissing';
170 $crawler = $client->request('GET', '/new');
172 $this->assertEquals(200, $client->getResponse()->getStatusCode());
174 $form = $crawler->filter('form[name=entry]')->form();
177 'entry[url]' => $url,
180 $client->submit($form, $data);
182 $crawler = $client->request('GET', '/new');
184 $this->assertEquals(200, $client->getResponse()->getStatusCode());
186 $form = $crawler->filter('form[name=entry]')->form();
189 'entry[url]' => $url,
192 $client->submit($form, $data);
194 $this->assertEquals(302, $client->getResponse()->getStatusCode());
195 $this->assertContains('/view/', $client->getResponse()->getTargetUrl());
197 $em = $client->getContainer()
198 ->get('doctrine.orm.entity_manager');
200 ->getRepository('WallabagCoreBundle:Entry')
201 ->findOneByUrl(urldecode($url));
208 * This test will require an internet connection.
210 public function testPostNewThatWillBeTagged()
212 $this->logInAs('admin');
213 $client = $this->getClient();
215 $crawler = $client->request('GET', '/new');
217 $this->assertEquals(200, $client->getResponse()->getStatusCode());
219 $form = $crawler->filter('form[name=entry]')->form();
222 'entry[url]' => $url = 'https://github.com/wallabag/wallabag',
225 $client->submit($form, $data);
227 $this->assertEquals(302, $client->getResponse()->getStatusCode());
228 $this->assertContains('/', $client->getResponse()->getTargetUrl());
230 $em = $client->getContainer()
231 ->get('doctrine.orm.entity_manager');
233 ->getRepository('WallabagCoreBundle:Entry')
234 ->findOneByUrl($url);
235 $tags = $entry->getTags();
237 $this->assertCount(1, $tags);
238 $this->assertEquals('wallabag', $tags[0]->getLabel());
243 // and now re-submit it to test the cascade persistence for tags after entry removal
244 // related https://github.com/wallabag/wallabag/issues/2121
245 $crawler = $client->request('GET', '/new');
247 $this->assertEquals(200, $client->getResponse()->getStatusCode());
249 $form = $crawler->filter('form[name=entry]')->form();
252 'entry[url]' => $url = 'https://github.com/wallabag/wallabag/tree/master',
255 $client->submit($form, $data);
257 $this->assertEquals(302, $client->getResponse()->getStatusCode());
258 $this->assertContains('/', $client->getResponse()->getTargetUrl());
261 ->getRepository('WallabagCoreBundle:Entry')
262 ->findOneByUrl($url);
264 $tags = $entry->getTags();
266 $this->assertCount(1, $tags);
267 $this->assertEquals('wallabag', $tags[0]->getLabel());
273 public function testArchive()
275 $this->logInAs('admin');
276 $client = $this->getClient();
278 $client->request('GET', '/archive/list');
280 $this->assertEquals(200, $client->getResponse()->getStatusCode());
283 public function testUntagged()
285 $this->logInAs('admin');
286 $client = $this->getClient();
288 $client->request('GET', '/untagged/list');
290 $this->assertEquals(200, $client->getResponse()->getStatusCode());
293 public function testStarred()
295 $this->logInAs('admin');
296 $client = $this->getClient();
298 $client->request('GET', '/starred/list');
300 $this->assertEquals(200, $client->getResponse()->getStatusCode());
303 public function testRangeException()
305 $this->logInAs('admin');
306 $client = $this->getClient();
308 $client->request('GET', '/all/list/900');
310 $this->assertEquals(302, $client->getResponse()->getStatusCode());
311 $this->assertEquals('/all/list', $client->getResponse()->getTargetUrl());
315 * @depends testPostNewOk
317 public function testView()
319 $this->logInAs('admin');
320 $client = $this->getClient();
322 $content = $client->getContainer()
323 ->get('doctrine.orm.entity_manager')
324 ->getRepository('WallabagCoreBundle:Entry')
325 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
327 $crawler = $client->request('GET', '/view/'.$content->getId());
329 $this->assertEquals(200, $client->getResponse()->getStatusCode());
330 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
331 $this->assertContains($content->getTitle(), $body[0]);
335 * @depends testPostNewOk
337 * This test will require an internet connection.
339 public function testReload()
341 $this->logInAs('admin');
342 $client = $this->getClient();
344 $em = $client->getContainer()
345 ->get('doctrine.orm.entity_manager');
348 ->getRepository('WallabagCoreBundle:Entry')
349 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
352 $content->setContent('');
353 $em->persist($content);
356 $client->request('GET', '/reload/'.$content->getId());
358 $this->assertEquals(302, $client->getResponse()->getStatusCode());
361 ->getRepository('WallabagCoreBundle:Entry')
362 ->find($content->getId());
364 $this->assertNotEmpty($content->getContent());
368 * @depends testPostNewOk
370 public function testReloadWithFetchingFailed()
372 $this->logInAs('admin');
373 $client = $this->getClient();
375 $em = $client->getContainer()
376 ->get('doctrine.orm.entity_manager');
379 ->getRepository('WallabagCoreBundle:Entry')
380 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
382 // put a known failed url
383 $content->setUrl('http://0.0.0.0/failed.html');
384 $em->persist($content);
387 $client->request('GET', '/reload/'.$content->getId());
389 $this->assertEquals(302, $client->getResponse()->getStatusCode());
391 // force EntityManager to clear previous entity
392 // otherwise, retrieve the same entity will retrieve change from the previous request :0
395 ->getRepository('WallabagCoreBundle:Entry')
396 ->find($content->getId());
398 $newContent->setUrl($this->url
);
399 $em->persist($newContent);
402 $this->assertNotEquals($client->getContainer()->getParameter('wallabag_core.fetching_error_message'), $newContent->getContent());
405 public function testEdit()
407 $this->logInAs('admin');
408 $client = $this->getClient();
410 $content = $client->getContainer()
411 ->get('doctrine.orm.entity_manager')
412 ->getRepository('WallabagCoreBundle:Entry')
413 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
415 $crawler = $client->request('GET', '/edit/'.$content->getId());
417 $this->assertEquals(200, $client->getResponse()->getStatusCode());
419 $this->assertCount(1, $crawler->filter('input[id=entry_title]'));
420 $this->assertCount(1, $crawler->filter('button[id=entry_save]'));
423 public function testEditUpdate()
425 $this->logInAs('admin');
426 $client = $this->getClient();
428 $content = $client->getContainer()
429 ->get('doctrine.orm.entity_manager')
430 ->getRepository('WallabagCoreBundle:Entry')
431 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
433 $crawler = $client->request('GET', '/edit/'.$content->getId());
435 $this->assertEquals(200, $client->getResponse()->getStatusCode());
437 $form = $crawler->filter('button[type=submit]')->form();
440 'entry[title]' => 'My updated title hehe :)',
443 $client->submit($form, $data);
445 $this->assertEquals(302, $client->getResponse()->getStatusCode());
447 $crawler = $client->followRedirect();
449 $this->assertGreaterThan(1, $alert = $crawler->filter('div[id=article] h1')->extract(['_text']));
450 $this->assertContains('My updated title hehe :)', $alert[0]);
453 public function testToggleArchive()
455 $this->logInAs('admin');
456 $client = $this->getClient();
458 $content = $client->getContainer()
459 ->get('doctrine.orm.entity_manager')
460 ->getRepository('WallabagCoreBundle:Entry')
461 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
463 $client->request('GET', '/archive/'.$content->getId());
465 $this->assertEquals(302, $client->getResponse()->getStatusCode());
467 $res = $client->getContainer()
468 ->get('doctrine.orm.entity_manager')
469 ->getRepository('WallabagCoreBundle:Entry')
470 ->find($content->getId());
472 $this->assertEquals($res->isArchived(), true);
475 public function testToggleStar()
477 $this->logInAs('admin');
478 $client = $this->getClient();
480 $content = $client->getContainer()
481 ->get('doctrine.orm.entity_manager')
482 ->getRepository('WallabagCoreBundle:Entry')
483 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
485 $client->request('GET', '/star/'.$content->getId());
487 $this->assertEquals(302, $client->getResponse()->getStatusCode());
489 $res = $client->getContainer()
490 ->get('doctrine.orm.entity_manager')
491 ->getRepository('WallabagCoreBundle:Entry')
492 ->findOneById($content->getId());
494 $this->assertEquals($res->isStarred(), true);
497 public function testDelete()
499 $this->logInAs('admin');
500 $client = $this->getClient();
502 $content = $client->getContainer()
503 ->get('doctrine.orm.entity_manager')
504 ->getRepository('WallabagCoreBundle:Entry')
505 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
507 $client->request('GET', '/delete/'.$content->getId());
509 $this->assertEquals(302, $client->getResponse()->getStatusCode());
511 $client->request('GET', '/delete/'.$content->getId());
513 $this->assertEquals(404, $client->getResponse()->getStatusCode());
517 * It will create a new entry.
521 * And it'll check that user won't be redirected to the view page of the content when it had been removed
523 public function testViewAndDelete()
525 $this->logInAs('admin');
526 $client = $this->getClient();
528 $em = $client->getContainer()
529 ->get('doctrine.orm.entity_manager');
531 // add a new content to be removed later
533 ->getRepository('WallabagUserBundle:User')
534 ->findOneByUserName('admin');
536 $content = new Entry($user);
537 $content->setUrl('http://1.1.1.1/entry');
538 $content->setReadingTime(12);
539 $content->setDomainName('domain.io');
540 $content->setMimetype('text/html');
541 $content->setTitle('test title entry');
542 $content->setContent('This is my content /o/');
543 $content->setArchived(true);
544 $content->setLanguage('fr');
546 $em->persist($content);
549 $client->request('GET', '/view/'.$content->getId());
550 $this->assertEquals(200, $client->getResponse()->getStatusCode());
552 $client->request('GET', '/delete/'.$content->getId());
553 $this->assertEquals(302, $client->getResponse()->getStatusCode());
555 $client->followRedirect();
556 $this->assertEquals(200, $client->getResponse()->getStatusCode());
559 public function testViewOtherUserEntry()
561 $this->logInAs('admin');
562 $client = $this->getClient();
564 $content = $client->getContainer()
565 ->get('doctrine.orm.entity_manager')
566 ->getRepository('WallabagCoreBundle:Entry')
567 ->findOneByUsernameAndNotArchived('bob');
569 $client->request('GET', '/view/'.$content->getId());
571 $this->assertEquals(403, $client->getResponse()->getStatusCode());
574 public function testFilterOnReadingTime()
576 $this->logInAs('admin');
577 $client = $this->getClient();
579 $crawler = $client->request('GET', '/unread/list');
581 $form = $crawler->filter('button[id=submit-filter]')->form();
584 'entry_filter[readingTime][right_number]' => 22,
585 'entry_filter[readingTime][left_number]' => 22,
588 $crawler = $client->submit($form, $data);
590 $this->assertCount(1, $crawler->filter('div[class=entry]'));
593 public function testFilterOnReadingTimeOnlyUpper()
595 $this->logInAs('admin');
596 $client = $this->getClient();
598 $crawler = $client->request('GET', '/unread/list');
600 $form = $crawler->filter('button[id=submit-filter]')->form();
603 'entry_filter[readingTime][right_number]' => 22,
606 $crawler = $client->submit($form, $data);
608 $this->assertCount(2, $crawler->filter('div[class=entry]'));
611 public function testFilterOnReadingTimeOnlyLower()
613 $this->logInAs('admin');
614 $client = $this->getClient();
616 $crawler = $client->request('GET', '/unread/list');
618 $form = $crawler->filter('button[id=submit-filter]')->form();
621 'entry_filter[readingTime][left_number]' => 22,
624 $crawler = $client->submit($form, $data);
626 $this->assertCount(4, $crawler->filter('div[class=entry]'));
629 public function testFilterOnUnreadStatus()
631 $this->logInAs('admin');
632 $client = $this->getClient();
634 $crawler = $client->request('GET', '/all/list');
636 $form = $crawler->filter('button[id=submit-filter]')->form();
639 'entry_filter[isUnread]' => true,
642 $crawler = $client->submit($form, $data);
644 $this->assertCount(4, $crawler->filter('div[class=entry]'));
647 public function testFilterOnCreationDate()
649 $this->logInAs('admin');
650 $client = $this->getClient();
652 $crawler = $client->request('GET', '/unread/list');
654 $form = $crawler->filter('button[id=submit-filter]')->form();
657 'entry_filter[createdAt][left_date]' => date('d/m/Y'),
658 'entry_filter[createdAt][right_date]' => date('d/m/Y', strtotime('+1 day')),
661 $crawler = $client->submit($form, $data);
663 $this->assertCount(5, $crawler->filter('div[class=entry]'));
666 'entry_filter[createdAt][left_date]' => date('d/m/Y'),
667 'entry_filter[createdAt][right_date]' => date('d/m/Y'),
670 $crawler = $client->submit($form, $data);
672 $this->assertCount(5, $crawler->filter('div[class=entry]'));
675 'entry_filter[createdAt][left_date]' => '01/01/1970',
676 'entry_filter[createdAt][right_date]' => '01/01/1970',
679 $crawler = $client->submit($form, $data);
681 $this->assertCount(0, $crawler->filter('div[class=entry]'));
684 public function testPaginationWithFilter()
686 $this->logInAs('admin');
687 $client = $this->getClient();
688 $crawler = $client->request('GET', '/config');
690 $form = $crawler->filter('button[id=config_save]')->form();
693 'config[items_per_page]' => '1',
696 $client->submit($form, $data);
698 $parameters = '?entry_filter%5BreadingTime%5D%5Bleft_number%5D=&entry_filter%5BreadingTime%5D%5Bright_number%5D=';
700 $client->request('GET', 'unread/list'.$parameters);
702 $this->assertContains($parameters, $client->getResponse()->getContent());
705 $crawler = $client->request('GET', '/config');
706 $form = $crawler->filter('button[id=config_save]')->form();
708 'config[items_per_page]' => '12',
710 $client->submit($form, $data);
713 public function testFilterOnDomainName()
715 $this->logInAs('admin');
716 $client = $this->getClient();
718 $crawler = $client->request('GET', '/unread/list');
719 $form = $crawler->filter('button[id=submit-filter]')->form();
721 'entry_filter[domainName]' => 'domain',
724 $crawler = $client->submit($form, $data);
725 $this->assertCount(5, $crawler->filter('div[class=entry]'));
727 $form = $crawler->filter('button[id=submit-filter]')->form();
729 'entry_filter[domainName]' => 'wallabag',
732 $crawler = $client->submit($form, $data);
733 $this->assertCount(0, $crawler->filter('div[class=entry]'));
736 public function testFilterOnStatus()
738 $this->logInAs('admin');
739 $client = $this->getClient();
741 $crawler = $client->request('GET', '/unread/list');
742 $form = $crawler->filter('button[id=submit-filter]')->form();
743 $form['entry_filter[isArchived]']->tick();
744 $form['entry_filter[isStarred]']->untick();
746 $crawler = $client->submit($form);
747 $this->assertCount(1, $crawler->filter('div[class=entry]'));
749 $form = $crawler->filter('button[id=submit-filter]')->form();
750 $form['entry_filter[isArchived]']->untick();
751 $form['entry_filter[isStarred]']->tick();
753 $crawler = $client->submit($form);
754 $this->assertCount(1, $crawler->filter('div[class=entry]'));
757 public function testPreviewPictureFilter()
759 $this->logInAs('admin');
760 $client = $this->getClient();
762 $crawler = $client->request('GET', '/unread/list');
763 $form = $crawler->filter('button[id=submit-filter]')->form();
764 $form['entry_filter[previewPicture]']->tick();
766 $crawler = $client->submit($form);
767 $this->assertCount(1, $crawler->filter('div[class=entry]'));
770 public function testFilterOnLanguage()
772 $this->logInAs('admin');
773 $client = $this->getClient();
775 $crawler = $client->request('GET', '/unread/list');
776 $form = $crawler->filter('button[id=submit-filter]')->form();
778 'entry_filter[language]' => 'fr',
781 $crawler = $client->submit($form, $data);
782 $this->assertCount(2, $crawler->filter('div[class=entry]'));
784 $form = $crawler->filter('button[id=submit-filter]')->form();
786 'entry_filter[language]' => 'en',
789 $crawler = $client->submit($form, $data);
790 $this->assertCount(2, $crawler->filter('div[class=entry]'));
793 public function testShareEntryPublicly()
795 $this->logInAs('admin');
796 $client = $this->getClient();
798 $content = $client->getContainer()
799 ->get('doctrine.orm.entity_manager')
800 ->getRepository('WallabagCoreBundle:Entry')
801 ->findOneByUser($this->getLoggedInUserId());
804 $client->request('GET', '/share/'.$content->getUuid());
805 $this->assertEquals(404, $client->getResponse()->getStatusCode());
807 // generating the uuid
808 $client->request('GET', '/share/'.$content->getId());
809 $this->assertEquals(302, $client->getResponse()->getStatusCode());
811 // follow link with uuid
812 $crawler = $client->followRedirect();
813 $this->assertEquals(200, $client->getResponse()->getStatusCode());
814 $this->assertContains('max-age=25200', $client->getResponse()->headers
->get('cache-control'));
815 $this->assertContains('public', $client->getResponse()->headers
->get('cache-control'));
816 $this->assertContains('s-maxage=25200', $client->getResponse()->headers
->get('cache-control'));
817 $this->assertNotContains('no-cache', $client->getResponse()->headers
->get('cache-control'));
818 $this->assertContains('og:title', $client->getResponse()->getContent());
819 $this->assertContains('og:type', $client->getResponse()->getContent());
820 $this->assertContains('og:url', $client->getResponse()->getContent());
821 $this->assertContains('og:image', $client->getResponse()->getContent());
823 // sharing is now disabled
824 $client->getContainer()->get('craue_config')->set('share_public', 0);
825 $client->request('GET', '/share/'.$content->getUuid());
826 $this->assertEquals(404, $client->getResponse()->getStatusCode());
828 $client->request('GET', '/view/'.$content->getId());
829 $this->assertContains('no-cache', $client->getResponse()->headers
->get('cache-control'));
831 // removing the share
832 $client->request('GET', '/share/delete/'.$content->getId());
833 $this->assertEquals(302, $client->getResponse()->getStatusCode());
835 // share is now disable
836 $client->request('GET', '/share/'.$content->getUuid());
837 $this->assertEquals(404, $client->getResponse()->getStatusCode());