public function testReverseTransformAllowEmptyOriginalRoles()
 {
     $roleBuilder = $this->getMockBuilder('Sonata\\UserBundle\\Security\\EditableRolesBuilder')->disableOriginalConstructor()->getMock();
     $roleBuilder->expects($this->once())->method('getRoles')->will($this->returnValue(array(array(), array())));
     $transformer = new RestoreRolesTransformer($roleBuilder);
     $transformer->setOriginalRoles(null);
     $data = array('ROLE_FOO');
     $this->assertEquals(array('ROLE_FOO'), $transformer->reverseTransform($data));
 }
 public function testReverseTransformRevokedHierarchicalRole()
 {
     $roleBuilder = $this->getMockBuilder('Sonata\\UserBundle\\Security\\EditableRolesBuilder')->disableOriginalConstructor()->getMock();
     $availableRoles = array('ROLE_SONATA_ADMIN' => 'ROLE_SONATA_ADMIN', 'ROLE_COMPANY_ADMIN' => 'ROLE_COMPANY_ADMIN: ROLE_COMPANY_PERSONAL_MODERATOR, ROLE_COMPANY_NEWS_MODERATOR, ROLE_COMPANY_BOOKKEEPER', 'ROLE_COMPANY_PERSONAL_MODERATOR' => 'ROLE_COMPANY_PERSONAL_MODERATOR: ROLE_COMPANY_USER', 'ROLE_COMPANY_NEWS_MODERATOR' => 'ROLE_COMPANY_NEWS_MODERATOR: ROLE_COMPANY_USER', 'ROLE_COMPANY_BOOKKEEPER' => 'ROLE_COMPANY_BOOKKEEPER: ROLE_COMPANY_USER', 'ROLE_COMPANY_USER' => 'ROLE_USER', 'ROLE_USER' => 'ROLE_USER');
     $roleBuilder->expects($this->once())->method('getRoles')->will($this->returnValue(array($availableRoles, array())));
     // user has thease roles
     $userRoles = array('ROLE_COMPANY_PERSONAL_MODERATOR', 'ROLE_COMPANY_NEWS_MODERATOR', 'ROLE_COMPANY_BOOKKEEPER');
     $transformer = new RestoreRolesTransformer($roleBuilder);
     $transformer->setOriginalRoles($userRoles);
     // now we want to revoke role ROLE_COMPANY_PERSONAL_MODERATOR
     $revokedRole = array_shift($userRoles);
     $processedRoles = $transformer->reverseTransform($userRoles);
     $this->assertNotContains($revokedRole, $processedRoles);
 }
 /**
  * {@inheritdoc}
  */
 public function buildForm(FormBuilderInterface $formBuilder, array $options)
 {
     /*
      * The form shows only roles that the current user can edit for the targeted user. Now we still need to persist
      * all other roles. It is not possible to alter those values inside an event listener as the selected
      * key will be validated. So we use a Transformer to alter the value and an listener to catch the original values
      *
      * The transformer will then append non editable roles to the user ...
      */
     $transformer = new RestoreRolesTransformer($this->rolesBuilder);
     // GET METHOD
     $formBuilder->addEventListener(FormEvents::PRE_SET_DATA, function (FormEvent $event) use($transformer) {
         $transformer->setOriginalRoles($event->getData());
     });
     // POST METHOD
     $formBuilder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use($transformer) {
         $transformer->setOriginalRoles($event->getForm()->getData());
     });
     $formBuilder->addModelTransformer($transformer);
 }
 public function testReverseTransformHiddenRole()
 {
     $roleBuilder = $this->getMockBuilder('Sonata\\UserBundle\\Security\\EditableRolesBuilder')->disableOriginalConstructor()->getMock();
     $availableRoles = array('ROLE_SONATA_ADMIN' => 'ROLE_SONATA_ADMIN', 'ROLE_ADMIN' => 'ROLE_ADMIN: ROLE_USER ROLE_COMPANY_ADMIN');
     $roleBuilder->expects($this->once())->method('getRoles')->will($this->returnValue(array($availableRoles, array())));
     // user roles
     $userRoles = array('ROLE_USER', 'ROLE_SUPER_ADMIN');
     $transformer = new RestoreRolesTransformer($roleBuilder);
     $transformer->setOriginalRoles($userRoles);
     // add a new role
     array_push($userRoles, 'ROLE_SONATA_ADMIN');
     // remove existing user role that is not availableRoles
     unset($userRoles[array_search('ROLE_SUPER_ADMIN', $userRoles)]);
     $processedRoles = $transformer->reverseTransform($userRoles);
     $this->assertContains('ROLE_SUPER_ADMIN', $processedRoles);
 }