3 namespace Tests\Wallabag\CoreBundle\Controller
;
5 use Tests\Wallabag\CoreBundle\WallabagCoreTestCase
;
7 class ConfigControllerTest
extends WallabagCoreTestCase
9 public function testLogin()
11 $client = $this->getClient();
13 $client->request('GET', '/new');
15 $this->assertEquals(302, $client->getResponse()->getStatusCode());
16 $this->assertContains('login', $client->getResponse()->headers
->get('location'));
19 public function testIndex()
21 $this->logInAs('admin');
22 $client = $this->getClient();
24 $crawler = $client->request('GET', '/config');
26 $this->assertEquals(200, $client->getResponse()->getStatusCode());
28 $this->assertCount(1, $crawler->filter('button[id=config_save]'));
29 $this->assertCount(1, $crawler->filter('button[id=change_passwd_save]'));
30 $this->assertCount(1, $crawler->filter('button[id=update_user_save]'));
31 $this->assertCount(1, $crawler->filter('button[id=new_user_save]'));
32 $this->assertCount(1, $crawler->filter('button[id=rss_config_save]'));
35 public function testUpdate()
37 $this->logInAs('admin');
38 $client = $this->getClient();
40 $crawler = $client->request('GET', '/config');
42 $this->assertEquals(200, $client->getResponse()->getStatusCode());
44 $form = $crawler->filter('button[id=config_save]')->form();
47 'config[theme]' => 'baggy',
48 'config[items_per_page]' => '30',
49 'config[reading_speed]' => '0.5',
50 'config[language]' => 'en',
53 $client->submit($form, $data);
55 $this->assertEquals(302, $client->getResponse()->getStatusCode());
57 $crawler = $client->followRedirect();
59 $this->assertContains('flashes.config.notice.config_saved', $crawler->filter('body')->extract(['_text'])[0]);
62 public function testChangeReadingSpeed()
64 $this->logInAs('admin');
65 $client = $this->getClient();
67 $crawler = $client->request('GET', '/unread/list');
68 $form = $crawler->filter('button[id=submit-filter]')->form();
70 'entry_filter[readingTime][right_number]' => 22,
71 'entry_filter[readingTime][left_number]' => 22,
73 $crawler = $client->submit($form, $dataFilters);
74 $this->assertCount(1, $crawler->filter('div[class=entry]'));
76 // Change reading speed
77 $crawler = $client->request('GET', '/config');
78 $form = $crawler->filter('button[id=config_save]')->form();
80 'config[reading_speed]' => '2',
82 $client->submit($form, $data);
84 // Is the entry still available via filters?
85 $crawler = $client->request('GET', '/unread/list');
86 $form = $crawler->filter('button[id=submit-filter]')->form();
87 $crawler = $client->submit($form, $dataFilters);
88 $this->assertCount(0, $crawler->filter('div[class=entry]'));
90 // Restore old configuration
91 $crawler = $client->request('GET', '/config');
92 $form = $crawler->filter('button[id=config_save]')->form();
94 'config[reading_speed]' => '0.5',
96 $client->submit($form, $data);
99 public function dataForUpdateFailed()
103 'config[theme]' => 'baggy',
104 'config[items_per_page]' => '',
105 'config[language]' => 'en',
111 * @dataProvider dataForUpdateFailed
113 public function testUpdateFailed($data)
115 $this->logInAs('admin');
116 $client = $this->getClient();
118 $crawler = $client->request('GET', '/config');
120 $this->assertEquals(200, $client->getResponse()->getStatusCode());
122 $form = $crawler->filter('button[id=config_save]')->form();
124 $crawler = $client->submit($form, $data);
126 $this->assertEquals(200, $client->getResponse()->getStatusCode());
128 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
129 $this->assertContains('This value should not be blank', $alert[0]);
132 public function dataForChangePasswordFailed()
137 'change_passwd[old_password]' => 'material',
138 'change_passwd[new_password][first]' => '',
139 'change_passwd[new_password][second]' => '',
141 'validator.password_wrong_value',
145 'change_passwd[old_password]' => 'mypassword',
146 'change_passwd[new_password][first]' => '',
147 'change_passwd[new_password][second]' => '',
149 'This value should not be blank',
153 'change_passwd[old_password]' => 'mypassword',
154 'change_passwd[new_password][first]' => 'hop',
155 'change_passwd[new_password][second]' => '',
157 'validator.password_must_match',
161 'change_passwd[old_password]' => 'mypassword',
162 'change_passwd[new_password][first]' => 'hop',
163 'change_passwd[new_password][second]' => 'hop',
165 'validator.password_too_short',
171 * @dataProvider dataForChangePasswordFailed
173 public function testChangePasswordFailed($data, $expectedMessage)
175 $this->logInAs('admin');
176 $client = $this->getClient();
178 $crawler = $client->request('GET', '/config');
180 $this->assertEquals(200, $client->getResponse()->getStatusCode());
182 $form = $crawler->filter('button[id=change_passwd_save]')->form();
184 $crawler = $client->submit($form, $data);
186 $this->assertEquals(200, $client->getResponse()->getStatusCode());
188 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
189 $this->assertContains($expectedMessage, $alert[0]);
192 public function testChangePassword()
194 $this->logInAs('admin');
195 $client = $this->getClient();
197 $crawler = $client->request('GET', '/config');
199 $this->assertEquals(200, $client->getResponse()->getStatusCode());
201 $form = $crawler->filter('button[id=change_passwd_save]')->form();
204 'change_passwd[old_password]' => 'mypassword',
205 'change_passwd[new_password][first]' => 'mypassword',
206 'change_passwd[new_password][second]' => 'mypassword',
209 $client->submit($form, $data);
211 $this->assertEquals(302, $client->getResponse()->getStatusCode());
213 $crawler = $client->followRedirect();
215 $this->assertContains('flashes.config.notice.password_updated', $crawler->filter('body')->extract(['_text'])[0]);
218 public function dataForUserFailed()
223 'update_user[name]' => '',
224 'update_user[email]' => '',
226 'fos_user.email.blank',
230 'update_user[name]' => '',
231 'update_user[email]' => 'test',
233 'fos_user.email.invalid',
239 * @dataProvider dataForUserFailed
241 public function testUserFailed($data, $expectedMessage)
243 $this->logInAs('admin');
244 $client = $this->getClient();
246 $crawler = $client->request('GET', '/config');
248 $this->assertEquals(200, $client->getResponse()->getStatusCode());
250 $form = $crawler->filter('button[id=update_user_save]')->form();
252 $crawler = $client->submit($form, $data);
254 $this->assertEquals(200, $client->getResponse()->getStatusCode());
256 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
257 $this->assertContains($expectedMessage, $alert[0]);
260 public function testUserUpdate()
262 $this->logInAs('admin');
263 $client = $this->getClient();
265 $crawler = $client->request('GET', '/config');
267 $this->assertEquals(200, $client->getResponse()->getStatusCode());
269 $form = $crawler->filter('button[id=update_user_save]')->form();
272 'update_user[name]' => 'new name',
273 'update_user[email]' => 'admin@wallabag.io',
276 $client->submit($form, $data);
278 $this->assertEquals(302, $client->getResponse()->getStatusCode());
280 $crawler = $client->followRedirect();
282 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
283 $this->assertContains('flashes.config.notice.user_updated', $alert[0]);
286 public function dataForNewUserFailed()
291 'new_user[username]' => '',
292 'new_user[plainPassword][first]' => '',
293 'new_user[plainPassword][second]' => '',
294 'new_user[email]' => '',
296 'fos_user.username.blank',
300 'new_user[username]' => 'a',
301 'new_user[plainPassword][first]' => 'mypassword',
302 'new_user[plainPassword][second]' => 'mypassword',
303 'new_user[email]' => '',
305 'fos_user.username.short',
309 'new_user[username]' => 'wallace',
310 'new_user[plainPassword][first]' => 'mypassword',
311 'new_user[plainPassword][second]' => 'mypassword',
312 'new_user[email]' => 'test',
314 'fos_user.email.invalid',
318 'new_user[username]' => 'admin',
319 'new_user[plainPassword][first]' => 'wallacewallace',
320 'new_user[plainPassword][second]' => 'wallacewallace',
321 'new_user[email]' => 'wallace@wallace.me',
323 'fos_user.username.already_used',
327 'new_user[username]' => 'wallace',
328 'new_user[plainPassword][first]' => 'mypassword1',
329 'new_user[plainPassword][second]' => 'mypassword2',
330 'new_user[email]' => 'wallace@wallace.me',
332 'validator.password_must_match',
338 * @dataProvider dataForNewUserFailed
340 public function testNewUserFailed($data, $expectedMessage)
342 $this->logInAs('admin');
343 $client = $this->getClient();
345 $crawler = $client->request('GET', '/config');
347 $this->assertEquals(200, $client->getResponse()->getStatusCode());
349 $form = $crawler->filter('button[id=new_user_save]')->form();
351 $crawler = $client->submit($form, $data);
353 $this->assertEquals(200, $client->getResponse()->getStatusCode());
355 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
356 $this->assertContains($expectedMessage, $alert[0]);
359 public function testNewUserCreated()
361 $this->logInAs('admin');
362 $client = $this->getClient();
364 $crawler = $client->request('GET', '/config');
366 $this->assertEquals(200, $client->getResponse()->getStatusCode());
368 $form = $crawler->filter('button[id=new_user_save]')->form();
371 'new_user[username]' => 'wallace',
372 'new_user[plainPassword][first]' => 'wallace1',
373 'new_user[plainPassword][second]' => 'wallace1',
374 'new_user[email]' => 'wallace@wallace.me',
377 $client->submit($form, $data);
379 $this->assertEquals(302, $client->getResponse()->getStatusCode());
381 $crawler = $client->followRedirect();
383 $this->assertContains('flashes.config.notice.user_added', $crawler->filter('body')->extract(['_text'])[0]);
385 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
387 ->getRepository('WallabagUserBundle:User')
388 ->findOneByUsername('wallace');
390 $this->assertTrue(false !== $user);
391 $this->assertTrue($user->isEnabled());
392 $this->assertEquals('material', $user->getConfig()->getTheme());
393 $this->assertEquals(12, $user->getConfig()->getItemsPerPage());
394 $this->assertEquals(50, $user->getConfig()->getRssLimit());
395 $this->assertEquals('en', $user->getConfig()->getLanguage());
396 $this->assertEquals(1, $user->getConfig()->getReadingSpeed());
399 public function testRssUpdateResetToken()
401 $this->logInAs('admin');
402 $client = $this->getClient();
405 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
407 ->getRepository('WallabagUserBundle:User')
408 ->findOneByUsername('admin');
411 $this->markTestSkipped('No user found in db.');
414 $config = $user->getConfig();
415 $config->setRssToken(null);
416 $em->persist($config);
419 $crawler = $client->request('GET', '/config');
421 $this->assertEquals(200, $client->getResponse()->getStatusCode());
423 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
424 $this->assertContains('config.form_rss.no_token', $body[0]);
426 $client->request('GET', '/generate-token');
427 $this->assertEquals(302, $client->getResponse()->getStatusCode());
429 $crawler = $client->followRedirect();
431 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
432 $this->assertNotContains('config.form_rss.no_token', $body[0]);
435 public function testGenerateTokenAjax()
437 $this->logInAs('admin');
438 $client = $this->getClient();
445 ['HTTP_X-Requested-With' => 'XMLHttpRequest']
448 $this->assertEquals(200, $client->getResponse()->getStatusCode());
449 $content = json_decode($client->getResponse()->getContent(), true);
450 $this->assertArrayHasKey('token', $content);
453 public function testRssUpdate()
455 $this->logInAs('admin');
456 $client = $this->getClient();
458 $crawler = $client->request('GET', '/config');
460 $this->assertEquals(200, $client->getResponse()->getStatusCode());
462 $form = $crawler->filter('button[id=rss_config_save]')->form();
465 'rss_config[rss_limit]' => 12,
468 $client->submit($form, $data);
470 $this->assertEquals(302, $client->getResponse()->getStatusCode());
472 $crawler = $client->followRedirect();
474 $this->assertContains('flashes.config.notice.rss_updated', $crawler->filter('body')->extract(['_text'])[0]);
477 public function dataForRssFailed()
482 'rss_config[rss_limit]' => 0,
484 'This value should be 1 or more.',
488 'rss_config[rss_limit]' => 1000000000000,
490 'validator.rss_limit_too_hight',
496 * @dataProvider dataForRssFailed
498 public function testRssFailed($data, $expectedMessage)
500 $this->logInAs('admin');
501 $client = $this->getClient();
503 $crawler = $client->request('GET', '/config');
505 $this->assertEquals(200, $client->getResponse()->getStatusCode());
507 $form = $crawler->filter('button[id=rss_config_save]')->form();
509 $crawler = $client->submit($form, $data);
511 $this->assertEquals(200, $client->getResponse()->getStatusCode());
513 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
514 $this->assertContains($expectedMessage, $alert[0]);
517 public function testTaggingRuleCreation()
519 $this->logInAs('admin');
520 $client = $this->getClient();
522 $crawler = $client->request('GET', '/config');
524 $this->assertTrue($client->getResponse()->isSuccessful());
526 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
529 'tagging_rule[rule]' => 'readingTime <= 3',
530 'tagging_rule[tags]' => 'short reading',
533 $client->submit($form, $data);
535 $this->assertEquals(302, $client->getResponse()->getStatusCode());
537 $crawler = $client->followRedirect();
539 $this->assertContains('flashes.config.notice.tagging_rules_updated', $crawler->filter('body')->extract(['_text'])[0]);
541 $editLink = $crawler->filter('.mode_edit')->last()->link();
543 $crawler = $client->click($editLink);
544 $this->assertEquals(302, $client->getResponse()->getStatusCode());
545 $this->assertContains('?tagging-rule=', $client->getResponse()->headers
->get('location'));
547 $crawler = $client->followRedirect();
549 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
552 'tagging_rule[rule]' => 'readingTime <= 30',
553 'tagging_rule[tags]' => 'short reading',
556 $client->submit($form, $data);
558 $this->assertEquals(302, $client->getResponse()->getStatusCode());
560 $crawler = $client->followRedirect();
562 $this->assertContains('flashes.config.notice.tagging_rules_updated', $crawler->filter('body')->extract(['_text'])[0]);
564 $this->assertContains('readingTime <= 30', $crawler->filter('body')->extract(['_text'])[0]);
566 $deleteLink = $crawler->filter('.delete')->last()->link();
568 $crawler = $client->click($deleteLink);
569 $this->assertEquals(302, $client->getResponse()->getStatusCode());
571 $crawler = $client->followRedirect();
572 $this->assertContains('flashes.config.notice.tagging_rules_deleted', $crawler->filter('body')->extract(['_text'])[0]);
575 public function dataForTaggingRuleFailed()
580 'tagging_rule[rule]' => 'unknownVar <= 3',
581 'tagging_rule[tags]' => 'cool tag',
590 'tagging_rule[rule]' => 'length(domainName) <= 42',
591 'tagging_rule[tags]' => 'cool tag',
602 * @dataProvider dataForTaggingRuleFailed
604 public function testTaggingRuleCreationFail($data, $messages)
606 $this->logInAs('admin');
607 $client = $this->getClient();
609 $crawler = $client->request('GET', '/config');
611 $this->assertTrue($client->getResponse()->isSuccessful());
613 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
615 $crawler = $client->submit($form, $data);
617 $this->assertEquals(200, $client->getResponse()->getStatusCode());
619 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
621 foreach ($messages as $message) {
622 $this->assertContains($message, $body[0]);
626 public function testDeletingTaggingRuleFromAnOtherUser()
628 $this->logInAs('bob');
629 $client = $this->getClient();
631 $rule = $client->getContainer()->get('doctrine.orm.entity_manager')
632 ->getRepository('WallabagCoreBundle:TaggingRule')
635 $crawler = $client->request('GET', '/tagging-rule/edit/'.$rule->getId());
637 $this->assertEquals(403, $client->getResponse()->getStatusCode());
638 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
639 $this->assertContains('You can not access this tagging rule', $body[0]);
642 public function testEditingTaggingRuleFromAnOtherUser()
644 $this->logInAs('bob');
645 $client = $this->getClient();
647 $rule = $client->getContainer()->get('doctrine.orm.entity_manager')
648 ->getRepository('WallabagCoreBundle:TaggingRule')
651 $crawler = $client->request('GET', '/tagging-rule/edit/'.$rule->getId());
653 $this->assertEquals(403, $client->getResponse()->getStatusCode());
654 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
655 $this->assertContains('You can not access this tagging rule', $body[0]);
658 public function testDemoMode()
660 $this->logInAs('admin');
661 $client = $this->getClient();
663 $config = $client->getContainer()->get('craue_config');
664 $config->set('demo_mode_enabled', 1);
665 $config->set('demo_mode_username', 'admin');
667 $crawler = $client->request('GET', '/config');
669 $this->assertEquals(200, $client->getResponse()->getStatusCode());
671 $form = $crawler->filter('button[id=change_passwd_save]')->form();
674 'change_passwd[old_password]' => 'mypassword',
675 'change_passwd[new_password][first]' => 'mypassword',
676 'change_passwd[new_password][second]' => 'mypassword',
679 $client->submit($form, $data);
681 $this->assertEquals(302, $client->getResponse()->getStatusCode());
682 $this->assertContains('flashes.config.notice.password_not_updated_demo', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
684 $config->set('demo_mode_enabled', 0);
685 $config->set('demo_mode_username', 'wallabag');