MenuBuilderTest.php 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. <?php
  2. /*
  3. * This file is part of the Sonata 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\Twig\Extension;
  11. use Knp\Menu\MenuFactory;
  12. use Sonata\AdminBundle\Menu\MenuBuilder;
  13. class MenuBuilderTest extends \PHPUnit_Framework_TestCase
  14. {
  15. private $pool;
  16. private $provider;
  17. private $factory;
  18. private $builder;
  19. protected function setUp()
  20. {
  21. $this->pool = $this->getMockBuilder('Sonata\AdminBundle\Admin\Pool')->disableOriginalConstructor()->getMock();
  22. $this->provider = $this->getMock('Knp\Menu\Provider\MenuProviderInterface');
  23. $this->factory = new MenuFactory();
  24. $this->builder = new MenuBuilder($this->pool, $this->factory, $this->provider);
  25. }
  26. public function testGetKnpMenu()
  27. {
  28. $adminGroups = array(
  29. "bar" => array(
  30. "label" => "foo",
  31. "icon" => '<i class="fa fa-edit"></i>',
  32. "label_catalogue" => 'SonataAdminBundle',
  33. "items" => array(
  34. array(
  35. "admin" => "",
  36. "label" => "fooLabel",
  37. "route" => "FooRoute",
  38. "route_params" => array("foo" => "bar"),
  39. ),
  40. ),
  41. "item_adds" => array(),
  42. "roles" => array(),
  43. ),
  44. );
  45. $this->preparePool($adminGroups);
  46. $menu = $this->builder->createSidebarMenu();
  47. $this->assertInstanceOf('Knp\Menu\ItemInterface', $menu);
  48. $this->assertArrayHasKey('bar', $menu->getChildren());
  49. foreach ($menu->getChildren() as $key => $child) {
  50. $this->assertInstanceOf('Knp\Menu\MenuItem', $child);
  51. $this->assertEquals("bar", $child->getName());
  52. $this->assertEquals($adminGroups["bar"]["label"], $child->getLabel());
  53. // menu items
  54. $children = $child->getChildren();
  55. $this->assertCount(1, $children);
  56. $this->assertArrayHasKey('fooLabel', $children);
  57. $this->assertInstanceOf('Knp\Menu\MenuItem', $child['fooLabel']);
  58. $this->assertEquals('fooLabel', $child['fooLabel']->getLabel());
  59. }
  60. }
  61. public function testGetKnpMenuWithAdmin()
  62. {
  63. $adminGroups = array(
  64. 'bar' => array(
  65. 'label' => 'foo',
  66. 'icon' => '<i class="fa fa-edit"></i>',
  67. 'label_catalogue' => 'SonataAdminBundle',
  68. 'items' => array(
  69. array(
  70. 'admin' => 'sonata_admin_foo_service',
  71. 'label' => 'fooLabel',
  72. ),
  73. ),
  74. 'item_adds' => array(),
  75. 'roles' => array(),
  76. ),
  77. );
  78. $admin = $this->getMock('Sonata\AdminBundle\Admin\AdminInterface');
  79. $admin->expects($this->once())
  80. ->method('hasRoute')
  81. ->with($this->equalTo('list'))
  82. ->will($this->returnValue(true))
  83. ;
  84. $admin->expects($this->any())
  85. ->method('isGranted')
  86. ->with($this->equalTo('LIST'))
  87. ->will($this->returnValue(true))
  88. ;
  89. $admin->expects($this->once())
  90. ->method('getLabel')
  91. ->will($this->returnValue('foo_admin_label'))
  92. ;
  93. $admin->expects($this->once())
  94. ->method('generateMenuUrl')
  95. ->will($this->returnValue(array()))
  96. ;
  97. $this->preparePool($adminGroups, $admin);
  98. $menu = $this->builder->createSidebarMenu();
  99. $this->assertInstanceOf('Knp\Menu\ItemInterface', $menu);
  100. $this->assertArrayHasKey('bar', $menu->getChildren());
  101. foreach ($menu->getChildren() as $key => $child) {
  102. $this->assertInstanceOf('Knp\Menu\MenuItem', $child);
  103. $this->assertEquals('bar', $child->getName());
  104. $this->assertEquals($adminGroups['bar']['label'], $child->getLabel());
  105. // menu items
  106. $children = $child->getChildren();
  107. $this->assertCount(1, $children);
  108. $this->assertArrayHasKey('foo_admin_label', $children);
  109. $this->assertInstanceOf('Knp\Menu\MenuItem', $child['foo_admin_label']);
  110. $this->assertEquals('foo_admin_label', $child['foo_admin_label']->getLabel());
  111. }
  112. }
  113. public function testGetKnpMenuWithNoListRoute()
  114. {
  115. $adminGroups = array(
  116. 'bar' => array(
  117. 'label' => 'foo',
  118. 'icon' => '<i class="fa fa-edit"></i>',
  119. 'label_catalogue' => 'SonataAdminBundle',
  120. 'items' => array(
  121. array(
  122. 'admin' => 'sonata_admin_foo_service',
  123. 'label' => 'fooLabel',
  124. ),
  125. ),
  126. 'item_adds' => array(),
  127. 'roles' => array(),
  128. ),
  129. );
  130. $admin = $this->getMock('Sonata\AdminBundle\Admin\AdminInterface');
  131. $admin->expects($this->once())
  132. ->method('hasRoute')
  133. ->with($this->equalTo('list'))
  134. ->will($this->returnValue(false))
  135. ;
  136. $this->preparePool($adminGroups, $admin);
  137. $menu = $this->builder->createSidebarMenu();
  138. $this->assertInstanceOf('Knp\Menu\ItemInterface', $menu);
  139. $this->assertArrayNotHasKey('bar', $menu->getChildren());
  140. $this->assertCount(0, $menu->getChildren());
  141. }
  142. public function testGetKnpMenuWithNotGrantedList()
  143. {
  144. $adminGroups = array(
  145. 'bar' => array(
  146. 'label' => 'foo',
  147. 'icon' => '<i class="fa fa-edit"></i>',
  148. 'label_catalogue' => 'SonataAdminBundle',
  149. 'items' => array(
  150. array(
  151. 'admin' => 'sonata_admin_foo_service',
  152. 'label' => 'fooLabel',
  153. ),
  154. ),
  155. 'item_adds' => array(),
  156. 'roles' => array(),
  157. ),
  158. );
  159. $admin = $this->getMock('Sonata\AdminBundle\Admin\AdminInterface');
  160. $admin->expects($this->once())
  161. ->method('hasRoute')
  162. ->with($this->equalTo('list'))
  163. ->will($this->returnValue(true))
  164. ;
  165. $admin->expects($this->any())
  166. ->method('isGranted')
  167. ->with($this->equalTo('LIST'))
  168. ->will($this->returnValue(false))
  169. ;
  170. $this->preparePool($adminGroups, $admin);
  171. $menu = $this->builder->createSidebarMenu();
  172. $this->assertInstanceOf('Knp\Menu\ItemInterface', $menu);
  173. $this->assertArrayNotHasKey('bar', $menu->getChildren());
  174. $this->assertCount(0, $menu->getChildren());
  175. }
  176. public function testGetKnpMenuWithProvider()
  177. {
  178. $adminGroups = array(
  179. "bar" => array(
  180. "provider" => 'my_menu',
  181. "label_catalogue" => '',
  182. "icon" => '<i class="fa fa-edit"></i>',
  183. "roles" => array(),
  184. ),
  185. );
  186. $this->provider
  187. ->expects($this->once())
  188. ->method('get')
  189. ->with('my_menu')
  190. ->will($this->returnValue($this->factory->createItem('bar')->addChild('foo')->getParent()))
  191. ;
  192. $this->preparePool($adminGroups);
  193. $menu = $this->builder->createSidebarMenu();
  194. $this->assertInstanceOf('Knp\Menu\ItemInterface', $menu);
  195. $this->assertArrayHasKey('bar', $menu->getChildren());
  196. foreach ($menu->getChildren() as $key => $child) {
  197. $this->assertInstanceOf('Knp\Menu\MenuItem', $child);
  198. $this->assertEquals("bar", $child->getName());
  199. $this->assertEquals("bar", $child->getLabel());
  200. // menu items
  201. $children = $child->getChildren();
  202. $this->assertCount(1, $children);
  203. $this->assertArrayHasKey('foo', $children);
  204. $this->assertInstanceOf('Knp\Menu\MenuItem', $child['foo']);
  205. $this->assertEquals('foo', $child['foo']->getLabel());
  206. }
  207. }
  208. private function preparePool($adminGroups, $admin = null)
  209. {
  210. $this->pool->expects($this->once())
  211. ->method('getAdminGroups')
  212. ->will($this->returnValue($adminGroups))
  213. ;
  214. if (null !== $admin) {
  215. $this->pool->expects($this->once())
  216. ->method('getInstance')
  217. ->with($this->equalTo('sonata_admin_foo_service'))
  218. ->will($this->returnValue($admin))
  219. ;
  220. }
  221. }
  222. }