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 testStarred()
241 $this->logInAs('admin');
242 $client = $this->getClient();
244 $client->request('GET', '/starred/list');
246 $this->assertEquals(200, $client->getResponse()->getStatusCode());
249 public function testRangeException()
251 $this->logInAs('admin');
252 $client = $this->getClient();
254 $client->request('GET', '/all/list/900');
256 $this->assertEquals(302, $client->getResponse()->getStatusCode());
257 $this->assertEquals('/all/list', $client->getResponse()->getTargetUrl());
261 * @depends testPostNewOk
263 public function testView()
265 $this->logInAs('admin');
266 $client = $this->getClient();
268 $content = $client->getContainer()
269 ->get('doctrine.orm.entity_manager')
270 ->getRepository('WallabagCoreBundle:Entry')
271 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
273 $crawler = $client->request('GET', '/view/'.$content->getId());
275 $this->assertEquals(200, $client->getResponse()->getStatusCode());
276 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
277 $this->assertContains($content->getTitle(), $body[0]);
281 * @depends testPostNewOk
283 * This test will require an internet connection.
285 public function testReload()
287 $this->logInAs('admin');
288 $client = $this->getClient();
290 $content = $client->getContainer()
291 ->get('doctrine.orm.entity_manager')
292 ->getRepository('WallabagCoreBundle:Entry')
293 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
296 $content->setContent('');
297 $client->getContainer()->get('doctrine.orm.entity_manager')->persist($content);
298 $client->getContainer()->get('doctrine.orm.entity_manager')->flush();
300 $client->request('GET', '/reload/'.$content->getId());
302 $this->assertEquals(302, $client->getResponse()->getStatusCode());
304 $content = $client->getContainer()
305 ->get('doctrine.orm.entity_manager')
306 ->getRepository('WallabagCoreBundle:Entry')
307 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
309 $this->assertNotEmpty($content->getContent());
312 public function testEdit()
314 $this->logInAs('admin');
315 $client = $this->getClient();
317 $content = $client->getContainer()
318 ->get('doctrine.orm.entity_manager')
319 ->getRepository('WallabagCoreBundle:Entry')
320 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
322 $crawler = $client->request('GET', '/edit/'.$content->getId());
324 $this->assertEquals(200, $client->getResponse()->getStatusCode());
326 $this->assertCount(1, $crawler->filter('input[id=entry_title]'));
327 $this->assertCount(1, $crawler->filter('button[id=entry_save]'));
330 public function testEditUpdate()
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());
340 $crawler = $client->request('GET', '/edit/'.$content->getId());
342 $this->assertEquals(200, $client->getResponse()->getStatusCode());
344 $form = $crawler->filter('button[type=submit]')->form();
347 'entry[title]' => 'My updated title hehe :)',
350 $client->submit($form, $data);
352 $this->assertEquals(302, $client->getResponse()->getStatusCode());
354 $crawler = $client->followRedirect();
356 $this->assertGreaterThan(1, $alert = $crawler->filter('div[id=article] h1')->extract(['_text']));
357 $this->assertContains('My updated title hehe :)', $alert[0]);
360 public function testToggleArchive()
362 $this->logInAs('admin');
363 $client = $this->getClient();
365 $content = $client->getContainer()
366 ->get('doctrine.orm.entity_manager')
367 ->getRepository('WallabagCoreBundle:Entry')
368 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
370 $client->request('GET', '/archive/'.$content->getId());
372 $this->assertEquals(302, $client->getResponse()->getStatusCode());
374 $res = $client->getContainer()
375 ->get('doctrine.orm.entity_manager')
376 ->getRepository('WallabagCoreBundle:Entry')
377 ->find($content->getId());
379 $this->assertEquals($res->isArchived(), true);
382 public function testToggleStar()
384 $this->logInAs('admin');
385 $client = $this->getClient();
387 $content = $client->getContainer()
388 ->get('doctrine.orm.entity_manager')
389 ->getRepository('WallabagCoreBundle:Entry')
390 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
392 $client->request('GET', '/star/'.$content->getId());
394 $this->assertEquals(302, $client->getResponse()->getStatusCode());
396 $res = $client->getContainer()
397 ->get('doctrine.orm.entity_manager')
398 ->getRepository('WallabagCoreBundle:Entry')
399 ->findOneById($content->getId());
401 $this->assertEquals($res->isStarred(), true);
404 public function testDelete()
406 $this->logInAs('admin');
407 $client = $this->getClient();
409 $content = $client->getContainer()
410 ->get('doctrine.orm.entity_manager')
411 ->getRepository('WallabagCoreBundle:Entry')
412 ->findByUrlAndUserId($this->url
, $this->getLoggedInUserId());
414 $client->request('GET', '/delete/'.$content->getId());
416 $this->assertEquals(302, $client->getResponse()->getStatusCode());
418 $client->request('GET', '/delete/'.$content->getId());
420 $this->assertEquals(404, $client->getResponse()->getStatusCode());
424 * It will create a new entry.
428 * And it'll check that user won't be redirected to the view page of the content when it had been removed
430 public function testViewAndDelete()
432 $this->logInAs('admin');
433 $client = $this->getClient();
435 // add a new content to be removed later
436 $user = $client->getContainer()
437 ->get('doctrine.orm.entity_manager')
438 ->getRepository('WallabagUserBundle:User')
439 ->findOneByUserName('admin');
441 $content = new Entry($user);
442 $content->setUrl('http://1.1.1.1/entry');
443 $content->setReadingTime(12);
444 $content->setDomainName('domain.io');
445 $content->setMimetype('text/html');
446 $content->setTitle('test title entry');
447 $content->setContent('This is my content /o/');
448 $content->setArchived(true);
449 $content->setLanguage('fr');
451 $client->getContainer()
452 ->get('doctrine.orm.entity_manager')
454 $client->getContainer()
455 ->get('doctrine.orm.entity_manager')
458 $client->request('GET', '/view/'.$content->getId());
459 $this->assertEquals(200, $client->getResponse()->getStatusCode());
461 $client->request('GET', '/delete/'.$content->getId());
462 $this->assertEquals(302, $client->getResponse()->getStatusCode());
464 $client->followRedirect();
465 $this->assertEquals(200, $client->getResponse()->getStatusCode());
468 public function testViewOtherUserEntry()
470 $this->logInAs('admin');
471 $client = $this->getClient();
473 $content = $client->getContainer()
474 ->get('doctrine.orm.entity_manager')
475 ->getRepository('WallabagCoreBundle:Entry')
476 ->findOneByUsernameAndNotArchived('bob');
478 $client->request('GET', '/view/'.$content->getId());
480 $this->assertEquals(403, $client->getResponse()->getStatusCode());
483 public function testFilterOnReadingTime()
485 $this->logInAs('admin');
486 $client = $this->getClient();
488 $crawler = $client->request('GET', '/unread/list');
490 $form = $crawler->filter('button[id=submit-filter]')->form();
493 'entry_filter[readingTime][right_number]' => 22,
494 'entry_filter[readingTime][left_number]' => 22,
497 $crawler = $client->submit($form, $data);
499 $this->assertCount(1, $crawler->filter('div[class=entry]'));
502 public function testFilterOnReadingTimeOnlyUpper()
504 $this->logInAs('admin');
505 $client = $this->getClient();
507 $crawler = $client->request('GET', '/unread/list');
509 $form = $crawler->filter('button[id=submit-filter]')->form();
512 'entry_filter[readingTime][right_number]' => 22,
515 $crawler = $client->submit($form, $data);
517 $this->assertCount(2, $crawler->filter('div[class=entry]'));
520 public function testFilterOnReadingTimeOnlyLower()
522 $this->logInAs('admin');
523 $client = $this->getClient();
525 $crawler = $client->request('GET', '/unread/list');
527 $form = $crawler->filter('button[id=submit-filter]')->form();
530 'entry_filter[readingTime][left_number]' => 22,
533 $crawler = $client->submit($form, $data);
535 $this->assertCount(4, $crawler->filter('div[class=entry]'));
538 public function testFilterOnUnreadStatus()
540 $this->logInAs('admin');
541 $client = $this->getClient();
543 $crawler = $client->request('GET', '/all/list');
545 $form = $crawler->filter('button[id=submit-filter]')->form();
548 'entry_filter[isUnread]' => true,
551 $crawler = $client->submit($form, $data);
553 $this->assertCount(4, $crawler->filter('div[class=entry]'));
556 public function testFilterOnCreationDate()
558 $this->logInAs('admin');
559 $client = $this->getClient();
561 $crawler = $client->request('GET', '/unread/list');
563 $form = $crawler->filter('button[id=submit-filter]')->form();
566 'entry_filter[createdAt][left_date]' => date('d/m/Y'),
567 'entry_filter[createdAt][right_date]' => date('d/m/Y', strtotime('+1 day')),
570 $crawler = $client->submit($form, $data);
572 $this->assertCount(5, $crawler->filter('div[class=entry]'));
575 'entry_filter[createdAt][left_date]' => date('d/m/Y'),
576 'entry_filter[createdAt][right_date]' => date('d/m/Y'),
579 $crawler = $client->submit($form, $data);
581 $this->assertCount(5, $crawler->filter('div[class=entry]'));
584 'entry_filter[createdAt][left_date]' => '01/01/1970',
585 'entry_filter[createdAt][right_date]' => '01/01/1970',
588 $crawler = $client->submit($form, $data);
590 $this->assertCount(0, $crawler->filter('div[class=entry]'));
593 public function testPaginationWithFilter()
595 $this->logInAs('admin');
596 $client = $this->getClient();
597 $crawler = $client->request('GET', '/config');
599 $form = $crawler->filter('button[id=config_save]')->form();
602 'config[items_per_page]' => '1',
605 $client->submit($form, $data);
607 $parameters = '?entry_filter%5BreadingTime%5D%5Bleft_number%5D=&entry_filter%5BreadingTime%5D%5Bright_number%5D=';
609 $client->request('GET', 'unread/list'.$parameters);
611 $this->assertContains($parameters, $client->getResponse()->getContent());
614 $crawler = $client->request('GET', '/config');
615 $form = $crawler->filter('button[id=config_save]')->form();
617 'config[items_per_page]' => '12',
619 $client->submit($form, $data);
622 public function testFilterOnDomainName()
624 $this->logInAs('admin');
625 $client = $this->getClient();
627 $crawler = $client->request('GET', '/unread/list');
628 $form = $crawler->filter('button[id=submit-filter]')->form();
630 'entry_filter[domainName]' => 'domain',
633 $crawler = $client->submit($form, $data);
634 $this->assertCount(5, $crawler->filter('div[class=entry]'));
636 $form = $crawler->filter('button[id=submit-filter]')->form();
638 'entry_filter[domainName]' => 'wallabag',
641 $crawler = $client->submit($form, $data);
642 $this->assertCount(0, $crawler->filter('div[class=entry]'));
645 public function testFilterOnStatus()
647 $this->logInAs('admin');
648 $client = $this->getClient();
650 $crawler = $client->request('GET', '/unread/list');
651 $form = $crawler->filter('button[id=submit-filter]')->form();
652 $form['entry_filter[isArchived]']->tick();
653 $form['entry_filter[isStarred]']->untick();
655 $crawler = $client->submit($form);
656 $this->assertCount(1, $crawler->filter('div[class=entry]'));
658 $form = $crawler->filter('button[id=submit-filter]')->form();
659 $form['entry_filter[isArchived]']->untick();
660 $form['entry_filter[isStarred]']->tick();
662 $crawler = $client->submit($form);
663 $this->assertCount(1, $crawler->filter('div[class=entry]'));
666 public function testPreviewPictureFilter()
668 $this->logInAs('admin');
669 $client = $this->getClient();
671 $crawler = $client->request('GET', '/unread/list');
672 $form = $crawler->filter('button[id=submit-filter]')->form();
673 $form['entry_filter[previewPicture]']->tick();
675 $crawler = $client->submit($form);
676 $this->assertCount(1, $crawler->filter('div[class=entry]'));
679 public function testFilterOnLanguage()
681 $this->logInAs('admin');
682 $client = $this->getClient();
684 $crawler = $client->request('GET', '/unread/list');
685 $form = $crawler->filter('button[id=submit-filter]')->form();
687 'entry_filter[language]' => 'fr',
690 $crawler = $client->submit($form, $data);
691 $this->assertCount(2, $crawler->filter('div[class=entry]'));
693 $form = $crawler->filter('button[id=submit-filter]')->form();
695 'entry_filter[language]' => 'en',
698 $crawler = $client->submit($form, $data);
699 $this->assertCount(2, $crawler->filter('div[class=entry]'));