3 namespace Wallabag\CoreBundle\Tests\Controller
;
5 use Symfony\Component\Filesystem\Filesystem
;
6 use Symfony\Component\Finder\Finder
;
7 use Wallabag\CoreBundle\Tests\WallabagCoreTestCase
;
9 class SecurityControllerTest
extends WallabagCoreTestCase
11 public function testRegister()
13 $client = $this->getClient();
15 $crawler = $client->request('GET', '/register/');
17 $this->assertEquals(200, $client->getResponse()->getStatusCode());
18 $this->assertContains('Register', $client->getResponse()->getContent());
21 public function dataForCreateAccountFailed()
26 'fos_user_registration_form[email]' => '',
27 'fos_user_registration_form[username]' => 'newuser',
28 'fos_user_registration_form[plainPassword][first]' => 'mypassword',
29 'fos_user_registration_form[plainPassword][second]' => 'mypassword',
31 'Please enter an email',
35 'fos_user_registration_form[email]' => 'newuser@wallabag.org',
36 'fos_user_registration_form[username]' => 'admin',
37 'fos_user_registration_form[plainPassword][first]' => 'mypassword',
38 'fos_user_registration_form[plainPassword][second]' => 'mypassword',
40 'The username is already used',
44 'fos_user_registration_form[email]' => 'newuser@wallabag.org',
45 'fos_user_registration_form[username]' => 'newuser',
46 'fos_user_registration_form[plainPassword][first]' => 'mypassword1',
47 'fos_user_registration_form[plainPassword][second]' => 'mypassword2',
49 'The entered passwords don't match',
55 * @dataProvider dataForCreateAccountFailed
57 public function testCreateAccountFailed($data, $expectedMessage)
59 $client = $this->getClient();
61 $crawler = $client->request('GET', '/register/');
63 $form = $crawler->filter('input[type=submit]')->form();
65 $client->submit($form, $data);
67 $this->assertEquals(200, $client->getResponse()->getStatusCode());
68 $this->assertContains($expectedMessage, $client->getResponse()->getContent());
71 public function dataForCreateAccountSuccess()
76 'fos_user_registration_form[email]' => 'newuser@wallabag.org',
77 'fos_user_registration_form[username]' => 'newuser',
78 'fos_user_registration_form[plainPassword][first]' => 'mypassword',
79 'fos_user_registration_form[plainPassword][second]' => 'mypassword',
86 * @dataProvider dataForCreateAccountSuccess
88 public function testCreateAccountSuccess($data)
90 $client = $this->getClient();
92 $crawler = $client->request('GET', '/register/');
94 $form = $crawler->filter('input[type=submit]')->form();
96 $client->submit($form, $data);
97 $this->assertEquals(302, $client->getResponse()->getStatusCode());
99 $crawler = $client->followRedirect();
101 $this->assertContains('The user has been created successfully', $client->getResponse()->getContent());
104 public function testRegistrationConfirmation()
106 $client = $this->getClient();
107 $client->followRedirects();
109 $user = $client->getContainer()
110 ->get('doctrine.orm.entity_manager')
111 ->getRepository('WallabagCoreBundle:User')
112 ->findOneByUsername('newuser');
114 $this->assertNull($user->getConfig());
116 $client->request('GET', '/register/confirm/b4dT0k3n');
117 $this->assertEquals(404, $client->getResponse()->getStatusCode());
119 $crawler = $client->request('GET', '/register/confirm/'.$user->getConfirmationToken());
120 $this->assertEquals(200, $client->getResponse()->getStatusCode());
122 $user = $client->getContainer()
123 ->get('doctrine.orm.entity_manager')
124 ->getRepository('WallabagCoreBundle:User')
125 ->findOneByUsername('newuser');
126 $this->assertNotNull($user->getConfig());
129 public function testLogin()
131 $client = $this->getClient();
133 $crawler = $client->request('GET', '/new');
135 $this->assertEquals(302, $client->getResponse()->getStatusCode());
136 $this->assertContains('login', $client->getResponse()->headers
->get('location'));
139 public function testLoginFail()
141 $client = $this->getClient();
143 $crawler = $client->request('GET', '/login');
145 $form = $crawler->filter('button[type=submit]')->form();
147 '_username' => 'admin',
148 '_password' => 'admin',
151 $client->submit($form, $data);
153 $this->assertEquals(302, $client->getResponse()->getStatusCode());
154 $this->assertContains('login', $client->getResponse()->headers
->get('location'));
156 $crawler = $client->followRedirect();
158 $this->assertContains('Bad credentials', $client->getResponse()->getContent());
161 public function testRedirectionAfterLogin()
163 $client = $this->getClient();
164 $client->followRedirects();
166 $crawler = $client->request('GET', '/config');
168 $form = $crawler->filter('button[type=submit]')->form();
171 '_username' => 'admin',
172 '_password' => 'mypassword',
175 $client->submit($form, $data);
177 $this->assertContains('RSS', $client->getResponse()->getContent());
180 public function testForgotPassword()
182 $client = $this->getClient();
184 $crawler = $client->request('GET', '/forgot-password');
186 $this->assertEquals(200, $client->getResponse()->getStatusCode());
188 $this->assertContains('Forgot password', $client->getResponse()->getContent());
190 $form = $crawler->filter('button[type=submit]');
192 $this->assertCount(1, $form);
195 'form' => $form->form(),
201 * @depends testForgotPassword
203 public function testSubmitForgotPasswordFail($parameters)
205 $form = $parameters['form'];
206 $client = $parameters['client'];
209 'forgot_password[email]' => 'material',
212 $client->submit($form, $data);
214 $this->assertEquals(200, $client->getResponse()->getStatusCode());
215 $this->assertContains('No user found with this email', $client->getResponse()->getContent());
219 * @depends testForgotPassword
221 * Instead of using collector which slow down the test suite
222 * http://symfony.com/doc/current/cookbook/email/testing.html
224 * Use a different way where Swift store email as file
226 public function testSubmitForgotPassword($parameters)
228 $form = $parameters['form'];
229 $client = $parameters['client'];
231 $spoolDir = $client->getKernel()->getContainer()->getParameter('swiftmailer.spool.default.file.path');
234 $filesystem = new Filesystem();
235 $filesystem->remove($spoolDir);
237 // to use `getCollector` since `collect: false` in config_test.yml
238 $client->enableProfiler();
241 'forgot_password[email]' => 'bobby@wallabag.org',
244 $client->submit($form, $data);
246 $this->assertEquals(302, $client->getResponse()->getStatusCode());
248 $crawler = $client->followRedirect();
250 $this->assertContains('An email has been sent to', $client->getResponse()->getContent());
252 // find every files (ie: emails) inside the spool dir except hidden files
253 $finder = new Finder();
256 ->ignoreDotFiles(true)
259 $this->assertCount(1, $finder, 'Only one email has been sent');
261 foreach ($finder as $file) {
262 $message = unserialize(file_get_contents($file));
264 $this->assertInstanceOf('Swift_Message', $message);
265 $this->assertEquals('Reset Password', $message->getSubject());
266 $this->assertEquals('no-reply@wallabag.org', key($message->getFrom()));
267 $this->assertEquals('bobby@wallabag.org', key($message->getTo()));
268 $this->assertContains(
269 'To reset your password - please visit',
275 public function testReset()
277 $client = $this->getClient();
278 $user = $client->getContainer()
279 ->get('doctrine.orm.entity_manager')
280 ->getRepository('WallabagCoreBundle:User')
281 ->findOneByEmail('bobby@wallabag.org');
283 $crawler = $client->request('GET', '/forgot-password/'.$user->getConfirmationToken());
285 $this->assertEquals(200, $client->getResponse()->getStatusCode());
286 $this->assertCount(2, $crawler->filter('input[type=password]'));
287 $this->assertCount(1, $form = $crawler->filter('button[type=submit]'));
288 $this->assertCount(1, $form);
291 'change_passwd[new_password][first]' => 'mypassword',
292 'change_passwd[new_password][second]' => 'mypassword',
295 $client->submit($form->form(), $data);
297 $this->assertEquals(302, $client->getResponse()->getStatusCode());
298 $this->assertContains('login', $client->getResponse()->headers
->get('location'));
301 public function testResetBadToken()
303 $client = $this->getClient();
305 $client->request('GET', '/forgot-password/UIZOAU29UE902IEPZO');
307 $this->assertEquals(404, $client->getResponse()->getStatusCode());
310 public function testCheckEmailWithoutEmail()
312 $client = $this->getClient();
314 $client->request('GET', '/forgot-password/check-email');
316 $this->assertEquals(302, $client->getResponse()->getStatusCode());
317 $this->assertContains('forgot-password', $client->getResponse()->headers
->get('location'));