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());
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());
199 * This test will require an internet connection.
201 public function testPostNewThatWillBeTagged()
203 $this->logInAs('admin');
204 $client = $this->getClient();
206 $crawler = $client->request('GET', '/new');
208 $this->assertEquals(200, $client->getResponse()->getStatusCode());
210 $form = $crawler->filter('form[name=entry]')->form();
213 'entry[url]' => $url = 'https://github.com/wallabag/wallabag',
216 $client->submit($form, $data);
218 $this->assertEquals(302, $client->getResponse()->getStatusCode());
219 $this->assertContains('/', $client->getResponse()->getTargetUrl());
221 $em = $client->getContainer()
222 ->get('doctrine.orm.entity_manager');
224 ->getRepository('WallabagCoreBundle:Entry')
225 ->findOneByUrl($url);
226 $tags = $entry->getTags();
228 $this->assertCount(1, $tags);
229 $this->assertEquals('wallabag', $tags[0]->getLabel());
234 // and now re-submit it to test the cascade persistence for tags after entry removal
235 // related https://github.com/wallabag/wallabag/issues/2121
236 $crawler = $client->request('GET', '/new');
238 $this->assertEquals(200, $client->getResponse()->getStatusCode());
240 $form = $crawler->filter('form[name=entry]')->form();
243 'entry[url]' => $url = 'https://github.com/wallabag/wallabag/tree/master',
246 $client->submit($form, $data);
248 $this->assertEquals(302, $client->getResponse()->getStatusCode());
249 $this->assertContains('/', $client->getResponse()->getTargetUrl());
252 ->getRepository('WallabagCoreBundle:Entry')
253 ->findOneByUrl($url);
255 $tags = $entry->getTags();
257 $this->assertCount(1, $tags);
258 $this->assertEquals('wallabag', $tags[0]->getLabel());
264 public function testArchive()
266 $this->logInAs('admin');
267 $client = $this->getClient();
269 $client->request('GET', '/archive/list');
271 $this->assertEquals(200, $client->getResponse()->getStatusCode());
274 public function testUntagged()
276 $this->logInAs('admin');
277 $client = $this->getClient();
279 $client->request('GET', '/untagged/list');
281 $this->assertEquals(200, $client->getResponse()->getStatusCode());
284 public function testStarred()
286 $this->logInAs('admin');
287 $client = $this->getClient();
289 $client->request('GET', '/starred/list');
291 $this->assertEquals(200, $client->getResponse()->getStatusCode());
294 public function testRangeException()
296 $this->logInAs('admin');
297 $client = $this->getClient();
299 $client->request('GET', '/all/list/900');
301 $this->assertEquals(302, $client->getResponse()->getStatusCode());
302 $this->assertEquals('/all/list', $client->getResponse()->getTargetUrl());
306 * @depends testPostNewOk
308 public function testView()
310 $this->logInAs('admin');
311 $client = $this->getClient();
313 $content = $client->getContainer()
314 ->get('doctrine.orm.entity_manager')
315 ->getRepository('WallabagCoreBundle:Entry')
316 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
318 $crawler = $client->request('GET', '/view/'.$content->getId());
320 $this->assertEquals(200, $client->getResponse()->getStatusCode());
321 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
322 $this->assertContains($content->getTitle(), $body[0]);
326 * @depends testPostNewOk
328 * This test will require an internet connection.
330 public function testReload()
332 $this->logInAs('admin');
333 $client = $this->getClient();
335 $content = $client->getContainer()
336 ->get('doctrine.orm.entity_manager')
337 ->getRepository('WallabagCoreBundle:Entry')
338 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
341 $content->setContent('');
342 $client->getContainer()->get('doctrine.orm.entity_manager')->persist($content);
343 $client->getContainer()->get('doctrine.orm.entity_manager')->flush();
345 $client->request('GET', '/reload/'.$content->getId());
347 $this->assertEquals(302, $client->getResponse()->getStatusCode());
349 $content = $client->getContainer()
350 ->get('doctrine.orm.entity_manager')
351 ->getRepository('WallabagCoreBundle:Entry')
352 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
354 $this->assertNotEmpty($content->getContent());
357 public function testEdit()
359 $this->logInAs('admin');
360 $client = $this->getClient();
362 $content = $client->getContainer()
363 ->get('doctrine.orm.entity_manager')
364 ->getRepository('WallabagCoreBundle:Entry')
365 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
367 $crawler = $client->request('GET', '/edit/'.$content->getId());
369 $this->assertEquals(200, $client->getResponse()->getStatusCode());
371 $this->assertCount(1, $crawler->filter('input[id=entry_title]'));
372 $this->assertCount(1, $crawler->filter('button[id=entry_save]'));
375 public function testEditUpdate()
377 $this->logInAs('admin');
378 $client = $this->getClient();
380 $content = $client->getContainer()
381 ->get('doctrine.orm.entity_manager')
382 ->getRepository('WallabagCoreBundle:Entry')
383 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
385 $crawler = $client->request('GET', '/edit/'.$content->getId());
387 $this->assertEquals(200, $client->getResponse()->getStatusCode());
389 $form = $crawler->filter('button[type=submit]')->form();
392 'entry[title]' => 'My updated title hehe :)',
395 $client->submit($form, $data);
397 $this->assertEquals(302, $client->getResponse()->getStatusCode());
399 $crawler = $client->followRedirect();
401 $this->assertGreaterThan(1, $alert = $crawler->filter('div[id=article] h1')->extract(['_text']));
402 $this->assertContains('My updated title hehe :)', $alert[0]);
405 public function testToggleArchive()
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 $client->request('GET', '/archive/'.$content->getId());
417 $this->assertEquals(302, $client->getResponse()->getStatusCode());
419 $res = $client->getContainer()
420 ->get('doctrine.orm.entity_manager')
421 ->getRepository('WallabagCoreBundle:Entry')
422 ->find($content->getId());
424 $this->assertEquals($res->isArchived(), true);
427 public function testToggleStar()
429 $this->logInAs('admin');
430 $client = $this->getClient();
432 $content = $client->getContainer()
433 ->get('doctrine.orm.entity_manager')
434 ->getRepository('WallabagCoreBundle:Entry')
435 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
437 $client->request('GET', '/star/'.$content->getId());
439 $this->assertEquals(302, $client->getResponse()->getStatusCode());
441 $res = $client->getContainer()
442 ->get('doctrine.orm.entity_manager')
443 ->getRepository('WallabagCoreBundle:Entry')
444 ->findOneById($content->getId());
446 $this->assertEquals($res->isStarred(), true);
449 public function testDelete()
451 $this->logInAs('admin');
452 $client = $this->getClient();
454 $content = $client->getContainer()
455 ->get('doctrine.orm.entity_manager')
456 ->getRepository('WallabagCoreBundle:Entry')
457 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
459 $client->request('GET', '/delete/'.$content->getId());
461 $this->assertEquals(302, $client->getResponse()->getStatusCode());
463 $client->request('GET', '/delete/'.$content->getId());
465 $this->assertEquals(404, $client->getResponse()->getStatusCode());
469 * It will create a new entry.
473 * And it'll check that user won't be redirected to the view page of the content when it had been removed
475 public function testViewAndDelete()
477 $this->logInAs('admin');
478 $client = $this->getClient();
480 // add a new content to be removed later
481 $user = $client->getContainer()
482 ->get('doctrine.orm.entity_manager')
483 ->getRepository('WallabagUserBundle:User')
484 ->findOneByUserName('admin');
486 $content = new Entry($user);
487 $content->setUrl('http://1.1.1.1/entry');
488 $content->setReadingTime(12);
489 $content->setDomainName('domain.io');
490 $content->setMimetype('text/html');
491 $content->setTitle('test title entry');
492 $content->setContent('This is my content /o/');
493 $content->setArchived(true);
494 $content->setLanguage('fr');
496 $client->getContainer()
497 ->get('doctrine.orm.entity_manager')
499 $client->getContainer()
500 ->get('doctrine.orm.entity_manager')
503 $client->request('GET', '/view/'.$content->getId());
504 $this->assertEquals(200, $client->getResponse()->getStatusCode());
506 $client->request('GET', '/delete/'.$content->getId());
507 $this->assertEquals(302, $client->getResponse()->getStatusCode());
509 $client->followRedirect();
510 $this->assertEquals(200, $client->getResponse()->getStatusCode());
513 public function testViewOtherUserEntry()
515 $this->logInAs('admin');
516 $client = $this->getClient();
518 $content = $client->getContainer()
519 ->get('doctrine.orm.entity_manager')
520 ->getRepository('WallabagCoreBundle:Entry')
521 ->findOneByUsernameAndNotArchived('bob');
523 $client->request('GET', '/view/'.$content->getId());
525 $this->assertEquals(403, $client->getResponse()->getStatusCode());
528 public function testFilterOnReadingTime()
530 $this->logInAs('admin');
531 $client = $this->getClient();
533 $crawler = $client->request('GET', '/unread/list');
535 $form = $crawler->filter('button[id=submit-filter]')->form();
538 'entry_filter[readingTime][right_number]' => 22,
539 'entry_filter[readingTime][left_number]' => 22,
542 $crawler = $client->submit($form, $data);
544 $this->assertCount(1, $crawler->filter('div[class=entry]'));
547 public function testFilterOnReadingTimeOnlyUpper()
549 $this->logInAs('admin');
550 $client = $this->getClient();
552 $crawler = $client->request('GET', '/unread/list');
554 $form = $crawler->filter('button[id=submit-filter]')->form();
557 'entry_filter[readingTime][right_number]' => 22,
560 $crawler = $client->submit($form, $data);
562 $this->assertCount(2, $crawler->filter('div[class=entry]'));
565 public function testFilterOnReadingTimeOnlyLower()
567 $this->logInAs('admin');
568 $client = $this->getClient();
570 $crawler = $client->request('GET', '/unread/list');
572 $form = $crawler->filter('button[id=submit-filter]')->form();
575 'entry_filter[readingTime][left_number]' => 22,
578 $crawler = $client->submit($form, $data);
580 $this->assertCount(4, $crawler->filter('div[class=entry]'));
583 public function testFilterOnUnreadStatus()
585 $this->logInAs('admin');
586 $client = $this->getClient();
588 $crawler = $client->request('GET', '/all/list');
590 $form = $crawler->filter('button[id=submit-filter]')->form();
593 'entry_filter[isUnread]' => true,
596 $crawler = $client->submit($form, $data);
598 $this->assertCount(4, $crawler->filter('div[class=entry]'));
601 public function testFilterOnCreationDate()
603 $this->logInAs('admin');
604 $client = $this->getClient();
606 $crawler = $client->request('GET', '/unread/list');
608 $form = $crawler->filter('button[id=submit-filter]')->form();
611 'entry_filter[createdAt][left_date]' => date('d/m/Y'),
612 'entry_filter[createdAt][right_date]' => date('d/m/Y', strtotime('+1 day')),
615 $crawler = $client->submit($form, $data);
617 $this->assertCount(5, $crawler->filter('div[class=entry]'));
620 'entry_filter[createdAt][left_date]' => date('d/m/Y'),
621 'entry_filter[createdAt][right_date]' => date('d/m/Y'),
624 $crawler = $client->submit($form, $data);
626 $this->assertCount(5, $crawler->filter('div[class=entry]'));
629 'entry_filter[createdAt][left_date]' => '01/01/1970',
630 'entry_filter[createdAt][right_date]' => '01/01/1970',
633 $crawler = $client->submit($form, $data);
635 $this->assertCount(0, $crawler->filter('div[class=entry]'));
638 public function testPaginationWithFilter()
640 $this->logInAs('admin');
641 $client = $this->getClient();
642 $crawler = $client->request('GET', '/config');
644 $form = $crawler->filter('button[id=config_save]')->form();
647 'config[items_per_page]' => '1',
650 $client->submit($form, $data);
652 $parameters = '?entry_filter%5BreadingTime%5D%5Bleft_number%5D=&entry_filter%5BreadingTime%5D%5Bright_number%5D=';
654 $client->request('GET', 'unread/list'.$parameters);
656 $this->assertContains($parameters, $client->getResponse()->getContent());
659 $crawler = $client->request('GET', '/config');
660 $form = $crawler->filter('button[id=config_save]')->form();
662 'config[items_per_page]' => '12',
664 $client->submit($form, $data);
667 public function testFilterOnDomainName()
669 $this->logInAs('admin');
670 $client = $this->getClient();
672 $crawler = $client->request('GET', '/unread/list');
673 $form = $crawler->filter('button[id=submit-filter]')->form();
675 'entry_filter[domainName]' => 'domain',
678 $crawler = $client->submit($form, $data);
679 $this->assertCount(5, $crawler->filter('div[class=entry]'));
681 $form = $crawler->filter('button[id=submit-filter]')->form();
683 'entry_filter[domainName]' => 'wallabag',
686 $crawler = $client->submit($form, $data);
687 $this->assertCount(0, $crawler->filter('div[class=entry]'));
690 public function testFilterOnStatus()
692 $this->logInAs('admin');
693 $client = $this->getClient();
695 $crawler = $client->request('GET', '/unread/list');
696 $form = $crawler->filter('button[id=submit-filter]')->form();
697 $form['entry_filter[isArchived]']->tick();
698 $form['entry_filter[isStarred]']->untick();
700 $crawler = $client->submit($form);
701 $this->assertCount(1, $crawler->filter('div[class=entry]'));
703 $form = $crawler->filter('button[id=submit-filter]')->form();
704 $form['entry_filter[isArchived]']->untick();
705 $form['entry_filter[isStarred]']->tick();
707 $crawler = $client->submit($form);
708 $this->assertCount(1, $crawler->filter('div[class=entry]'));
711 public function testPreviewPictureFilter()
713 $this->logInAs('admin');
714 $client = $this->getClient();
716 $crawler = $client->request('GET', '/unread/list');
717 $form = $crawler->filter('button[id=submit-filter]')->form();
718 $form['entry_filter[previewPicture]']->tick();
720 $crawler = $client->submit($form);
721 $this->assertCount(1, $crawler->filter('div[class=entry]'));
724 public function testFilterOnLanguage()
726 $this->logInAs('admin');
727 $client = $this->getClient();
729 $crawler = $client->request('GET', '/unread/list');
730 $form = $crawler->filter('button[id=submit-filter]')->form();
732 'entry_filter[language]' => 'fr',
735 $crawler = $client->submit($form, $data);
736 $this->assertCount(2, $crawler->filter('div[class=entry]'));
738 $form = $crawler->filter('button[id=submit-filter]')->form();
740 'entry_filter[language]' => 'en',
743 $crawler = $client->submit($form, $data);
744 $this->assertCount(2, $crawler->filter('div[class=entry]'));
747 public function testCache()
749 $this->logInAs('admin');
750 $client = $this->getClient();
752 $content = $client->getContainer()
753 ->get('doctrine.orm.entity_manager')
754 ->getRepository('WallabagCoreBundle:Entry')
755 ->findOneByUser($this->getLoggedInUserId());
758 $client->request('GET', '/share/'.$content->getUuid());
759 $this->assertEquals(404, $client->getResponse()->getStatusCode());
761 // generating the uuid
762 $client->request('GET', '/share/'.$content->getId());
763 $this->assertEquals(302, $client->getResponse()->getStatusCode());
765 // follow link with uuid
766 $crawler = $client->followRedirect();
767 $this->assertEquals(200, $client->getResponse()->getStatusCode());
768 $this->assertContains('max-age=25200', $client->getResponse()->headers
->get('cache-control'));
769 $this->assertContains('public', $client->getResponse()->headers
->get('cache-control'));
770 $this->assertContains('s-maxage=25200', $client->getResponse()->headers
->get('cache-control'));
771 $this->assertNotContains('no-cache', $client->getResponse()->headers
->get('cache-control'));
773 // sharing is now disabled
774 $client->getContainer()->get('craue_config')->set('share_public', 0);
775 $client->request('GET', '/share/'.$content->getUuid());
776 $this->assertEquals(404, $client->getResponse()->getStatusCode());
778 $client->request('GET', '/view/'.$content->getId());
779 $this->assertContains('no-cache', $client->getResponse()->headers
->get('cache-control'));
781 // removing the share
782 $client->request('GET', '/share/delete/'.$content->getId());
783 $this->assertEquals(302, $client->getResponse()->getStatusCode());
785 // share is now disable
786 $client->request('GET', '/share/'.$content->getUuid());
787 $this->assertEquals(404, $client->getResponse()->getStatusCode());