AdminTest.php 44 KB

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