AdminTest.php 57 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517
  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. public function testGetClass()
  43. {
  44. $class = 'Application\Sonata\NewsBundle\Entity\Post';
  45. $baseControllerName = 'SonataNewsBundle:PostAdmin';
  46. $admin = new PostAdmin('sonata.post.admin.post', $class, $baseControllerName);
  47. $testObject = new \stdClass();
  48. $admin->setSubject($testObject);
  49. $this->assertEquals('stdClass', $admin->getClass());
  50. $admin->setSubClasses(array('foo'));
  51. $this->assertEquals('stdClass', $admin->getClass());
  52. $admin->setSubject(null);
  53. $admin->setSubClasses(array());
  54. $this->assertEquals($class, $admin->getClass());
  55. $admin->setSubClasses(array('foo' => 'bar'));
  56. $admin->setRequest(new Request(array('subclass' => 'foo')));
  57. $this->assertEquals('bar', $admin->getClass());
  58. }
  59. /**
  60. * @expectedException \RuntimeException
  61. * @expectedExceptionMessage Feature not implemented: an embedded admin cannot have subclass
  62. */
  63. public function testGetClassException()
  64. {
  65. $class = 'Application\Sonata\NewsBundle\Entity\Post';
  66. $baseControllerName = 'SonataNewsBundle:PostAdmin';
  67. $admin = new PostAdmin('sonata.post.admin.post', $class, $baseControllerName);
  68. $admin->setParentFieldDescription(new FieldDescription());
  69. $admin->setSubClasses(array('foo' => 'bar'));
  70. $admin->setRequest(new Request(array('subclass' => 'foo')));
  71. $admin->getClass();
  72. }
  73. public function testGetBreadCrumbs()
  74. {
  75. $class = 'Application\Sonata\NewsBundle\Entity\Post';
  76. $baseControllerName = 'SonataNewsBundle:PostAdmin';
  77. $admin = new PostAdmin('sonata.post.admin.post', $class, $baseControllerName);
  78. $commentAdmin = new CommentAdmin(
  79. 'sonata.post.admin.comment',
  80. 'Application\Sonata\NewsBundle\Entity\Comment',
  81. 'SonataNewsBundle:CommentAdmin'
  82. );
  83. $subCommentAdmin = new CommentAdmin(
  84. 'sonata.post.admin.comment',
  85. 'Application\Sonata\NewsBundle\Entity\Comment',
  86. 'SonataNewsBundle:CommentAdmin'
  87. );
  88. $admin->addChild($commentAdmin);
  89. $admin->setRequest(new Request(array('id' => 42)));
  90. $commentAdmin->setRequest(new Request());
  91. $commentAdmin->initialize();
  92. $admin->initialize();
  93. $commentAdmin->setCurrentChild($subCommentAdmin);
  94. $menuFactory = $this->getMock('Knp\Menu\FactoryInterface');
  95. $menu = $this->getMock('Knp\Menu\ItemInterface');
  96. $translatorStrategy = $this->getMock(
  97. 'Sonata\AdminBundle\Translator\LabelTranslatorStrategyInterface'
  98. );
  99. $routeGenerator = $this->getMock(
  100. 'Sonata\AdminBundle\Route\RouteGeneratorInterface'
  101. );
  102. $modelManager = $this->getMock(
  103. 'Sonata\AdminBundle\Model\ModelManagerInterface'
  104. );
  105. $admin->setMenuFactory($menuFactory);
  106. $admin->setLabelTranslatorStrategy($translatorStrategy);
  107. $admin->setRouteGenerator($routeGenerator);
  108. $admin->setModelManager($modelManager);
  109. $commentAdmin->setLabelTranslatorStrategy($translatorStrategy);
  110. $commentAdmin->setRouteGenerator($routeGenerator);
  111. $modelManager->expects($this->exactly(1))
  112. ->method('find')
  113. ->with('Application\Sonata\NewsBundle\Entity\Post', 42)
  114. ->will($this->returnValue(new DummySubject()));
  115. $menuFactory->expects($this->exactly(5))
  116. ->method('createItem')
  117. ->with('root')
  118. ->will($this->returnValue($menu));
  119. $menu->expects($this->once())
  120. ->method('setUri')
  121. ->with($this->identicalTo(false));
  122. $menu->expects($this->exactly(5))
  123. ->method('getParent')
  124. ->will($this->returnValue(false));
  125. $routeGenerator->expects($this->exactly(5))
  126. ->method('generate')
  127. ->with('sonata_admin_dashboard')
  128. ->will($this->returnValue('http://somehost.com'));
  129. $translatorStrategy->expects($this->exactly(18))
  130. ->method('getLabel')
  131. ->withConsecutive(
  132. array('dashboard'),
  133. array('Post_list'),
  134. array('Comment_list'),
  135. array('Comment_repost'),
  136. array('dashboard'),
  137. array('Post_list'),
  138. array('Comment_list'),
  139. array('Comment_flag'),
  140. array('dashboard'),
  141. array('Post_list'),
  142. array('Comment_list'),
  143. array('Comment_edit'),
  144. array('dashboard'),
  145. array('Post_list'),
  146. array('Comment_list'),
  147. array('dashboard'),
  148. array('Post_list'),
  149. array('Comment_list')
  150. )
  151. ->will($this->onConsecutiveCalls(
  152. 'someLabel',
  153. 'someOtherLabel',
  154. 'someInterestingLabel',
  155. 'someFancyLabel',
  156. 'someCoolLabel',
  157. 'someTipTopLabel',
  158. 'someFunkyLabel',
  159. 'someAwesomeLabel',
  160. 'someLikeableLabel',
  161. 'someMildlyInterestingLabel',
  162. 'someWTFLabel',
  163. 'someBadLabel',
  164. 'someBoringLabel',
  165. 'someLongLabel',
  166. 'someEndlessLabel',
  167. 'someAlmostThereLabel',
  168. 'someOriginalLabel',
  169. 'someOkayishLabel'
  170. ));
  171. $menu->expects($this->exactly(24))
  172. ->method('addChild')
  173. ->withConsecutive(
  174. array('someLabel'),
  175. array('someOtherLabel'),
  176. array('dummy subject representation'),
  177. array('someInterestingLabel'),
  178. array('someFancyLabel'),
  179. array('someCoolLabel'),
  180. array('someTipTopLabel'),
  181. array('dummy subject representation'),
  182. array('someFunkyLabel'),
  183. array('someAwesomeLabel'),
  184. array('someLikeableLabel'),
  185. array('someMildlyInterestingLabel'),
  186. array('dummy subject representation'),
  187. array('someWTFLabel'),
  188. array('someBadLabel'),
  189. array('someBoringLabel'),
  190. array('someLongLabel'),
  191. array('dummy subject representation'),
  192. array('someEndlessLabel'),
  193. array('someAlmostThereLabel'),
  194. array('someOriginalLabel'),
  195. array('dummy subject representation'),
  196. array('someOkayishLabel'),
  197. array('dummy subject representation')
  198. )
  199. ->will($this->returnValue($menu));
  200. $admin->getBreadcrumbs('repost');
  201. $admin->setSubject(new DummySubject());
  202. $admin->getBreadcrumbs('flag');
  203. $commentAdmin->getBreadcrumbs('edit');
  204. $commentAdmin->getBreadcrumbs('list');
  205. $commentAdmin->setSubject(new DummySubject());
  206. $commentAdmin->getBreadcrumbs('reply');
  207. }
  208. public function testGetBreadCrumbsWithNoCurrentAdmin()
  209. {
  210. $class = 'Application\Sonata\NewsBundle\Entity\Post';
  211. $baseControllerName = 'SonataNewsBundle:PostAdmin';
  212. $admin = new PostAdmin('sonata.post.admin.post', $class, $baseControllerName);
  213. $commentAdmin = new CommentAdmin(
  214. 'sonata.post.admin.comment',
  215. 'Application\Sonata\NewsBundle\Entity\Comment',
  216. 'SonataNewsBundle:CommentAdmin'
  217. );
  218. $admin->addChild($commentAdmin);
  219. $admin->setRequest(new Request(array('id' => 42)));
  220. $commentAdmin->setRequest(new Request());
  221. $commentAdmin->initialize();
  222. $admin->initialize();
  223. $menuFactory = $this->getMock('Knp\Menu\FactoryInterface');
  224. $menu = $this->getMock('Knp\Menu\ItemInterface');
  225. $translatorStrategy = $this->getMock(
  226. 'Sonata\AdminBundle\Translator\LabelTranslatorStrategyInterface'
  227. );
  228. $routeGenerator = $this->getMock(
  229. 'Sonata\AdminBundle\Route\RouteGeneratorInterface'
  230. );
  231. $admin->setMenuFactory($menuFactory);
  232. $admin->setLabelTranslatorStrategy($translatorStrategy);
  233. $admin->setRouteGenerator($routeGenerator);
  234. $menuFactory->expects($this->exactly(2))
  235. ->method('createItem')
  236. ->with('root')
  237. ->will($this->returnValue($menu));
  238. $translatorStrategy->expects($this->exactly(5))
  239. ->method('getLabel')
  240. ->withConsecutive(
  241. array('dashboard'),
  242. array('Post_list'),
  243. array('Post_repost'),
  244. array('dashboard'),
  245. array('Post_list')
  246. )
  247. ->will($this->onConsecutiveCalls(
  248. 'someLabel',
  249. 'someOtherLabel',
  250. 'someInterestingLabel',
  251. 'someFancyLabel',
  252. 'someCoolLabel'
  253. ));
  254. $menu->expects($this->exactly(6))
  255. ->method('addChild')
  256. ->withConsecutive(
  257. array('someLabel'),
  258. array('someOtherLabel'),
  259. array('someInterestingLabel'),
  260. array('someFancyLabel'),
  261. array('someCoolLabel'),
  262. array('dummy subject representation')
  263. )
  264. ->will($this->returnValue($menu));
  265. $admin->getBreadcrumbs('repost');
  266. $admin->setSubject(new DummySubject());
  267. $flagBreadcrumb = $admin->getBreadcrumbs('flag');
  268. $this->assertSame($flagBreadcrumb, $admin->getBreadcrumbs('flag'));
  269. }
  270. /**
  271. * @covers Sonata\AdminBundle\Admin\Admin::hasChild
  272. * @covers Sonata\AdminBundle\Admin\Admin::addChild
  273. * @covers Sonata\AdminBundle\Admin\Admin::getChild
  274. * @covers Sonata\AdminBundle\Admin\Admin::isChild
  275. * @covers Sonata\AdminBundle\Admin\Admin::hasChildren
  276. * @covers Sonata\AdminBundle\Admin\Admin::getChildren
  277. */
  278. public function testChildren()
  279. {
  280. $postAdmin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  281. $this->assertFalse($postAdmin->hasChildren());
  282. $this->assertFalse($postAdmin->hasChild('comment'));
  283. $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  284. $postAdmin->addChild($commentAdmin);
  285. $this->assertTrue($postAdmin->hasChildren());
  286. $this->assertTrue($postAdmin->hasChild('sonata.post.admin.comment'));
  287. $this->assertEquals('sonata.post.admin.comment', $postAdmin->getChild('sonata.post.admin.comment')->getCode());
  288. $this->assertEquals('sonata.post.admin.post|sonata.post.admin.comment', $postAdmin->getChild('sonata.post.admin.comment')->getBaseCodeRoute());
  289. $this->assertEquals($postAdmin, $postAdmin->getChild('sonata.post.admin.comment')->getParent());
  290. $this->assertFalse($postAdmin->isChild());
  291. $this->assertTrue($commentAdmin->isChild());
  292. $this->assertEquals(array('sonata.post.admin.comment' => $commentAdmin), $postAdmin->getChildren());
  293. }
  294. /**
  295. * @covers Sonata\AdminBundle\Admin\Admin::configure
  296. */
  297. public function testConfigure()
  298. {
  299. $admin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  300. $this->assertNotNull($admin->getUniqid());
  301. $admin->initialize();
  302. $this->assertNotNull($admin->getUniqid());
  303. $this->assertEquals('Post', $admin->getClassnameLabel());
  304. $admin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  305. $admin->setClassnameLabel('postcomment');
  306. $admin->initialize();
  307. $this->assertEquals('postcomment', $admin->getClassnameLabel());
  308. }
  309. public function testConfigureWithValidParentAssociationMapping()
  310. {
  311. $admin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  312. $admin->setParentAssociationMapping('Category');
  313. $admin->initialize();
  314. $this->assertEquals('Category', $admin->getParentAssociationMapping());
  315. }
  316. public function provideGetBaseRoutePattern()
  317. {
  318. return array(
  319. array(
  320. 'Application\Sonata\NewsBundle\Entity\Post',
  321. '/sonata/news/post'
  322. ),
  323. array(
  324. 'Application\Sonata\NewsBundle\Document\Post',
  325. '/sonata/news/post'
  326. ),
  327. array(
  328. 'MyApplication\MyBundle\Entity\Post',
  329. '/myapplication/my/post'
  330. ),
  331. array(
  332. 'MyApplication\MyBundle\Entity\Post\Category',
  333. '/myapplication/my/post-category'
  334. ),
  335. array(
  336. 'MyApplication\MyBundle\Entity\Product\Category',
  337. '/myapplication/my/product-category'
  338. ),
  339. array(
  340. 'MyApplication\MyBundle\Entity\Other\Product\Category',
  341. '/myapplication/my/other-product-category'
  342. ),
  343. array(
  344. 'Symfony\Cmf\Bundle\FooBundle\Document\Menu',
  345. '/cmf/foo/menu'
  346. ),
  347. array(
  348. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\Phpcr\Menu',
  349. '/cmf/foo/menu'
  350. ),
  351. array(
  352. 'Symfony\Bundle\BarBarBundle\Doctrine\Phpcr\Menu',
  353. '/symfony/barbar/menu'
  354. ),
  355. array(
  356. 'Symfony\Bundle\BarBarBundle\Doctrine\Phpcr\Menu\Item',
  357. '/symfony/barbar/menu-item'
  358. ),
  359. array(
  360. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\Orm\Menu',
  361. '/cmf/foo/menu'
  362. ),
  363. array(
  364. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\MongoDB\Menu',
  365. '/cmf/foo/menu'
  366. ),
  367. array(
  368. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\CouchDB\Menu',
  369. '/cmf/foo/menu'
  370. ),
  371. array(
  372. 'AppBundle\Entity\User',
  373. '/app/user'
  374. ),
  375. );
  376. }
  377. /**
  378. * @dataProvider provideGetBaseRoutePattern
  379. */
  380. public function testGetBaseRoutePattern($objFqn, $expected)
  381. {
  382. $admin = new PostAdmin('sonata.post.admin.post', $objFqn, 'SonataNewsBundle:PostAdmin');
  383. $this->assertEquals($expected, $admin->getBaseRoutePattern());
  384. }
  385. public function testGetBaseRoutePatternWithChildAdmin()
  386. {
  387. $postAdmin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  388. $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  389. $commentAdmin->setParent($postAdmin);
  390. $this->assertEquals('/sonata/news/post/{id}/comment', $commentAdmin->getBaseRoutePattern());
  391. }
  392. /**
  393. * @expectedException RuntimeException
  394. */
  395. public function testGetBaseRoutePatternWithUnreconizedClassname()
  396. {
  397. $admin = new PostAdmin('sonata.post.admin.post', 'News\Entity\Post', 'SonataNewsBundle:PostAdmin');
  398. $admin->getBaseRoutePattern();
  399. }
  400. public function provideGetBaseRouteName()
  401. {
  402. return array(
  403. array(
  404. 'Application\Sonata\NewsBundle\Entity\Post',
  405. 'admin_sonata_news_post'
  406. ),
  407. array(
  408. 'Application\Sonata\NewsBundle\Document\Post',
  409. 'admin_sonata_news_post'
  410. ),
  411. array(
  412. 'MyApplication\MyBundle\Entity\Post',
  413. 'admin_myapplication_my_post'
  414. ),
  415. array(
  416. 'MyApplication\MyBundle\Entity\Post\Category',
  417. 'admin_myapplication_my_post_category'
  418. ),
  419. array(
  420. 'MyApplication\MyBundle\Entity\Product\Category',
  421. 'admin_myapplication_my_product_category'
  422. ),
  423. array(
  424. 'MyApplication\MyBundle\Entity\Other\Product\Category',
  425. 'admin_myapplication_my_other_product_category'
  426. ),
  427. array(
  428. 'Symfony\Cmf\Bundle\FooBundle\Document\Menu',
  429. 'admin_cmf_foo_menu'
  430. ),
  431. array(
  432. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\Phpcr\Menu',
  433. 'admin_cmf_foo_menu'
  434. ),
  435. array(
  436. 'Symfony\Bundle\BarBarBundle\Doctrine\Phpcr\Menu',
  437. 'admin_symfony_barbar_menu'
  438. ),
  439. array(
  440. 'Symfony\Bundle\BarBarBundle\Doctrine\Phpcr\Menu\Item',
  441. 'admin_symfony_barbar_menu_item'
  442. ),
  443. array(
  444. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\Orm\Menu',
  445. 'admin_cmf_foo_menu'
  446. ),
  447. array(
  448. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\MongoDB\Menu',
  449. 'admin_cmf_foo_menu'
  450. ),
  451. array(
  452. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\CouchDB\Menu',
  453. 'admin_cmf_foo_menu'
  454. ),
  455. array(
  456. 'AppBundle\Entity\User',
  457. 'admin_app_user'
  458. ),
  459. );
  460. }
  461. /**
  462. * @dataProvider provideGetBaseRouteName
  463. */
  464. public function testGetBaseRouteName($objFqn, $expected)
  465. {
  466. $admin = new PostAdmin('sonata.post.admin.post', $objFqn, 'SonataNewsBundle:PostAdmin');
  467. $this->assertEquals($expected, $admin->getBaseRouteName());
  468. }
  469. public function testGetBaseRouteNameWithChildAdmin()
  470. {
  471. $routeGenerator = new DefaultRouteGenerator(
  472. $this->getMock('Symfony\Component\Routing\RouterInterface'),
  473. new RoutesCache($this->cacheTempFolder, true)
  474. );
  475. $pathInfo = new \Sonata\AdminBundle\Route\PathInfoBuilder($this->getMock('Sonata\AdminBundle\Model\AuditManagerInterface'));
  476. $postAdmin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  477. $postAdmin->setRouteBuilder($pathInfo);
  478. $postAdmin->setRouteGenerator($routeGenerator);
  479. $postAdmin->initialize();
  480. $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  481. $commentAdmin->setRouteBuilder($pathInfo);
  482. $commentAdmin->setRouteGenerator($routeGenerator);
  483. $commentAdmin->initialize();
  484. $postAdmin->addChild($commentAdmin);
  485. $this->assertEquals('admin_sonata_news_post_comment', $commentAdmin->getBaseRouteName());
  486. $this->assertTrue($postAdmin->hasRoute('show'));
  487. $this->assertTrue($postAdmin->hasRoute('sonata.post.admin.post.show'));
  488. $this->assertTrue($postAdmin->hasRoute('sonata.post.admin.post|sonata.post.admin.comment.show'));
  489. $this->assertTrue($postAdmin->hasRoute('sonata.post.admin.comment.list'));
  490. $this->assertFalse($postAdmin->hasRoute('sonata.post.admin.post|sonata.post.admin.comment.edit'));
  491. $this->assertFalse($commentAdmin->hasRoute('edit'));
  492. }
  493. /**
  494. * @expectedException RuntimeException
  495. */
  496. public function testGetBaseRouteNameWithUnreconizedClassname()
  497. {
  498. $admin = new PostAdmin('sonata.post.admin.post', 'News\Entity\Post', 'SonataNewsBundle:PostAdmin');
  499. $admin->getBaseRouteName();
  500. }
  501. /**
  502. * @covers Sonata\AdminBundle\Admin\Admin::setUniqid
  503. * @covers Sonata\AdminBundle\Admin\Admin::getUniqid
  504. */
  505. public function testUniqid()
  506. {
  507. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  508. $uniqid = uniqid();
  509. $admin->setUniqid($uniqid);
  510. $this->assertEquals($uniqid, $admin->getUniqid());
  511. }
  512. public function testToString()
  513. {
  514. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  515. $s = new \stdClass();
  516. $this->assertNotEmpty($admin->toString($s));
  517. $s = new FooToString();
  518. $this->assertEquals('salut', $admin->toString($s));
  519. // To string method is implemented, but returns null
  520. $s = new FooToStringNull();
  521. $this->assertNotEmpty($admin->toString($s));
  522. $this->assertEquals("", $admin->toString(false));
  523. }
  524. public function testIsAclEnabled()
  525. {
  526. $postAdmin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  527. $this->assertFalse($postAdmin->isAclEnabled());
  528. $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  529. $commentAdmin->setSecurityHandler($this->getMock('Sonata\AdminBundle\Security\Handler\AclSecurityHandlerInterface'));
  530. $this->assertTrue($commentAdmin->isAclEnabled());
  531. }
  532. /**
  533. * @covers Sonata\AdminBundle\Admin\Admin::getSubClasses
  534. * @covers Sonata\AdminBundle\Admin\Admin::getSubClass
  535. * @covers Sonata\AdminBundle\Admin\Admin::setSubClasses
  536. * @covers Sonata\AdminBundle\Admin\Admin::hasSubClass
  537. * @covers Sonata\AdminBundle\Admin\Admin::hasActiveSubClass
  538. * @covers Sonata\AdminBundle\Admin\Admin::getActiveSubClass
  539. * @covers Sonata\AdminBundle\Admin\Admin::getActiveSubclassCode
  540. * @covers Sonata\AdminBundle\Admin\Admin::getClass
  541. */
  542. public function testSubClass()
  543. {
  544. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  545. $this->assertFalse($admin->hasSubClass('test'));
  546. $this->assertFalse($admin->hasActiveSubClass());
  547. $this->assertCount(0, $admin->getSubClasses());
  548. $this->assertNull($admin->getActiveSubClass());
  549. $this->assertNull($admin->getActiveSubclassCode());
  550. $this->assertEquals('NewsBundle\Entity\Post', $admin->getClass());
  551. // Just for the record, if there is no inheritance set, the getSubject is not used
  552. // the getSubject can also lead to some issue
  553. $admin->setSubject(new \stdClass());
  554. $this->assertEquals('stdClass', $admin->getClass());
  555. $admin->setSubClasses(array('extended1' => 'NewsBundle\Entity\PostExtended1', 'extended2' => 'NewsBundle\Entity\PostExtended2'));
  556. $this->assertFalse($admin->hasSubClass('test'));
  557. $this->assertTrue($admin->hasSubClass('extended1'));
  558. $this->assertFalse($admin->hasActiveSubClass());
  559. $this->assertCount(2, $admin->getSubClasses());
  560. $this->assertNull($admin->getActiveSubClass());
  561. $this->assertNull($admin->getActiveSubclassCode());
  562. $this->assertEquals('stdClass', $admin->getClass());
  563. $request = new \Symfony\Component\HttpFoundation\Request(array('subclass' => 'extended1'));
  564. $admin->setRequest($request);
  565. $this->assertFalse($admin->hasSubClass('test'));
  566. $this->assertTrue($admin->hasSubClass('extended1'));
  567. $this->assertTrue($admin->hasActiveSubClass());
  568. $this->assertCount(2, $admin->getSubClasses());
  569. $this->assertEquals('stdClass', $admin->getActiveSubClass());
  570. $this->assertEquals('extended1', $admin->getActiveSubclassCode());
  571. $this->assertEquals('stdClass', $admin->getClass());
  572. $request->query->set('subclass', 'inject');
  573. $this->assertNull($admin->getActiveSubclassCode());
  574. }
  575. /**
  576. * @expectedException RuntimeException
  577. */
  578. public function testNonExistantSubclass()
  579. {
  580. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  581. $admin->setRequest(new \Symfony\Component\HttpFoundation\Request(array('subclass' => 'inject')));
  582. $admin->setSubClasses(array('extended1' => 'NewsBundle\Entity\PostExtended1', 'extended2' => 'NewsBundle\Entity\PostExtended2'));
  583. $this->assertTrue($admin->hasActiveSubClass());
  584. $admin->getActiveSubClass();
  585. }
  586. /**
  587. * @covers Sonata\AdminBundle\Admin\Admin::hasActiveSubClass
  588. */
  589. public function testOnlyOneSubclassNeededToBeActive()
  590. {
  591. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  592. $admin->setSubClasses(array('extended1' => 'NewsBundle\Entity\PostExtended1'));
  593. $request = new \Symfony\Component\HttpFoundation\Request(array('subclass' => 'extended1'));
  594. $admin->setRequest($request);
  595. $this->assertTrue($admin->hasActiveSubClass());
  596. }
  597. public function testGetPerPageOptions()
  598. {
  599. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  600. $this->assertEquals(array(16, 32, 64, 128, 192), $admin->getPerPageOptions());
  601. $admin->setPerPageOptions(array(500, 1000));
  602. $this->assertEquals(array(500, 1000), $admin->getPerPageOptions());
  603. }
  604. public function testGetLabelTranslatorStrategy()
  605. {
  606. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  607. $this->assertNull($admin->getLabelTranslatorStrategy());
  608. $labelTranslatorStrategy = $this->getMock('Sonata\AdminBundle\Translator\LabelTranslatorStrategyInterface');
  609. $admin->setLabelTranslatorStrategy($labelTranslatorStrategy);
  610. $this->assertEquals($labelTranslatorStrategy, $admin->getLabelTranslatorStrategy());
  611. }
  612. public function testGetRouteBuilder()
  613. {
  614. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  615. $this->assertNull($admin->getRouteBuilder());
  616. $routeBuilder = $this->getMock('Sonata\AdminBundle\Builder\RouteBuilderInterface');
  617. $admin->setRouteBuilder($routeBuilder);
  618. $this->assertEquals($routeBuilder, $admin->getRouteBuilder());
  619. }
  620. public function testGetMenuFactory()
  621. {
  622. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  623. $this->assertNull($admin->getMenuFactory());
  624. $menuFactory = $this->getMock('Knp\Menu\FactoryInterface');
  625. $admin->setMenuFactory($menuFactory);
  626. $this->assertEquals($menuFactory, $admin->getMenuFactory());
  627. }
  628. public function testGetExtensions()
  629. {
  630. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  631. $this->assertEquals(array(), $admin->getExtensions());
  632. $adminExtension1 = $this->getMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
  633. $adminExtension2 = $this->getMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
  634. $admin->addExtension($adminExtension1);
  635. $admin->addExtension($adminExtension2);
  636. $this->assertEquals(array($adminExtension1, $adminExtension2), $admin->getExtensions());
  637. }
  638. public function testGetFilterTheme()
  639. {
  640. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  641. $this->assertEquals(array(), $admin->getFilterTheme());
  642. $admin->setFilterTheme(array('FooTheme'));
  643. $this->assertEquals(array('FooTheme'), $admin->getFilterTheme());
  644. }
  645. public function testGetFormTheme()
  646. {
  647. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  648. $this->assertEquals(array(), $admin->getFormTheme());
  649. $admin->setFormTheme(array('FooTheme'));
  650. $this->assertEquals(array('FooTheme'), $admin->getFormTheme());
  651. }
  652. public function testGetValidator()
  653. {
  654. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  655. $this->assertNull($admin->getValidator());
  656. $validator = $this->getMock('Symfony\Component\Validator\ValidatorInterface');
  657. $admin->setValidator($validator);
  658. $this->assertEquals($validator, $admin->getValidator());
  659. }
  660. public function testGetSecurityHandler()
  661. {
  662. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  663. $this->assertNull($admin->getSecurityHandler());
  664. $securityHandler = $this->getMock('Sonata\AdminBundle\Security\Handler\SecurityHandlerInterface');
  665. $admin->setSecurityHandler($securityHandler);
  666. $this->assertEquals($securityHandler, $admin->getSecurityHandler());
  667. }
  668. public function testGetSecurityInformation()
  669. {
  670. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  671. $this->assertEquals(array(), $admin->getSecurityInformation());
  672. $securityInformation = array('ROLE_FOO', 'ROLE_BAR');
  673. $admin->setSecurityInformation($securityInformation);
  674. $this->assertEquals($securityInformation, $admin->getSecurityInformation());
  675. }
  676. public function testGetManagerType()
  677. {
  678. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  679. $this->assertNull($admin->getManagerType());
  680. $admin->setManagerType('foo_orm');
  681. $this->assertEquals('foo_orm', $admin->getManagerType());
  682. }
  683. public function testGetModelManager()
  684. {
  685. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  686. $this->assertNull($admin->getModelManager());
  687. $modelManager = $this->getMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  688. $admin->setModelManager($modelManager);
  689. $this->assertEquals($modelManager, $admin->getModelManager());
  690. }
  691. public function testGetBaseCodeRoute()
  692. {
  693. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  694. $this->assertSame('', $admin->getBaseCodeRoute());
  695. $admin->setBaseCodeRoute('foo');
  696. $this->assertEquals('foo', $admin->getBaseCodeRoute());
  697. }
  698. public function testGetRouteGenerator()
  699. {
  700. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  701. $this->assertNull($admin->getRouteGenerator());
  702. $routeGenerator = $this->getMock('Sonata\AdminBundle\Route\RouteGeneratorInterface');
  703. $admin->setRouteGenerator($routeGenerator);
  704. $this->assertEquals($routeGenerator, $admin->getRouteGenerator());
  705. }
  706. public function testGetConfigurationPool()
  707. {
  708. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  709. $this->assertNull($admin->getConfigurationPool());
  710. $pool = $this->getMockBuilder('Sonata\AdminBundle\Admin\Pool')
  711. ->disableOriginalConstructor()
  712. ->getMock();
  713. $admin->setConfigurationPool($pool);
  714. $this->assertEquals($pool, $admin->getConfigurationPool());
  715. }
  716. public function testGetShowBuilder()
  717. {
  718. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  719. $this->assertNull($admin->getShowBuilder());
  720. $showBuilder = $this->getMock('Sonata\AdminBundle\Builder\ShowBuilderInterface');
  721. $admin->setShowBuilder($showBuilder);
  722. $this->assertEquals($showBuilder, $admin->getShowBuilder());
  723. }
  724. public function testGetListBuilder()
  725. {
  726. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  727. $this->assertNull($admin->getListBuilder());
  728. $listBuilder = $this->getMock('Sonata\AdminBundle\Builder\ListBuilderInterface');
  729. $admin->setListBuilder($listBuilder);
  730. $this->assertEquals($listBuilder, $admin->getListBuilder());
  731. }
  732. public function testGetDatagridBuilder()
  733. {
  734. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  735. $this->assertNull($admin->getDatagridBuilder());
  736. $datagridBuilder = $this->getMock('Sonata\AdminBundle\Builder\DatagridBuilderInterface');
  737. $admin->setDatagridBuilder($datagridBuilder);
  738. $this->assertEquals($datagridBuilder, $admin->getDatagridBuilder());
  739. }
  740. public function testGetFormContractor()
  741. {
  742. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  743. $this->assertNull($admin->getFormContractor());
  744. $formContractor = $this->getMock('Sonata\AdminBundle\Builder\FormContractorInterface');
  745. $admin->setFormContractor($formContractor);
  746. $this->assertEquals($formContractor, $admin->getFormContractor());
  747. }
  748. public function testGetRequest()
  749. {
  750. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  751. $this->assertFalse($admin->hasRequest());
  752. $request = new Request();
  753. $admin->setRequest($request);
  754. $this->assertEquals($request, $admin->getRequest());
  755. $this->assertTrue($admin->hasRequest());
  756. }
  757. public function testGetRequestWithException()
  758. {
  759. $this->setExpectedException('RuntimeException', 'The Request object has not been set');
  760. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  761. $admin->getRequest();
  762. }
  763. public function testGetTranslationDomain()
  764. {
  765. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  766. $this->assertEquals('messages', $admin->getTranslationDomain());
  767. $admin->setTranslationDomain('foo');
  768. $this->assertEquals('foo', $admin->getTranslationDomain());
  769. }
  770. public function testGetTranslator()
  771. {
  772. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  773. $this->assertNull($admin->getTranslator());
  774. $translator = $this->getMock('Symfony\Component\Translation\TranslatorInterface');
  775. $admin->setTranslator($translator);
  776. $this->assertEquals($translator, $admin->getTranslator());
  777. }
  778. public function testGetShowGroups()
  779. {
  780. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  781. $this->assertEquals(false, $admin->getShowGroups());
  782. $groups = array('foo', 'bar', 'baz');
  783. $admin->setShowGroups($groups);
  784. $this->assertSame($groups, $admin->getShowGroups());
  785. }
  786. public function testGetFormGroups()
  787. {
  788. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  789. $this->assertEquals(false, $admin->getFormGroups());
  790. $groups = array('foo', 'bar', 'baz');
  791. $admin->setFormGroups($groups);
  792. $this->assertSame($groups, $admin->getFormGroups());
  793. }
  794. public function testGetMaxPageLinks()
  795. {
  796. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  797. $this->assertEquals(25, $admin->getMaxPageLinks());
  798. $admin->setMaxPageLinks(14);
  799. $this->assertSame(14, $admin->getMaxPageLinks());
  800. }
  801. public function testGetMaxPerPage()
  802. {
  803. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  804. $this->assertEquals(32, $admin->getMaxPerPage());
  805. $admin->setMaxPerPage(94);
  806. $this->assertSame(94, $admin->getMaxPerPage());
  807. }
  808. public function testGetLabel()
  809. {
  810. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  811. $this->assertNull($admin->getLabel());
  812. $admin->setLabel('FooLabel');
  813. $this->assertSame('FooLabel', $admin->getLabel());
  814. }
  815. public function testGetBaseController()
  816. {
  817. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  818. $this->assertEquals('SonataNewsBundle:PostAdmin', $admin->getBaseControllerName());
  819. $admin->setBaseControllerName('SonataNewsBundle:FooAdmin');
  820. $this->assertSame('SonataNewsBundle:FooAdmin', $admin->getBaseControllerName());
  821. }
  822. public function testGetTemplates()
  823. {
  824. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  825. $this->assertEquals(array(), $admin->getTemplates());
  826. $templates = array(
  827. 'list' => 'FooAdminBundle:CRUD:list.html.twig',
  828. 'show' => 'FooAdminBundle:CRUD:show.html.twig',
  829. 'edit' => 'FooAdminBundle:CRUD:edit.html.twig'
  830. );
  831. $admin->setTemplates($templates);
  832. $this->assertSame($templates, $admin->getTemplates());
  833. }
  834. public function testGetTemplate1()
  835. {
  836. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  837. $this->assertNull($admin->getTemplate('edit'));
  838. $templates = array(
  839. 'list' => 'FooAdminBundle:CRUD:list.html.twig',
  840. 'show' => 'FooAdminBundle:CRUD:show.html.twig',
  841. 'edit' => 'FooAdminBundle:CRUD:edit.html.twig'
  842. );
  843. $admin->setTemplate('edit', 'FooAdminBundle:CRUD:edit.html.twig');
  844. $admin->setTemplate('show', 'FooAdminBundle:CRUD:show.html.twig');
  845. $this->assertEquals('FooAdminBundle:CRUD:edit.html.twig', $admin->getTemplate('edit'));
  846. $this->assertEquals('FooAdminBundle:CRUD:show.html.twig', $admin->getTemplate('show'));
  847. }
  848. public function testGetTemplate2()
  849. {
  850. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  851. $this->assertNull($admin->getTemplate('edit'));
  852. $templates = array(
  853. 'list' => 'FooAdminBundle:CRUD:list.html.twig',
  854. 'show' => 'FooAdminBundle:CRUD:show.html.twig',
  855. 'edit' => 'FooAdminBundle:CRUD:edit.html.twig'
  856. );
  857. $admin->setTemplates($templates);
  858. $this->assertEquals('FooAdminBundle:CRUD:edit.html.twig', $admin->getTemplate('edit'));
  859. $this->assertEquals('FooAdminBundle:CRUD:show.html.twig', $admin->getTemplate('show'));
  860. }
  861. public function testGetIdParameter()
  862. {
  863. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  864. $this->assertEquals('id', $admin->getIdParameter());
  865. $this->assertFalse($admin->isChild());
  866. $parentAdmin = new PostAdmin('sonata.post.admin.post_parent', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostParentAdmin');
  867. $admin->setParent($parentAdmin);
  868. $this->assertTrue($admin->isChild());
  869. $this->assertEquals('childId', $admin->getIdParameter());
  870. }
  871. public function testGetExportFormats()
  872. {
  873. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  874. $this->assertEquals(array('json', 'xml', 'csv', 'xls'), $admin->getExportFormats());
  875. }
  876. public function testGetUrlsafeIdentifier()
  877. {
  878. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  879. $entity = new \stdClass();
  880. $modelManager = $this->getMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  881. $modelManager->expects($this->once())
  882. ->method('getUrlsafeIdentifier')
  883. ->with($this->equalTo($entity))
  884. ->will($this->returnValue('foo'));
  885. $admin->setModelManager($modelManager);
  886. $this->assertEquals('foo', $admin->getUrlsafeIdentifier($entity));
  887. }
  888. public function testDeterminedPerPageValue()
  889. {
  890. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  891. $this->assertFalse($admin->determinedPerPageValue('foo'));
  892. $this->assertFalse($admin->determinedPerPageValue(123));
  893. $this->assertTrue($admin->determinedPerPageValue(16));
  894. $this->assertTrue($admin->determinedPerPageValue(32));
  895. $this->assertTrue($admin->determinedPerPageValue(64));
  896. $this->assertTrue($admin->determinedPerPageValue(128));
  897. $this->assertTrue($admin->determinedPerPageValue(192));
  898. $admin->setPerPageOptions(array(101, 102, 103));
  899. $this->assertFalse($admin->determinedPerPageValue(15));
  900. $this->assertFalse($admin->determinedPerPageValue(25));
  901. $this->assertFalse($admin->determinedPerPageValue(200));
  902. $this->assertTrue($admin->determinedPerPageValue(101));
  903. $this->assertTrue($admin->determinedPerPageValue(102));
  904. $this->assertTrue($admin->determinedPerPageValue(103));
  905. }
  906. public function testIsGranted()
  907. {
  908. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  909. $entity = new \stdClass();
  910. $securityHandler=$this->getMock('Sonata\AdminBundle\Security\Handler\AclSecurityHandlerInterface');
  911. $securityHandler->expects($this->any())
  912. ->method('isGranted')
  913. ->will($this->returnCallback(function (AdminInterface $adminIn, $attributes, $object = null) use ($admin, $entity) {
  914. if ($admin == $adminIn && $attributes == 'FOO') {
  915. if (($object == $admin) || ($object == $entity)) {
  916. return true;
  917. }
  918. }
  919. return false;
  920. }));
  921. $admin->setSecurityHandler($securityHandler);
  922. $this->assertTrue($admin->isGranted('FOO'));
  923. $this->assertTrue($admin->isGranted('FOO', $entity));
  924. $this->assertFalse($admin->isGranted('BAR'));
  925. $this->assertFalse($admin->isGranted('BAR', $entity));
  926. }
  927. public function testSupportsPreviewMode()
  928. {
  929. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  930. $this->assertFalse($admin->supportsPreviewMode());
  931. }
  932. public function testGetPermissionsShow()
  933. {
  934. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  935. $this->assertEquals(array('LIST'), $admin->getPermissionsShow(Admin::CONTEXT_DASHBOARD));
  936. $this->assertEquals(array('LIST'), $admin->getPermissionsShow(Admin::CONTEXT_MENU));
  937. $this->assertEquals(array('LIST'), $admin->getPermissionsShow('foo'));
  938. }
  939. public function testShowIn()
  940. {
  941. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  942. $securityHandler=$this->getMock('Sonata\AdminBundle\Security\Handler\AclSecurityHandlerInterface');
  943. $securityHandler->expects($this->any())
  944. ->method('isGranted')
  945. ->will($this->returnCallback(function (AdminInterface $adminIn, $attributes, $object = null) use ($admin) {
  946. if ($admin == $adminIn && $attributes == array('LIST')) {
  947. return true;
  948. }
  949. return false;
  950. }));
  951. $admin->setSecurityHandler($securityHandler);
  952. $this->assertTrue($admin->showIn(Admin::CONTEXT_DASHBOARD));
  953. $this->assertTrue($admin->showIn(Admin::CONTEXT_MENU));
  954. $this->assertTrue($admin->showIn('foo'));
  955. }
  956. public function testGetObjectIdentifier()
  957. {
  958. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  959. $this->assertEquals('sonata.post.admin.post', $admin->getObjectIdentifier());
  960. }
  961. public function testTransWithNoTranslator()
  962. {
  963. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  964. $this->assertEquals('foo', $admin->trans('foo'));
  965. }
  966. public function testTrans()
  967. {
  968. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  969. $admin->setTranslationDomain('fooMessageDomain');
  970. $translator = $this->getMock('Symfony\Component\Translation\TranslatorInterface');
  971. $admin->setTranslator($translator);
  972. $translator->expects($this->once())
  973. ->method('trans')
  974. ->with($this->equalTo('foo'), $this->equalTo(array()), $this->equalTo('fooMessageDomain'))
  975. ->will($this->returnValue('fooTranslated'));
  976. $this->assertEquals('fooTranslated', $admin->trans('foo'));
  977. }
  978. public function testTransWithMessageDomain()
  979. {
  980. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  981. $translator = $this->getMock('Symfony\Component\Translation\TranslatorInterface');
  982. $admin->setTranslator($translator);
  983. $translator->expects($this->once())
  984. ->method('trans')
  985. ->with($this->equalTo('foo'), $this->equalTo(array('name'=>'Andrej')), $this->equalTo('fooMessageDomain'))
  986. ->will($this->returnValue('fooTranslated'));
  987. $this->assertEquals('fooTranslated', $admin->trans('foo', array('name'=>'Andrej'), 'fooMessageDomain'));
  988. }
  989. public function testTransChoiceWithNoTranslator()
  990. {
  991. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  992. $this->assertEquals('foo', $admin->transChoice('foo', 2));
  993. }
  994. public function testTransChoice()
  995. {
  996. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  997. $admin->setTranslationDomain('fooMessageDomain');
  998. $translator = $this->getMock('Symfony\Component\Translation\TranslatorInterface');
  999. $admin->setTranslator($translator);
  1000. $translator->expects($this->once())
  1001. ->method('transChoice')
  1002. ->with($this->equalTo('foo'), $this->equalTo(2), $this->equalTo(array()), $this->equalTo('fooMessageDomain'))
  1003. ->will($this->returnValue('fooTranslated'));
  1004. $this->assertEquals('fooTranslated', $admin->transChoice('foo', 2));
  1005. }
  1006. public function testTransChoiceWithMessageDomain()
  1007. {
  1008. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1009. $translator = $this->getMock('Symfony\Component\Translation\TranslatorInterface');
  1010. $admin->setTranslator($translator);
  1011. $translator->expects($this->once())
  1012. ->method('transChoice')
  1013. ->with($this->equalTo('foo'), $this->equalTo(2), $this->equalTo(array('name'=>'Andrej')), $this->equalTo('fooMessageDomain'))
  1014. ->will($this->returnValue('fooTranslated'));
  1015. $this->assertEquals('fooTranslated', $admin->transChoice('foo', 2, array('name'=>'Andrej'), 'fooMessageDomain'));
  1016. }
  1017. public function testSetPersistFilters()
  1018. {
  1019. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1020. $this->assertAttributeEquals(false, 'persistFilters', $admin);
  1021. $admin->setPersistFilters(true);
  1022. $this->assertAttributeEquals(true, 'persistFilters', $admin);
  1023. }
  1024. public function testGetRootCode()
  1025. {
  1026. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1027. $this->assertEquals('sonata.post.admin.post', $admin->getRootCode());
  1028. $parentAdmin = new PostAdmin('sonata.post.admin.post.parent', 'NewsBundle\Entity\PostParent', 'SonataNewsBundle:PostParentAdmin');
  1029. $parentFieldDescription = $this->getMock('Sonata\AdminBundle\Admin\FieldDescriptionInterface');
  1030. $parentFieldDescription->expects($this->once())
  1031. ->method('getAdmin')
  1032. ->will($this->returnValue($parentAdmin));
  1033. $this->assertNull($admin->getParentFieldDescription());
  1034. $admin->setParentFieldDescription($parentFieldDescription);
  1035. $this->assertEquals($parentFieldDescription, $admin->getParentFieldDescription());
  1036. $this->assertEquals('sonata.post.admin.post.parent', $admin->getRootCode());
  1037. }
  1038. public function testGetRoot()
  1039. {
  1040. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1041. $this->assertEquals($admin, $admin->getRoot());
  1042. $parentAdmin = new PostAdmin('sonata.post.admin.post.parent', 'NewsBundle\Entity\PostParent', 'SonataNewsBundle:PostParentAdmin');
  1043. $parentFieldDescription = $this->getMock('Sonata\AdminBundle\Admin\FieldDescriptionInterface');
  1044. $parentFieldDescription->expects($this->once())
  1045. ->method('getAdmin')
  1046. ->will($this->returnValue($parentAdmin));
  1047. $this->assertNull($admin->getParentFieldDescription());
  1048. $admin->setParentFieldDescription($parentFieldDescription);
  1049. $this->assertEquals($parentFieldDescription, $admin->getParentFieldDescription());
  1050. $this->assertEquals($parentAdmin, $admin->getRoot());
  1051. }
  1052. public function testGetExportFields()
  1053. {
  1054. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1055. $modelManager = $this->getMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  1056. $modelManager->expects($this->once())
  1057. ->method('getExportFields')
  1058. ->with($this->equalTo('NewsBundle\Entity\Post'))
  1059. ->will($this->returnValue(array('foo', 'bar')));
  1060. $admin->setModelManager($modelManager);
  1061. $this->assertSame(array('foo', 'bar'), $admin->getExportFields());
  1062. }
  1063. public function testGetPersistentParametersWithNoExtension()
  1064. {
  1065. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1066. $this->assertEmpty($admin->getPersistentParameters());
  1067. }
  1068. /**
  1069. * @expectedException \RuntimeException
  1070. */
  1071. public function testGetPersistentParametersWithInvalidExtension()
  1072. {
  1073. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1074. $extension = $this->getMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
  1075. $extension->expects($this->once())->method('getPersistentParameters')->will($this->returnValue(null));
  1076. $admin->addExtension($extension);
  1077. $admin->getPersistentParameters();
  1078. }
  1079. public function testGetPersistentParametersWithValidExtension()
  1080. {
  1081. $expected = array(
  1082. 'context' => 'foobar'
  1083. );
  1084. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1085. $extension = $this->getMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
  1086. $extension->expects($this->once())->method('getPersistentParameters')->will($this->returnValue($expected));
  1087. $admin->addExtension($extension);
  1088. $this->assertEquals($expected, $admin->getPersistentParameters());
  1089. }
  1090. public function testGetFormWithNonCollectionParentValue()
  1091. {
  1092. $post = new Post();
  1093. $tagAdmin = $this->createTagAdmin($post);
  1094. $tag = $tagAdmin->getSubject();
  1095. $tag->setPosts(null);
  1096. $tagAdmin->getForm();
  1097. $this->assertSame($post, $tag->getPosts());
  1098. }
  1099. public function testGetFormWithCollectionParentValue()
  1100. {
  1101. $post = new Post();
  1102. $tagAdmin = $this->createTagAdmin($post);
  1103. $tag = $tagAdmin->getSubject();
  1104. // Case of a doctrine collection
  1105. $this->assertInstanceOf('Doctrine\Common\Collections\Collection', $tag->getPosts());
  1106. $this->assertCount(0, $tag->getPosts());
  1107. $tag->addPost(new Post());
  1108. $this->assertCount(1, $tag->getPosts());
  1109. $tagAdmin->getForm();
  1110. $this->assertInstanceOf('Doctrine\Common\Collections\Collection', $tag->getPosts());
  1111. $this->assertCount(2, $tag->getPosts());
  1112. $this->assertContains($post, $tag->getPosts());
  1113. // Case of an array
  1114. $tag->setPosts(array());
  1115. $this->assertCount(0, $tag->getPosts());
  1116. $tag->addPost(new Post());
  1117. $this->assertCount(1, $tag->getPosts());
  1118. $tagAdmin->getForm();
  1119. $this->assertInternalType('array', $tag->getPosts());
  1120. $this->assertCount(2, $tag->getPosts());
  1121. $this->assertContains($post, $tag->getPosts());
  1122. }
  1123. private function createTagAdmin(Post $post)
  1124. {
  1125. $postAdmin = $this->getMockBuilder('Sonata\AdminBundle\Tests\Fixtures\Admin\PostAdmin')
  1126. ->disableOriginalConstructor()
  1127. ->getMock();
  1128. $postAdmin->expects($this->any())->method('getObject')->will($this->returnValue($post));
  1129. $formBuilder = $this->getMockForAbstractClass('Sonata\AdminBundle\Tests\Form\Builder\FormBuilder');
  1130. $formBuilder->expects($this->any())->method('getForm')->will($this->returnValue(null));
  1131. $tagAdmin = $this->getMockBuilder('Sonata\AdminBundle\Tests\Fixtures\Admin\TagAdmin')
  1132. ->disableOriginalConstructor()
  1133. ->setMethods(array('getFormBuilder'))
  1134. ->getMock();
  1135. $tagAdmin->expects($this->any())->method('getFormBuilder')->will($this->returnValue($formBuilder));
  1136. $tagAdmin->setParent($postAdmin);
  1137. $tag = new Tag();
  1138. $tagAdmin->setSubject($tag);
  1139. $request = $this->getMock('Symfony\Component\HttpFoundation\Request');
  1140. $tagAdmin->setRequest($request);
  1141. return $tagAdmin;
  1142. }
  1143. public function testRemoveFieldFromFormGroup()
  1144. {
  1145. $formGroups = array(
  1146. 'foobar' => array(
  1147. 'fields' => array(
  1148. 'foo' => 'foo',
  1149. 'bar' => 'bar',
  1150. ),
  1151. )
  1152. );
  1153. $admin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1154. $admin->setFormGroups($formGroups);
  1155. $admin->removeFieldFromFormGroup('foo');
  1156. $this->assertEquals($admin->getFormGroups(), array(
  1157. 'foobar' => array(
  1158. 'fields' => array(
  1159. 'bar' => 'bar',
  1160. ),
  1161. )
  1162. ));
  1163. $admin->removeFieldFromFormGroup('bar');
  1164. $this->assertEquals($admin->getFormGroups(), array());
  1165. }
  1166. public function testGetFilterParameters()
  1167. {
  1168. $authorId = uniqid();
  1169. $postAdmin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1170. $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  1171. $commentAdmin->setParentAssociationMapping('post.author');
  1172. $commentAdmin->setParent($postAdmin);
  1173. $request = $this->getMock('Symfony\Component\HttpFoundation\Request', array('get'));
  1174. $request->expects($this->any())
  1175. ->method('get')
  1176. ->will($this->returnValue($authorId));
  1177. $commentAdmin->setRequest($request);
  1178. $modelManager = $this->getMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  1179. $modelManager->expects($this->any())
  1180. ->method('getDefaultSortValues')
  1181. ->will($this->returnValue(array()));
  1182. $commentAdmin->setModelManager($modelManager);
  1183. $parameters = $commentAdmin->getFilterParameters();
  1184. $this->assertTrue(isset($parameters['post__author']));
  1185. $this->assertEquals(array('value' => $authorId), $parameters['post__author']);
  1186. }
  1187. }
  1188. class DummySubject
  1189. {
  1190. public function __toString()
  1191. {
  1192. return 'dummy subject representation';
  1193. }
  1194. }