AdminTest.php 46 KB

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