AdminTest.php 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969
  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\Admin;
  11. use Sonata\AdminBundle\Admin\Admin;
  12. use Sonata\AdminBundle\Tests\Fixtures\Entity\FooToString;
  13. use Sonata\AdminBundle\Tests\Fixtures\Entity\FooToStringNull;
  14. use Sonata\AdminBundle\Tests\Fixtures\Admin\PostAdmin;
  15. use Sonata\AdminBundle\Tests\Fixtures\Admin\CommentAdmin;
  16. use Symfony\Component\HttpFoundation\Request;
  17. use Sonata\AdminBundle\Admin\AdminInterface;
  18. class AdminTest extends \PHPUnit_Framework_TestCase
  19. {
  20. /**
  21. * @covers Sonata\AdminBundle\Admin\Admin::__construct
  22. */
  23. public function testConstructor()
  24. {
  25. $class = 'Application\Sonata\NewsBundle\Entity\Post';
  26. $baseControllerName = 'SonataNewsBundle:PostAdmin';
  27. $admin = new PostAdmin('sonata.post.admin.post', $class, $baseControllerName);
  28. $this->assertInstanceOf('Sonata\AdminBundle\Admin\Admin', $admin);
  29. $this->assertEquals($class, $admin->getClass());
  30. $this->assertEquals($baseControllerName, $admin->getBaseControllerName());
  31. }
  32. /**
  33. * @covers Sonata\AdminBundle\Admin\Admin::hasChild
  34. * @covers Sonata\AdminBundle\Admin\Admin::addChild
  35. * @covers Sonata\AdminBundle\Admin\Admin::getChild
  36. * @covers Sonata\AdminBundle\Admin\Admin::isChild
  37. * @covers Sonata\AdminBundle\Admin\Admin::hasChildren
  38. * @covers Sonata\AdminBundle\Admin\Admin::getChildren
  39. */
  40. public function testChildren()
  41. {
  42. $postAdmin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  43. $this->assertFalse($postAdmin->hasChildren());
  44. $this->assertFalse($postAdmin->hasChild('comment'));
  45. $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  46. $postAdmin->addChild($commentAdmin);
  47. $this->assertTrue($postAdmin->hasChildren());
  48. $this->assertTrue($postAdmin->hasChild('sonata.post.admin.comment'));
  49. $this->assertEquals('sonata.post.admin.comment', $postAdmin->getChild('sonata.post.admin.comment')->getCode());
  50. $this->assertEquals('sonata.post.admin.post|sonata.post.admin.comment', $postAdmin->getChild('sonata.post.admin.comment')->getBaseCodeRoute());
  51. $this->assertEquals($postAdmin, $postAdmin->getChild('sonata.post.admin.comment')->getParent());
  52. $this->assertFalse($postAdmin->isChild());
  53. $this->assertTrue($commentAdmin->isChild());
  54. $this->assertEquals(array('sonata.post.admin.comment' => $commentAdmin), $postAdmin->getChildren());
  55. }
  56. /**
  57. * @covers Sonata\AdminBundle\Admin\Admin::configure
  58. */
  59. public function testConfigure()
  60. {
  61. $admin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  62. $this->assertTrue($admin->getUniqid() == "");
  63. $admin->initialize();
  64. $this->assertFalse($admin->getUniqid() == "");
  65. $this->assertEquals('Post', $admin->getClassnameLabel());
  66. $admin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  67. $admin->setClassnameLabel('postcomment');
  68. $admin->initialize();
  69. $this->assertEquals('postcomment', $admin->getClassnameLabel());
  70. }
  71. public function testConfigureWithValidParentAssociationMapping()
  72. {
  73. $admin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  74. $admin->setParentAssociationMapping('Category');
  75. $admin->initialize();
  76. $this->assertEquals('Category', $admin->getParentAssociationMapping());
  77. }
  78. public function provideGetBaseRoutePattern()
  79. {
  80. return array(
  81. array(
  82. 'Application\Sonata\NewsBundle\Entity\Post',
  83. '/sonata/news/post'
  84. ),
  85. array(
  86. 'Application\Sonata\NewsBundle\Document\Post',
  87. '/sonata/news/post'
  88. ),
  89. array(
  90. 'MyApplication\MyBundle\Entity\Post',
  91. '/myapplication/my/post'
  92. ),
  93. array(
  94. 'MyApplication\MyBundle\Entity\Post\Category',
  95. '/myapplication/my/post-category'
  96. ),
  97. array(
  98. 'MyApplication\MyBundle\Entity\Product\Category',
  99. '/myapplication/my/product-category'
  100. ),
  101. array(
  102. 'MyApplication\MyBundle\Entity\Other\Product\Category',
  103. '/myapplication/my/other-product-category'
  104. ),
  105. array(
  106. 'Symfony\Cmf\Bundle\FooBundle\Document\Menu',
  107. '/cmf/foo/menu'
  108. ),
  109. array(
  110. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\Phpcr\Menu',
  111. '/cmf/foo/menu'
  112. ),
  113. array(
  114. 'Symfony\Bundle\BarBarBundle\Doctrine\Phpcr\Menu',
  115. '/symfony/barbar/menu'
  116. ),
  117. array(
  118. 'Symfony\Bundle\BarBarBundle\Doctrine\Phpcr\Menu\Item',
  119. '/symfony/barbar/menu-item'
  120. ),
  121. array(
  122. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\Orm\Menu',
  123. '/cmf/foo/menu'
  124. ),
  125. array(
  126. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\MongoDB\Menu',
  127. '/cmf/foo/menu'
  128. ),
  129. array(
  130. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\CouchDB\Menu',
  131. '/cmf/foo/menu'
  132. ),
  133. );
  134. }
  135. /**
  136. * @dataProvider provideGetBaseRoutePattern
  137. */
  138. public function testGetBaseRoutePattern($objFqn, $expected)
  139. {
  140. $admin = new PostAdmin('sonata.post.admin.post', $objFqn, 'SonataNewsBundle:PostAdmin');
  141. $this->assertEquals($expected, $admin->getBaseRoutePattern());
  142. }
  143. public function testGetBaseRoutePatternWithChildAdmin()
  144. {
  145. $postAdmin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  146. $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  147. $commentAdmin->setParent($postAdmin);
  148. $this->assertEquals('/sonata/news/post/{id}/comment', $commentAdmin->getBaseRoutePattern());
  149. }
  150. /**
  151. * @expectedException RuntimeException
  152. */
  153. public function testGetBaseRoutePatternWithUnreconizedClassname()
  154. {
  155. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  156. $admin->getBaseRoutePattern();
  157. }
  158. public function provideGetBaseRouteName()
  159. {
  160. return array(
  161. array(
  162. 'Application\Sonata\NewsBundle\Entity\Post',
  163. 'admin_sonata_news_post'
  164. ),
  165. array(
  166. 'Application\Sonata\NewsBundle\Document\Post',
  167. 'admin_sonata_news_post'
  168. ),
  169. array(
  170. 'MyApplication\MyBundle\Entity\Post',
  171. 'admin_myapplication_my_post'
  172. ),
  173. array(
  174. 'MyApplication\MyBundle\Entity\Post\Category',
  175. 'admin_myapplication_my_post_category'
  176. ),
  177. array(
  178. 'MyApplication\MyBundle\Entity\Product\Category',
  179. 'admin_myapplication_my_product_category'
  180. ),
  181. array(
  182. 'MyApplication\MyBundle\Entity\Other\Product\Category',
  183. 'admin_myapplication_my_other_product_category'
  184. ),
  185. array(
  186. 'Symfony\Cmf\Bundle\FooBundle\Document\Menu',
  187. 'admin_cmf_foo_menu'
  188. ),
  189. array(
  190. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\Phpcr\Menu',
  191. 'admin_cmf_foo_menu'
  192. ),
  193. array(
  194. 'Symfony\Bundle\BarBarBundle\Doctrine\Phpcr\Menu',
  195. 'admin_symfony_barbar_menu'
  196. ),
  197. array(
  198. 'Symfony\Bundle\BarBarBundle\Doctrine\Phpcr\Menu\Item',
  199. 'admin_symfony_barbar_menu_item'
  200. ),
  201. array(
  202. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\Orm\Menu',
  203. 'admin_cmf_foo_menu'
  204. ),
  205. array(
  206. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\MongoDB\Menu',
  207. 'admin_cmf_foo_menu'
  208. ),
  209. array(
  210. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\CouchDB\Menu',
  211. 'admin_cmf_foo_menu'
  212. ),
  213. );
  214. }
  215. /**
  216. * @dataProvider provideGetBaseRouteName
  217. */
  218. public function testGetBaseRouteName($objFqn, $expected)
  219. {
  220. $admin = new PostAdmin('sonata.post.admin.post', $objFqn, 'SonataNewsBundle:PostAdmin');
  221. $this->assertEquals($expected, $admin->getBaseRouteName());
  222. }
  223. public function testGetBaseRouteNameWithChildAdmin()
  224. {
  225. $pathInfo = new \Sonata\AdminBundle\Route\PathInfoBuilder($this->getMock('Sonata\AdminBundle\Model\AuditManagerInterface'));
  226. $postAdmin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  227. $postAdmin->setRouteBuilder($pathInfo);
  228. $postAdmin->initialize();
  229. $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  230. $commentAdmin->setRouteBuilder($pathInfo);
  231. $commentAdmin->initialize();
  232. $postAdmin->addChild($commentAdmin);
  233. $this->assertEquals('admin_sonata_news_post_comment', $commentAdmin->getBaseRouteName());
  234. $this->assertTrue($postAdmin->hasRoute('show'));
  235. $this->assertTrue($postAdmin->hasRoute('sonata.post.admin.post.show'));
  236. $this->assertTrue($postAdmin->hasRoute('sonata.post.admin.post|sonata.post.admin.comment.show'));
  237. $this->assertTrue($postAdmin->hasRoute('sonata.post.admin.comment.list'));
  238. $this->assertFalse($postAdmin->hasRoute('sonata.post.admin.post|sonata.post.admin.comment.edit'));
  239. $this->assertFalse($commentAdmin->hasRoute('edit'));
  240. }
  241. /**
  242. * @expectedException RuntimeException
  243. */
  244. public function testGetBaseRouteNameWithUnreconizedClassname()
  245. {
  246. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  247. $admin->getBaseRouteName();
  248. }
  249. /**
  250. * @covers Sonata\AdminBundle\Admin\Admin::setUniqid
  251. * @covers Sonata\AdminBundle\Admin\Admin::getUniqid
  252. */
  253. public function testUniqid()
  254. {
  255. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  256. $uniqid = uniqid();
  257. $admin->setUniqid($uniqid);
  258. $this->assertEquals($uniqid, $admin->getUniqid());
  259. }
  260. public function testToString()
  261. {
  262. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  263. $s = new \stdClass();
  264. $this->assertNotEmpty($admin->toString($s));
  265. $s = new FooToString;
  266. $this->assertEquals('salut', $admin->toString($s));
  267. // To string method is implemented, but returns null
  268. $s = new FooToStringNull;
  269. $this->assertNotEmpty($admin->toString($s));
  270. $this->assertEquals("", $admin->toString(false));
  271. }
  272. public function testIsAclEnabled()
  273. {
  274. $postAdmin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  275. $this->assertFalse($postAdmin->isAclEnabled());
  276. $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  277. $commentAdmin->setSecurityHandler($this->getMock('Sonata\AdminBundle\Security\Handler\AclSecurityHandlerInterface'));
  278. $this->assertTrue($commentAdmin->isAclEnabled());
  279. }
  280. /**
  281. * @covers Sonata\AdminBundle\Admin\Admin::getSubClasses
  282. * @covers Sonata\AdminBundle\Admin\Admin::getSubClass
  283. * @covers Sonata\AdminBundle\Admin\Admin::setSubClasses
  284. * @covers Sonata\AdminBundle\Admin\Admin::hasSubClass
  285. * @covers Sonata\AdminBundle\Admin\Admin::hasActiveSubClass
  286. * @covers Sonata\AdminBundle\Admin\Admin::getActiveSubClass
  287. * @covers Sonata\AdminBundle\Admin\Admin::getActiveSubclassCode
  288. * @covers Sonata\AdminBundle\Admin\Admin::getClass
  289. */
  290. public function testSubClass()
  291. {
  292. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  293. $this->assertFalse($admin->hasSubClass('test'));
  294. $this->assertFalse($admin->hasActiveSubClass());
  295. $this->assertCount(0, $admin->getSubClasses());
  296. $this->assertNull($admin->getActiveSubClass());
  297. $this->assertNull($admin->getActiveSubclassCode());
  298. $this->assertEquals('NewsBundle\Entity\Post', $admin->getClass());
  299. // Just for the record, if there is no inheritance set, the getSubject is not used
  300. // the getSubject can also lead to some issue
  301. $admin->setSubject(new \stdClass());
  302. $this->assertEquals('stdClass', $admin->getClass());
  303. $admin->setSubClasses(array('extended1' => 'NewsBundle\Entity\PostExtended1', 'extended2' => 'NewsBundle\Entity\PostExtended2'));
  304. $this->assertFalse($admin->hasSubClass('test'));
  305. $this->assertTrue($admin->hasSubClass('extended1'));
  306. $this->assertFalse($admin->hasActiveSubClass());
  307. $this->assertCount(2, $admin->getSubClasses());
  308. $this->assertNull($admin->getActiveSubClass());
  309. $this->assertNull($admin->getActiveSubclassCode());
  310. $this->assertEquals('stdClass', $admin->getClass());
  311. $request = new \Symfony\Component\HttpFoundation\Request(array('subclass' => 'extended1'));
  312. $admin->setRequest($request);
  313. $this->assertFalse($admin->hasSubClass('test'));
  314. $this->assertTrue($admin->hasSubClass('extended1'));
  315. $this->assertTrue($admin->hasActiveSubClass());
  316. $this->assertCount(2, $admin->getSubClasses());
  317. $this->assertEquals('stdClass', $admin->getActiveSubClass());
  318. $this->assertEquals('extended1', $admin->getActiveSubclassCode());
  319. $this->assertEquals('stdClass', $admin->getClass());
  320. $request->query->set('subclass', 'inject');
  321. $this->assertNull($admin->getActiveSubclassCode());
  322. }
  323. /**
  324. * @expectedException RuntimeException
  325. */
  326. public function testNonExistantSubclass()
  327. {
  328. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  329. $admin->setRequest(new \Symfony\Component\HttpFoundation\Request(array('subclass' => 'inject')));
  330. $admin->setSubClasses(array('extended1' => 'NewsBundle\Entity\PostExtended1', 'extended2' => 'NewsBundle\Entity\PostExtended2'));
  331. $this->assertTrue($admin->hasActiveSubClass());
  332. $admin->getActiveSubClass();
  333. }
  334. public function testGetPerPageOptions()
  335. {
  336. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  337. $this->assertEquals(array(15, 25, 50, 100, 150, 200), $admin->getPerPageOptions());
  338. $admin->setPerPageOptions(array(500, 1000));
  339. $this->assertEquals(array(500, 1000), $admin->getPerPageOptions());
  340. }
  341. public function testGetLabelTranslatorStrategy()
  342. {
  343. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  344. $this->assertNull($admin->getLabelTranslatorStrategy());
  345. $labelTranslatorStrategy = $this->getMock('Sonata\AdminBundle\Translator\LabelTranslatorStrategyInterface');
  346. $admin->setLabelTranslatorStrategy($labelTranslatorStrategy);
  347. $this->assertEquals($labelTranslatorStrategy, $admin->getLabelTranslatorStrategy());
  348. }
  349. public function testGetRouteBuilder()
  350. {
  351. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  352. $this->assertNull($admin->getRouteBuilder());
  353. $routeBuilder = $this->getMock('Sonata\AdminBundle\Builder\RouteBuilderInterface');
  354. $admin->setRouteBuilder($routeBuilder);
  355. $this->assertEquals($routeBuilder, $admin->getRouteBuilder());
  356. }
  357. public function testGetMenuFactory()
  358. {
  359. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  360. $this->assertNull($admin->getMenuFactory());
  361. $menuFactory = $this->getMock('Knp\Menu\FactoryInterface');
  362. $admin->setMenuFactory($menuFactory);
  363. $this->assertEquals($menuFactory, $admin->getMenuFactory());
  364. }
  365. public function testGetExtensions()
  366. {
  367. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  368. $this->assertEquals(array(), $admin->getExtensions());
  369. $adminExtension1 = $this->getMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
  370. $adminExtension2 = $this->getMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
  371. $admin->addExtension($adminExtension1);
  372. $admin->addExtension($adminExtension2);
  373. $this->assertEquals(array($adminExtension1, $adminExtension2), $admin->getExtensions());
  374. }
  375. public function testGetFilterTheme()
  376. {
  377. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  378. $this->assertEquals(array(), $admin->getFilterTheme());
  379. $admin->setFilterTheme(array('FooTheme'));
  380. $this->assertEquals(array('FooTheme'), $admin->getFilterTheme());
  381. }
  382. public function testGetFormTheme()
  383. {
  384. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  385. $this->assertEquals(array(), $admin->getFormTheme());
  386. $admin->setFormTheme(array('FooTheme'));
  387. $this->assertEquals(array('FooTheme'), $admin->getFormTheme());
  388. }
  389. public function testGetValidator()
  390. {
  391. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  392. $this->assertNull($admin->getValidator());
  393. $validator = $this->getMock('Symfony\Component\Validator\ValidatorInterface');
  394. $admin->setValidator($validator);
  395. $this->assertEquals($validator, $admin->getValidator());
  396. }
  397. public function testGetSecurityHandler()
  398. {
  399. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  400. $this->assertNull($admin->getSecurityHandler());
  401. $securityHandler = $this->getMock('Sonata\AdminBundle\Security\Handler\SecurityHandlerInterface');
  402. $admin->setSecurityHandler($securityHandler);
  403. $this->assertEquals($securityHandler, $admin->getSecurityHandler());
  404. }
  405. public function testGetSecurityInformation()
  406. {
  407. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  408. $this->assertEquals(array(), $admin->getSecurityInformation());
  409. $securityInformation = array('ROLE_FOO', 'ROLE_BAR');
  410. $admin->setSecurityInformation($securityInformation);
  411. $this->assertEquals($securityInformation, $admin->getSecurityInformation());
  412. }
  413. public function testGetManagerType()
  414. {
  415. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  416. $this->assertNull($admin->getManagerType());
  417. $admin->setManagerType('foo_orm');
  418. $this->assertEquals('foo_orm', $admin->getManagerType());
  419. }
  420. public function testGetModelManager()
  421. {
  422. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  423. $this->assertNull($admin->getModelManager());
  424. $modelManager = $this->getMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  425. $admin->setModelManager($modelManager);
  426. $this->assertEquals($modelManager, $admin->getModelManager());
  427. }
  428. public function testGetBaseCodeRoute()
  429. {
  430. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  431. $this->assertSame('', $admin->getBaseCodeRoute());
  432. $admin->setBaseCodeRoute('foo');
  433. $this->assertEquals('foo', $admin->getBaseCodeRoute());
  434. }
  435. public function testGetRouteGenerator()
  436. {
  437. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  438. $this->assertNull($admin->getRouteGenerator());
  439. $routeGenerator = $this->getMock('Sonata\AdminBundle\Route\RouteGeneratorInterface');
  440. $admin->setRouteGenerator($routeGenerator);
  441. $this->assertEquals($routeGenerator, $admin->getRouteGenerator());
  442. }
  443. public function testGetConfigurationPool()
  444. {
  445. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  446. $this->assertNull($admin->getConfigurationPool());
  447. $pool = $this->getMockBuilder('Sonata\AdminBundle\Admin\Pool')
  448. ->disableOriginalConstructor()
  449. ->getMock();
  450. $admin->setConfigurationPool($pool);
  451. $this->assertEquals($pool, $admin->getConfigurationPool());
  452. }
  453. public function testGetShowBuilder()
  454. {
  455. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  456. $this->assertNull($admin->getShowBuilder());
  457. $showBuilder = $this->getMock('Sonata\AdminBundle\Builder\ShowBuilderInterface');
  458. $admin->setShowBuilder($showBuilder);
  459. $this->assertEquals($showBuilder, $admin->getShowBuilder());
  460. }
  461. public function testGetListBuilder()
  462. {
  463. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  464. $this->assertNull($admin->getListBuilder());
  465. $listBuilder = $this->getMock('Sonata\AdminBundle\Builder\ListBuilderInterface');
  466. $admin->setListBuilder($listBuilder);
  467. $this->assertEquals($listBuilder, $admin->getListBuilder());
  468. }
  469. public function testGetDatagridBuilder()
  470. {
  471. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  472. $this->assertNull($admin->getDatagridBuilder());
  473. $datagridBuilder = $this->getMock('Sonata\AdminBundle\Builder\DatagridBuilderInterface');
  474. $admin->setDatagridBuilder($datagridBuilder);
  475. $this->assertEquals($datagridBuilder, $admin->getDatagridBuilder());
  476. }
  477. public function testGetFormContractor()
  478. {
  479. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  480. $this->assertNull($admin->getFormContractor());
  481. $formContractor = $this->getMock('Sonata\AdminBundle\Builder\FormContractorInterface');
  482. $admin->setFormContractor($formContractor);
  483. $this->assertEquals($formContractor, $admin->getFormContractor());
  484. }
  485. public function testGetRequest()
  486. {
  487. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  488. $this->assertFalse($admin->hasRequest());
  489. $request = new Request();
  490. $admin->setRequest($request);
  491. $this->assertEquals($request, $admin->getRequest());
  492. $this->assertTrue($admin->hasRequest());
  493. }
  494. public function testGetRequestWithException()
  495. {
  496. $this->setExpectedException('RuntimeException', 'The Request object has not been set');
  497. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  498. $admin->getRequest();
  499. }
  500. public function testGetTranslationDomain()
  501. {
  502. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  503. $this->assertEquals('messages', $admin->getTranslationDomain());
  504. $admin->setTranslationDomain('foo');
  505. $this->assertEquals('foo', $admin->getTranslationDomain());
  506. }
  507. public function testGetTranslator()
  508. {
  509. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  510. $this->assertNull($admin->getTranslator());
  511. $translator = $this->getMock('Symfony\Component\Translation\TranslatorInterface');
  512. $admin->setTranslator($translator);
  513. $this->assertEquals($translator, $admin->getTranslator());
  514. }
  515. public function testGetShowGroups()
  516. {
  517. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  518. $this->assertEquals(false, $admin->getShowGroups());
  519. $groups = array('foo', 'bar', 'baz');
  520. $admin->setShowGroups($groups);
  521. $this->assertSame($groups, $admin->getShowGroups());
  522. }
  523. public function testGetFormGroups()
  524. {
  525. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  526. $this->assertEquals(false, $admin->getFormGroups());
  527. $groups = array('foo', 'bar', 'baz');
  528. $admin->setFormGroups($groups);
  529. $this->assertSame($groups, $admin->getFormGroups());
  530. }
  531. public function testGetMaxPageLinks()
  532. {
  533. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  534. $this->assertEquals(25, $admin->getMaxPageLinks());
  535. $admin->setMaxPageLinks(14);
  536. $this->assertSame(14, $admin->getMaxPageLinks());
  537. }
  538. public function testGetMaxPerPage()
  539. {
  540. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  541. $this->assertEquals(25, $admin->getMaxPerPage());
  542. $admin->setMaxPerPage(94);
  543. $this->assertSame(94, $admin->getMaxPerPage());
  544. }
  545. public function testGetLabel()
  546. {
  547. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  548. $this->assertNull($admin->getLabel());
  549. $admin->setLabel('FooLabel');
  550. $this->assertSame('FooLabel', $admin->getLabel());
  551. }
  552. public function testGetBaseController()
  553. {
  554. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  555. $this->assertEquals('SonataNewsBundle:PostAdmin', $admin->getBaseControllerName());
  556. $admin->setBaseControllerName('SonataNewsBundle:FooAdmin');
  557. $this->assertSame('SonataNewsBundle:FooAdmin', $admin->getBaseControllerName());
  558. }
  559. public function testGetTemplates()
  560. {
  561. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  562. $this->assertEquals(array(), $admin->getTemplates());
  563. $templates = array(
  564. 'list' => 'FooAdminBundle:CRUD:list.html.twig',
  565. 'show' => 'FooAdminBundle:CRUD:show.html.twig',
  566. 'edit' => 'FooAdminBundle:CRUD:edit.html.twig'
  567. );
  568. $admin->setTemplates($templates);
  569. $this->assertSame($templates, $admin->getTemplates());
  570. }
  571. public function testGetTemplate1()
  572. {
  573. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  574. $this->assertNull($admin->getTemplate('edit'));
  575. $templates = array(
  576. 'list' => 'FooAdminBundle:CRUD:list.html.twig',
  577. 'show' => 'FooAdminBundle:CRUD:show.html.twig',
  578. 'edit' => 'FooAdminBundle:CRUD:edit.html.twig'
  579. );
  580. $admin->setTemplate('edit', 'FooAdminBundle:CRUD:edit.html.twig');
  581. $admin->setTemplate('show', 'FooAdminBundle:CRUD:show.html.twig');
  582. $this->assertEquals('FooAdminBundle:CRUD:edit.html.twig', $admin->getTemplate('edit'));
  583. $this->assertEquals('FooAdminBundle:CRUD:show.html.twig', $admin->getTemplate('show'));
  584. }
  585. public function testGetTemplate2()
  586. {
  587. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  588. $this->assertNull($admin->getTemplate('edit'));
  589. $templates = array(
  590. 'list' => 'FooAdminBundle:CRUD:list.html.twig',
  591. 'show' => 'FooAdminBundle:CRUD:show.html.twig',
  592. 'edit' => 'FooAdminBundle:CRUD:edit.html.twig'
  593. );
  594. $admin->setTemplates($templates);
  595. $this->assertEquals('FooAdminBundle:CRUD:edit.html.twig', $admin->getTemplate('edit'));
  596. $this->assertEquals('FooAdminBundle:CRUD:show.html.twig', $admin->getTemplate('show'));
  597. }
  598. public function testGetIdParameter()
  599. {
  600. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  601. $this->assertEquals('id', $admin->getIdParameter());
  602. $this->assertFalse($admin->isChild());
  603. $parentAdmin = new PostAdmin('sonata.post.admin.post_parent', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostParentAdmin');
  604. $admin->setParent($parentAdmin);
  605. $this->assertTrue($admin->isChild());
  606. $this->assertEquals('childId', $admin->getIdParameter());
  607. }
  608. public function testGetExportFormats()
  609. {
  610. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  611. $this->assertEquals(array('json', 'xml', 'csv', 'xls'), $admin->getExportFormats());
  612. }
  613. public function testGetUrlsafeIdentifier()
  614. {
  615. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  616. $entity = new \stdClass();
  617. $modelManager = $this->getMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  618. $modelManager->expects($this->once())
  619. ->method('getUrlsafeIdentifier')
  620. ->with($this->equalTo($entity))
  621. ->will($this->returnValue('foo'));
  622. $admin->setModelManager($modelManager);
  623. $this->assertEquals('foo', $admin->getUrlsafeIdentifier($entity));
  624. }
  625. public function testDeterminedPerPageValue()
  626. {
  627. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  628. $this->assertFalse($admin->determinedPerPageValue('foo'));
  629. $this->assertFalse($admin->determinedPerPageValue(123));
  630. $this->assertTrue($admin->determinedPerPageValue(15));
  631. $this->assertTrue($admin->determinedPerPageValue(25));
  632. $this->assertTrue($admin->determinedPerPageValue(50));
  633. $this->assertTrue($admin->determinedPerPageValue(100));
  634. $this->assertTrue($admin->determinedPerPageValue(150));
  635. $this->assertTrue($admin->determinedPerPageValue(200));
  636. $admin->setPerPageOptions(array(101, 102, 103));
  637. $this->assertFalse($admin->determinedPerPageValue(15));
  638. $this->assertFalse($admin->determinedPerPageValue(25));
  639. $this->assertFalse($admin->determinedPerPageValue(200));
  640. $this->assertTrue($admin->determinedPerPageValue(101));
  641. $this->assertTrue($admin->determinedPerPageValue(102));
  642. $this->assertTrue($admin->determinedPerPageValue(103));
  643. }
  644. public function testIsGranted()
  645. {
  646. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  647. $entity = new \stdClass();
  648. $securityHandler=$this->getMock('Sonata\AdminBundle\Security\Handler\AclSecurityHandlerInterface');
  649. $securityHandler->expects($this->any())
  650. ->method('isGranted')
  651. ->will($this->returnCallback(function (AdminInterface $adminIn, $attributes, $object = nul) use ($admin, $entity) {
  652. if ($admin == $adminIn && $attributes == 'FOO') {
  653. if (($object == $admin) || ($object == $entity)) {
  654. return true;
  655. }
  656. }
  657. return false;
  658. }));
  659. $admin->setSecurityHandler($securityHandler);
  660. $this->assertTrue($admin->isGranted('FOO'));
  661. $this->assertTrue($admin->isGranted('FOO', $entity));
  662. $this->assertFalse($admin->isGranted('BAR'));
  663. $this->assertFalse($admin->isGranted('BAR', $entity));
  664. }
  665. public function testSupportsPreviewMode()
  666. {
  667. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  668. $this->assertFalse($admin->supportsPreviewMode());
  669. }
  670. public function testGetPermissionsShow()
  671. {
  672. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  673. $this->assertEquals(array('LIST'), $admin->getPermissionsShow(Admin::CONTEXT_DASHBOARD));
  674. $this->assertEquals(array('LIST'), $admin->getPermissionsShow(Admin::CONTEXT_MENU));
  675. $this->assertEquals(array('LIST'), $admin->getPermissionsShow('foo'));
  676. }
  677. public function testShowIn()
  678. {
  679. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  680. $securityHandler=$this->getMock('Sonata\AdminBundle\Security\Handler\AclSecurityHandlerInterface');
  681. $securityHandler->expects($this->any())
  682. ->method('isGranted')
  683. ->will($this->returnCallback(function (AdminInterface $adminIn, $attributes, $object = nul) use ($admin) {
  684. if ($admin == $adminIn && $attributes == array('LIST')) {
  685. return true;
  686. }
  687. return false;
  688. }));
  689. $admin->setSecurityHandler($securityHandler);
  690. $this->assertTrue($admin->showIn(Admin::CONTEXT_DASHBOARD));
  691. $this->assertTrue($admin->showIn(Admin::CONTEXT_MENU));
  692. $this->assertTrue($admin->showIn('foo'));
  693. }
  694. public function testGetObjectIdentifier()
  695. {
  696. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  697. $this->assertEquals('sonata.post.admin.post', $admin->getObjectIdentifier());
  698. }
  699. public function testTransWithNoTranslator()
  700. {
  701. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  702. $this->assertEquals('foo', $admin->trans('foo'));
  703. }
  704. public function testTrans()
  705. {
  706. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  707. $admin->setTranslationDomain('fooMessageDomain');
  708. $translator = $this->getMock('Symfony\Component\Translation\TranslatorInterface');
  709. $admin->setTranslator($translator);
  710. $translator->expects($this->once())
  711. ->method('trans')
  712. ->with($this->equalTo('foo'), $this->equalTo(array()), $this->equalTo('fooMessageDomain'))
  713. ->will($this->returnValue('fooTranslated'));
  714. $this->assertEquals('fooTranslated', $admin->trans('foo'));
  715. }
  716. public function testTransWithMessageDomain()
  717. {
  718. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  719. $translator = $this->getMock('Symfony\Component\Translation\TranslatorInterface');
  720. $admin->setTranslator($translator);
  721. $translator->expects($this->once())
  722. ->method('trans')
  723. ->with($this->equalTo('foo'), $this->equalTo(array('name'=>'Andrej')), $this->equalTo('fooMessageDomain'))
  724. ->will($this->returnValue('fooTranslated'));
  725. $this->assertEquals('fooTranslated', $admin->trans('foo', array('name'=>'Andrej'), 'fooMessageDomain'));
  726. }
  727. public function testTransChoiceWithNoTranslator()
  728. {
  729. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  730. $this->assertEquals('foo', $admin->transChoice('foo', 2));
  731. }
  732. public function testTransChoice()
  733. {
  734. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  735. $admin->setTranslationDomain('fooMessageDomain');
  736. $translator = $this->getMock('Symfony\Component\Translation\TranslatorInterface');
  737. $admin->setTranslator($translator);
  738. $translator->expects($this->once())
  739. ->method('transChoice')
  740. ->with($this->equalTo('foo'), $this->equalTo(2), $this->equalTo(array()), $this->equalTo('fooMessageDomain'))
  741. ->will($this->returnValue('fooTranslated'));
  742. $this->assertEquals('fooTranslated', $admin->transChoice('foo', 2));
  743. }
  744. public function testTransChoiceWithMessageDomain()
  745. {
  746. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  747. $translator = $this->getMock('Symfony\Component\Translation\TranslatorInterface');
  748. $admin->setTranslator($translator);
  749. $translator->expects($this->once())
  750. ->method('transChoice')
  751. ->with($this->equalTo('foo'), $this->equalTo(2), $this->equalTo(array('name'=>'Andrej')), $this->equalTo('fooMessageDomain'))
  752. ->will($this->returnValue('fooTranslated'));
  753. $this->assertEquals('fooTranslated', $admin->transChoice('foo', 2, array('name'=>'Andrej'), 'fooMessageDomain'));
  754. }
  755. }