3 namespace Tests\Wallabag\CoreBundle\Controller
;
5 use Tests\Wallabag\CoreBundle\WallabagCoreTestCase
;
6 use Wallabag\CoreBundle\Entity\Config
;
7 use Wallabag\UserBundle\Entity\User
;
8 use Wallabag\CoreBundle\Entity\Entry
;
9 use Wallabag\CoreBundle\Entity\Tag
;
10 use Wallabag\AnnotationBundle\Entity\Annotation
;
12 class ConfigControllerTest
extends WallabagCoreTestCase
14 public function testLogin()
16 $client = $this->getClient();
18 $client->request('GET', '/new');
20 $this->assertEquals(302, $client->getResponse()->getStatusCode());
21 $this->assertContains('login', $client->getResponse()->headers
->get('location'));
24 public function testIndex()
26 $this->logInAs('admin');
27 $client = $this->getClient();
29 $crawler = $client->request('GET', '/config');
31 $this->assertEquals(200, $client->getResponse()->getStatusCode());
33 $this->assertCount(1, $crawler->filter('button[id=config_save]'));
34 $this->assertCount(1, $crawler->filter('button[id=change_passwd_save]'));
35 $this->assertCount(1, $crawler->filter('button[id=update_user_save]'));
36 $this->assertCount(1, $crawler->filter('button[id=rss_config_save]'));
39 public function testUpdate()
41 $this->logInAs('admin');
42 $client = $this->getClient();
44 $crawler = $client->request('GET', '/config');
46 $this->assertEquals(200, $client->getResponse()->getStatusCode());
48 $form = $crawler->filter('button[id=config_save]')->form();
51 'config[theme]' => 'baggy',
52 'config[items_per_page]' => '30',
53 'config[reading_speed]' => '0.5',
54 'config[action_mark_as_read]' => '0',
55 'config[language]' => 'en',
58 $client->submit($form, $data);
60 $this->assertEquals(302, $client->getResponse()->getStatusCode());
62 $crawler = $client->followRedirect();
64 $this->assertContains('flashes.config.notice.config_saved', $crawler->filter('body')->extract(['_text'])[0]);
67 public function testChangeReadingSpeed()
69 $this->logInAs('admin');
70 $client = $this->getClient();
72 $crawler = $client->request('GET', '/unread/list');
73 $form = $crawler->filter('button[id=submit-filter]')->form();
75 'entry_filter[readingTime][right_number]' => 22,
76 'entry_filter[readingTime][left_number]' => 22,
78 $crawler = $client->submit($form, $dataFilters);
79 $this->assertCount(1, $crawler->filter('div[class=entry]'));
81 // Change reading speed
82 $crawler = $client->request('GET', '/config');
83 $form = $crawler->filter('button[id=config_save]')->form();
85 'config[reading_speed]' => '2',
87 $client->submit($form, $data);
89 // Is the entry still available via filters?
90 $crawler = $client->request('GET', '/unread/list');
91 $form = $crawler->filter('button[id=submit-filter]')->form();
92 $crawler = $client->submit($form, $dataFilters);
93 $this->assertCount(0, $crawler->filter('div[class=entry]'));
95 // Restore old configuration
96 $crawler = $client->request('GET', '/config');
97 $form = $crawler->filter('button[id=config_save]')->form();
99 'config[reading_speed]' => '0.5',
101 $client->submit($form, $data);
104 public function dataForUpdateFailed()
108 'config[theme]' => 'baggy',
109 'config[items_per_page]' => '',
110 'config[language]' => 'en',
116 * @dataProvider dataForUpdateFailed
118 public function testUpdateFailed($data)
120 $this->logInAs('admin');
121 $client = $this->getClient();
123 $crawler = $client->request('GET', '/config');
125 $this->assertEquals(200, $client->getResponse()->getStatusCode());
127 $form = $crawler->filter('button[id=config_save]')->form();
129 $crawler = $client->submit($form, $data);
131 $this->assertEquals(200, $client->getResponse()->getStatusCode());
133 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
134 $this->assertContains('This value should not be blank', $alert[0]);
137 public function dataForChangePasswordFailed()
142 'change_passwd[old_password]' => 'material',
143 'change_passwd[new_password][first]' => '',
144 'change_passwd[new_password][second]' => '',
146 'validator.password_wrong_value',
150 'change_passwd[old_password]' => 'mypassword',
151 'change_passwd[new_password][first]' => '',
152 'change_passwd[new_password][second]' => '',
154 'This value should not be blank',
158 'change_passwd[old_password]' => 'mypassword',
159 'change_passwd[new_password][first]' => 'hop',
160 'change_passwd[new_password][second]' => '',
162 'validator.password_must_match',
166 'change_passwd[old_password]' => 'mypassword',
167 'change_passwd[new_password][first]' => 'hop',
168 'change_passwd[new_password][second]' => 'hop',
170 'validator.password_too_short',
176 * @dataProvider dataForChangePasswordFailed
178 public function testChangePasswordFailed($data, $expectedMessage)
180 $this->logInAs('admin');
181 $client = $this->getClient();
183 $crawler = $client->request('GET', '/config');
185 $this->assertEquals(200, $client->getResponse()->getStatusCode());
187 $form = $crawler->filter('button[id=change_passwd_save]')->form();
189 $crawler = $client->submit($form, $data);
191 $this->assertEquals(200, $client->getResponse()->getStatusCode());
193 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
194 $this->assertContains($expectedMessage, $alert[0]);
197 public function testChangePassword()
199 $this->logInAs('admin');
200 $client = $this->getClient();
202 $crawler = $client->request('GET', '/config');
204 $this->assertEquals(200, $client->getResponse()->getStatusCode());
206 $form = $crawler->filter('button[id=change_passwd_save]')->form();
209 'change_passwd[old_password]' => 'mypassword',
210 'change_passwd[new_password][first]' => 'mypassword',
211 'change_passwd[new_password][second]' => 'mypassword',
214 $client->submit($form, $data);
216 $this->assertEquals(302, $client->getResponse()->getStatusCode());
218 $crawler = $client->followRedirect();
220 $this->assertContains('flashes.config.notice.password_updated', $crawler->filter('body')->extract(['_text'])[0]);
223 public function dataForUserFailed()
228 'update_user[name]' => '',
229 'update_user[email]' => '',
231 'fos_user.email.blank',
235 'update_user[name]' => '',
236 'update_user[email]' => 'test',
238 'fos_user.email.invalid',
244 * @dataProvider dataForUserFailed
246 public function testUserFailed($data, $expectedMessage)
248 $this->logInAs('admin');
249 $client = $this->getClient();
251 $crawler = $client->request('GET', '/config');
253 $this->assertEquals(200, $client->getResponse()->getStatusCode());
255 $form = $crawler->filter('button[id=update_user_save]')->form();
257 $crawler = $client->submit($form, $data);
259 $this->assertEquals(200, $client->getResponse()->getStatusCode());
261 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
262 $this->assertContains($expectedMessage, $alert[0]);
265 public function testUserUpdate()
267 $this->logInAs('admin');
268 $client = $this->getClient();
270 $crawler = $client->request('GET', '/config');
272 $this->assertEquals(200, $client->getResponse()->getStatusCode());
274 $form = $crawler->filter('button[id=update_user_save]')->form();
277 'update_user[name]' => 'new name',
278 'update_user[email]' => 'admin@wallabag.io',
281 $client->submit($form, $data);
283 $this->assertEquals(302, $client->getResponse()->getStatusCode());
285 $crawler = $client->followRedirect();
287 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
288 $this->assertContains('flashes.config.notice.user_updated', $alert[0]);
291 public function testRssUpdateResetToken()
293 $this->logInAs('admin');
294 $client = $this->getClient();
297 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
299 ->getRepository('WallabagUserBundle:User')
300 ->findOneByUsername('admin');
303 $this->markTestSkipped('No user found in db.');
306 $config = $user->getConfig();
307 $config->setRssToken(null);
308 $em->persist($config);
311 $crawler = $client->request('GET', '/config');
313 $this->assertEquals(200, $client->getResponse()->getStatusCode());
315 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
316 $this->assertContains('config.form_rss.no_token', $body[0]);
318 $client->request('GET', '/generate-token');
319 $this->assertEquals(302, $client->getResponse()->getStatusCode());
321 $crawler = $client->followRedirect();
323 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
324 $this->assertNotContains('config.form_rss.no_token', $body[0]);
327 public function testGenerateTokenAjax()
329 $this->logInAs('admin');
330 $client = $this->getClient();
337 ['HTTP_X-Requested-With' => 'XMLHttpRequest']
340 $this->assertEquals(200, $client->getResponse()->getStatusCode());
341 $content = json_decode($client->getResponse()->getContent(), true);
342 $this->assertArrayHasKey('token', $content);
345 public function testRssUpdate()
347 $this->logInAs('admin');
348 $client = $this->getClient();
350 $crawler = $client->request('GET', '/config');
352 $this->assertEquals(200, $client->getResponse()->getStatusCode());
354 $form = $crawler->filter('button[id=rss_config_save]')->form();
357 'rss_config[rss_limit]' => 12,
360 $client->submit($form, $data);
362 $this->assertEquals(302, $client->getResponse()->getStatusCode());
364 $crawler = $client->followRedirect();
366 $this->assertContains('flashes.config.notice.rss_updated', $crawler->filter('body')->extract(['_text'])[0]);
369 public function dataForRssFailed()
374 'rss_config[rss_limit]' => 0,
376 'This value should be 1 or more.',
380 'rss_config[rss_limit]' => 1000000000000,
382 'validator.rss_limit_too_high',
388 * @dataProvider dataForRssFailed
390 public function testRssFailed($data, $expectedMessage)
392 $this->logInAs('admin');
393 $client = $this->getClient();
395 $crawler = $client->request('GET', '/config');
397 $this->assertEquals(200, $client->getResponse()->getStatusCode());
399 $form = $crawler->filter('button[id=rss_config_save]')->form();
401 $crawler = $client->submit($form, $data);
403 $this->assertEquals(200, $client->getResponse()->getStatusCode());
405 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
406 $this->assertContains($expectedMessage, $alert[0]);
409 public function testTaggingRuleCreation()
411 $this->logInAs('admin');
412 $client = $this->getClient();
414 $crawler = $client->request('GET', '/config');
416 $this->assertEquals(200, $client->getResponse()->getStatusCode());
418 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
421 'tagging_rule[rule]' => 'readingTime <= 3',
422 'tagging_rule[tags]' => 'short reading',
425 $client->submit($form, $data);
427 $this->assertEquals(302, $client->getResponse()->getStatusCode());
429 $crawler = $client->followRedirect();
431 $this->assertContains('flashes.config.notice.tagging_rules_updated', $crawler->filter('body')->extract(['_text'])[0]);
433 $editLink = $crawler->filter('.mode_edit')->last()->link();
435 $crawler = $client->click($editLink);
436 $this->assertEquals(302, $client->getResponse()->getStatusCode());
437 $this->assertContains('?tagging-rule=', $client->getResponse()->headers
->get('location'));
439 $crawler = $client->followRedirect();
441 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
444 'tagging_rule[rule]' => 'readingTime <= 30',
445 'tagging_rule[tags]' => 'short reading',
448 $client->submit($form, $data);
450 $this->assertEquals(302, $client->getResponse()->getStatusCode());
452 $crawler = $client->followRedirect();
454 $this->assertContains('flashes.config.notice.tagging_rules_updated', $crawler->filter('body')->extract(['_text'])[0]);
456 $this->assertContains('readingTime <= 30', $crawler->filter('body')->extract(['_text'])[0]);
458 $deleteLink = $crawler->filter('.delete')->last()->link();
460 $crawler = $client->click($deleteLink);
461 $this->assertEquals(302, $client->getResponse()->getStatusCode());
463 $crawler = $client->followRedirect();
464 $this->assertContains('flashes.config.notice.tagging_rules_deleted', $crawler->filter('body')->extract(['_text'])[0]);
467 public function dataForTaggingRuleFailed()
472 'tagging_rule[rule]' => 'unknownVar <= 3',
473 'tagging_rule[tags]' => 'cool tag',
482 'tagging_rule[rule]' => 'length(domainName) <= 42',
483 'tagging_rule[tags]' => 'cool tag',
494 * @dataProvider dataForTaggingRuleFailed
496 public function testTaggingRuleCreationFail($data, $messages)
498 $this->logInAs('admin');
499 $client = $this->getClient();
501 $crawler = $client->request('GET', '/config');
503 $this->assertEquals(200, $client->getResponse()->getStatusCode());
505 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
507 $crawler = $client->submit($form, $data);
509 $this->assertEquals(200, $client->getResponse()->getStatusCode());
511 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
513 foreach ($messages as $message) {
514 $this->assertContains($message, $body[0]);
518 public function testDeletingTaggingRuleFromAnOtherUser()
520 $this->logInAs('bob');
521 $client = $this->getClient();
523 $rule = $client->getContainer()->get('doctrine.orm.entity_manager')
524 ->getRepository('WallabagCoreBundle:TaggingRule')
527 $crawler = $client->request('GET', '/tagging-rule/edit/'.$rule->getId());
529 $this->assertEquals(403, $client->getResponse()->getStatusCode());
530 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
531 $this->assertContains('You can not access this tagging rule', $body[0]);
534 public function testEditingTaggingRuleFromAnOtherUser()
536 $this->logInAs('bob');
537 $client = $this->getClient();
539 $rule = $client->getContainer()->get('doctrine.orm.entity_manager')
540 ->getRepository('WallabagCoreBundle:TaggingRule')
543 $crawler = $client->request('GET', '/tagging-rule/edit/'.$rule->getId());
545 $this->assertEquals(403, $client->getResponse()->getStatusCode());
546 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
547 $this->assertContains('You can not access this tagging rule', $body[0]);
550 public function testDemoMode()
552 $this->logInAs('admin');
553 $client = $this->getClient();
555 $config = $client->getContainer()->get('craue_config');
556 $config->set('demo_mode_enabled', 1);
557 $config->set('demo_mode_username', 'admin');
559 $crawler = $client->request('GET', '/config');
561 $this->assertEquals(200, $client->getResponse()->getStatusCode());
563 $form = $crawler->filter('button[id=change_passwd_save]')->form();
566 'change_passwd[old_password]' => 'mypassword',
567 'change_passwd[new_password][first]' => 'mypassword',
568 'change_passwd[new_password][second]' => 'mypassword',
571 $client->submit($form, $data);
573 $this->assertEquals(302, $client->getResponse()->getStatusCode());
574 $this->assertContains('flashes.config.notice.password_not_updated_demo', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
576 $config->set('demo_mode_enabled', 0);
577 $config->set('demo_mode_username', 'wallabag');
580 public function testDeleteUserButtonVisibility()
582 $this->logInAs('admin');
583 $client = $this->getClient();
585 $crawler = $client->request('GET', '/config');
587 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
588 $this->assertContains('config.form_user.delete.button', $body[0]);
590 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
593 ->getRepository('WallabagUserBundle:User')
594 ->findOneByUsername('empty');
595 $user->setExpired(1);
599 ->getRepository('WallabagUserBundle:User')
600 ->findOneByUsername('bob');
601 $user->setExpired(1);
606 $crawler = $client->request('GET', '/config');
608 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
609 $this->assertNotContains('config.form_user.delete.button', $body[0]);
611 $client->request('GET', '/account/delete');
612 $this->assertEquals(403, $client->getResponse()->getStatusCode());
615 ->getRepository('WallabagUserBundle:User')
616 ->findOneByUsername('empty');
617 $user->setExpired(0);
621 ->getRepository('WallabagUserBundle:User')
622 ->findOneByUsername('bob');
623 $user->setExpired(0);
629 public function testDeleteAccount()
631 $client = $this->getClient();
632 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
635 $user->setName('Wallace');
636 $user->setEmail('wallace@wallabag.org');
637 $user->setUsername('wallace');
638 $user->setPlainPassword('wallace');
639 $user->setEnabled(true);
640 $user->addRole('ROLE_SUPER_ADMIN');
644 $config = new Config($user);
646 $config->setTheme('material');
647 $config->setItemsPerPage(30);
648 $config->setReadingSpeed(1);
649 $config->setLanguage('en');
650 $config->setPocketConsumerKey('xxxxx');
652 $em->persist($config);
655 $this->logInAs('wallace');
656 $loggedInUserId = $this->getLoggedInUserId();
658 // create entry to check after user deletion
659 // that this entry is also deleted
660 $crawler = $client->request('GET', '/new');
662 $this->assertEquals(200, $client->getResponse()->getStatusCode());
664 $form = $crawler->filter('form[name=entry]')->form();
666 'entry[url]' => $url = 'https://github.com/wallabag/wallabag',
669 $client->submit($form, $data);
670 $this->assertEquals(302, $client->getResponse()->getStatusCode());
672 $crawler = $client->request('GET', '/config');
674 $deleteLink = $crawler->filter('.delete-account')->last()->link();
676 $client->click($deleteLink);
677 $this->assertEquals(302, $client->getResponse()->getStatusCode());
679 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
681 ->getRepository('WallabagUserBundle:User')
682 ->createQueryBuilder('u')
683 ->where('u.username = :username')->setParameter('username', 'wallace')
685 ->getOneOrNullResult()
688 $this->assertNull($user);
690 $entries = $client->getContainer()
691 ->get('doctrine.orm.entity_manager')
692 ->getRepository('WallabagCoreBundle:Entry')
693 ->findByUser($loggedInUserId);
695 $this->assertEmpty($entries);
698 public function testReset()
700 $this->logInAs('empty');
701 $client = $this->getClient();
703 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
705 $user = static::$kernel->getContainer()->get('security.token_storage')->getToken()->getUser();
708 $tag->setLabel('super');
711 $entry = new Entry($user);
712 $entry->setUrl('http://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html');
713 $entry->setContent('Youhou');
714 $entry->setTitle('Youhou');
715 $entry->addTag($tag);
716 $em->persist($entry);
718 $entry2 = new Entry($user);
719 $entry2->setUrl('http://www.lemonde.de/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html');
720 $entry2->setContent('Youhou');
721 $entry2->setTitle('Youhou');
722 $entry2->addTag($tag);
723 $em->persist($entry2);
725 $annotation = new Annotation($user);
726 $annotation->setText('annotated');
727 $annotation->setQuote('annotated');
728 $annotation->setRanges([]);
729 $annotation->setEntry($entry);
730 $em->persist($annotation);
735 $crawler = $client->request('GET', '/config#set3');
737 $this->assertEquals(200, $client->getResponse()->getStatusCode());
739 $crawler = $client->click($crawler->selectLink('config.reset.annotations')->link());
741 $this->assertEquals(302, $client->getResponse()->getStatusCode());
742 $this->assertContains('flashes.config.notice.annotations_reset', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
744 $annotationsReset = $em
745 ->getRepository('WallabagAnnotationBundle:Annotation')
746 ->findAnnotationsByPageId($entry->getId(), $user->getId());
748 $this->assertEmpty($annotationsReset, 'Annotations were reset');
751 $crawler = $client->request('GET', '/config#set3');
753 $this->assertEquals(200, $client->getResponse()->getStatusCode());
755 $crawler = $client->click($crawler->selectLink('config.reset.tags')->link());
757 $this->assertEquals(302, $client->getResponse()->getStatusCode());
758 $this->assertContains('flashes.config.notice.tags_reset', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
761 ->getRepository('WallabagCoreBundle:Tag')
762 ->countAllTags($user->getId());
764 $this->assertEquals(0, $tagReset, 'Tags were reset');
767 $crawler = $client->request('GET', '/config#set3');
769 $this->assertEquals(200, $client->getResponse()->getStatusCode());
771 $crawler = $client->click($crawler->selectLink('config.reset.entries')->link());
773 $this->assertEquals(302, $client->getResponse()->getStatusCode());
774 $this->assertContains('flashes.config.notice.entries_reset', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
777 ->getRepository('WallabagCoreBundle:Entry')
778 ->countAllEntriesByUsername($user->getId());
780 $this->assertEquals(0, $entryReset, 'Entries were reset');
783 public function testResetEntriesCascade()
785 $this->logInAs('empty');
786 $client = $this->getClient();
788 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
790 $user = static::$kernel->getContainer()->get('security.token_storage')->getToken()->getUser();
793 $tag->setLabel('super');
796 $entry = new Entry($user);
797 $entry->setUrl('http://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html');
798 $entry->setContent('Youhou');
799 $entry->setTitle('Youhou');
800 $entry->addTag($tag);
801 $em->persist($entry);
803 $annotation = new Annotation($user);
804 $annotation->setText('annotated');
805 $annotation->setQuote('annotated');
806 $annotation->setRanges([]);
807 $annotation->setEntry($entry);
808 $em->persist($annotation);
812 $crawler = $client->request('GET', '/config#set3');
814 $this->assertEquals(200, $client->getResponse()->getStatusCode());
816 $crawler = $client->click($crawler->selectLink('config.reset.entries')->link());
818 $this->assertEquals(302, $client->getResponse()->getStatusCode());
819 $this->assertContains('flashes.config.notice.entries_reset', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
822 ->getRepository('WallabagCoreBundle:Entry')
823 ->countAllEntriesByUsername($user->getId());
825 $this->assertEquals(0, $entryReset, 'Entries were reset');
828 ->getRepository('WallabagCoreBundle:Tag')
829 ->countAllTags($user->getId());
831 $this->assertEquals(0, $tagReset, 'Tags were reset');
833 $annotationsReset = $em
834 ->getRepository('WallabagAnnotationBundle:Annotation')
835 ->findAnnotationsByPageId($entry->getId(), $user->getId());
837 $this->assertEmpty($annotationsReset, 'Annotations were reset');