From c0d9eba07f40a52bdfcfca3e7a926163b17d83ab Mon Sep 17 00:00:00 2001 From: Jeremy Date: Tue, 17 Feb 2015 22:45:20 +0100 Subject: [PATCH] Updating logged in user (email, name, etc ..) --- .../Controller/ConfigController.php | 21 ++++- src/Wallabag/CoreBundle/Entity/User.php | 19 ++-- .../Form/Type/ChangePasswordType.php | 9 +- .../CoreBundle/Form/Type/ConfigType.php | 2 +- .../CoreBundle/Form/Type/UserType.php | 31 +++++++ .../Resources/views/Config/index.html.twig | 34 ++++++- .../Tests/Controller/ConfigControllerTest.php | 89 +++++++++++++++++-- 7 files changed, 185 insertions(+), 20 deletions(-) create mode 100644 src/Wallabag/CoreBundle/Form/Type/UserType.php diff --git a/src/Wallabag/CoreBundle/Controller/ConfigController.php b/src/Wallabag/CoreBundle/Controller/ConfigController.php index 7540f756..b3236e3c 100644 --- a/src/Wallabag/CoreBundle/Controller/ConfigController.php +++ b/src/Wallabag/CoreBundle/Controller/ConfigController.php @@ -8,6 +8,7 @@ use Symfony\Component\HttpFoundation\Request; use Wallabag\CoreBundle\Entity\Config; use Wallabag\CoreBundle\Form\Type\ConfigType; use Wallabag\CoreBundle\Form\Type\ChangePasswordType; +use Wallabag\CoreBundle\Form\Type\UserType; class ConfigController extends Controller { @@ -20,13 +21,13 @@ class ConfigController extends Controller { $em = $this->getDoctrine()->getManager(); $config = $this->getConfig(); + $user = $this->getUser(); // handle basic config detail $configForm = $this->createForm(new ConfigType(), $config); $configForm->handleRequest($request); if ($configForm->isValid()) { - $em->persist($config); $em->flush(); @@ -43,7 +44,6 @@ class ConfigController extends Controller $pwdForm->handleRequest($request); if ($pwdForm->isValid()) { - $user = $this->getUser(); $user->setPassword($pwdForm->get('new_password')->getData()); $em->persist($user); $em->flush(); @@ -56,9 +56,26 @@ class ConfigController extends Controller return $this->redirect($this->generateUrl('config')); } + // handle changing user information + $userForm = $this->createForm(new UserType(), $user); + $userForm->handleRequest($request); + + if ($userForm->isValid()) { + $em->persist($user); + $em->flush(); + + $this->get('session')->getFlashBag()->add( + 'notice', + 'Information updated' + ); + + return $this->redirect($this->generateUrl('config')); + } + return $this->render('WallabagCoreBundle:Config:index.html.twig', array( 'configForm' => $configForm->createView(), 'pwdForm' => $pwdForm->createView(), + 'userForm' => $userForm->createView(), )); } diff --git a/src/Wallabag/CoreBundle/Entity/User.php b/src/Wallabag/CoreBundle/Entity/User.php index c83250c3..193dfebc 100644 --- a/src/Wallabag/CoreBundle/Entity/User.php +++ b/src/Wallabag/CoreBundle/Entity/User.php @@ -6,6 +6,7 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\Mapping as ORM; use Symfony\Component\Security\Core\User\UserInterface; use Symfony\Component\Security\Core\User\AdvancedUserInterface; +use Symfony\Component\Validator\Constraints as Assert; /** * User @@ -29,6 +30,11 @@ class User implements AdvancedUserInterface, \Serializable * @var string * * @ORM\Column(name="username", type="text") + * @Assert\NotBlank() + * @Assert\Length( + * min = "3", + * max = "255" + * ) */ private $username; @@ -56,14 +62,16 @@ class User implements AdvancedUserInterface, \Serializable /** * @var string * - * @ORM\Column(name="email", type="text", nullable=true) + * @ORM\Column(name="email", type="text", nullable=false) + * @Assert\Email() + * @Assert\NotBlank() */ private $email; /** - * @ORM\Column(name="is_active", type="boolean") + * @ORM\Column(name="is_active", type="boolean", nullable=false) */ - private $isActive; + private $isActive = true; /** * @var date @@ -86,9 +94,8 @@ class User implements AdvancedUserInterface, \Serializable public function __construct() { - $this->isActive = true; - $this->salt = md5(uniqid(null, true)); - $this->entries = new ArrayCollection(); + $this->salt = md5(uniqid(null, true)); + $this->entries = new ArrayCollection(); } /** diff --git a/src/Wallabag/CoreBundle/Form/Type/ChangePasswordType.php b/src/Wallabag/CoreBundle/Form/Type/ChangePasswordType.php index 8bf4ca1e..de0ad537 100644 --- a/src/Wallabag/CoreBundle/Form/Type/ChangePasswordType.php +++ b/src/Wallabag/CoreBundle/Form/Type/ChangePasswordType.php @@ -3,7 +3,6 @@ namespace Wallabag\CoreBundle\Form\Type; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\FormBuilderInterface; -use Symfony\Component\OptionsResolver\OptionsResolverInterface; use Symfony\Component\Security\Core\Validator\Constraints\UserPassword; use Symfony\Component\Validator\Constraints; @@ -23,11 +22,11 @@ class ChangePasswordType extends AbstractType 'second_options' => array('label' => 'Repeat new password'), 'constraints' => array( new Constraints\Length(array( - 'min' => 6, - 'minMessage' => 'Password should by at least 6 chars long' + 'min' => 8, + 'minMessage' => 'Password should by at least 6 chars long', )), - new Constraints\NotBlank() - ) + new Constraints\NotBlank(), + ), )) ->add('save', 'submit') ; diff --git a/src/Wallabag/CoreBundle/Form/Type/ConfigType.php b/src/Wallabag/CoreBundle/Form/Type/ConfigType.php index 74e2a6f1..a1e0ce47 100644 --- a/src/Wallabag/CoreBundle/Form/Type/ConfigType.php +++ b/src/Wallabag/CoreBundle/Form/Type/ConfigType.php @@ -21,7 +21,7 @@ class ConfigType extends AbstractType 'solarized_dark' => 'Solarized Dark', ), )) - ->add('items_per_page') + ->add('items_per_page', 'text') ->add('language') ->add('save', 'submit') ; diff --git a/src/Wallabag/CoreBundle/Form/Type/UserType.php b/src/Wallabag/CoreBundle/Form/Type/UserType.php new file mode 100644 index 00000000..b479a0b5 --- /dev/null +++ b/src/Wallabag/CoreBundle/Form/Type/UserType.php @@ -0,0 +1,31 @@ +add('username', 'text') + ->add('name', 'text') + ->add('email', 'text') + ->add('save', 'submit') + ; + } + + public function setDefaultOptions(OptionsResolverInterface $resolver) + { + $resolver->setDefaults(array( + 'data_class' => 'Wallabag\CoreBundle\Entity\User', + )); + } + + public function getName() + { + return 'user'; + } +} diff --git a/src/Wallabag/CoreBundle/Resources/views/Config/index.html.twig b/src/Wallabag/CoreBundle/Resources/views/Config/index.html.twig index 94145177..7a45ec1f 100644 --- a/src/Wallabag/CoreBundle/Resources/views/Config/index.html.twig +++ b/src/Wallabag/CoreBundle/Resources/views/Config/index.html.twig @@ -7,7 +7,7 @@ {% endblock %} {% block content %} -

{% trans %}Basic config{% endtrans %}

+

{% trans %}Wallabag configuration{% endtrans %}

{{ form_errors(configForm) }} @@ -39,6 +39,38 @@ {{ form_rest(configForm) }}
+

{% trans %}User information{% endtrans %}

+ +
+ {{ form_errors(userForm) }} + +
+
+ {{ form_label(userForm.username) }} + {{ form_errors(userForm.username) }} + {{ form_widget(userForm.username) }} +
+
+ +
+
+ {{ form_label(userForm.name) }} + {{ form_errors(userForm.name) }} + {{ form_widget(userForm.name) }} +
+
+ +
+
+ {{ form_label(userForm.email) }} + {{ form_errors(userForm.email) }} + {{ form_widget(userForm.email) }} +
+
+ + {{ form_rest(userForm) }} +
+

{% trans %}Change your password{% endtrans %}

diff --git a/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php b/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php index 4aceed15..519b4ba2 100644 --- a/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php +++ b/src/Wallabag/CoreBundle/Tests/Controller/ConfigControllerTest.php @@ -25,9 +25,9 @@ class ConfigControllerTest extends WallabagTestCase $this->assertEquals(200, $client->getResponse()->getStatusCode()); - $this->assertCount(1, $crawler->filter('input[type=number]')); $this->assertCount(1, $crawler->filter('button[id=config_save]')); $this->assertCount(1, $crawler->filter('button[id=change_passwd_save]')); + $this->assertCount(1, $crawler->filter('button[id=user_save]')); } public function testUpdate() @@ -104,7 +104,7 @@ class ConfigControllerTest extends WallabagTestCase 'change_passwd[new_password][first]' => '', 'change_passwd[new_password][second]' => '', ), - 'Wrong value for your current password' + 'Wrong value for your current password', ), array( array( @@ -112,7 +112,7 @@ class ConfigControllerTest extends WallabagTestCase 'change_passwd[new_password][first]' => '', 'change_passwd[new_password][second]' => '', ), - 'This value should not be blank' + 'This value should not be blank', ), array( array( @@ -120,7 +120,7 @@ class ConfigControllerTest extends WallabagTestCase 'change_passwd[new_password][first]' => 'hop', 'change_passwd[new_password][second]' => '', ), - 'The password fields must match' + 'The password fields must match', ), array( array( @@ -128,7 +128,7 @@ class ConfigControllerTest extends WallabagTestCase 'change_passwd[new_password][first]' => 'hop', 'change_passwd[new_password][second]' => 'hop', ), - 'Password should by at least 6 chars long' + 'Password should by at least 6 chars long', ), ); } @@ -181,4 +181,83 @@ class ConfigControllerTest extends WallabagTestCase $this->assertGreaterThan(1, $alert = $crawler->filter('div.flash-notice')->extract(array('_text'))); $this->assertContains('Password updated', $alert[0]); } + + public function dataForUserFailed() + { + return array( + array( + array( + 'user[username]' => '', + 'user[name]' => '', + 'user[email]' => '', + ), + 'This value should not be blank.', + ), + array( + array( + 'user[username]' => 'ad', + 'user[name]' => '', + 'user[email]' => '', + ), + 'This value is too short.', + ), + array( + array( + 'user[username]' => 'admin', + 'user[name]' => '', + 'user[email]' => 'test', + ), + 'This value is not a valid email address.', + ), + ); + } + + /** + * @dataProvider dataForUserFailed + */ + public function testUserFailed($data, $expectedMessage) + { + $this->logInAs('admin'); + $client = $this->getClient(); + + $crawler = $client->request('GET', '/config'); + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + + $form = $crawler->filter('button[id=user_save]')->form(); + + $crawler = $client->submit($form, $data); + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + + $this->assertGreaterThan(1, $alert = $crawler->filter('body')->extract(array('_text'))); + $this->assertContains($expectedMessage, $alert[0]); + } + + public function testUserUpdate() + { + $this->logInAs('admin'); + $client = $this->getClient(); + + $crawler = $client->request('GET', '/config'); + + $this->assertEquals(200, $client->getResponse()->getStatusCode()); + + $form = $crawler->filter('button[id=user_save]')->form(); + + $data = array( + 'user[username]' => 'admin', + 'user[name]' => 'new name', + 'user[email]' => 'admin@wallabag.io', + ); + + $client->submit($form, $data); + + $this->assertEquals(302, $client->getResponse()->getStatusCode()); + + $crawler = $client->followRedirect(); + + $this->assertGreaterThan(1, $alert = $crawler->filter('div.flash-notice')->extract(array('_text'))); + $this->assertContains('Information updated', $alert[0]); + } } -- 2.41.0