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.paragraph_1', $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());
164 * This test will require an internet connection.
166 public function testPostNewThatWillBeTagged()
168 $this->logInAs('admin');
169 $client = $this->getClient();
171 $crawler = $client->request('GET', '/new');
173 $this->assertEquals(200, $client->getResponse()->getStatusCode());
175 $form = $crawler->filter('form[name=entry]')->form();
178 'entry[url]' => $url = 'https://github.com/wallabag/wallabag',
181 $client->submit($form, $data);
183 $this->assertEquals(302, $client->getResponse()->getStatusCode());
184 $this->assertContains('/', $client->getResponse()->getTargetUrl());
186 $em = $client->getContainer()
187 ->get('doctrine.orm.entity_manager');
189 ->getRepository('WallabagCoreBundle:Entry')
190 ->findOneByUrl($url);
191 $tags = $entry->getTags();
193 $this->assertCount(1, $tags);
194 $this->assertEquals('wallabag', $tags[0]->getLabel());
199 // and now re-submit it to test the cascade persistence for tags after entry removal
200 // related https://github.com/wallabag/wallabag/issues/2121
201 $crawler = $client->request('GET', '/new');
203 $this->assertEquals(200, $client->getResponse()->getStatusCode());
205 $form = $crawler->filter('form[name=entry]')->form();
208 'entry[url]' => $url = 'https://github.com/wallabag/wallabag/tree/master',
211 $client->submit($form, $data);
213 $this->assertEquals(302, $client->getResponse()->getStatusCode());
214 $this->assertContains('/', $client->getResponse()->getTargetUrl());
217 ->getRepository('WallabagCoreBundle:Entry')
218 ->findOneByUrl($url);
220 $tags = $entry->getTags();
222 $this->assertCount(1, $tags);
223 $this->assertEquals('wallabag', $tags[0]->getLabel());
229 public function testArchive()
231 $this->logInAs('admin');
232 $client = $this->getClient();
234 $client->request('GET', '/archive/list');
236 $this->assertEquals(200, $client->getResponse()->getStatusCode());
239 public function testUntagged()
241 $this->logInAs('admin');
242 $client = $this->getClient();
244 $client->request('GET', '/untagged/list');
246 $this->assertEquals(200, $client->getResponse()->getStatusCode());
249 public function testStarred()
251 $this->logInAs('admin');
252 $client = $this->getClient();
254 $client->request('GET', '/starred/list');
256 $this->assertEquals(200, $client->getResponse()->getStatusCode());
259 public function testRangeException()
261 $this->logInAs('admin');
262 $client = $this->getClient();
264 $client->request('GET', '/all/list/900');
266 $this->assertEquals(302, $client->getResponse()->getStatusCode());
267 $this->assertEquals('/all/list', $client->getResponse()->getTargetUrl());
271 * @depends testPostNewOk
273 public function testView()
275 $this->logInAs('admin');
276 $client = $this->getClient();
278 $content = $client->getContainer()
279 ->get('doctrine.orm.entity_manager')
280 ->getRepository('WallabagCoreBundle:Entry')
281 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
283 $crawler = $client->request('GET', '/view/'.$content->getId());
285 $this->assertEquals(200, $client->getResponse()->getStatusCode());
286 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
287 $this->assertContains($content->getTitle(), $body[0]);
291 * @depends testPostNewOk
293 * This test will require an internet connection.
295 public function testReload()
297 $this->logInAs('admin');
298 $client = $this->getClient();
300 $content = $client->getContainer()
301 ->get('doctrine.orm.entity_manager')
302 ->getRepository('WallabagCoreBundle:Entry')
303 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
306 $content->setContent('');
307 $client->getContainer()->get('doctrine.orm.entity_manager')->persist($content);
308 $client->getContainer()->get('doctrine.orm.entity_manager')->flush();
310 $client->request('GET', '/reload/'.$content->getId());
312 $this->assertEquals(302, $client->getResponse()->getStatusCode());
314 $content = $client->getContainer()
315 ->get('doctrine.orm.entity_manager')
316 ->getRepository('WallabagCoreBundle:Entry')
317 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
319 $this->assertNotEmpty($content->getContent());
322 public function testEdit()
324 $this->logInAs('admin');
325 $client = $this->getClient();
327 $content = $client->getContainer()
328 ->get('doctrine.orm.entity_manager')
329 ->getRepository('WallabagCoreBundle:Entry')
330 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
332 $crawler = $client->request('GET', '/edit/'.$content->getId());
334 $this->assertEquals(200, $client->getResponse()->getStatusCode());
336 $this->assertCount(1, $crawler->filter('input[id=entry_title]'));
337 $this->assertCount(1, $crawler->filter('button[id=entry_save]'));
340 public function testEditUpdate()
342 $this->logInAs('admin');
343 $client = $this->getClient();
345 $content = $client->getContainer()
346 ->get('doctrine.orm.entity_manager')
347 ->getRepository('WallabagCoreBundle:Entry')
348 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
350 $crawler = $client->request('GET', '/edit/'.$content->getId());
352 $this->assertEquals(200, $client->getResponse()->getStatusCode());
354 $form = $crawler->filter('button[type=submit]')->form();
357 'entry[title]' => 'My updated title hehe :)',
360 $client->submit($form, $data);
362 $this->assertEquals(302, $client->getResponse()->getStatusCode());
364 $crawler = $client->followRedirect();
366 $this->assertGreaterThan(1, $alert = $crawler->filter('div[id=article] h1')->extract(['_text']));
367 $this->assertContains('My updated title hehe :)', $alert[0]);
370 public function testToggleArchive()
372 $this->logInAs('admin');
373 $client = $this->getClient();
375 $content = $client->getContainer()
376 ->get('doctrine.orm.entity_manager')
377 ->getRepository('WallabagCoreBundle:Entry')
378 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
380 $client->request('GET', '/archive/'.$content->getId());
382 $this->assertEquals(302, $client->getResponse()->getStatusCode());
384 $res = $client->getContainer()
385 ->get('doctrine.orm.entity_manager')
386 ->getRepository('WallabagCoreBundle:Entry')
387 ->find($content->getId());
389 $this->assertEquals($res->isArchived(), true);
392 public function testToggleStar()
394 $this->logInAs('admin');
395 $client = $this->getClient();
397 $content = $client->getContainer()
398 ->get('doctrine.orm.entity_manager')
399 ->getRepository('WallabagCoreBundle:Entry')
400 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
402 $client->request('GET', '/star/'.$content->getId());
404 $this->assertEquals(302, $client->getResponse()->getStatusCode());
406 $res = $client->getContainer()
407 ->get('doctrine.orm.entity_manager')
408 ->getRepository('WallabagCoreBundle:Entry')
409 ->findOneById($content->getId());
411 $this->assertEquals($res->isStarred(), true);
414 public function testDelete()
416 $this->logInAs('admin');
417 $client = $this->getClient();
419 $content = $client->getContainer()
420 ->get('doctrine.orm.entity_manager')
421 ->getRepository('WallabagCoreBundle:Entry')
422 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
424 $client->request('GET', '/delete/'.$content->getId());
426 $this->assertEquals(302, $client->getResponse()->getStatusCode());
428 $client->request('GET', '/delete/'.$content->getId());
430 $this->assertEquals(404, $client->getResponse()->getStatusCode());
434 * It will create a new entry.
438 * And it'll check that user won't be redirected to the view page of the content when it had been removed
440 public function testViewAndDelete()
442 $this->logInAs('admin');
443 $client = $this->getClient();
445 // add a new content to be removed later
446 $user = $client->getContainer()
447 ->get('doctrine.orm.entity_manager')
448 ->getRepository('WallabagUserBundle:User')
449 ->findOneByUserName('admin');
451 $content = new Entry($user);
452 $content->setUrl('http://1.1.1.1/entry');
453 $content->setReadingTime(12);
454 $content->setDomainName('domain.io');
455 $content->setMimetype('text/html');
456 $content->setTitle('test title entry');
457 $content->setContent('This is my content /o/');
458 $content->setArchived(true);
459 $content->setLanguage('fr');
461 $client->getContainer()
462 ->get('doctrine.orm.entity_manager')
464 $client->getContainer()
465 ->get('doctrine.orm.entity_manager')
468 $client->request('GET', '/view/'.$content->getId());
469 $this->assertEquals(200, $client->getResponse()->getStatusCode());
471 $client->request('GET', '/delete/'.$content->getId());
472 $this->assertEquals(302, $client->getResponse()->getStatusCode());
474 $client->followRedirect();
475 $this->assertEquals(200, $client->getResponse()->getStatusCode());
478 public function testViewOtherUserEntry()
480 $this->logInAs('admin');
481 $client = $this->getClient();
483 $content = $client->getContainer()
484 ->get('doctrine.orm.entity_manager')
485 ->getRepository('WallabagCoreBundle:Entry')
486 ->findOneByUsernameAndNotArchived('bob');
488 $client->request('GET', '/view/'.$content->getId());
490 $this->assertEquals(403, $client->getResponse()->getStatusCode());
493 public function testFilterOnReadingTime()
495 $this->logInAs('admin');
496 $client = $this->getClient();
498 $crawler = $client->request('GET', '/unread/list');
500 $form = $crawler->filter('button[id=submit-filter]')->form();
503 'entry_filter[readingTime][right_number]' => 22,
504 'entry_filter[readingTime][left_number]' => 22,
507 $crawler = $client->submit($form, $data);
509 $this->assertCount(1, $crawler->filter('div[class=entry]'));
512 public function testFilterOnReadingTimeOnlyUpper()
514 $this->logInAs('admin');
515 $client = $this->getClient();
517 $crawler = $client->request('GET', '/unread/list');
519 $form = $crawler->filter('button[id=submit-filter]')->form();
522 'entry_filter[readingTime][right_number]' => 22,
525 $crawler = $client->submit($form, $data);
527 $this->assertCount(2, $crawler->filter('div[class=entry]'));
530 public function testFilterOnReadingTimeOnlyLower()
532 $this->logInAs('admin');
533 $client = $this->getClient();
535 $crawler = $client->request('GET', '/unread/list');
537 $form = $crawler->filter('button[id=submit-filter]')->form();
540 'entry_filter[readingTime][left_number]' => 22,
543 $crawler = $client->submit($form, $data);
545 $this->assertCount(4, $crawler->filter('div[class=entry]'));
548 public function testFilterOnUnreadStatus()
550 $this->logInAs('admin');
551 $client = $this->getClient();
553 $crawler = $client->request('GET', '/all/list');
555 $form = $crawler->filter('button[id=submit-filter]')->form();
558 'entry_filter[isUnread]' => true,
561 $crawler = $client->submit($form, $data);
563 $this->assertCount(4, $crawler->filter('div[class=entry]'));
566 public function testFilterOnCreationDate()
568 $this->logInAs('admin');
569 $client = $this->getClient();
571 $crawler = $client->request('GET', '/unread/list');
573 $form = $crawler->filter('button[id=submit-filter]')->form();
576 'entry_filter[createdAt][left_date]' => date('d/m/Y'),
577 'entry_filter[createdAt][right_date]' => date('d/m/Y', strtotime('+1 day')),
580 $crawler = $client->submit($form, $data);
582 $this->assertCount(5, $crawler->filter('div[class=entry]'));
585 'entry_filter[createdAt][left_date]' => date('d/m/Y'),
586 'entry_filter[createdAt][right_date]' => date('d/m/Y'),
589 $crawler = $client->submit($form, $data);
591 $this->assertCount(5, $crawler->filter('div[class=entry]'));
594 'entry_filter[createdAt][left_date]' => '01/01/1970',
595 'entry_filter[createdAt][right_date]' => '01/01/1970',
598 $crawler = $client->submit($form, $data);
600 $this->assertCount(0, $crawler->filter('div[class=entry]'));
603 public function testPaginationWithFilter()
605 $this->logInAs('admin');
606 $client = $this->getClient();
607 $crawler = $client->request('GET', '/config');
609 $form = $crawler->filter('button[id=config_save]')->form();
612 'config[items_per_page]' => '1',
615 $client->submit($form, $data);
617 $parameters = '?entry_filter%5BreadingTime%5D%5Bleft_number%5D=&entry_filter%5BreadingTime%5D%5Bright_number%5D=';
619 $client->request('GET', 'unread/list'.$parameters);
621 $this->assertContains($parameters, $client->getResponse()->getContent());
624 $crawler = $client->request('GET', '/config');
625 $form = $crawler->filter('button[id=config_save]')->form();
627 'config[items_per_page]' => '12',
629 $client->submit($form, $data);
632 public function testFilterOnDomainName()
634 $this->logInAs('admin');
635 $client = $this->getClient();
637 $crawler = $client->request('GET', '/unread/list');
638 $form = $crawler->filter('button[id=submit-filter]')->form();
640 'entry_filter[domainName]' => 'domain',
643 $crawler = $client->submit($form, $data);
644 $this->assertCount(5, $crawler->filter('div[class=entry]'));
646 $form = $crawler->filter('button[id=submit-filter]')->form();
648 'entry_filter[domainName]' => 'wallabag',
651 $crawler = $client->submit($form, $data);
652 $this->assertCount(0, $crawler->filter('div[class=entry]'));
655 public function testFilterOnStatus()
657 $this->logInAs('admin');
658 $client = $this->getClient();
660 $crawler = $client->request('GET', '/unread/list');
661 $form = $crawler->filter('button[id=submit-filter]')->form();
662 $form['entry_filter[isArchived]']->tick();
663 $form['entry_filter[isStarred]']->untick();
665 $crawler = $client->submit($form);
666 $this->assertCount(1, $crawler->filter('div[class=entry]'));
668 $form = $crawler->filter('button[id=submit-filter]')->form();
669 $form['entry_filter[isArchived]']->untick();
670 $form['entry_filter[isStarred]']->tick();
672 $crawler = $client->submit($form);
673 $this->assertCount(1, $crawler->filter('div[class=entry]'));
676 public function testPreviewPictureFilter()
678 $this->logInAs('admin');
679 $client = $this->getClient();
681 $crawler = $client->request('GET', '/unread/list');
682 $form = $crawler->filter('button[id=submit-filter]')->form();
683 $form['entry_filter[previewPicture]']->tick();
685 $crawler = $client->submit($form);
686 $this->assertCount(1, $crawler->filter('div[class=entry]'));
689 public function testFilterOnLanguage()
691 $this->logInAs('admin');
692 $client = $this->getClient();
694 $crawler = $client->request('GET', '/unread/list');
695 $form = $crawler->filter('button[id=submit-filter]')->form();
697 'entry_filter[language]' => 'fr',
700 $crawler = $client->submit($form, $data);
701 $this->assertCount(2, $crawler->filter('div[class=entry]'));
703 $form = $crawler->filter('button[id=submit-filter]')->form();
705 'entry_filter[language]' => 'en',
708 $crawler = $client->submit($form, $data);
709 $this->assertCount(2, $crawler->filter('div[class=entry]'));
712 public function testCache()
714 $this->logInAs('admin');
715 $client = $this->getClient();
717 $content = $client->getContainer()
718 ->get('doctrine.orm.entity_manager')
719 ->getRepository('WallabagCoreBundle:Entry')
720 ->findOneByUser($this->getLoggedInUserId());
723 $client->request('GET', '/share/'.$content->getUuid());
724 $this->assertEquals(404, $client->getResponse()->getStatusCode());
726 // generating the uuid
727 $client->request('GET', '/share/'.$content->getId());
728 $this->assertEquals(302, $client->getResponse()->getStatusCode());
730 // follow link with uuid
731 $crawler = $client->followRedirect();
732 $this->assertEquals(200, $client->getResponse()->getStatusCode());
733 $this->assertContains('max-age=25200', $client->getResponse()->headers
->get('cache-control'));
734 $this->assertContains('public', $client->getResponse()->headers
->get('cache-control'));
735 $this->assertContains('s-maxage=25200', $client->getResponse()->headers
->get('cache-control'));
736 $this->assertNotContains('no-cache', $client->getResponse()->headers
->get('cache-control'));
738 // sharing is now disabled
739 $client->getContainer()->get('craue_config')->set('share_public', 0);
740 $client->request('GET', '/share/'.$content->getUuid());
741 $this->assertEquals(404, $client->getResponse()->getStatusCode());
743 $client->request('GET', '/view/'.$content->getId());
744 $this->assertContains('no-cache', $client->getResponse()->headers
->get('cache-control'));
746 // removing the share
747 $client->request('GET', '/share/delete/'.$content->getId());
748 $this->assertEquals(302, $client->getResponse()->getStatusCode());
750 // share is now disable
751 $client->request('GET', '/share/'.$content->getUuid());
752 $this->assertEquals(404, $client->getResponse()->getStatusCode());