From dabd58ed89fda34c660d950ca7c85049c2f8f98b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julien=20Fastr=C3=A9?= Date: Tue, 5 Jan 2016 13:47:17 +0100 Subject: [PATCH] fix issue with password change + tests user lifecycle --- Controller/UserController.php | 10 +- Resources/translations/messages.fr.yml | 5 + Tests/Controller/UserControllerTest.php | 151 ++++++++++++++++++------ 3 files changed, 128 insertions(+), 38 deletions(-) diff --git a/Controller/UserController.php b/Controller/UserController.php index 604d47152..48786ae62 100644 --- a/Controller/UserController.php +++ b/Controller/UserController.php @@ -354,7 +354,15 @@ class UserController extends Controller $editForm->handleRequest($request); if ($editForm->isValid()) { - $password = $editForm->getData(); + $password = $editForm->getData()->getPassword(); + + // logging for debug !! WARNING print the new password !! + $this->get('logger')->debug('update password for an user', + array('method' => __METHOD__, 'password' => $password, + 'user' => $user->getUsername())); + // logging for prod + $this->get('logger')->info('update password for an user', + array('method' => __METHOD__, 'user' => $user->getUsername())); $user->setPassword($this->get('security.password_encoder') ->encodePassword($user, $password)); diff --git a/Resources/translations/messages.fr.yml b/Resources/translations/messages.fr.yml index 4cec5771f..422d49c18 100644 --- a/Resources/translations/messages.fr.yml +++ b/Resources/translations/messages.fr.yml @@ -18,6 +18,10 @@ Export Menu: Export Admin Menu: Menu d'administration Details: Détails +Edit: Modifier +Update: Mettre à jour +Back to the list: Retour à la liste + #serach Your search is empty. Please provide search terms.: La recherche est vide. Merci de fournir des termes de recherche. The domain %domain% is unknow. Please check your search.: Le domaine de recherche "%domain%" est inconnu. Merci de vérifier votre recherche. @@ -85,6 +89,7 @@ The permissions have been added: Les permissions ont été ajoutées Edit password for %username%: Éditer le mot de passe de %username% Change password: Changer le mot de passe Back to the user edition: Retour au formulaire d'édition +Password successfully updated!: Mot de passe mis à jour #admin section for circles (old: scopes) List circles: Liste des cercles diff --git a/Tests/Controller/UserControllerTest.php b/Tests/Controller/UserControllerTest.php index d856cb2da..554df33ae 100644 --- a/Tests/Controller/UserControllerTest.php +++ b/Tests/Controller/UserControllerTest.php @@ -6,54 +6,131 @@ use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; class UserControllerTest extends WebTestCase { - public function testBlank() + private $client; + + public function setUp() { - $this->markTestSkipped(); + self::bootKernel(); + + $this->client = static::createClient(array(), array( + 'PHP_AUTH_USER' => 'admin', + 'PHP_AUTH_PW' => 'password', + 'HTTP_ACCEPT_LANGUAGE' => 'fr_FR' + )); } - /* - public function testCompleteScenario() + + public function testList() { - // Create a new client to browse the application - $client = static::createClient(); - - // Create a new entry in the database - $crawler = $client->request('GET', '/admin/user/'); - $this->assertEquals(200, $client->getResponse()->getStatusCode(), "Unexpected HTTP status code for GET /admin/user/"); - $crawler = $client->click($crawler->selectLink('Create a new entry')->link()); - + // get the list + $crawler = $this->client->request('GET', '/fr/admin/user/'); + $this->assertEquals(200, $this->client->getResponse()->getStatusCode(), + "Unexpected HTTP status code for GET /admin/user/"); + + $link = $crawler->selectLink('Ajouter un nouvel utilisateur')->link(); + $this->assertInstanceOf('Symfony\Component\DomCrawler\Link', $link); + $this->assertRegExp('|/fr/admin/user/new$|', $link->getUri()); + } + + public function testNew() + { + $crawler = $this->client->request('GET', '/fr/admin/user/new'); + + $username = 'Test_user'. uniqid(); + $password = 'Password1234!'; // Fill in the form and submit it - $form = $crawler->selectButton('Create')->form(array( - 'chill_mainbundle_user[field_name]' => 'Test', - // ... other fields to fill + $form = $crawler->selectButton('Créer')->form(array( + 'chill_mainbundle_user[username]' => $username, + 'chill_mainbundle_user[plainPassword][password][first]' => $password, + 'chill_mainbundle_user[plainPassword][password][second]' => $password )); - $client->submit($form); - $crawler = $client->followRedirect(); + $this->client->submit($form); + $crawler = $this->client->followRedirect(); // Check data in the show view - $this->assertGreaterThan(0, $crawler->filter('td:contains("Test")')->count(), 'Missing element td:contains("Test")'); + $this->assertGreaterThan(0, $crawler->filter('td:contains("Test_user")')->count(), + 'Missing element td:contains("Test user")'); + + $update = $crawler->selectLink('Modifier')->link(); + + $this->assertInstanceOf('Symfony\Component\DomCrawler\Link', $update); + $this->assertRegExp('|/fr/admin/user/[0-9]{1,}/edit$|', $update->getUri()); + + //test the auth of the new client + $this->isPasswordValid($username, $password); + + return $update; + } + + protected function isPasswordValid($username, $password) + { + /* @var $passwordEncoder \Symfony\Component\Security\Core\Encoder\UserPasswordEncoder */ + $passwordEncoder = self::$kernel->getContainer() + ->get('security.password_encoder'); + + $user = self::$kernel->getContainer() + ->get('doctrine.orm.entity_manager') + ->getRepository('ChillMainBundle:User') + ->findOneBy(array('username' => $username)); + + $this->assertTrue($passwordEncoder->isPasswordValid($user, $password)); + } + + /** + * + * @param \Symfony\Component\DomCrawler\Link $update + * @depends testNew + */ + public function testUpdate(\Symfony\Component\DomCrawler\Link $update) + { + $crawler = $this->client->click($update); - // Edit the entity - $crawler = $client->click($crawler->selectLink('Edit')->link()); - - $form = $crawler->selectButton('Update')->form(array( - 'chill_mainbundle_user[field_name]' => 'Foo', - // ... other fields to fill + $username = 'Foo bar '.uniqid(); + $form = $crawler->selectButton('Mettre à jour')->form(array( + 'chill_mainbundle_user[username]' => $username, )); - - $client->submit($form); - $crawler = $client->followRedirect(); - + + $this->client->submit($form); + $crawler = $this->client->followRedirect(); // Check the element contains an attribute with value equals "Foo" - $this->assertGreaterThan(0, $crawler->filter('[value="Foo"]')->count(), 'Missing element [value="Foo"]'); - - // Delete the entity - $client->submit($crawler->selectButton('Delete')->form()); - $crawler = $client->followRedirect(); - - // Check the entity has been delete on the list - $this->assertNotRegExp('/Foo/', $client->getResponse()->getContent()); + $this->assertGreaterThan(0, $crawler->filter('[value="'.$username.'"]')->count(), + 'Missing element [value="Foo bar"]'); + + $updatePassword = $crawler->selectLink('Modifier le mot de passe')->link(); + + $this->assertInstanceOf('Symfony\Component\DomCrawler\Link', $updatePassword); + $this->assertRegExp('|/fr/admin/user/[0-9]{1,}/edit_password$|', + $updatePassword->getUri()); + + return array('link' => $updatePassword, 'username' => $username); + } + + /** + * + * @param \Symfony\Component\DomCrawler\Link $updatePassword + * @depends testUpdate + */ + public function testUpdatePassword(array $params) + { + $link = $params['link']; + $username = $params['username']; + $newPassword = '1234Password!'; + + $crawler = $this->client->click($link); + + $form = $crawler->selectButton('Changer le mot de passe')->form(array( + 'chill_mainbundle_user_password[password][first]' => $newPassword, + 'chill_mainbundle_user_password[password][second]' => $newPassword, + )); + + $this->client->submit($form); + + $this->assertTrue($this->client->getResponse()->isRedirect(), + "the response is a redirection"); + $this->client->followRedirect(); + + $this->isPasswordValid($username, $newPassword); } - */ + }