RoleSecurityHandlerTest.php 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225
  1. <?php
  2. /*
  3. * This file is part of the Sonata project.
  4. *
  5. * (c) Thomas Rabaix <thomas.rabaix@sonata-project.org>
  6. *
  7. * For the full copyright and license information, please view the LICENSE
  8. * file that was distributed with this source code.
  9. */
  10. namespace Sonata\AdminBundle\Tests\Security\Handler;
  11. use Symfony\Component\Security\Core\SecurityContextInterface;
  12. use Sonata\AdminBundle\Admin\AdminInterface;
  13. use Sonata\AdminBundle\Security\Handler\RoleSecurityHandler;
  14. use Symfony\Component\Security\Core\Exception\AuthenticationCredentialsNotFoundException;
  15. /**
  16. * Test for RoleSecurityHandler
  17. *
  18. * @author Andrej Hudec <pulzarraider@gmail.com>
  19. */
  20. class RoleSecurityHandlerTest extends \PHPUnit_Framework_TestCase
  21. {
  22. /**
  23. * @var AdminInterface
  24. */
  25. private $admin;
  26. /**
  27. * @var SecurityContextInterface
  28. */
  29. private $securityContext;
  30. public function setUp()
  31. {
  32. $this->securityContext = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
  33. $this->admin = $this->getMock('Sonata\AdminBundle\Admin\AdminInterface');
  34. }
  35. /**
  36. * @dataProvider getBaseRoleTests
  37. */
  38. public function testGetBaseRole($expected, $code)
  39. {
  40. $handler = new RoleSecurityHandler($this->securityContext, array('ROLE_BATMAN', 'ROLE_IRONMAN'));
  41. $this->admin->expects($this->once())
  42. ->method('getCode')
  43. ->will($this->returnValue($code));
  44. $this->assertEquals($expected, $handler->getBaseRole($this->admin));
  45. }
  46. public function getBaseRoleTests()
  47. {
  48. return array(
  49. array('ROLE_FOO_BAR_%s', 'foo.bar'),
  50. array('ROLE_FOO_BAR_%s', 'Foo.Bar'),
  51. array('ROLE_FOO_BAR_BAZ_%s', 'foo.bar_baz'),
  52. array('ROLE_FOO_BAR_%s', 'FOO.BAR'),
  53. );
  54. }
  55. /**
  56. * @dataProvider getIsGrantedTests
  57. */
  58. public function testIsGranted($expected, array $superAdminRoles, $adminCode, $operation, $object = null)
  59. {
  60. $handler = $this->getRoleSecurityHandler($superAdminRoles);
  61. $this->admin->expects($this->any())
  62. ->method('getCode')
  63. ->will($this->returnValue($adminCode));
  64. $this->securityContext->expects($this->any())
  65. ->method('isGranted')
  66. ->will($this->returnCallback(function (array $attributes, $object) {
  67. if (in_array('ROLE_BATMAN', $attributes)) {
  68. return true;
  69. }
  70. if (in_array('ROLE_IRONMAN', $attributes)) {
  71. return true;
  72. }
  73. if (in_array('ROLE_AUTH_EXCEPTION', $attributes)) {
  74. throw new AuthenticationCredentialsNotFoundException();
  75. }
  76. if (in_array('ROLE_FOO_BAR_ABC', $attributes)) {
  77. return true;
  78. }
  79. if (in_array('ROLE_FOO_BAR_DEF', $attributes) && is_a($object, 'stdClass')) {
  80. return true;
  81. }
  82. return false;
  83. }));
  84. $this->assertEquals($expected, $handler->isGranted($this->admin, $operation, $object));
  85. }
  86. public function getIsGrantedTests()
  87. {
  88. return array(
  89. //empty
  90. array(false, array(''), 'foo.bar', ''),
  91. array(false, array(''), 'foo.bar', array('')),
  92. array(false, array(''), 'foo.bar.abc', array('')),
  93. array(false, array(''), 'foo.bar.def', array('')),
  94. array(false, array(''), 'foo.bar.baz.xyz', ''),
  95. array(false, array(''), 'foo.bar.baz.xyz', array('')),
  96. //superadmins
  97. array(true, array('ROLE_BATMAN', 'ROLE_IRONMAN'), 'foo.bar', 'BAZ'),
  98. array(true, array('ROLE_BATMAN', 'ROLE_IRONMAN'), 'foo.bar', 'ANYTHING'),
  99. array(true, array('ROLE_BATMAN', 'ROLE_IRONMAN'), 'foo.bar', array('BAZ', 'ANYTHING')),
  100. array(true, array('ROLE_IRONMAN'), 'foo.bar', 'BAZ'),
  101. array(true, array('ROLE_IRONMAN'), 'foo.bar', 'ANYTHING'),
  102. array(true, array('ROLE_IRONMAN'), 'foo.bar.baz.xyz', 'ANYTHING'),
  103. array(true, array('ROLE_IRONMAN'), 'foo.bar', ''),
  104. array(true, array('ROLE_IRONMAN'), 'foo.bar', array('')),
  105. //operations
  106. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', 'ABC'),
  107. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('ABC')),
  108. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('ABC', 'DEF')),
  109. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('BAZ', 'ABC')),
  110. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', 'DEF'),
  111. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', array('DEF')),
  112. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', 'BAZ'),
  113. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', array('BAZ')),
  114. array(true, array(), 'foo.bar', 'ABC'),
  115. array(true, array(), 'foo.bar', array('ABC')),
  116. array(false, array(), 'foo.bar', 'DEF'),
  117. array(false, array(), 'foo.bar', array('DEF')),
  118. array(false, array(), 'foo.bar', 'BAZ'),
  119. array(false, array(), 'foo.bar', array('BAZ')),
  120. array(false, array(), 'foo.bar.baz.xyz', 'ABC'),
  121. array(false, array(), 'foo.bar.baz.xyz', array('ABC')),
  122. array(false, array(), 'foo.bar.baz.xyz', array('ABC', 'DEF')),
  123. array(false, array(), 'foo.bar.baz.xyz', 'DEF'),
  124. array(false, array(), 'foo.bar.baz.xyz', array('DEF')),
  125. array(false, array(), 'foo.bar.baz.xyz', 'BAZ'),
  126. array(false, array(), 'foo.bar.baz.xyz', array('BAZ')),
  127. //objects
  128. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('DEF'), new \stdClass()),
  129. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('ABC'), new \stdClass()),
  130. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('ABC', 'DEF'), new \stdClass()),
  131. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('BAZ', 'DEF'), new \stdClass()),
  132. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', 'DEF', new \stdClass()),
  133. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', 'ABC', new \stdClass()),
  134. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', 'BAZ', new \stdClass()),
  135. array(false, array('ROLE_SPIDERMAN'), 'foo.bar.baz.xyz', 'DEF', new \stdClass()),
  136. array(false, array('ROLE_SPIDERMAN'), 'foo.bar.baz.xyz', 'ABC', new \stdClass()),
  137. array(true, array(), 'foo.bar', array('ABC'), new \stdClass()),
  138. array(true, array(), 'foo.bar', 'ABC', new \stdClass()),
  139. array(true, array(), 'foo.bar', array('DEF'), new \stdClass()),
  140. array(true, array(), 'foo.bar', 'DEF', new \stdClass()),
  141. array(false, array(), 'foo.bar', array('BAZ'), new \stdClass()),
  142. array(false, array(), 'foo.bar', 'BAZ', new \stdClass()),
  143. array(false, array(), 'foo.bar.baz.xyz', 'BAZ', new \stdClass()),
  144. array(false, array(), 'foo.bar.baz.xyz', array('BAZ'), new \stdClass()),
  145. array(false, array('ROLE_AUTH_EXCEPTION'), 'foo.bar.baz.xyz', array('BAZ'), new \stdClass()),
  146. );
  147. }
  148. public function testIsGrantedWithException()
  149. {
  150. $this->setExpectedException('RuntimeException', 'Something is wrong');
  151. $this->admin->expects($this->any())
  152. ->method('getCode')
  153. ->will($this->returnValue('foo.bar'));
  154. $this->securityContext->expects($this->any())
  155. ->method('isGranted')
  156. ->will($this->returnCallback(function (array $attributes, $object) {
  157. throw new \RuntimeException('Something is wrong');
  158. }));
  159. $handler = $this->getRoleSecurityHandler(array('ROLE_BATMAN'));
  160. $handler->isGranted($this->admin, 'BAZ');
  161. }
  162. public function testCreateObjectSecurity()
  163. {
  164. $handler = $this->getRoleSecurityHandler(array('ROLE_FOO'));
  165. $this->assertNull($handler->createObjectSecurity($this->getSonataAdminObject(), new \stdClass()));
  166. }
  167. public function testDeleteObjectSecurity()
  168. {
  169. $handler = $this->getRoleSecurityHandler(array('ROLE_FOO'));
  170. $this->assertNull($handler->deleteObjectSecurity($this->getSonataAdminObject(), new \stdClass()));
  171. }
  172. public function testBuildSecurityInformation()
  173. {
  174. $handler = $this->getRoleSecurityHandler(array('ROLE_FOO'));
  175. $this->assertEquals(array(), $handler->buildSecurityInformation($this->getSonataAdminObject()));
  176. }
  177. /**
  178. * @return RoleSecurityHandler
  179. */
  180. private function getRoleSecurityHandler(array $superAdminRoles)
  181. {
  182. return new RoleSecurityHandler($this->securityContext, $superAdminRoles);
  183. }
  184. /**
  185. * @return AdminInterface
  186. */
  187. private function getSonataAdminObject()
  188. {
  189. return $this->getMock('Sonata\AdminBundle\Admin\AdminInterface');
  190. }
  191. }