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 testLogin()
106 $client = $this->getClient();
108 $crawler = $client->request('GET', '/new');
110 $this->assertEquals(302, $client->getResponse()->getStatusCode());
111 $this->assertContains('login', $client->getResponse()->headers
->get('location'));
114 public function testLoginFail()
116 $client = $this->getClient();
118 $crawler = $client->request('GET', '/login');
120 $form = $crawler->filter('button[type=submit]')->form();
122 '_username' => 'admin',
123 '_password' => 'admin',
126 $client->submit($form, $data);
128 $this->assertEquals(302, $client->getResponse()->getStatusCode());
129 $this->assertContains('login', $client->getResponse()->headers
->get('location'));
131 $crawler = $client->followRedirect();
133 $this->assertContains('Bad credentials', $client->getResponse()->getContent());
136 public function testRedirectionAfterLogin()
138 $client = $this->getClient();
139 $client->followRedirects();
141 $crawler = $client->request('GET', '/config');
143 $form = $crawler->filter('button[type=submit]')->form();
146 '_username' => 'admin',
147 '_password' => 'mypassword',
150 $client->submit($form, $data);
152 $this->assertContains('RSS', $client->getResponse()->getContent());
155 public function testForgotPassword()
157 $client = $this->getClient();
159 $crawler = $client->request('GET', '/forgot-password');
161 $this->assertEquals(200, $client->getResponse()->getStatusCode());
163 $this->assertContains('Forgot password', $client->getResponse()->getContent());
165 $form = $crawler->filter('button[type=submit]');
167 $this->assertCount(1, $form);
170 'form' => $form->form(),
176 * @depends testForgotPassword
178 public function testSubmitForgotPasswordFail($parameters)
180 $form = $parameters['form'];
181 $client = $parameters['client'];
184 'forgot_password[email]' => 'material',
187 $client->submit($form, $data);
189 $this->assertEquals(200, $client->getResponse()->getStatusCode());
190 $this->assertContains('No user found with this email', $client->getResponse()->getContent());
194 * @depends testForgotPassword
196 * Instead of using collector which slow down the test suite
197 * http://symfony.com/doc/current/cookbook/email/testing.html
199 * Use a different way where Swift store email as file
201 public function testSubmitForgotPassword($parameters)
203 $form = $parameters['form'];
204 $client = $parameters['client'];
206 $spoolDir = $client->getKernel()->getContainer()->getParameter('swiftmailer.spool.default.file.path');
209 $filesystem = new Filesystem();
210 $filesystem->remove($spoolDir);
212 // to use `getCollector` since `collect: false` in config_test.yml
213 $client->enableProfiler();
216 'forgot_password[email]' => 'bobby@wallabag.org',
219 $client->submit($form, $data);
221 $this->assertEquals(302, $client->getResponse()->getStatusCode());
223 $crawler = $client->followRedirect();
225 $this->assertContains('An email has been sent to', $client->getResponse()->getContent());
227 // find every files (ie: emails) inside the spool dir except hidden files
228 $finder = new Finder();
231 ->ignoreDotFiles(true)
234 $this->assertCount(1, $finder, 'Only one email has been sent');
236 foreach ($finder as $file) {
237 $message = unserialize(file_get_contents($file));
239 $this->assertInstanceOf('Swift_Message', $message);
240 $this->assertEquals('Reset Password', $message->getSubject());
241 $this->assertEquals('no-reply@wallabag.org', key($message->getFrom()));
242 $this->assertEquals('bobby@wallabag.org', key($message->getTo()));
243 $this->assertContains(
244 'To reset your password - please visit',
250 public function testReset()
252 $client = $this->getClient();
253 $user = $client->getContainer()
254 ->get('doctrine.orm.entity_manager')
255 ->getRepository('WallabagCoreBundle:User')
256 ->findOneByEmail('bobby@wallabag.org');
258 $crawler = $client->request('GET', '/forgot-password/'.$user->getConfirmationToken());
260 $this->assertEquals(200, $client->getResponse()->getStatusCode());
261 $this->assertCount(2, $crawler->filter('input[type=password]'));
262 $this->assertCount(1, $form = $crawler->filter('button[type=submit]'));
263 $this->assertCount(1, $form);
266 'change_passwd[new_password][first]' => 'mypassword',
267 'change_passwd[new_password][second]' => 'mypassword',
270 $client->submit($form->form(), $data);
272 $this->assertEquals(302, $client->getResponse()->getStatusCode());
273 $this->assertContains('login', $client->getResponse()->headers
->get('location'));
276 public function testResetBadToken()
278 $client = $this->getClient();
280 $client->request('GET', '/forgot-password/UIZOAU29UE902IEPZO');
282 $this->assertEquals(404, $client->getResponse()->getStatusCode());
285 public function testCheckEmailWithoutEmail()
287 $client = $this->getClient();
289 $client->request('GET', '/forgot-password/check-email');
291 $this->assertEquals(302, $client->getResponse()->getStatusCode());
292 $this->assertContains('forgot-password', $client->getResponse()->headers
->get('location'));