GroupMenuProviderTest.php 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410
  1. <?php
  2. /*
  3. * This file is part of the Sonata Project package.
  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\Menu\Provider;
  11. use Knp\Menu\FactoryInterface;
  12. use Knp\Menu\MenuFactory;
  13. use Knp\Menu\Provider\MenuProviderInterface;
  14. use PHPUnit_Framework_MockObject_MockObject as MockObject;
  15. use Sonata\AdminBundle\Admin\AdminInterface;
  16. use Sonata\AdminBundle\Admin\Pool;
  17. use Sonata\AdminBundle\Menu\Provider\GroupMenuProvider;
  18. use Sonata\AdminBundle\Tests\Helpers\PHPUnit_Framework_TestCase;
  19. class GroupMenuProviderTest extends PHPUnit_Framework_TestCase
  20. {
  21. /**
  22. * @var MockObject|Pool
  23. */
  24. private $pool;
  25. /**
  26. * @var MockObject|MenuProviderInterface
  27. */
  28. private $provider;
  29. /**
  30. * @var MockObject|FactoryInterface
  31. */
  32. private $factory;
  33. /**
  34. * @var MockObject
  35. */
  36. private $checker;
  37. protected function setUp()
  38. {
  39. $this->pool = $this->getMockBuilder('Sonata\AdminBundle\Admin\Pool')->disableOriginalConstructor()->getMock();
  40. $this->checker = $this
  41. ->getMockBuilder('Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface')
  42. ->setMethods(array('isGranted'))
  43. ->disableOriginalConstructor()
  44. ->getMock();
  45. $this->factory = new MenuFactory();
  46. $this->provider = new GroupMenuProvider($this->factory, $this->pool, $this->checker);
  47. }
  48. public function testGroupMenuProviderName()
  49. {
  50. $this->assertTrue($this->provider->has('sonata_group_menu'));
  51. }
  52. /**
  53. * NEXT_MAJOR: Remove this test.
  54. *
  55. * @param array $adminGroups
  56. *
  57. * @group legacy
  58. * @dataProvider getAdminGroups
  59. */
  60. public function testGroupMenuProviderWithoutChecker(array $adminGroups)
  61. {
  62. $provider = new GroupMenuProvider($this->factory, $this->pool);
  63. $this->pool->expects($this->once())
  64. ->method('getInstance')
  65. ->with($this->equalTo('sonata_admin_foo_service'))
  66. ->will($this->returnValue($this->getAdminMock()));
  67. $menu = $provider->get(
  68. 'providerFoo',
  69. array(
  70. 'name' => 'foo',
  71. 'group' => $adminGroups,
  72. )
  73. );
  74. $this->assertInstanceOf('Knp\Menu\ItemInterface', $menu);
  75. $this->assertSame('foo', $menu->getName());
  76. $children = $menu->getChildren();
  77. $this->assertCount(2, $children);
  78. $this->assertArrayHasKey('foo_admin_label', $children);
  79. $this->assertArrayHasKey('route_label', $children);
  80. $this->assertInstanceOf('Knp\Menu\MenuItem', $menu['foo_admin_label']);
  81. $this->assertSame('foo_admin_label', $menu['foo_admin_label']->getLabel());
  82. $extras = $menu['foo_admin_label']->getExtras();
  83. $this->assertArrayHasKey('label_catalogue', $extras);
  84. $this->assertSame($extras['label_catalogue'], 'SonataAdminBundle');
  85. $extras = $menu['route_label']->getExtras();
  86. $this->assertArrayHasKey('label_catalogue', $extras);
  87. $this->assertSame($extras['label_catalogue'], 'SonataAdminBundle');
  88. }
  89. /**
  90. * NEXT_MAJOR: Remove this test when bumping requirements to >=Symfony 2.6.
  91. *
  92. * @group legacy
  93. */
  94. public function testGroupMenuProviderThrowsExceptionWithInvalidArgument()
  95. {
  96. $this->expectException('InvalidArgumentException');
  97. new GroupMenuProvider($this->factory, $this->pool, 'foo');
  98. }
  99. /**
  100. * @param array $adminGroups
  101. *
  102. * @dataProvider getAdminGroups
  103. */
  104. public function testGetMenuProviderWithCheckerGrantedGroupRoles(array $adminGroups)
  105. {
  106. $this->pool->expects($this->once())
  107. ->method('getInstance')
  108. ->with($this->equalTo('sonata_admin_foo_service'))
  109. ->will($this->returnValue($this->getAdminMock()));
  110. $this->checker->expects($this->any())
  111. ->method('isGranted')
  112. ->willReturn(false);
  113. $menu = $this->provider->get(
  114. 'providerFoo',
  115. array(
  116. 'name' => 'foo',
  117. 'group' => $adminGroups,
  118. )
  119. );
  120. $this->assertInstanceOf('Knp\Menu\ItemInterface', $menu);
  121. $this->assertSame('foo', $menu->getName());
  122. $children = $menu->getChildren();
  123. $this->assertCount(1, $children);
  124. $this->assertArrayHasKey('foo_admin_label', $children);
  125. $this->assertArrayNotHasKey('route_label', $children);
  126. $this->assertInstanceOf('Knp\Menu\MenuItem', $menu['foo_admin_label']);
  127. $this->assertSame('foo_admin_label', $menu['foo_admin_label']->getLabel());
  128. $extras = $menu['foo_admin_label']->getExtras();
  129. $this->assertArrayHasKey('label_catalogue', $extras);
  130. $this->assertSame($extras['label_catalogue'], 'SonataAdminBundle');
  131. }
  132. /**
  133. * @param array $adminGroups
  134. *
  135. * @dataProvider getAdminGroups
  136. */
  137. public function testGetMenuProviderWithAdmin(array $adminGroups)
  138. {
  139. $this->pool->expects($this->once())
  140. ->method('getInstance')
  141. ->with($this->equalTo('sonata_admin_foo_service'))
  142. ->will($this->returnValue($this->getAdminMock()));
  143. $this->checker->expects($this->any())
  144. ->method('isGranted')
  145. ->willReturn(true);
  146. $menu = $this->provider->get(
  147. 'providerFoo',
  148. array(
  149. 'name' => 'foo',
  150. 'group' => $adminGroups,
  151. )
  152. );
  153. $this->assertInstanceOf('Knp\Menu\ItemInterface', $menu);
  154. $this->assertSame('foo', $menu->getName());
  155. $children = $menu->getChildren();
  156. $this->assertCount(2, $children);
  157. $this->assertArrayHasKey('foo_admin_label', $children);
  158. $this->assertArrayHasKey('route_label', $children);
  159. $this->assertInstanceOf('Knp\Menu\MenuItem', $menu['foo_admin_label']);
  160. $this->assertSame('foo_admin_label', $menu['foo_admin_label']->getLabel());
  161. $extras = $menu['foo_admin_label']->getExtras();
  162. $this->assertArrayHasKey('label_catalogue', $extras);
  163. $this->assertSame($extras['label_catalogue'], 'SonataAdminBundle');
  164. $extras = $menu['route_label']->getExtras();
  165. $this->assertArrayHasKey('label_catalogue', $extras);
  166. $this->assertSame($extras['label_catalogue'], 'SonataAdminBundle');
  167. }
  168. /**
  169. * @param array $adminGroups
  170. *
  171. * @dataProvider getAdminGroups
  172. */
  173. public function testGetKnpMenuWithListRoute(array $adminGroups)
  174. {
  175. $this->pool->expects($this->once())
  176. ->method('getInstance')
  177. ->with($this->equalTo('sonata_admin_foo_service'))
  178. ->will($this->returnValue($this->getAdminMock(false)));
  179. $this->checker->expects($this->any())
  180. ->method('isGranted')
  181. ->willReturn(true);
  182. $menu = $this->provider->get(
  183. 'providerFoo',
  184. array(
  185. 'name' => 'foo',
  186. 'group' => $adminGroups,
  187. )
  188. );
  189. $this->assertInstanceOf('Knp\Menu\ItemInterface', $menu);
  190. $this->assertArrayNotHasKey('foo_admin_label', $menu->getChildren());
  191. $this->assertArrayHasKey('route_label', $menu->getChildren());
  192. $this->assertCount(1, $menu->getChildren());
  193. }
  194. /**
  195. * @param array $adminGroups
  196. *
  197. * @dataProvider getAdminGroups
  198. */
  199. public function testGetKnpMenuWithGrantedList(array $adminGroups)
  200. {
  201. $this->pool->expects($this->once())
  202. ->method('getInstance')
  203. ->with($this->equalTo('sonata_admin_foo_service'))
  204. ->will($this->returnValue($this->getAdminMock(true, false)));
  205. $this->checker->expects($this->any())
  206. ->method('isGranted')
  207. ->willReturn(true);
  208. $menu = $this->provider->get(
  209. 'providerFoo',
  210. array(
  211. 'name' => 'foo',
  212. 'group' => $adminGroups,
  213. )
  214. );
  215. $this->assertInstanceOf('Knp\Menu\ItemInterface', $menu);
  216. $this->assertArrayNotHasKey('foo_admin_label', $menu->getChildren());
  217. $this->assertArrayHasKey('route_label', $menu->getChildren());
  218. $this->assertCount(1, $menu->getChildren());
  219. }
  220. /**
  221. * @param array $adminGroupsOnTopOption
  222. *
  223. * @dataProvider getAdminGroupsWithOnTopOption
  224. */
  225. public function testGetMenuProviderOnTopOptions(array $adminGroupsOnTopOption)
  226. {
  227. $this->pool->expects($this->once())
  228. ->method('getInstance')
  229. ->with($this->equalTo('sonata_admin_foo_service'))
  230. ->will($this->returnValue($this->getAdminMock(true, false)));
  231. $menu = $this->provider->get(
  232. 'providerFoo',
  233. array(
  234. 'name' => 'foo',
  235. 'group' => $adminGroupsOnTopOption,
  236. )
  237. );
  238. $this->assertInstanceOf('Knp\Menu\ItemInterface', $menu);
  239. $this->assertCount(0, $menu->getChildren());
  240. }
  241. /**
  242. * @param array $adminGroups
  243. *
  244. * @dataProvider getAdminGroups
  245. */
  246. public function testGetMenuProviderKeepOpenOption(array $adminGroups)
  247. {
  248. $this->pool->expects($this->once())
  249. ->method('getInstance')
  250. ->with($this->equalTo('sonata_admin_foo_service'))
  251. ->will($this->returnValue($this->getAdminMock()));
  252. $this->checker->expects($this->any())
  253. ->method('isGranted')
  254. ->willReturn(true);
  255. $adminGroups['keep_open'] = true;
  256. $menu = $this->provider->get(
  257. 'providerFoo',
  258. array(
  259. 'name' => 'foo',
  260. 'group' => $adminGroups,
  261. )
  262. );
  263. $this->assertInstanceOf('Knp\Menu\ItemInterface', $menu);
  264. $this->assertSame('keep-open', $menu->getAttribute('class'));
  265. $this->assertTrue($menu->getExtra('keep_open'));
  266. }
  267. /**
  268. * @return array
  269. */
  270. public function getAdminGroups()
  271. {
  272. return array(
  273. array(
  274. 'bar' => array(
  275. 'label' => 'foo',
  276. 'icon' => '<i class="fa fa-edit"></i>',
  277. 'label_catalogue' => 'SonataAdminBundle',
  278. 'items' => array(
  279. array(
  280. 'admin' => 'sonata_admin_foo_service',
  281. 'label' => 'fooLabel',
  282. 'route_absolute' => true,
  283. ),
  284. array(
  285. 'admin' => '',
  286. 'label' => 'route_label',
  287. 'route' => 'FooRoute',
  288. 'route_params' => array('foo' => 'bar'),
  289. 'route_absolute' => true,
  290. 'roles' => array(),
  291. ),
  292. ),
  293. 'item_adds' => array(),
  294. 'roles' => array('foo'),
  295. ),
  296. ),
  297. );
  298. }
  299. /**
  300. * @return array
  301. */
  302. public function getAdminGroupsWithOnTopOption()
  303. {
  304. return array(
  305. array(
  306. 'foo' => array(
  307. 'label' => 'foo_on_top',
  308. 'icon' => '<i class="fa fa-edit"></i>',
  309. 'label_catalogue' => 'SonataAdminBundle',
  310. 'on_top' => true,
  311. 'items' => array(
  312. array(
  313. 'admin' => 'sonata_admin_foo_service',
  314. 'label' => 'fooLabel',
  315. 'route_absolute' => true,
  316. 'route_params' => array(),
  317. ),
  318. ),
  319. 'item_adds' => array(),
  320. 'roles' => array(),
  321. ),
  322. ),
  323. );
  324. }
  325. /**
  326. * @param bool $hasRoute
  327. * @param bool $isGranted
  328. *
  329. * @return MockObject|AdminInterface
  330. */
  331. private function getAdminMock($hasRoute = true, $isGranted = true)
  332. {
  333. $admin = $this->createMock('Sonata\AdminBundle\Admin\AbstractAdmin');
  334. $admin->expects($this->once())
  335. ->method('hasRoute')
  336. ->with($this->equalTo('list'))
  337. ->will($this->returnValue($hasRoute));
  338. $admin->expects($this->any())
  339. ->method('hasAccess')
  340. ->with($this->equalTo('list'))
  341. ->will($this->returnValue($isGranted));
  342. $admin->expects($this->any())
  343. ->method('getLabel')
  344. ->will($this->returnValue('foo_admin_label'));
  345. $admin->expects($this->any())
  346. ->method('generateMenuUrl')
  347. ->will($this->returnValue(array()));
  348. $admin->expects($this->any())
  349. ->method('getTranslationDomain')
  350. ->will($this->returnValue('SonataAdminBundle'));
  351. return $admin;
  352. }
  353. }