]> git.immae.eu Git - github/wallabag/wallabag.git/blob - tests/Wallabag/CoreBundle/Controller/ConfigControllerTest.php
Enable OTP 2FA
[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 use Wallabag\AnnotationBundle\Entity\Annotation;
7 use Wallabag\CoreBundle\Entity\Config;
8 use Wallabag\CoreBundle\Entity\Entry;
9 use Wallabag\CoreBundle\Entity\Tag;
10 use Wallabag\UserBundle\Entity\User;
11
12 class ConfigControllerTest extends WallabagCoreTestCase
13 {
14 public function testLogin()
15 {
16 $client = $this->getClient();
17
18 $client->request('GET', '/new');
19
20 $this->assertSame(302, $client->getResponse()->getStatusCode());
21 $this->assertContains('login', $client->getResponse()->headers->get('location'));
22 }
23
24 public function testIndex()
25 {
26 $this->logInAs('admin');
27 $client = $this->getClient();
28
29 $crawler = $client->request('GET', '/config');
30
31 $this->assertSame(200, $client->getResponse()->getStatusCode());
32
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]'));
37 }
38
39 public function testUpdate()
40 {
41 $this->logInAs('admin');
42 $client = $this->getClient();
43
44 $crawler = $client->request('GET', '/config');
45
46 $this->assertSame(200, $client->getResponse()->getStatusCode());
47
48 $form = $crawler->filter('button[id=config_save]')->form();
49
50 $data = [
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',
56 ];
57
58 $client->submit($form, $data);
59
60 $this->assertSame(302, $client->getResponse()->getStatusCode());
61
62 $crawler = $client->followRedirect();
63
64 $this->assertContains('flashes.config.notice.config_saved', $crawler->filter('body')->extract(['_text'])[0]);
65 }
66
67 public function testChangeReadingSpeed()
68 {
69 $this->logInAs('admin');
70 $this->useTheme('baggy');
71 $client = $this->getClient();
72
73 $entry = new Entry($this->getLoggedInUser());
74 $entry->setUrl('http://0.0.0.0/test-entry1')
75 ->setReadingTime(22);
76 $this->getEntityManager()->persist($entry);
77
78 $this->getEntityManager()->flush();
79 $this->getEntityManager()->clear();
80
81 $crawler = $client->request('GET', '/unread/list');
82 $form = $crawler->filter('button[id=submit-filter]')->form();
83 $dataFilters = [
84 'entry_filter[readingTime][right_number]' => 22,
85 'entry_filter[readingTime][left_number]' => 22,
86 ];
87 $crawler = $client->submit($form, $dataFilters);
88 $this->assertCount(1, $crawler->filter('div[class=entry]'));
89
90 // Change reading speed
91 $crawler = $client->request('GET', '/config');
92 $form = $crawler->filter('button[id=config_save]')->form();
93 $data = [
94 'config[reading_speed]' => '2',
95 ];
96 $client->submit($form, $data);
97
98 // Is the entry still available via filters?
99 $crawler = $client->request('GET', '/unread/list');
100 $form = $crawler->filter('button[id=submit-filter]')->form();
101 $crawler = $client->submit($form, $dataFilters);
102 $this->assertCount(0, $crawler->filter('div[class=entry]'));
103
104 // Restore old configuration
105 $crawler = $client->request('GET', '/config');
106 $form = $crawler->filter('button[id=config_save]')->form();
107 $data = [
108 'config[reading_speed]' => '0.5',
109 ];
110 $client->submit($form, $data);
111 }
112
113 public function dataForUpdateFailed()
114 {
115 return [
116 [[
117 'config[theme]' => 'baggy',
118 'config[items_per_page]' => '',
119 'config[language]' => 'en',
120 ]],
121 ];
122 }
123
124 /**
125 * @dataProvider dataForUpdateFailed
126 */
127 public function testUpdateFailed($data)
128 {
129 $this->logInAs('admin');
130 $client = $this->getClient();
131
132 $crawler = $client->request('GET', '/config');
133
134 $this->assertSame(200, $client->getResponse()->getStatusCode());
135
136 $form = $crawler->filter('button[id=config_save]')->form();
137
138 $crawler = $client->submit($form, $data);
139
140 $this->assertSame(200, $client->getResponse()->getStatusCode());
141
142 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
143 $this->assertContains('This value should not be blank', $alert[0]);
144 }
145
146 public function dataForChangePasswordFailed()
147 {
148 return [
149 [
150 [
151 'change_passwd[old_password]' => 'material',
152 'change_passwd[new_password][first]' => '',
153 'change_passwd[new_password][second]' => '',
154 ],
155 'validator.password_wrong_value',
156 ],
157 [
158 [
159 'change_passwd[old_password]' => 'mypassword',
160 'change_passwd[new_password][first]' => '',
161 'change_passwd[new_password][second]' => '',
162 ],
163 'This value should not be blank',
164 ],
165 [
166 [
167 'change_passwd[old_password]' => 'mypassword',
168 'change_passwd[new_password][first]' => 'hop',
169 'change_passwd[new_password][second]' => '',
170 ],
171 'validator.password_must_match',
172 ],
173 [
174 [
175 'change_passwd[old_password]' => 'mypassword',
176 'change_passwd[new_password][first]' => 'hop',
177 'change_passwd[new_password][second]' => 'hop',
178 ],
179 'validator.password_too_short',
180 ],
181 ];
182 }
183
184 /**
185 * @dataProvider dataForChangePasswordFailed
186 */
187 public function testChangePasswordFailed($data, $expectedMessage)
188 {
189 $this->logInAs('admin');
190 $client = $this->getClient();
191
192 $crawler = $client->request('GET', '/config');
193
194 $this->assertSame(200, $client->getResponse()->getStatusCode());
195
196 $form = $crawler->filter('button[id=change_passwd_save]')->form();
197
198 $crawler = $client->submit($form, $data);
199
200 $this->assertSame(200, $client->getResponse()->getStatusCode());
201
202 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
203 $this->assertContains($expectedMessage, $alert[0]);
204 }
205
206 public function testChangePassword()
207 {
208 $this->logInAs('admin');
209 $client = $this->getClient();
210
211 $crawler = $client->request('GET', '/config');
212
213 $this->assertSame(200, $client->getResponse()->getStatusCode());
214
215 $form = $crawler->filter('button[id=change_passwd_save]')->form();
216
217 $data = [
218 'change_passwd[old_password]' => 'mypassword',
219 'change_passwd[new_password][first]' => 'mypassword',
220 'change_passwd[new_password][second]' => 'mypassword',
221 ];
222
223 $client->submit($form, $data);
224
225 $this->assertSame(302, $client->getResponse()->getStatusCode());
226
227 $crawler = $client->followRedirect();
228
229 $this->assertContains('flashes.config.notice.password_updated', $crawler->filter('body')->extract(['_text'])[0]);
230 }
231
232 public function dataForUserFailed()
233 {
234 return [
235 [
236 [
237 'update_user[name]' => '',
238 'update_user[email]' => '',
239 ],
240 'fos_user.email.blank',
241 ],
242 [
243 [
244 'update_user[name]' => '',
245 'update_user[email]' => 'test',
246 ],
247 'fos_user.email.invalid',
248 ],
249 ];
250 }
251
252 /**
253 * @dataProvider dataForUserFailed
254 */
255 public function testUserFailed($data, $expectedMessage)
256 {
257 $this->logInAs('admin');
258 $client = $this->getClient();
259
260 $crawler = $client->request('GET', '/config');
261
262 $this->assertSame(200, $client->getResponse()->getStatusCode());
263
264 $form = $crawler->filter('button[id=update_user_save]')->form();
265
266 $crawler = $client->submit($form, $data);
267
268 $this->assertSame(200, $client->getResponse()->getStatusCode());
269
270 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
271 $this->assertContains($expectedMessage, $alert[0]);
272 }
273
274 public function testUserUpdate()
275 {
276 $this->logInAs('admin');
277 $client = $this->getClient();
278
279 $crawler = $client->request('GET', '/config');
280
281 $this->assertSame(200, $client->getResponse()->getStatusCode());
282
283 $form = $crawler->filter('button[id=update_user_save]')->form();
284
285 $data = [
286 'update_user[name]' => 'new name',
287 'update_user[email]' => 'admin@wallabag.io',
288 ];
289
290 $client->submit($form, $data);
291
292 $this->assertSame(302, $client->getResponse()->getStatusCode());
293
294 $crawler = $client->followRedirect();
295
296 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
297 $this->assertContains('flashes.config.notice.user_updated', $alert[0]);
298 }
299
300 public function testUserEnable2faEmail()
301 {
302 $this->logInAs('admin');
303 $client = $this->getClient();
304
305 $crawler = $client->request('GET', '/config');
306
307 $this->assertSame(200, $client->getResponse()->getStatusCode());
308
309 $form = $crawler->filter('button[id=update_user_save]')->form();
310
311 $data = [
312 'update_user[emailTwoFactor]' => '1',
313 ];
314
315 $client->submit($form, $data);
316
317 $this->assertSame(302, $client->getResponse()->getStatusCode());
318
319 $crawler = $client->followRedirect();
320
321 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
322 $this->assertContains('flashes.config.notice.user_updated', $alert[0]);
323
324 // restore user
325 $em = $this->getEntityManager();
326 $user = $em
327 ->getRepository('WallabagUserBundle:User')
328 ->findOneByUsername('admin');
329
330 $this->assertTrue($user->isEmailTwoFactor());
331
332 $user->setEmailTwoFactor(false);
333 $em->persist($user);
334 $em->flush();
335 }
336
337 public function testUserEnable2faGoogle()
338 {
339 $this->logInAs('admin');
340 $client = $this->getClient();
341
342 $crawler = $client->request('GET', '/config');
343
344 $this->assertSame(200, $client->getResponse()->getStatusCode());
345
346 $form = $crawler->filter('button[id=update_user_save]')->form();
347
348 $data = [
349 'update_user[googleTwoFactor]' => '1',
350 ];
351
352 $client->submit($form, $data);
353
354 $this->assertSame(302, $client->getResponse()->getStatusCode());
355
356 $crawler = $client->followRedirect();
357
358 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
359 $this->assertContains('flashes.config.notice.user_updated', $alert[0]);
360
361 // restore user
362 $em = $this->getEntityManager();
363 $user = $em
364 ->getRepository('WallabagUserBundle:User')
365 ->findOneByUsername('admin');
366
367 $this->assertTrue($user->isGoogleAuthenticatorEnabled());
368
369 $user->setGoogleAuthenticatorSecret(null);
370 $em->persist($user);
371 $em->flush();
372 }
373
374 public function testUserEnable2faBoth()
375 {
376 $this->logInAs('admin');
377 $client = $this->getClient();
378
379 $crawler = $client->request('GET', '/config');
380
381 $this->assertSame(200, $client->getResponse()->getStatusCode());
382
383 $form = $crawler->filter('button[id=update_user_save]')->form();
384
385 $data = [
386 'update_user[googleTwoFactor]' => '1',
387 'update_user[emailTwoFactor]' => '1',
388 ];
389
390 $client->submit($form, $data);
391
392 $this->assertSame(302, $client->getResponse()->getStatusCode());
393
394 $crawler = $client->followRedirect();
395
396 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
397 $this->assertContains('flashes.config.notice.user_updated', $alert[0]);
398
399 // restore user
400 $em = $this->getEntityManager();
401 $user = $em
402 ->getRepository('WallabagUserBundle:User')
403 ->findOneByUsername('admin');
404
405 $this->assertTrue($user->isGoogleAuthenticatorEnabled());
406 $this->assertFalse($user->isEmailTwoFactor());
407
408 $user->setGoogleAuthenticatorSecret(null);
409 $em->persist($user);
410 $em->flush();
411 }
412
413 public function testRssUpdateResetToken()
414 {
415 $this->logInAs('admin');
416 $client = $this->getClient();
417
418 // reset the token
419 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
420 $user = $em
421 ->getRepository('WallabagUserBundle:User')
422 ->findOneByUsername('admin');
423
424 if (!$user) {
425 $this->markTestSkipped('No user found in db.');
426 }
427
428 $config = $user->getConfig();
429 $config->setRssToken(null);
430 $em->persist($config);
431 $em->flush();
432
433 $crawler = $client->request('GET', '/config');
434
435 $this->assertSame(200, $client->getResponse()->getStatusCode());
436
437 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
438 $this->assertContains('config.form_rss.no_token', $body[0]);
439
440 $client->request('GET', '/generate-token');
441 $this->assertSame(302, $client->getResponse()->getStatusCode());
442
443 $crawler = $client->followRedirect();
444
445 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
446 $this->assertNotContains('config.form_rss.no_token', $body[0]);
447 }
448
449 public function testGenerateTokenAjax()
450 {
451 $this->logInAs('admin');
452 $client = $this->getClient();
453
454 $client->request(
455 'GET',
456 '/generate-token',
457 [],
458 [],
459 ['HTTP_X-Requested-With' => 'XMLHttpRequest']
460 );
461
462 $this->assertSame(200, $client->getResponse()->getStatusCode());
463 $content = json_decode($client->getResponse()->getContent(), true);
464 $this->assertArrayHasKey('token', $content);
465 }
466
467 public function testRssUpdate()
468 {
469 $this->logInAs('admin');
470 $client = $this->getClient();
471
472 $crawler = $client->request('GET', '/config');
473
474 $this->assertSame(200, $client->getResponse()->getStatusCode());
475
476 $form = $crawler->filter('button[id=rss_config_save]')->form();
477
478 $data = [
479 'rss_config[rss_limit]' => 12,
480 ];
481
482 $client->submit($form, $data);
483
484 $this->assertSame(302, $client->getResponse()->getStatusCode());
485
486 $crawler = $client->followRedirect();
487
488 $this->assertContains('flashes.config.notice.rss_updated', $crawler->filter('body')->extract(['_text'])[0]);
489 }
490
491 public function dataForRssFailed()
492 {
493 return [
494 [
495 [
496 'rss_config[rss_limit]' => 0,
497 ],
498 'This value should be 1 or more.',
499 ],
500 [
501 [
502 'rss_config[rss_limit]' => 1000000000000,
503 ],
504 'validator.rss_limit_too_high',
505 ],
506 ];
507 }
508
509 /**
510 * @dataProvider dataForRssFailed
511 */
512 public function testRssFailed($data, $expectedMessage)
513 {
514 $this->logInAs('admin');
515 $client = $this->getClient();
516
517 $crawler = $client->request('GET', '/config');
518
519 $this->assertSame(200, $client->getResponse()->getStatusCode());
520
521 $form = $crawler->filter('button[id=rss_config_save]')->form();
522
523 $crawler = $client->submit($form, $data);
524
525 $this->assertSame(200, $client->getResponse()->getStatusCode());
526
527 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(['_text']));
528 $this->assertContains($expectedMessage, $alert[0]);
529 }
530
531 public function testTaggingRuleCreation()
532 {
533 $this->logInAs('admin');
534 $this->useTheme('baggy');
535 $client = $this->getClient();
536
537 $crawler = $client->request('GET', '/config');
538
539 $this->assertSame(200, $client->getResponse()->getStatusCode());
540
541 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
542
543 $data = [
544 'tagging_rule[rule]' => 'readingTime <= 3',
545 'tagging_rule[tags]' => 'short reading',
546 ];
547
548 $client->submit($form, $data);
549
550 $this->assertSame(302, $client->getResponse()->getStatusCode());
551
552 $crawler = $client->followRedirect();
553
554 $this->assertContains('flashes.config.notice.tagging_rules_updated', $crawler->filter('body')->extract(['_text'])[0]);
555
556 $editLink = $crawler->filter('.mode_edit')->last()->link();
557
558 $crawler = $client->click($editLink);
559 $this->assertSame(302, $client->getResponse()->getStatusCode());
560 $this->assertContains('?tagging-rule=', $client->getResponse()->headers->get('location'));
561
562 $crawler = $client->followRedirect();
563
564 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
565
566 $data = [
567 'tagging_rule[rule]' => 'readingTime <= 30',
568 'tagging_rule[tags]' => 'short reading',
569 ];
570
571 $client->submit($form, $data);
572
573 $this->assertSame(302, $client->getResponse()->getStatusCode());
574
575 $crawler = $client->followRedirect();
576
577 $this->assertContains('flashes.config.notice.tagging_rules_updated', $crawler->filter('body')->extract(['_text'])[0]);
578
579 $this->assertContains('readingTime <= 30', $crawler->filter('body')->extract(['_text'])[0]);
580
581 $deleteLink = $crawler->filter('.delete')->last()->link();
582
583 $crawler = $client->click($deleteLink);
584 $this->assertSame(302, $client->getResponse()->getStatusCode());
585
586 $crawler = $client->followRedirect();
587 $this->assertContains('flashes.config.notice.tagging_rules_deleted', $crawler->filter('body')->extract(['_text'])[0]);
588 }
589
590 public function dataForTaggingRuleFailed()
591 {
592 return [
593 [
594 [
595 'tagging_rule[rule]' => 'unknownVar <= 3',
596 'tagging_rule[tags]' => 'cool tag',
597 ],
598 [
599 'The variable',
600 'does not exist.',
601 ],
602 ],
603 [
604 [
605 'tagging_rule[rule]' => 'length(domainName) <= 42',
606 'tagging_rule[tags]' => 'cool tag',
607 ],
608 [
609 'The operator',
610 'does not exist.',
611 ],
612 ],
613 ];
614 }
615
616 /**
617 * @dataProvider dataForTaggingRuleFailed
618 */
619 public function testTaggingRuleCreationFail($data, $messages)
620 {
621 $this->logInAs('admin');
622 $client = $this->getClient();
623
624 $crawler = $client->request('GET', '/config');
625
626 $this->assertSame(200, $client->getResponse()->getStatusCode());
627
628 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
629
630 $crawler = $client->submit($form, $data);
631
632 $this->assertSame(200, $client->getResponse()->getStatusCode());
633
634 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
635
636 foreach ($messages as $message) {
637 $this->assertContains($message, $body[0]);
638 }
639 }
640
641 public function testTaggingRuleTooLong()
642 {
643 $this->logInAs('admin');
644 $client = $this->getClient();
645
646 $crawler = $client->request('GET', '/config');
647
648 $this->assertSame(200, $client->getResponse()->getStatusCode());
649
650 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
651
652 $crawler = $client->submit($form, [
653 'tagging_rule[rule]' => str_repeat('title', 60),
654 'tagging_rule[tags]' => 'cool tag',
655 ]);
656
657 $this->assertSame(200, $client->getResponse()->getStatusCode());
658
659 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
660
661 $this->assertContains('255 characters', $body[0]);
662 }
663
664 public function testDeletingTaggingRuleFromAnOtherUser()
665 {
666 $this->logInAs('bob');
667 $client = $this->getClient();
668
669 $rule = $client->getContainer()->get('doctrine.orm.entity_manager')
670 ->getRepository('WallabagCoreBundle:TaggingRule')
671 ->findAll()[0];
672
673 $crawler = $client->request('GET', '/tagging-rule/edit/' . $rule->getId());
674
675 $this->assertSame(403, $client->getResponse()->getStatusCode());
676 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
677 $this->assertContains('You can not access this tagging rule', $body[0]);
678 }
679
680 public function testEditingTaggingRuleFromAnOtherUser()
681 {
682 $this->logInAs('bob');
683 $client = $this->getClient();
684
685 $rule = $client->getContainer()->get('doctrine.orm.entity_manager')
686 ->getRepository('WallabagCoreBundle:TaggingRule')
687 ->findAll()[0];
688
689 $crawler = $client->request('GET', '/tagging-rule/edit/' . $rule->getId());
690
691 $this->assertSame(403, $client->getResponse()->getStatusCode());
692 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
693 $this->assertContains('You can not access this tagging rule', $body[0]);
694 }
695
696 public function testDemoMode()
697 {
698 $this->logInAs('admin');
699 $client = $this->getClient();
700
701 $config = $client->getContainer()->get('craue_config');
702 $config->set('demo_mode_enabled', 1);
703 $config->set('demo_mode_username', 'admin');
704
705 $crawler = $client->request('GET', '/config');
706
707 $this->assertSame(200, $client->getResponse()->getStatusCode());
708
709 $form = $crawler->filter('button[id=change_passwd_save]')->form();
710
711 $data = [
712 'change_passwd[old_password]' => 'mypassword',
713 'change_passwd[new_password][first]' => 'mypassword',
714 'change_passwd[new_password][second]' => 'mypassword',
715 ];
716
717 $client->submit($form, $data);
718
719 $this->assertSame(302, $client->getResponse()->getStatusCode());
720 $this->assertContains('flashes.config.notice.password_not_updated_demo', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
721
722 $config->set('demo_mode_enabled', 0);
723 $config->set('demo_mode_username', 'wallabag');
724 }
725
726 public function testDeleteUserButtonVisibility()
727 {
728 $this->logInAs('admin');
729 $client = $this->getClient();
730
731 $crawler = $client->request('GET', '/config');
732
733 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
734 $this->assertContains('config.form_user.delete.button', $body[0]);
735
736 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
737
738 $user = $em
739 ->getRepository('WallabagUserBundle:User')
740 ->findOneByUsername('empty');
741 $user->setEnabled(false);
742 $em->persist($user);
743
744 $user = $em
745 ->getRepository('WallabagUserBundle:User')
746 ->findOneByUsername('bob');
747 $user->setEnabled(false);
748 $em->persist($user);
749
750 $em->flush();
751
752 $crawler = $client->request('GET', '/config');
753
754 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(['_text']));
755 $this->assertNotContains('config.form_user.delete.button', $body[0]);
756
757 $client->request('GET', '/account/delete');
758 $this->assertSame(403, $client->getResponse()->getStatusCode());
759
760 $user = $em
761 ->getRepository('WallabagUserBundle:User')
762 ->findOneByUsername('empty');
763 $user->setEnabled(true);
764 $em->persist($user);
765
766 $user = $em
767 ->getRepository('WallabagUserBundle:User')
768 ->findOneByUsername('bob');
769 $user->setEnabled(true);
770 $em->persist($user);
771
772 $em->flush();
773 }
774
775 public function testDeleteAccount()
776 {
777 $client = $this->getClient();
778 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
779
780 $user = new User();
781 $user->setName('Wallace');
782 $user->setEmail('wallace@wallabag.org');
783 $user->setUsername('wallace');
784 $user->setPlainPassword('wallace');
785 $user->setEnabled(true);
786 $user->addRole('ROLE_SUPER_ADMIN');
787
788 $em->persist($user);
789
790 $config = new Config($user);
791
792 $config->setTheme('material');
793 $config->setItemsPerPage(30);
794 $config->setReadingSpeed(1);
795 $config->setLanguage('en');
796 $config->setPocketConsumerKey('xxxxx');
797
798 $em->persist($config);
799 $em->flush();
800
801 $this->logInAs('wallace');
802 $loggedInUserId = $this->getLoggedInUserId();
803
804 // create entry to check after user deletion
805 // that this entry is also deleted
806 $crawler = $client->request('GET', '/new');
807
808 $this->assertSame(200, $client->getResponse()->getStatusCode());
809
810 $form = $crawler->filter('form[name=entry]')->form();
811 $data = [
812 'entry[url]' => $url = 'https://github.com/wallabag/wallabag',
813 ];
814
815 $client->submit($form, $data);
816 $this->assertSame(302, $client->getResponse()->getStatusCode());
817
818 $crawler = $client->request('GET', '/config');
819
820 $deleteLink = $crawler->filter('.delete-account')->last()->link();
821
822 $client->click($deleteLink);
823 $this->assertSame(302, $client->getResponse()->getStatusCode());
824
825 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
826 $user = $em
827 ->getRepository('WallabagUserBundle:User')
828 ->createQueryBuilder('u')
829 ->where('u.username = :username')->setParameter('username', 'wallace')
830 ->getQuery()
831 ->getOneOrNullResult()
832 ;
833
834 $this->assertNull($user);
835
836 $entries = $client->getContainer()
837 ->get('doctrine.orm.entity_manager')
838 ->getRepository('WallabagCoreBundle:Entry')
839 ->findByUser($loggedInUserId);
840
841 $this->assertEmpty($entries);
842 }
843
844 public function testReset()
845 {
846 $this->logInAs('empty');
847 $client = $this->getClient();
848
849 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
850
851 $user = static::$kernel->getContainer()->get('security.token_storage')->getToken()->getUser();
852
853 $tag = new Tag();
854 $tag->setLabel('super');
855 $em->persist($tag);
856
857 $entry = new Entry($user);
858 $entry->setUrl('https://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html');
859 $entry->setContent('Youhou');
860 $entry->setTitle('Youhou');
861 $entry->addTag($tag);
862 $em->persist($entry);
863
864 $entry2 = new Entry($user);
865 $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');
866 $entry2->setContent('Youhou');
867 $entry2->setTitle('Youhou');
868 $entry2->addTag($tag);
869 $em->persist($entry2);
870
871 $annotation = new Annotation($user);
872 $annotation->setText('annotated');
873 $annotation->setQuote('annotated');
874 $annotation->setRanges([]);
875 $annotation->setEntry($entry);
876 $em->persist($annotation);
877
878 $em->flush();
879
880 // reset annotations
881 $crawler = $client->request('GET', '/config#set3');
882
883 $this->assertSame(200, $client->getResponse()->getStatusCode());
884
885 $crawler = $client->click($crawler->selectLink('config.reset.annotations')->link());
886
887 $this->assertSame(302, $client->getResponse()->getStatusCode());
888 $this->assertContains('flashes.config.notice.annotations_reset', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
889
890 $annotationsReset = $em
891 ->getRepository('WallabagAnnotationBundle:Annotation')
892 ->findAnnotationsByPageId($entry->getId(), $user->getId());
893
894 $this->assertEmpty($annotationsReset, 'Annotations were reset');
895
896 // reset tags
897 $crawler = $client->request('GET', '/config#set3');
898
899 $this->assertSame(200, $client->getResponse()->getStatusCode());
900
901 $crawler = $client->click($crawler->selectLink('config.reset.tags')->link());
902
903 $this->assertSame(302, $client->getResponse()->getStatusCode());
904 $this->assertContains('flashes.config.notice.tags_reset', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
905
906 $tagReset = $em
907 ->getRepository('WallabagCoreBundle:Tag')
908 ->countAllTags($user->getId());
909
910 $this->assertSame(0, $tagReset, 'Tags were reset');
911
912 // reset entries
913 $crawler = $client->request('GET', '/config#set3');
914
915 $this->assertSame(200, $client->getResponse()->getStatusCode());
916
917 $crawler = $client->click($crawler->selectLink('config.reset.entries')->link());
918
919 $this->assertSame(302, $client->getResponse()->getStatusCode());
920 $this->assertContains('flashes.config.notice.entries_reset', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
921
922 $entryReset = $em
923 ->getRepository('WallabagCoreBundle:Entry')
924 ->countAllEntriesByUser($user->getId());
925
926 $this->assertSame(0, $entryReset, 'Entries were reset');
927 }
928
929 public function testResetArchivedEntries()
930 {
931 $this->logInAs('empty');
932 $client = $this->getClient();
933
934 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
935
936 $user = static::$kernel->getContainer()->get('security.token_storage')->getToken()->getUser();
937
938 $tag = new Tag();
939 $tag->setLabel('super');
940 $em->persist($tag);
941
942 $entry = new Entry($user);
943 $entry->setUrl('https://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html');
944 $entry->setContent('Youhou');
945 $entry->setTitle('Youhou');
946 $entry->addTag($tag);
947 $em->persist($entry);
948
949 $annotation = new Annotation($user);
950 $annotation->setText('annotated');
951 $annotation->setQuote('annotated');
952 $annotation->setRanges([]);
953 $annotation->setEntry($entry);
954 $em->persist($annotation);
955
956 $tagArchived = new Tag();
957 $tagArchived->setLabel('super');
958 $em->persist($tagArchived);
959
960 $entryArchived = new Entry($user);
961 $entryArchived->setUrl('https://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html');
962 $entryArchived->setContent('Youhou');
963 $entryArchived->setTitle('Youhou');
964 $entryArchived->addTag($tagArchived);
965 $entryArchived->updateArchived(true);
966 $em->persist($entryArchived);
967
968 $annotationArchived = new Annotation($user);
969 $annotationArchived->setText('annotated');
970 $annotationArchived->setQuote('annotated');
971 $annotationArchived->setRanges([]);
972 $annotationArchived->setEntry($entryArchived);
973 $em->persist($annotationArchived);
974
975 $em->flush();
976
977 $crawler = $client->request('GET', '/config#set3');
978
979 $this->assertSame(200, $client->getResponse()->getStatusCode());
980
981 $crawler = $client->click($crawler->selectLink('config.reset.archived')->link());
982
983 $this->assertSame(302, $client->getResponse()->getStatusCode());
984 $this->assertContains('flashes.config.notice.archived_reset', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
985
986 $entryReset = $em
987 ->getRepository('WallabagCoreBundle:Entry')
988 ->countAllEntriesByUser($user->getId());
989
990 $this->assertSame(1, $entryReset, 'Entries were reset');
991
992 $tagReset = $em
993 ->getRepository('WallabagCoreBundle:Tag')
994 ->countAllTags($user->getId());
995
996 $this->assertSame(1, $tagReset, 'Tags were reset');
997
998 $annotationsReset = $em
999 ->getRepository('WallabagAnnotationBundle:Annotation')
1000 ->findAnnotationsByPageId($annotationArchived->getId(), $user->getId());
1001
1002 $this->assertEmpty($annotationsReset, 'Annotations were reset');
1003 }
1004
1005 public function testResetEntriesCascade()
1006 {
1007 $this->logInAs('empty');
1008 $client = $this->getClient();
1009
1010 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
1011
1012 $user = static::$kernel->getContainer()->get('security.token_storage')->getToken()->getUser();
1013
1014 $tag = new Tag();
1015 $tag->setLabel('super');
1016 $em->persist($tag);
1017
1018 $entry = new Entry($user);
1019 $entry->setUrl('https://www.lemonde.fr/europe/article/2016/10/01/pour-le-psoe-chaque-election-s-est-transformee-en-une-agonie_5006476_3214.html');
1020 $entry->setContent('Youhou');
1021 $entry->setTitle('Youhou');
1022 $entry->addTag($tag);
1023 $em->persist($entry);
1024
1025 $annotation = new Annotation($user);
1026 $annotation->setText('annotated');
1027 $annotation->setQuote('annotated');
1028 $annotation->setRanges([]);
1029 $annotation->setEntry($entry);
1030 $em->persist($annotation);
1031
1032 $em->flush();
1033
1034 $crawler = $client->request('GET', '/config#set3');
1035
1036 $this->assertSame(200, $client->getResponse()->getStatusCode());
1037
1038 $crawler = $client->click($crawler->selectLink('config.reset.entries')->link());
1039
1040 $this->assertSame(302, $client->getResponse()->getStatusCode());
1041 $this->assertContains('flashes.config.notice.entries_reset', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
1042
1043 $entryReset = $em
1044 ->getRepository('WallabagCoreBundle:Entry')
1045 ->countAllEntriesByUser($user->getId());
1046
1047 $this->assertSame(0, $entryReset, 'Entries were reset');
1048
1049 $tagReset = $em
1050 ->getRepository('WallabagCoreBundle:Tag')
1051 ->countAllTags($user->getId());
1052
1053 $this->assertSame(0, $tagReset, 'Tags were reset');
1054
1055 $annotationsReset = $em
1056 ->getRepository('WallabagAnnotationBundle:Annotation')
1057 ->findAnnotationsByPageId($entry->getId(), $user->getId());
1058
1059 $this->assertEmpty($annotationsReset, 'Annotations were reset');
1060 }
1061
1062 public function testSwitchViewMode()
1063 {
1064 $this->logInAs('admin');
1065 $this->useTheme('baggy');
1066 $client = $this->getClient();
1067
1068 $client->request('GET', '/unread/list');
1069
1070 $this->assertNotContains('listmode', $client->getResponse()->getContent());
1071
1072 $client->request('GET', '/config/view-mode');
1073 $crawler = $client->followRedirect();
1074
1075 $client->request('GET', '/unread/list');
1076
1077 $this->assertContains('listmode', $client->getResponse()->getContent());
1078
1079 $client->request('GET', '/config/view-mode');
1080 }
1081
1082 public function testChangeLocaleWithoutReferer()
1083 {
1084 $client = $this->getClient();
1085
1086 $client->request('GET', '/locale/de');
1087 $client->followRedirect();
1088
1089 $this->assertSame('de', $client->getRequest()->getLocale());
1090 $this->assertSame('de', $client->getContainer()->get('session')->get('_locale'));
1091 }
1092
1093 public function testChangeLocaleWithReferer()
1094 {
1095 $client = $this->getClient();
1096
1097 $client->request('GET', '/login');
1098 $client->request('GET', '/locale/de');
1099 $client->followRedirect();
1100
1101 $this->assertSame('de', $client->getRequest()->getLocale());
1102 $this->assertSame('de', $client->getContainer()->get('session')->get('_locale'));
1103 }
1104
1105 public function testChangeLocaleToBadLocale()
1106 {
1107 $client = $this->getClient();
1108
1109 $client->request('GET', '/login');
1110 $client->request('GET', '/locale/yuyuyuyu');
1111 $client->followRedirect();
1112
1113 $this->assertNotSame('yuyuyuyu', $client->getRequest()->getLocale());
1114 $this->assertNotSame('yuyuyuyu', $client->getContainer()->get('session')->get('_locale'));
1115 }
1116 }