]> git.immae.eu Git - github/wallabag/wallabag.git/blob - tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php
Add ability to edit a tagging rule
[github/wallabag/wallabag.git] / tests / Wallabag / CoreBundle / Controller / ConfigControllerTest.php
1 <?php
2
3 namespace Tests\Wallabag\CoreBundle\Controller;
4
5 use Tests\Wallabag\CoreBundle\WallabagCoreTestCase;
6
7 class ConfigControllerTest extends WallabagCoreTestCase
8 {
9 public function testLogin()
10 {
11 $client = $this->getClient();
12
13 $client->request('GET', '/new');
14
15 $this->assertEquals(302, $client->getResponse()->getStatusCode());
16 $this->assertContains('login', $client->getResponse()->headers->get('location'));
17 }
18
19 public function testIndex()
20 {
21 $this->logInAs('admin');
22 $client = $this->getClient();
23
24 $crawler = $client->request('GET', '/config');
25
26 $this->assertEquals(200, $client->getResponse()->getStatusCode());
27
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]'));
33 }
34
35 public function testUpdate()
36 {
37 $this->logInAs('admin');
38 $client = $this->getClient();
39
40 $crawler = $client->request('GET', '/config');
41
42 $this->assertEquals(200, $client->getResponse()->getStatusCode());
43
44 $form = $crawler->filter('button[id=config_save]')->form();
45
46 $data = [
47 'config[theme]' => 'baggy',
48 'config[items_per_page]' => '30',
49 'config[reading_speed]' => '0.5',
50 'config[language]' => 'en',
51 ];
52
53 $client->submit($form, $data);
54
55 $this->assertEquals(302, $client->getResponse()->getStatusCode());
56
57 $crawler = $client->followRedirect();
58
59 $this->assertContains('flashes.config.notice.config_saved', $crawler->filter('body')->extract(['_text'])[0]);
60 }
61
62 public function testChangeReadingSpeed()
63 {
64 $this->logInAs('admin');
65 $client = $this->getClient();
66
67 $crawler = $client->request('GET', '/unread/list');
68 $form = $crawler->filter('button[id=submit-filter]')->form();
69 $dataFilters = [
70 'entry_filter[readingTime][right_number]' => 22,
71 'entry_filter[readingTime][left_number]' => 22,
72 ];
73 $crawler = $client->submit($form, $dataFilters);
74 $this->assertCount(1, $crawler->filter('div[class=entry]'));
75
76 // Change reading speed
77 $crawler = $client->request('GET', '/config');
78 $form = $crawler->filter('button[id=config_save]')->form();
79 $data = [
80 'config[reading_speed]' => '2',
81 ];
82 $client->submit($form, $data);
83
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]'));
89
90 // Restore old configuration
91 $crawler = $client->request('GET', '/config');
92 $form = $crawler->filter('button[id=config_save]')->form();
93 $data = [
94 'config[reading_speed]' => '0.5',
95 ];
96 $client->submit($form, $data);
97 }
98
99 public function dataForUpdateFailed()
100 {
101 return [
102 [[
103 'config[theme]' => 'baggy',
104 'config[items_per_page]' => '',
105 'config[language]' => 'en',
106 ]],
107 ];
108 }
109
110 /**
111 * @dataProvider dataForUpdateFailed
112 */
113 public function testUpdateFailed($data)
114 {
115 $this->logInAs('admin');
116 $client = $this->getClient();
117
118 $crawler = $client->request('GET', '/config');
119
120 $this->assertEquals(200, $client->getResponse()->getStatusCode());
121
122 $form = $crawler->filter('button[id=config_save]')->form();
123
124 $crawler = $client->submit($form, $data);
125
126 $this->assertEquals(200, $client->getResponse()->getStatusCode());
127
128 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
129 $this->assertContains('This value should not be blank', $alert[0]);
130 }
131
132 public function dataForChangePasswordFailed()
133 {
134 return [
135 [
136 [
137 'change_passwd[old_password]' => 'material',
138 'change_passwd[new_password][first]' => '',
139 'change_passwd[new_password][second]' => '',
140 ],
141 'validator.password_wrong_value',
142 ],
143 [
144 [
145 'change_passwd[old_password]' => 'mypassword',
146 'change_passwd[new_password][first]' => '',
147 'change_passwd[new_password][second]' => '',
148 ],
149 'This value should not be blank',
150 ],
151 [
152 [
153 'change_passwd[old_password]' => 'mypassword',
154 'change_passwd[new_password][first]' => 'hop',
155 'change_passwd[new_password][second]' => '',
156 ],
157 'validator.password_must_match',
158 ],
159 [
160 [
161 'change_passwd[old_password]' => 'mypassword',
162 'change_passwd[new_password][first]' => 'hop',
163 'change_passwd[new_password][second]' => 'hop',
164 ],
165 'validator.password_too_short',
166 ],
167 ];
168 }
169
170 /**
171 * @dataProvider dataForChangePasswordFailed
172 */
173 public function testChangePasswordFailed($data, $expectedMessage)
174 {
175 $this->logInAs('admin');
176 $client = $this->getClient();
177
178 $crawler = $client->request('GET', '/config');
179
180 $this->assertEquals(200, $client->getResponse()->getStatusCode());
181
182 $form = $crawler->filter('button[id=change_passwd_save]')->form();
183
184 $crawler = $client->submit($form, $data);
185
186 $this->assertEquals(200, $client->getResponse()->getStatusCode());
187
188 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
189 $this->assertContains($expectedMessage, $alert[0]);
190 }
191
192 public function testChangePassword()
193 {
194 $this->logInAs('admin');
195 $client = $this->getClient();
196
197 $crawler = $client->request('GET', '/config');
198
199 $this->assertEquals(200, $client->getResponse()->getStatusCode());
200
201 $form = $crawler->filter('button[id=change_passwd_save]')->form();
202
203 $data = [
204 'change_passwd[old_password]' => 'mypassword',
205 'change_passwd[new_password][first]' => 'mypassword',
206 'change_passwd[new_password][second]' => 'mypassword',
207 ];
208
209 $client->submit($form, $data);
210
211 $this->assertEquals(302, $client->getResponse()->getStatusCode());
212
213 $crawler = $client->followRedirect();
214
215 $this->assertContains('flashes.config.notice.password_updated', $crawler->filter('body')->extract(['_text'])[0]);
216 }
217
218 public function dataForUserFailed()
219 {
220 return [
221 [
222 [
223 'update_user[name]' => '',
224 'update_user[email]' => '',
225 ],
226 'fos_user.email.blank',
227 ],
228 [
229 [
230 'update_user[name]' => '',
231 'update_user[email]' => 'test',
232 ],
233 'fos_user.email.invalid',
234 ],
235 ];
236 }
237
238 /**
239 * @dataProvider dataForUserFailed
240 */
241 public function testUserFailed($data, $expectedMessage)
242 {
243 $this->logInAs('admin');
244 $client = $this->getClient();
245
246 $crawler = $client->request('GET', '/config');
247
248 $this->assertEquals(200, $client->getResponse()->getStatusCode());
249
250 $form = $crawler->filter('button[id=update_user_save]')->form();
251
252 $crawler = $client->submit($form, $data);
253
254 $this->assertEquals(200, $client->getResponse()->getStatusCode());
255
256 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
257 $this->assertContains($expectedMessage, $alert[0]);
258 }
259
260 public function testUserUpdate()
261 {
262 $this->logInAs('admin');
263 $client = $this->getClient();
264
265 $crawler = $client->request('GET', '/config');
266
267 $this->assertEquals(200, $client->getResponse()->getStatusCode());
268
269 $form = $crawler->filter('button[id=update_user_save]')->form();
270
271 $data = [
272 'update_user[name]' => 'new name',
273 'update_user[email]' => 'admin@wallabag.io',
274 ];
275
276 $client->submit($form, $data);
277
278 $this->assertEquals(302, $client->getResponse()->getStatusCode());
279
280 $crawler = $client->followRedirect();
281
282 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
283 $this->assertContains('flashes.config.notice.user_updated', $alert[0]);
284 }
285
286 public function dataForNewUserFailed()
287 {
288 return [
289 [
290 [
291 'new_user[username]' => '',
292 'new_user[plainPassword][first]' => '',
293 'new_user[plainPassword][second]' => '',
294 'new_user[email]' => '',
295 ],
296 'fos_user.username.blank',
297 ],
298 [
299 [
300 'new_user[username]' => 'a',
301 'new_user[plainPassword][first]' => 'mypassword',
302 'new_user[plainPassword][second]' => 'mypassword',
303 'new_user[email]' => '',
304 ],
305 'fos_user.username.short',
306 ],
307 [
308 [
309 'new_user[username]' => 'wallace',
310 'new_user[plainPassword][first]' => 'mypassword',
311 'new_user[plainPassword][second]' => 'mypassword',
312 'new_user[email]' => 'test',
313 ],
314 'fos_user.email.invalid',
315 ],
316 [
317 [
318 'new_user[username]' => 'admin',
319 'new_user[plainPassword][first]' => 'wallacewallace',
320 'new_user[plainPassword][second]' => 'wallacewallace',
321 'new_user[email]' => 'wallace@wallace.me',
322 ],
323 'fos_user.username.already_used',
324 ],
325 [
326 [
327 'new_user[username]' => 'wallace',
328 'new_user[plainPassword][first]' => 'mypassword1',
329 'new_user[plainPassword][second]' => 'mypassword2',
330 'new_user[email]' => 'wallace@wallace.me',
331 ],
332 'validator.password_must_match',
333 ],
334 ];
335 }
336
337 /**
338 * @dataProvider dataForNewUserFailed
339 */
340 public function testNewUserFailed($data, $expectedMessage)
341 {
342 $this->logInAs('admin');
343 $client = $this->getClient();
344
345 $crawler = $client->request('GET', '/config');
346
347 $this->assertEquals(200, $client->getResponse()->getStatusCode());
348
349 $form = $crawler->filter('button[id=new_user_save]')->form();
350
351 $crawler = $client->submit($form, $data);
352
353 $this->assertEquals(200, $client->getResponse()->getStatusCode());
354
355 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
356 $this->assertContains($expectedMessage, $alert[0]);
357 }
358
359 public function testNewUserCreated()
360 {
361 $this->logInAs('admin');
362 $client = $this->getClient();
363
364 $crawler = $client->request('GET', '/config');
365
366 $this->assertEquals(200, $client->getResponse()->getStatusCode());
367
368 $form = $crawler->filter('button[id=new_user_save]')->form();
369
370 $data = [
371 'new_user[username]' => 'wallace',
372 'new_user[plainPassword][first]' => 'wallace1',
373 'new_user[plainPassword][second]' => 'wallace1',
374 'new_user[email]' => 'wallace@wallace.me',
375 ];
376
377 $client->submit($form, $data);
378
379 $this->assertEquals(302, $client->getResponse()->getStatusCode());
380
381 $crawler = $client->followRedirect();
382
383 $this->assertContains('flashes.config.notice.user_added', $crawler->filter('body')->extract(['_text'])[0]);
384
385 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
386 $user = $em
387 ->getRepository('WallabagUserBundle:User')
388 ->findOneByUsername('wallace');
389
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());
397 }
398
399 public function testRssUpdateResetToken()
400 {
401 $this->logInAs('admin');
402 $client = $this->getClient();
403
404 // reset the token
405 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
406 $user = $em
407 ->getRepository('WallabagUserBundle:User')
408 ->findOneByUsername('admin');
409
410 if (!$user) {
411 $this->markTestSkipped('No user found in db.');
412 }
413
414 $config = $user->getConfig();
415 $config->setRssToken(null);
416 $em->persist($config);
417 $em->flush();
418
419 $crawler = $client->request('GET', '/config');
420
421 $this->assertEquals(200, $client->getResponse()->getStatusCode());
422
423 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
424 $this->assertContains('config.form_rss.no_token', $body[0]);
425
426 $client->request('GET', '/generate-token');
427 $this->assertEquals(302, $client->getResponse()->getStatusCode());
428
429 $crawler = $client->followRedirect();
430
431 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
432 $this->assertNotContains('config.form_rss.no_token', $body[0]);
433 }
434
435 public function testGenerateTokenAjax()
436 {
437 $this->logInAs('admin');
438 $client = $this->getClient();
439
440 $client->request(
441 'GET',
442 '/generate-token',
443 [],
444 [],
445 ['HTTP_X-Requested-With' => 'XMLHttpRequest']
446 );
447
448 $this->assertEquals(200, $client->getResponse()->getStatusCode());
449 $content = json_decode($client->getResponse()->getContent(), true);
450 $this->assertArrayHasKey('token', $content);
451 }
452
453 public function testRssUpdate()
454 {
455 $this->logInAs('admin');
456 $client = $this->getClient();
457
458 $crawler = $client->request('GET', '/config');
459
460 $this->assertEquals(200, $client->getResponse()->getStatusCode());
461
462 $form = $crawler->filter('button[id=rss_config_save]')->form();
463
464 $data = [
465 'rss_config[rss_limit]' => 12,
466 ];
467
468 $client->submit($form, $data);
469
470 $this->assertEquals(302, $client->getResponse()->getStatusCode());
471
472 $crawler = $client->followRedirect();
473
474 $this->assertContains('flashes.config.notice.rss_updated', $crawler->filter('body')->extract(['_text'])[0]);
475 }
476
477 public function dataForRssFailed()
478 {
479 return [
480 [
481 [
482 'rss_config[rss_limit]' => 0,
483 ],
484 'This value should be 1 or more.',
485 ],
486 [
487 [
488 'rss_config[rss_limit]' => 1000000000000,
489 ],
490 'validator.rss_limit_too_hight',
491 ],
492 ];
493 }
494
495 /**
496 * @dataProvider dataForRssFailed
497 */
498 public function testRssFailed($data, $expectedMessage)
499 {
500 $this->logInAs('admin');
501 $client = $this->getClient();
502
503 $crawler = $client->request('GET', '/config');
504
505 $this->assertEquals(200, $client->getResponse()->getStatusCode());
506
507 $form = $crawler->filter('button[id=rss_config_save]')->form();
508
509 $crawler = $client->submit($form, $data);
510
511 $this->assertEquals(200, $client->getResponse()->getStatusCode());
512
513 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
514 $this->assertContains($expectedMessage, $alert[0]);
515 }
516
517 public function testTaggingRuleCreation()
518 {
519 $this->logInAs('admin');
520 $client = $this->getClient();
521
522 $crawler = $client->request('GET', '/config');
523
524 $this->assertTrue($client->getResponse()->isSuccessful());
525
526 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
527
528 $data = [
529 'tagging_rule[rule]' => 'readingTime <= 3',
530 'tagging_rule[tags]' => 'short reading',
531 ];
532
533 $client->submit($form, $data);
534
535 $this->assertEquals(302, $client->getResponse()->getStatusCode());
536
537 $crawler = $client->followRedirect();
538
539 $this->assertContains('flashes.config.notice.tagging_rules_updated', $crawler->filter('body')->extract(['_text'])[0]);
540
541 $editLink = $crawler->filter('.mode_edit')->last()->link();
542
543 $crawler = $client->click($editLink);
544 $this->assertEquals(302, $client->getResponse()->getStatusCode());
545 $this->assertContains('?tagging-rule=', $client->getResponse()->headers->get('location'));
546
547 $crawler = $client->followRedirect();
548
549 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
550
551 $data = [
552 'tagging_rule[rule]' => 'readingTime <= 30',
553 'tagging_rule[tags]' => 'short reading',
554 ];
555
556 $client->submit($form, $data);
557
558 $this->assertEquals(302, $client->getResponse()->getStatusCode());
559
560 $crawler = $client->followRedirect();
561
562 $this->assertContains('flashes.config.notice.tagging_rules_updated', $crawler->filter('body')->extract(['_text'])[0]);
563
564 $this->assertContains('readingTime <= 30', $crawler->filter('body')->extract(['_text'])[0]);
565
566 $deleteLink = $crawler->filter('.delete')->last()->link();
567
568 $crawler = $client->click($deleteLink);
569 $this->assertEquals(302, $client->getResponse()->getStatusCode());
570
571 $crawler = $client->followRedirect();
572 $this->assertContains('flashes.config.notice.tagging_rules_deleted', $crawler->filter('body')->extract(['_text'])[0]);
573 }
574
575 public function dataForTaggingRuleFailed()
576 {
577 return [
578 [
579 [
580 'tagging_rule[rule]' => 'unknownVar <= 3',
581 'tagging_rule[tags]' => 'cool tag',
582 ],
583 [
584 'The variable',
585 'does not exist.',
586 ],
587 ],
588 [
589 [
590 'tagging_rule[rule]' => 'length(domainName) <= 42',
591 'tagging_rule[tags]' => 'cool tag',
592 ],
593 [
594 'The operator',
595 'does not exist.',
596 ],
597 ],
598 ];
599 }
600
601 /**
602 * @dataProvider dataForTaggingRuleFailed
603 */
604 public function testTaggingRuleCreationFail($data, $messages)
605 {
606 $this->logInAs('admin');
607 $client = $this->getClient();
608
609 $crawler = $client->request('GET', '/config');
610
611 $this->assertTrue($client->getResponse()->isSuccessful());
612
613 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
614
615 $crawler = $client->submit($form, $data);
616
617 $this->assertEquals(200, $client->getResponse()->getStatusCode());
618
619 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
620
621 foreach ($messages as $message) {
622 $this->assertContains($message, $body[0]);
623 }
624 }
625
626 public function testDeletingTaggingRuleFromAnOtherUser()
627 {
628 $this->logInAs('bob');
629 $client = $this->getClient();
630
631 $rule = $client->getContainer()->get('doctrine.orm.entity_manager')
632 ->getRepository('WallabagCoreBundle:TaggingRule')
633 ->findAll()[0];
634
635 $crawler = $client->request('GET', '/tagging-rule/edit/'.$rule->getId());
636
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]);
640 }
641
642 public function testEditingTaggingRuleFromAnOtherUser()
643 {
644 $this->logInAs('bob');
645 $client = $this->getClient();
646
647 $rule = $client->getContainer()->get('doctrine.orm.entity_manager')
648 ->getRepository('WallabagCoreBundle:TaggingRule')
649 ->findAll()[0];
650
651 $crawler = $client->request('GET', '/tagging-rule/edit/'.$rule->getId());
652
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]);
656 }
657
658 public function testDemoMode()
659 {
660 $this->logInAs('admin');
661 $client = $this->getClient();
662
663 $config = $client->getContainer()->get('craue_config');
664 $config->set('demo_mode_enabled', 1);
665 $config->set('demo_mode_username', 'admin');
666
667 $crawler = $client->request('GET', '/config');
668
669 $this->assertEquals(200, $client->getResponse()->getStatusCode());
670
671 $form = $crawler->filter('button[id=change_passwd_save]')->form();
672
673 $data = [
674 'change_passwd[old_password]' => 'mypassword',
675 'change_passwd[new_password][first]' => 'mypassword',
676 'change_passwd[new_password][second]' => 'mypassword',
677 ];
678
679 $client->submit($form, $data);
680
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]);
683
684 $config->set('demo_mode_enabled', 0);
685 $config->set('demo_mode_username', 'wallabag');
686 }
687 }