]> git.immae.eu Git - github/wallabag/wallabag.git/blame - src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php
Improved tests
[github/wallabag/wallabag.git] / src / Wallabag / CoreBundle / Tests / Controller / ConfigControllerTest.php
CommitLineData
4d85d7e9
J
1<?php
2
3namespace Wallabag\CoreBundle\Tests\Controller;
4
769e19dc 5use Wallabag\CoreBundle\Tests\WallabagCoreTestCase;
4d85d7e9 6
769e19dc 7class ConfigControllerTest extends WallabagCoreTestCase
4d85d7e9
J
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
d9085c63
J
28 $this->assertCount(1, $crawler->filter('button[id=config_save]'));
29 $this->assertCount(1, $crawler->filter('button[id=change_passwd_save]'));
c844dc0c 30 $this->assertCount(1, $crawler->filter('button[id=update_user_save]'));
371ac69a
J
31 $this->assertCount(1, $crawler->filter('button[id=new_user_save]'));
32 $this->assertCount(1, $crawler->filter('button[id=rss_config_save]'));
4d85d7e9
J
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
d9085c63 44 $form = $crawler->filter('button[id=config_save]')->form();
4d85d7e9
J
45
46 $data = array(
23ff8d36 47 'config[theme]' => 'baggy',
4d85d7e9 48 'config[items_per_page]' => '30',
1b64a84b 49 'config[reading_speed]' => '0.5',
c89d35e8 50 'config[language]' => 'en',
4d85d7e9
J
51 );
52
53 $client->submit($form, $data);
54
55 $this->assertEquals(302, $client->getResponse()->getStatusCode());
56
57 $crawler = $client->followRedirect();
58
32da2a70 59 $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(array('_text')));
4d85d7e9
J
60 $this->assertContains('Config saved', $alert[0]);
61 }
62
63 public function dataForUpdateFailed()
64 {
65 return array(
66 array(array(
23ff8d36 67 'config[theme]' => 'baggy',
4d85d7e9 68 'config[items_per_page]' => '',
c89d35e8 69 'config[language]' => 'en',
4d85d7e9
J
70 )),
71 );
72 }
73
74 /**
75 * @dataProvider dataForUpdateFailed
76 */
77 public function testUpdateFailed($data)
78 {
79 $this->logInAs('admin');
80 $client = $this->getClient();
81
82 $crawler = $client->request('GET', '/config');
83
84 $this->assertEquals(200, $client->getResponse()->getStatusCode());
85
d9085c63 86 $form = $crawler->filter('button[id=config_save]')->form();
4d85d7e9
J
87
88 $crawler = $client->submit($form, $data);
89
90 $this->assertEquals(200, $client->getResponse()->getStatusCode());
91
92 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(array('_text')));
93 $this->assertContains('This value should not be blank', $alert[0]);
94 }
d9085c63
J
95
96 public function dataForChangePasswordFailed()
97 {
98 return array(
99 array(
100 array(
4ab58dcf 101 'change_passwd[old_password]' => 'material',
d9085c63
J
102 'change_passwd[new_password][first]' => '',
103 'change_passwd[new_password][second]' => '',
104 ),
c0d9eba0 105 'Wrong value for your current password',
d9085c63
J
106 ),
107 array(
108 array(
109 'change_passwd[old_password]' => 'mypassword',
110 'change_passwd[new_password][first]' => '',
111 'change_passwd[new_password][second]' => '',
112 ),
c0d9eba0 113 'This value should not be blank',
d9085c63
J
114 ),
115 array(
116 array(
117 'change_passwd[old_password]' => 'mypassword',
118 'change_passwd[new_password][first]' => 'hop',
119 'change_passwd[new_password][second]' => '',
120 ),
c0d9eba0 121 'The password fields must match',
d9085c63
J
122 ),
123 array(
124 array(
125 'change_passwd[old_password]' => 'mypassword',
126 'change_passwd[new_password][first]' => 'hop',
127 'change_passwd[new_password][second]' => 'hop',
128 ),
e4977b8a 129 'Password should by at least',
d9085c63
J
130 ),
131 );
132 }
133
134 /**
135 * @dataProvider dataForChangePasswordFailed
136 */
137 public function testChangePasswordFailed($data, $expectedMessage)
138 {
139 $this->logInAs('admin');
140 $client = $this->getClient();
141
142 $crawler = $client->request('GET', '/config');
143
144 $this->assertEquals(200, $client->getResponse()->getStatusCode());
145
146 $form = $crawler->filter('button[id=change_passwd_save]')->form();
147
148 $crawler = $client->submit($form, $data);
149
150 $this->assertEquals(200, $client->getResponse()->getStatusCode());
151
152 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(array('_text')));
153 $this->assertContains($expectedMessage, $alert[0]);
154 }
155
156 public function testChangePassword()
157 {
158 $this->logInAs('admin');
159 $client = $this->getClient();
160
161 $crawler = $client->request('GET', '/config');
162
163 $this->assertEquals(200, $client->getResponse()->getStatusCode());
164
165 $form = $crawler->filter('button[id=change_passwd_save]')->form();
166
167 $data = array(
168 'change_passwd[old_password]' => 'mypassword',
169 'change_passwd[new_password][first]' => 'mypassword',
170 'change_passwd[new_password][second]' => 'mypassword',
171 );
172
173 $client->submit($form, $data);
174
175 $this->assertEquals(302, $client->getResponse()->getStatusCode());
176
177 $crawler = $client->followRedirect();
178
32da2a70 179 $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(array('_text')));
d9085c63
J
180 $this->assertContains('Password updated', $alert[0]);
181 }
c0d9eba0
J
182
183 public function dataForUserFailed()
184 {
185 return array(
186 array(
187 array(
c844dc0c
J
188 'update_user[name]' => '',
189 'update_user[email]' => '',
c0d9eba0 190 ),
3f7a6290 191 'Please enter an email',
c0d9eba0
J
192 ),
193 array(
194 array(
c844dc0c
J
195 'update_user[name]' => '',
196 'update_user[email]' => 'test',
c0d9eba0 197 ),
3f7a6290 198 'The email is not valid',
c0d9eba0
J
199 ),
200 );
201 }
202
203 /**
204 * @dataProvider dataForUserFailed
205 */
206 public function testUserFailed($data, $expectedMessage)
207 {
208 $this->logInAs('admin');
209 $client = $this->getClient();
210
211 $crawler = $client->request('GET', '/config');
212
213 $this->assertEquals(200, $client->getResponse()->getStatusCode());
214
c844dc0c 215 $form = $crawler->filter('button[id=update_user_save]')->form();
c0d9eba0
J
216
217 $crawler = $client->submit($form, $data);
218
219 $this->assertEquals(200, $client->getResponse()->getStatusCode());
220
221 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(array('_text')));
222 $this->assertContains($expectedMessage, $alert[0]);
223 }
224
225 public function testUserUpdate()
226 {
227 $this->logInAs('admin');
228 $client = $this->getClient();
229
230 $crawler = $client->request('GET', '/config');
231
232 $this->assertEquals(200, $client->getResponse()->getStatusCode());
233
c844dc0c 234 $form = $crawler->filter('button[id=update_user_save]')->form();
c0d9eba0
J
235
236 $data = array(
c844dc0c
J
237 'update_user[name]' => 'new name',
238 'update_user[email]' => 'admin@wallabag.io',
c0d9eba0
J
239 );
240
241 $client->submit($form, $data);
242
243 $this->assertEquals(302, $client->getResponse()->getStatusCode());
244
245 $crawler = $client->followRedirect();
246
32da2a70 247 $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(array('_text')));
c0d9eba0
J
248 $this->assertContains('Information updated', $alert[0]);
249 }
e4977b8a
J
250
251 public function dataForNewUserFailed()
252 {
253 return array(
254 array(
255 array(
256 'new_user[username]' => '',
fcb1fba5
NL
257 'new_user[plainPassword][first]' => '',
258 'new_user[plainPassword][second]' => '',
e4977b8a
J
259 'new_user[email]' => '',
260 ),
3f7a6290 261 'Please enter a username',
e4977b8a
J
262 ),
263 array(
264 array(
3f7a6290 265 'new_user[username]' => 'a',
fcb1fba5
NL
266 'new_user[plainPassword][first]' => 'mypassword',
267 'new_user[plainPassword][second]' => 'mypassword',
e4977b8a
J
268 'new_user[email]' => '',
269 ),
3f7a6290 270 'The username is too short',
e4977b8a
J
271 ),
272 array(
273 array(
274 'new_user[username]' => 'wallace',
fcb1fba5
NL
275 'new_user[plainPassword][first]' => 'mypassword',
276 'new_user[plainPassword][second]' => 'mypassword',
e4977b8a
J
277 'new_user[email]' => 'test',
278 ),
3f7a6290 279 'The email is not valid',
e4977b8a 280 ),
c844dc0c
J
281 array(
282 array(
283 'new_user[username]' => 'admin',
fcb1fba5
NL
284 'new_user[plainPassword][first]' => 'wallacewallace',
285 'new_user[plainPassword][second]' => 'wallacewallace',
c844dc0c
J
286 'new_user[email]' => 'wallace@wallace.me',
287 ),
3f7a6290 288 'The username is already used',
c844dc0c 289 ),
fcb1fba5
NL
290 array(
291 array(
292 'new_user[username]' => 'wallace',
293 'new_user[plainPassword][first]' => 'mypassword1',
294 'new_user[plainPassword][second]' => 'mypassword2',
295 'new_user[email]' => 'wallace@wallace.me',
296 ),
6fa4be38 297 'The password fields must match',
fcb1fba5 298 ),
e4977b8a
J
299 );
300 }
301
302 /**
303 * @dataProvider dataForNewUserFailed
304 */
305 public function testNewUserFailed($data, $expectedMessage)
306 {
307 $this->logInAs('admin');
308 $client = $this->getClient();
309
310 $crawler = $client->request('GET', '/config');
311
312 $this->assertEquals(200, $client->getResponse()->getStatusCode());
313
314 $form = $crawler->filter('button[id=new_user_save]')->form();
315
316 $crawler = $client->submit($form, $data);
317
318 $this->assertEquals(200, $client->getResponse()->getStatusCode());
319
320 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(array('_text')));
321 $this->assertContains($expectedMessage, $alert[0]);
322 }
323
324 public function testNewUserCreated()
325 {
326 $this->logInAs('admin');
327 $client = $this->getClient();
328
329 $crawler = $client->request('GET', '/config');
330
331 $this->assertEquals(200, $client->getResponse()->getStatusCode());
332
333 $form = $crawler->filter('button[id=new_user_save]')->form();
334
335 $data = array(
336 'new_user[username]' => 'wallace',
fcb1fba5
NL
337 'new_user[plainPassword][first]' => 'wallace1',
338 'new_user[plainPassword][second]' => 'wallace1',
e4977b8a
J
339 'new_user[email]' => 'wallace@wallace.me',
340 );
341
342 $client->submit($form, $data);
343
344 $this->assertEquals(302, $client->getResponse()->getStatusCode());
345
346 $crawler = $client->followRedirect();
347
32da2a70 348 $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(array('_text')));
e4977b8a 349 $this->assertContains('User "wallace" added', $alert[0]);
0f30f48b
JB
350
351 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
352 $user = $em
1210dae1 353 ->getRepository('WallabagUserBundle:User')
0f30f48b
JB
354 ->findOneByUsername('wallace');
355
356 $this->assertTrue(false !== $user);
357 $this->assertTrue($user->isEnabled());
e4977b8a 358 }
371ac69a
J
359
360 public function testRssUpdateResetToken()
361 {
362 $this->logInAs('admin');
363 $client = $this->getClient();
364
365 // reset the token
366 $em = $client->getContainer()->get('doctrine.orm.entity_manager');
367 $user = $em
1210dae1 368 ->getRepository('WallabagUserBundle:User')
371ac69a
J
369 ->findOneByUsername('admin');
370
371 if (!$user) {
372 $this->markTestSkipped('No user found in db.');
373 }
374
375 $config = $user->getConfig();
376 $config->setRssToken(null);
377 $em->persist($config);
378 $em->flush();
379
380 $crawler = $client->request('GET', '/config');
381
382 $this->assertEquals(200, $client->getResponse()->getStatusCode());
383
384 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(array('_text')));
385 $this->assertContains('You need to generate a token first.', $body[0]);
386
387 $client->request('GET', '/generate-token');
388 $this->assertEquals(302, $client->getResponse()->getStatusCode());
389
390 $crawler = $client->followRedirect();
391
392 $this->assertGreaterThan(1, $body = $crawler->filter('body')->extract(array('_text')));
393 $this->assertNotContains('You need to generate a token first.', $body[0]);
394 }
395
396 public function testGenerateTokenAjax()
397 {
398 $this->logInAs('admin');
399 $client = $this->getClient();
400
401 $client->request(
402 'GET',
403 '/generate-token',
404 array(),
405 array(),
406 array('HTTP_X-Requested-With' => 'XMLHttpRequest')
407 );
408
409 $this->assertEquals(200, $client->getResponse()->getStatusCode());
9744e971 410 $content = json_decode($client->getResponse()->getContent(), true);
371ac69a
J
411 $this->assertArrayHasKey('token', $content);
412 }
413
414 public function testRssUpdate()
415 {
416 $this->logInAs('admin');
417 $client = $this->getClient();
418
419 $crawler = $client->request('GET', '/config');
420
421 if (500 == $client->getResponse()->getStatusCode()) {
422 var_export($client->getResponse()->getContent());
423 die();
424 }
425
426 $this->assertEquals(200, $client->getResponse()->getStatusCode());
427
428 $form = $crawler->filter('button[id=rss_config_save]')->form();
429
430 $data = array(
431 'rss_config[rss_limit]' => 12,
432 );
433
434 $client->submit($form, $data);
435
436 $this->assertEquals(302, $client->getResponse()->getStatusCode());
437
438 $crawler = $client->followRedirect();
439
440 $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(array('_text')));
441 $this->assertContains('RSS information updated', $alert[0]);
442 }
443
444 public function dataForRssFailed()
445 {
446 return array(
447 array(
448 array(
449 'rss_config[rss_limit]' => 0,
450 ),
451 'This value should be 1 or more.',
452 ),
453 array(
454 array(
455 'rss_config[rss_limit]' => 1000000000000,
456 ),
457 'This will certainly kill the app',
458 ),
459 );
460 }
461
462 /**
463 * @dataProvider dataForRssFailed
464 */
465 public function testRssFailed($data, $expectedMessage)
466 {
467 $this->logInAs('admin');
468 $client = $this->getClient();
469
470 $crawler = $client->request('GET', '/config');
471
472 $this->assertEquals(200, $client->getResponse()->getStatusCode());
473
474 $form = $crawler->filter('button[id=rss_config_save]')->form();
475
476 $crawler = $client->submit($form, $data);
477
478 $this->assertEquals(200, $client->getResponse()->getStatusCode());
479
480 $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(array('_text')));
481 $this->assertContains($expectedMessage, $alert[0]);
482 }
8a99c7a8
KG
483
484 public function testTaggingRuleCreation()
485 {
486 $this->logInAs('admin');
487 $client = $this->getClient();
488
489 $crawler = $client->request('GET', '/config');
490
491 $this->assertTrue($client->getResponse()->isSuccessful());
492
493 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
494
495 $data = array(
496 'tagging_rule[rule]' => 'readingTime <= 3',
497 'tagging_rule[tags]' => 'short reading',
498 );
499
500 $client->submit($form, $data);
501
502 $this->assertEquals(302, $client->getResponse()->getStatusCode());
503
504 $crawler = $client->followRedirect();
505
506 $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(array('_text')));
507 $this->assertContains('Tagging rules updated', $alert[0]);
508
958671a7 509 $deleteLink = $crawler->filter('.delete')->last()->link();
8a99c7a8
KG
510
511 $crawler = $client->click($deleteLink);
512 $this->assertEquals(302, $client->getResponse()->getStatusCode());
513
514 $crawler = $client->followRedirect();
515 $this->assertGreaterThan(1, $alert = $crawler->filter('div.messages.success')->extract(array('_text')));
516 $this->assertContains('Tagging rule deleted', $alert[0]);
517 }
518
519 public function dataForTaggingRuleFailed()
520 {
521 return array(
522 array(
523 array(
a3cac44c
JB
524 'tagging_rule[rule]' => 'unknownVar <= 3',
525 'tagging_rule[tags]' => 'cool tag',
526 ),
527 array(
528 'The variable',
529 'does not exist.',
8a99c7a8 530 ),
8a99c7a8
KG
531 ),
532 array(
533 array(
a3cac44c
JB
534 'tagging_rule[rule]' => 'length(domainName) <= 42',
535 'tagging_rule[tags]' => 'cool tag',
536 ),
537 array(
538 'The operator',
539 'does not exist.',
8a99c7a8 540 ),
8a99c7a8
KG
541 ),
542 );
543 }
a3cac44c
JB
544
545 /**
546 * @dataProvider dataForTaggingRuleFailed
547 */
548 public function testTaggingRuleCreationFail($data, $messages)
549 {
550 $this->logInAs('admin');
551 $client = $this->getClient();
552
553 $crawler = $client->request('GET', '/config');
554
555 $this->assertTrue($client->getResponse()->isSuccessful());
556
557 $form = $crawler->filter('button[id=tagging_rule_save]')->form();
558
559 $client->submit($form, $data);
560
561 $this->assertEquals(200, $client->getResponse()->getStatusCode());
562
563 foreach ($messages as $message) {
564 $this->assertContains($message, $client->getResponse()->getContent());
565 }
566 }
567
568 public function testDeletingTaggingRuleFromAnOtherUser()
569 {
570 $this->logInAs('bob');
571 $client = $this->getClient();
572
573 $rule = $client->getContainer()->get('doctrine.orm.entity_manager')
574 ->getRepository('WallabagCoreBundle:TaggingRule')
575 ->findAll()[0];
576
577 $client->request('GET', '/tagging-rule/delete/'.$rule->getId());
578 $this->assertEquals(403, $client->getResponse()->getStatusCode());
579 $this->assertContains('You can not access this tagging ryle', $client->getResponse()->getContent());
580 }
b6c00b0b
JB
581
582 public function testDemoMode()
583 {
584 $this->logInAs('admin');
585 $client = $this->getClient();
586
587 $config = $client->getContainer()->get('craue_config');
588 $config->set('demo_mode_enabled', 1);
589 $config->set('demo_mode_username', 'admin');
590
591 $crawler = $client->request('GET', '/config');
592
593 $this->assertEquals(200, $client->getResponse()->getStatusCode());
594
595 $form = $crawler->filter('button[id=change_passwd_save]')->form();
596
597 $data = array(
598 'change_passwd[old_password]' => 'mypassword',
599 'change_passwd[new_password][first]' => 'mypassword',
600 'change_passwd[new_password][second]' => 'mypassword',
601 );
602
603 $client->submit($form, $data);
604
605 $this->assertEquals(302, $client->getResponse()->getStatusCode());
606 $this->assertContains('In demonstration mode, you can\'t change password for this user.', $client->getContainer()->get('session')->getFlashBag()->get('notice')[0]);
607
608 $config->set('demo_mode_enabled', 0);
609 $config->set('demo_mode_username', 'wallabag');
610 }
4d85d7e9 611}