RoleSecurityHandlerTest.php 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  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. /**
  15. * Test for RoleSecurityHandler
  16. *
  17. * @author Andrej Hudec <pulzarraider@gmail.com>
  18. */
  19. class RoleSecurityHandlerTest extends \PHPUnit_Framework_TestCase
  20. {
  21. /**
  22. * @var AdminInterface
  23. */
  24. private $admin;
  25. /**
  26. * @var SecurityContextInterface
  27. */
  28. private $securityContext;
  29. public function setUp()
  30. {
  31. $this->securityContext = $this->getMock('Symfony\Component\Security\Core\SecurityContextInterface');
  32. $this->admin = $this->getMock('Sonata\AdminBundle\Admin\AdminInterface');
  33. }
  34. /**
  35. * @dataProvider getBaseRoleTests
  36. */
  37. public function testGetBaseRole($expected, $code)
  38. {
  39. $handler = new RoleSecurityHandler($this->securityContext, array('ROLE_BATMAN', 'ROLE_IRONMAN'));
  40. $this->admin->expects($this->once())
  41. ->method('getCode')
  42. ->will($this->returnValue($code));
  43. $this->assertEquals($expected, $handler->getBaseRole($this->admin));
  44. }
  45. public function getBaseRoleTests()
  46. {
  47. return array(
  48. array('ROLE_FOO_BAR_%s', 'foo.bar'),
  49. array('ROLE_FOO_BAR_%s', 'Foo.Bar'),
  50. array('ROLE_FOO_BAR_BAZ_%s', 'foo.bar_baz'),
  51. array('ROLE_FOO_BAR_%s', 'FOO.BAR'),
  52. );
  53. }
  54. /**
  55. * @dataProvider getIsGrantedTests
  56. */
  57. public function testIsGranted($expected, array $superAdminRoles, $adminCode, $operation, $object = null)
  58. {
  59. $handler = new RoleSecurityHandler($this->securityContext, $superAdminRoles);
  60. $this->admin->expects($this->any())
  61. ->method('getCode')
  62. ->will($this->returnValue($adminCode));
  63. $this->securityContext->expects($this->any())
  64. ->method('isGranted')
  65. ->will($this->returnCallback(function(array $attributes, $object) {
  66. if (in_array('ROLE_BATMAN', $attributes)) {
  67. return true;
  68. }
  69. if (in_array('ROLE_IRONMAN', $attributes)) {
  70. return true;
  71. }
  72. if (in_array('ROLE_FOO_BAR_ABC', $attributes)) {
  73. return true;
  74. }
  75. if (in_array('ROLE_FOO_BAR_DEF', $attributes) && is_a($object, 'stdClass')) {
  76. return true;
  77. }
  78. return false;
  79. }));
  80. $this->assertEquals($expected, $handler->isGranted($this->admin, $operation, $object));
  81. }
  82. public function getIsGrantedTests()
  83. {
  84. return array(
  85. //empty
  86. array(false, array(''), 'foo.bar', ''),
  87. array(false, array(''), 'foo.bar', array('')),
  88. array(false, array(''), 'foo.bar.abc', array('')),
  89. array(false, array(''), 'foo.bar.def', array('')),
  90. array(false, array(''), 'foo.bar.baz.xyz', ''),
  91. array(false, array(''), 'foo.bar.baz.xyz', array('')),
  92. //superadmins
  93. array(true, array('ROLE_BATMAN', 'ROLE_IRONMAN'), 'foo.bar', 'BAZ'),
  94. array(true, array('ROLE_BATMAN', 'ROLE_IRONMAN'), 'foo.bar', 'ANYTHING'),
  95. array(true, array('ROLE_BATMAN', 'ROLE_IRONMAN'), 'foo.bar', array('BAZ', 'ANYTHING')),
  96. array(true, array('ROLE_IRONMAN'), 'foo.bar', 'BAZ'),
  97. array(true, array('ROLE_IRONMAN'), 'foo.bar', 'ANYTHING'),
  98. array(true, array('ROLE_IRONMAN'), 'foo.bar.baz.xyz', 'ANYTHING'),
  99. array(true, array('ROLE_IRONMAN'), 'foo.bar', ''),
  100. array(true, array('ROLE_IRONMAN'), 'foo.bar', array('')),
  101. //operations
  102. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', 'ABC'),
  103. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('ABC')),
  104. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('ABC', 'DEF')),
  105. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('BAZ', 'ABC')),
  106. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', 'DEF'),
  107. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', array('DEF')),
  108. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', 'BAZ'),
  109. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', array('BAZ')),
  110. array(true, array(), 'foo.bar', 'ABC'),
  111. array(true, array(), 'foo.bar', array('ABC')),
  112. array(false, array(), 'foo.bar', 'DEF'),
  113. array(false, array(), 'foo.bar', array('DEF')),
  114. array(false, array(), 'foo.bar', 'BAZ'),
  115. array(false, array(), 'foo.bar', array('BAZ')),
  116. array(false, array(), 'foo.bar.baz.xyz', 'ABC'),
  117. array(false, array(), 'foo.bar.baz.xyz', array('ABC')),
  118. array(false, array(), 'foo.bar.baz.xyz', array('ABC', 'DEF')),
  119. array(false, array(), 'foo.bar.baz.xyz', 'DEF'),
  120. array(false, array(), 'foo.bar.baz.xyz', array('DEF')),
  121. array(false, array(), 'foo.bar.baz.xyz', 'BAZ'),
  122. array(false, array(), 'foo.bar.baz.xyz', array('BAZ')),
  123. //objects
  124. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('DEF'), new \stdClass()),
  125. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('ABC'), new \stdClass()),
  126. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('ABC', 'DEF'), new \stdClass()),
  127. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', array('BAZ', 'DEF'), new \stdClass()),
  128. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', 'DEF', new \stdClass()),
  129. array(true, array('ROLE_SPIDERMAN'), 'foo.bar', 'ABC', new \stdClass()),
  130. array(false, array('ROLE_SPIDERMAN'), 'foo.bar', 'BAZ', new \stdClass()),
  131. array(false, array('ROLE_SPIDERMAN'), 'foo.bar.baz.xyz', 'DEF', new \stdClass()),
  132. array(false, array('ROLE_SPIDERMAN'), 'foo.bar.baz.xyz', 'ABC', new \stdClass()),
  133. array(true, array(), 'foo.bar', array('ABC'), new \stdClass()),
  134. array(true, array(), 'foo.bar', 'ABC', new \stdClass()),
  135. array(true, array(), 'foo.bar', array('DEF'), new \stdClass()),
  136. array(true, array(), 'foo.bar', 'DEF', new \stdClass()),
  137. array(false, array(), 'foo.bar', array('BAZ'), new \stdClass()),
  138. array(false, array(), 'foo.bar', 'BAZ', new \stdClass()),
  139. array(false, array(), 'foo.bar.baz.xyz', 'BAZ', new \stdClass()),
  140. array(false, array(), 'foo.bar.baz.xyz', array('BAZ'), new \stdClass()),
  141. );
  142. }
  143. }