AdminTest.php 91 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397
  1. <?php
  2. /*
  3. * This file is part of the Sonata Project 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\AbstractAdmin;
  12. use Sonata\AdminBundle\Admin\AdminInterface;
  13. use Sonata\AdminBundle\Admin\Pool;
  14. use Sonata\AdminBundle\Route\DefaultRouteGenerator;
  15. use Sonata\AdminBundle\Route\RoutesCache;
  16. use Sonata\AdminBundle\Tests\Fixtures\Admin\CommentAdmin;
  17. use Sonata\AdminBundle\Tests\Fixtures\Admin\CommentVoteAdmin;
  18. use Sonata\AdminBundle\Tests\Fixtures\Admin\CommentWithCustomRouteAdmin;
  19. use Sonata\AdminBundle\Tests\Fixtures\Admin\FieldDescription;
  20. use Sonata\AdminBundle\Tests\Fixtures\Admin\FilteredAdmin;
  21. use Sonata\AdminBundle\Tests\Fixtures\Admin\ModelAdmin;
  22. use Sonata\AdminBundle\Tests\Fixtures\Admin\PostAdmin;
  23. use Sonata\AdminBundle\Tests\Fixtures\Admin\PostWithCustomRouteAdmin;
  24. use Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\Comment;
  25. use Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\Post;
  26. use Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\Tag;
  27. use Sonata\AdminBundle\Tests\Fixtures\Entity\FooToString;
  28. use Sonata\AdminBundle\Tests\Fixtures\Entity\FooToStringNull;
  29. use Sonata\AdminBundle\Tests\Helpers\PHPUnit_Framework_TestCase;
  30. use Sonata\CoreBundle\Model\Adapter\AdapterInterface;
  31. use Symfony\Component\DependencyInjection\Container;
  32. use Symfony\Component\HttpFoundation\Request;
  33. use Symfony\Component\PropertyAccess\PropertyAccess;
  34. class AdminTest extends PHPUnit_Framework_TestCase
  35. {
  36. protected $cacheTempFolder;
  37. public function setUp()
  38. {
  39. $this->cacheTempFolder = sys_get_temp_dir().'/sonata_test_route';
  40. exec('rm -rf '.$this->cacheTempFolder);
  41. }
  42. /**
  43. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::__construct
  44. */
  45. public function testConstructor()
  46. {
  47. $class = 'Application\Sonata\NewsBundle\Entity\Post';
  48. $baseControllerName = 'SonataNewsBundle:PostAdmin';
  49. $admin = new PostAdmin('sonata.post.admin.post', $class, $baseControllerName);
  50. $this->assertInstanceOf('Sonata\AdminBundle\Admin\AbstractAdmin', $admin);
  51. $this->assertSame($class, $admin->getClass());
  52. $this->assertSame($baseControllerName, $admin->getBaseControllerName());
  53. }
  54. public function testGetClass()
  55. {
  56. $class = 'Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\Post';
  57. $baseControllerName = 'SonataNewsBundle:PostAdmin';
  58. $admin = new PostAdmin('sonata.post.admin.post', $class, $baseControllerName);
  59. $admin->setSubject(new \Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\BlogPost());
  60. $this->assertSame(
  61. 'Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\BlogPost',
  62. $admin->getClass()
  63. );
  64. $admin->setSubClasses(array('foo'));
  65. $this->assertSame(
  66. 'Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\BlogPost',
  67. $admin->getClass()
  68. );
  69. $admin->setSubject(null);
  70. $admin->setSubClasses(array());
  71. $this->assertSame($class, $admin->getClass());
  72. $admin->setSubClasses(array('foo' => 'bar'));
  73. $admin->setRequest(new Request(array('subclass' => 'foo')));
  74. $this->assertSame('bar', $admin->getClass());
  75. }
  76. /**
  77. * @expectedException \RuntimeException
  78. * @expectedExceptionMessage Feature not implemented: an embedded admin cannot have subclass
  79. */
  80. public function testGetClassException()
  81. {
  82. $class = 'Application\Sonata\NewsBundle\Entity\Post';
  83. $baseControllerName = 'SonataNewsBundle:PostAdmin';
  84. $admin = new PostAdmin('sonata.post.admin.post', $class, $baseControllerName);
  85. $admin->setParentFieldDescription(new FieldDescription());
  86. $admin->setSubClasses(array('foo' => 'bar'));
  87. $admin->setRequest(new Request(array('subclass' => 'foo')));
  88. $admin->getClass();
  89. }
  90. public function testCheckAccessThrowsExceptionOnMadeUpAction()
  91. {
  92. $admin = new PostAdmin(
  93. 'sonata.post.admin.post',
  94. 'Application\Sonata\NewsBundle\Entity\Post',
  95. 'SonataNewsBundle:PostAdmin'
  96. );
  97. $this->setExpectedException(
  98. '\InvalidArgumentException',
  99. 'Action "made-up" could not be found'
  100. );
  101. $admin->checkAccess('made-up');
  102. }
  103. public function testCheckAccessThrowsAccessDeniedException()
  104. {
  105. $admin = new PostAdmin(
  106. 'sonata.post.admin.post',
  107. 'Application\Sonata\NewsBundle\Entity\Post',
  108. 'SonataNewsBundle:PostAdmin'
  109. );
  110. $securityHandler = $this->prophesize(
  111. 'Sonata\AdminBundle\Security\Handler\SecurityHandlerInterface'
  112. );
  113. $securityHandler->isGranted($admin, 'CUSTOM_ROLE', $admin)->willReturn(true);
  114. $securityHandler->isGranted($admin, 'EXTRA_CUSTOM_ROLE', $admin)->willReturn(false);
  115. $customExtension = $this->prophesize(
  116. 'Sonata\AdminBundle\Admin\AbstractAdminExtension'
  117. );
  118. $customExtension->getAccessMapping($admin)->willReturn(
  119. array('custom_action' => array('CUSTOM_ROLE', 'EXTRA_CUSTOM_ROLE'))
  120. );
  121. $admin->addExtension($customExtension->reveal());
  122. $admin->setSecurityHandler($securityHandler->reveal());
  123. $this->setExpectedException(
  124. 'Symfony\Component\Security\Core\Exception\AccessDeniedException',
  125. 'Access Denied to the action custom_action and role EXTRA_CUSTOM_ROLE'
  126. );
  127. $admin->checkAccess('custom_action');
  128. }
  129. public function testHasAccessOnMadeUpAction()
  130. {
  131. $admin = new PostAdmin(
  132. 'sonata.post.admin.post',
  133. 'Application\Sonata\NewsBundle\Entity\Post',
  134. 'SonataNewsBundle:PostAdmin'
  135. );
  136. $this->assertFalse($admin->hasAccess('made-up'));
  137. }
  138. public function testHasAccess()
  139. {
  140. $admin = new PostAdmin(
  141. 'sonata.post.admin.post',
  142. 'Application\Sonata\NewsBundle\Entity\Post',
  143. 'SonataNewsBundle:PostAdmin'
  144. );
  145. $securityHandler = $this->prophesize(
  146. 'Sonata\AdminBundle\Security\Handler\SecurityHandlerInterface'
  147. );
  148. $securityHandler->isGranted($admin, 'CUSTOM_ROLE', $admin)->willReturn(true);
  149. $securityHandler->isGranted($admin, 'EXTRA_CUSTOM_ROLE', $admin)->willReturn(false);
  150. $customExtension = $this->prophesize(
  151. 'Sonata\AdminBundle\Admin\AbstractAdminExtension'
  152. );
  153. $customExtension->getAccessMapping($admin)->willReturn(
  154. array('custom_action' => array('CUSTOM_ROLE', 'EXTRA_CUSTOM_ROLE'))
  155. );
  156. $admin->addExtension($customExtension->reveal());
  157. $admin->setSecurityHandler($securityHandler->reveal());
  158. $this->assertFalse($admin->hasAccess('custom_action'));
  159. }
  160. public function testHasAccessAllowsAccess()
  161. {
  162. $admin = new PostAdmin(
  163. 'sonata.post.admin.post',
  164. 'Application\Sonata\NewsBundle\Entity\Post',
  165. 'SonataNewsBundle:PostAdmin'
  166. );
  167. $securityHandler = $this->prophesize(
  168. 'Sonata\AdminBundle\Security\Handler\SecurityHandlerInterface'
  169. );
  170. $securityHandler->isGranted($admin, 'CUSTOM_ROLE', $admin)->willReturn(true);
  171. $securityHandler->isGranted($admin, 'EXTRA_CUSTOM_ROLE', $admin)->willReturn(true);
  172. $customExtension = $this->prophesize(
  173. 'Sonata\AdminBundle\Admin\AbstractAdminExtension'
  174. );
  175. $customExtension->getAccessMapping($admin)->willReturn(
  176. array('custom_action' => array('CUSTOM_ROLE', 'EXTRA_CUSTOM_ROLE'))
  177. );
  178. $admin->addExtension($customExtension->reveal());
  179. $admin->setSecurityHandler($securityHandler->reveal());
  180. $this->assertTrue($admin->hasAccess('custom_action'));
  181. }
  182. public function testHasAccessAllowsAccessEditAction()
  183. {
  184. $admin = new PostAdmin(
  185. 'sonata.post.admin.post',
  186. 'Application\Sonata\NewsBundle\Entity\Post',
  187. 'SonataNewsBundle:PostAdmin'
  188. );
  189. $securityHandler = $this->prophesize(
  190. 'Sonata\AdminBundle\Security\Handler\SecurityHandlerInterface'
  191. );
  192. $securityHandler->isGranted($admin, 'EDIT_ROLE', $admin)->willReturn(true);
  193. $customExtension = $this->prophesize(
  194. 'Sonata\AdminBundle\Admin\AbstractAdminExtension'
  195. );
  196. $customExtension->getAccessMapping($admin)->willReturn(
  197. array('edit_action' => array('EDIT_ROLE'))
  198. );
  199. $admin->addExtension($customExtension->reveal());
  200. $admin->setSecurityHandler($securityHandler->reveal());
  201. $this->assertTrue($admin->hasAccess('edit_action'));
  202. }
  203. /**
  204. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::hasChild
  205. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::addChild
  206. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::getChild
  207. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::isChild
  208. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::hasChildren
  209. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::getChildren
  210. */
  211. public function testChildren()
  212. {
  213. $postAdmin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  214. $this->assertFalse($postAdmin->hasChildren());
  215. $this->assertFalse($postAdmin->hasChild('comment'));
  216. $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  217. $postAdmin->addChild($commentAdmin);
  218. $this->assertTrue($postAdmin->hasChildren());
  219. $this->assertTrue($postAdmin->hasChild('sonata.post.admin.comment'));
  220. $this->assertSame('sonata.post.admin.comment', $postAdmin->getChild('sonata.post.admin.comment')->getCode());
  221. $this->assertSame('sonata.post.admin.post|sonata.post.admin.comment', $postAdmin->getChild('sonata.post.admin.comment')->getBaseCodeRoute());
  222. $this->assertSame($postAdmin, $postAdmin->getChild('sonata.post.admin.comment')->getParent());
  223. $this->assertFalse($postAdmin->isChild());
  224. $this->assertTrue($commentAdmin->isChild());
  225. $this->assertSame(array('sonata.post.admin.comment' => $commentAdmin), $postAdmin->getChildren());
  226. }
  227. /**
  228. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::configure
  229. */
  230. public function testConfigure()
  231. {
  232. $admin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  233. $this->assertNotNull($admin->getUniqid());
  234. $admin->initialize();
  235. $this->assertNotNull($admin->getUniqid());
  236. $this->assertSame('Post', $admin->getClassnameLabel());
  237. $admin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  238. $admin->setClassnameLabel('postcomment');
  239. $admin->initialize();
  240. $this->assertSame('postcomment', $admin->getClassnameLabel());
  241. }
  242. public function testConfigureWithValidParentAssociationMapping()
  243. {
  244. $admin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  245. $admin->setParentAssociationMapping('Category');
  246. $admin->initialize();
  247. $this->assertSame('Category', $admin->getParentAssociationMapping());
  248. }
  249. public function provideGetBaseRoutePattern()
  250. {
  251. return array(
  252. array(
  253. 'Application\Sonata\NewsBundle\Entity\Post',
  254. '/sonata/news/post',
  255. ),
  256. array(
  257. 'Application\Sonata\NewsBundle\Document\Post',
  258. '/sonata/news/post',
  259. ),
  260. array(
  261. 'MyApplication\MyBundle\Entity\Post',
  262. '/myapplication/my/post',
  263. ),
  264. array(
  265. 'MyApplication\MyBundle\Entity\Post\Category',
  266. '/myapplication/my/post-category',
  267. ),
  268. array(
  269. 'MyApplication\MyBundle\Entity\Product\Category',
  270. '/myapplication/my/product-category',
  271. ),
  272. array(
  273. 'MyApplication\MyBundle\Entity\Other\Product\Category',
  274. '/myapplication/my/other-product-category',
  275. ),
  276. array(
  277. 'Symfony\Cmf\Bundle\FooBundle\Document\Menu',
  278. '/cmf/foo/menu',
  279. ),
  280. array(
  281. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\Phpcr\Menu',
  282. '/cmf/foo/menu',
  283. ),
  284. array(
  285. 'Symfony\Bundle\BarBarBundle\Doctrine\Phpcr\Menu',
  286. '/symfony/barbar/menu',
  287. ),
  288. array(
  289. 'Symfony\Bundle\BarBarBundle\Doctrine\Phpcr\Menu\Item',
  290. '/symfony/barbar/menu-item',
  291. ),
  292. array(
  293. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\Orm\Menu',
  294. '/cmf/foo/menu',
  295. ),
  296. array(
  297. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\MongoDB\Menu',
  298. '/cmf/foo/menu',
  299. ),
  300. array(
  301. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\CouchDB\Menu',
  302. '/cmf/foo/menu',
  303. ),
  304. array(
  305. 'AppBundle\Entity\User',
  306. '/app/user',
  307. ),
  308. array(
  309. 'App\Entity\User',
  310. '/app/user',
  311. ),
  312. );
  313. }
  314. /**
  315. * @dataProvider provideGetBaseRoutePattern
  316. */
  317. public function testGetBaseRoutePattern($objFqn, $expected)
  318. {
  319. $admin = new PostAdmin('sonata.post.admin.post', $objFqn, 'SonataNewsBundle:PostAdmin');
  320. $this->assertSame($expected, $admin->getBaseRoutePattern());
  321. }
  322. /**
  323. * @dataProvider provideGetBaseRoutePattern
  324. */
  325. public function testGetBaseRoutePatternWithChildAdmin($objFqn, $expected)
  326. {
  327. $postAdmin = new PostAdmin('sonata.post.admin.post', $objFqn, 'SonataNewsBundle:PostAdmin');
  328. $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  329. $commentAdmin->setParent($postAdmin);
  330. $this->assertSame($expected.'/{id}/comment', $commentAdmin->getBaseRoutePattern());
  331. }
  332. /**
  333. * @dataProvider provideGetBaseRoutePattern
  334. */
  335. public function testGetBaseRoutePatternWithTwoNestedChildAdmin($objFqn, $expected)
  336. {
  337. $postAdmin = new PostAdmin('sonata.post.admin.post', $objFqn, 'SonataNewsBundle:PostAdmin');
  338. $commentAdmin = new CommentAdmin(
  339. 'sonata.post.admin.comment',
  340. 'Application\Sonata\NewsBundle\Entity\Comment',
  341. 'SonataNewsBundle:CommentAdmin'
  342. );
  343. $commentVoteAdmin = new CommentVoteAdmin(
  344. 'sonata.post.admin.comment_vote',
  345. 'Application\Sonata\NewsBundle\Entity\CommentVote',
  346. 'SonataNewsBundle:CommentVoteAdmin'
  347. );
  348. $commentAdmin->setParent($postAdmin);
  349. $commentVoteAdmin->setParent($commentAdmin);
  350. $this->assertSame($expected.'/{id}/comment/{childId}/commentvote', $commentVoteAdmin->getBaseRoutePattern());
  351. }
  352. public function testGetBaseRoutePatternWithSpecifedPattern()
  353. {
  354. $postAdmin = new PostWithCustomRouteAdmin('sonata.post.admin.post_with_custom_route', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostWithCustomRouteAdmin');
  355. $this->assertSame('/post-custom', $postAdmin->getBaseRoutePattern());
  356. }
  357. public function testGetBaseRoutePatternWithChildAdminAndWithSpecifedPattern()
  358. {
  359. $postAdmin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  360. $commentAdmin = new CommentWithCustomRouteAdmin('sonata.post.admin.comment_with_custom_route', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentWithCustomRouteAdmin');
  361. $commentAdmin->setParent($postAdmin);
  362. $this->assertSame('/sonata/news/post/{id}/comment-custom', $commentAdmin->getBaseRoutePattern());
  363. }
  364. /**
  365. * @expectedException \RuntimeException
  366. */
  367. public function testGetBaseRoutePatternWithUnreconizedClassname()
  368. {
  369. $admin = new PostAdmin('sonata.post.admin.post', 'News\Thing\Post', 'SonataNewsBundle:PostAdmin');
  370. $admin->getBaseRoutePattern();
  371. }
  372. public function provideGetBaseRouteName()
  373. {
  374. return array(
  375. array(
  376. 'Application\Sonata\NewsBundle\Entity\Post',
  377. 'admin_sonata_news_post',
  378. ),
  379. array(
  380. 'Application\Sonata\NewsBundle\Document\Post',
  381. 'admin_sonata_news_post',
  382. ),
  383. array(
  384. 'MyApplication\MyBundle\Entity\Post',
  385. 'admin_myapplication_my_post',
  386. ),
  387. array(
  388. 'MyApplication\MyBundle\Entity\Post\Category',
  389. 'admin_myapplication_my_post_category',
  390. ),
  391. array(
  392. 'MyApplication\MyBundle\Entity\Product\Category',
  393. 'admin_myapplication_my_product_category',
  394. ),
  395. array(
  396. 'MyApplication\MyBundle\Entity\Other\Product\Category',
  397. 'admin_myapplication_my_other_product_category',
  398. ),
  399. array(
  400. 'Symfony\Cmf\Bundle\FooBundle\Document\Menu',
  401. 'admin_cmf_foo_menu',
  402. ),
  403. array(
  404. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\Phpcr\Menu',
  405. 'admin_cmf_foo_menu',
  406. ),
  407. array(
  408. 'Symfony\Bundle\BarBarBundle\Doctrine\Phpcr\Menu',
  409. 'admin_symfony_barbar_menu',
  410. ),
  411. array(
  412. 'Symfony\Bundle\BarBarBundle\Doctrine\Phpcr\Menu\Item',
  413. 'admin_symfony_barbar_menu_item',
  414. ),
  415. array(
  416. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\Orm\Menu',
  417. 'admin_cmf_foo_menu',
  418. ),
  419. array(
  420. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\MongoDB\Menu',
  421. 'admin_cmf_foo_menu',
  422. ),
  423. array(
  424. 'Symfony\Cmf\Bundle\FooBundle\Doctrine\CouchDB\Menu',
  425. 'admin_cmf_foo_menu',
  426. ),
  427. array(
  428. 'AppBundle\Entity\User',
  429. 'admin_app_user',
  430. ),
  431. array(
  432. 'App\Entity\User',
  433. 'admin_app_user',
  434. ),
  435. );
  436. }
  437. /**
  438. * @dataProvider provideGetBaseRouteName
  439. */
  440. public function testGetBaseRouteName($objFqn, $expected)
  441. {
  442. $admin = new PostAdmin('sonata.post.admin.post', $objFqn, 'SonataNewsBundle:PostAdmin');
  443. $this->assertSame($expected, $admin->getBaseRouteName());
  444. }
  445. /**
  446. * @dataProvider provideGetBaseRouteName
  447. */
  448. public function testGetBaseRouteNameWithChildAdmin($objFqn, $expected)
  449. {
  450. $routeGenerator = new DefaultRouteGenerator(
  451. $this->createMock('Symfony\Component\Routing\RouterInterface'),
  452. new RoutesCache($this->cacheTempFolder, true)
  453. );
  454. $container = new Container();
  455. $pool = new Pool($container, 'Sonata Admin', '/path/to/pic.png');
  456. $pathInfo = new \Sonata\AdminBundle\Route\PathInfoBuilder($this->createMock('Sonata\AdminBundle\Model\AuditManagerInterface'));
  457. $postAdmin = new PostAdmin('sonata.post.admin.post', $objFqn, 'SonataNewsBundle:PostAdmin');
  458. $container->set('sonata.post.admin.post', $postAdmin);
  459. $postAdmin->setConfigurationPool($pool);
  460. $postAdmin->setRouteBuilder($pathInfo);
  461. $postAdmin->setRouteGenerator($routeGenerator);
  462. $postAdmin->initialize();
  463. $commentAdmin = new CommentAdmin(
  464. 'sonata.post.admin.comment',
  465. 'Application\Sonata\NewsBundle\Entity\Comment',
  466. 'SonataNewsBundle:CommentAdmin'
  467. );
  468. $container->set('sonata.post.admin.comment', $commentAdmin);
  469. $commentAdmin->setConfigurationPool($pool);
  470. $commentAdmin->setRouteBuilder($pathInfo);
  471. $commentAdmin->setRouteGenerator($routeGenerator);
  472. $commentAdmin->initialize();
  473. $postAdmin->addChild($commentAdmin);
  474. $commentVoteAdmin = new CommentVoteAdmin(
  475. 'sonata.post.admin.comment_vote',
  476. 'Application\Sonata\NewsBundle\Entity\CommentVote',
  477. 'SonataNewsBundle:CommentVoteAdmin'
  478. );
  479. $container->set('sonata.post.admin.comment_vote', $commentVoteAdmin);
  480. $commentVoteAdmin->setConfigurationPool($pool);
  481. $commentVoteAdmin->setRouteBuilder($pathInfo);
  482. $commentVoteAdmin->setRouteGenerator($routeGenerator);
  483. $commentVoteAdmin->initialize();
  484. $commentAdmin->addChild($commentVoteAdmin);
  485. $pool->setAdminServiceIds(array(
  486. 'sonata.post.admin.post',
  487. 'sonata.post.admin.comment',
  488. 'sonata.post.admin.comment_vote',
  489. ));
  490. $this->assertSame($expected.'_comment', $commentAdmin->getBaseRouteName());
  491. $this->assertTrue($postAdmin->hasRoute('show'));
  492. $this->assertTrue($postAdmin->hasRoute('sonata.post.admin.post.show'));
  493. $this->assertTrue($postAdmin->hasRoute('sonata.post.admin.post|sonata.post.admin.comment.show'));
  494. $this->assertTrue($postAdmin->hasRoute('sonata.post.admin.post|sonata.post.admin.comment|sonata.post.admin.comment_vote.show'));
  495. $this->assertTrue($postAdmin->hasRoute('sonata.post.admin.comment.list'));
  496. $this->assertTrue($postAdmin->hasRoute('sonata.post.admin.comment|sonata.post.admin.comment_vote.list'));
  497. $this->assertFalse($postAdmin->hasRoute('sonata.post.admin.post|sonata.post.admin.comment.edit'));
  498. $this->assertFalse($commentAdmin->hasRoute('edit'));
  499. /*
  500. * Test the route name from request
  501. */
  502. $postListRequest = new Request(
  503. array(),
  504. array(),
  505. array(
  506. '_route' => $postAdmin->getBaseRouteName().'_list',
  507. )
  508. );
  509. $postAdmin->setRequest($postListRequest);
  510. $commentAdmin->setRequest($postListRequest);
  511. $this->assertTrue($postAdmin->isCurrentRoute('list'));
  512. $this->assertFalse($postAdmin->isCurrentRoute('create'));
  513. $this->assertFalse($commentAdmin->isCurrentRoute('list'));
  514. $this->assertFalse($commentVoteAdmin->isCurrentRoute('list'));
  515. $this->assertTrue($commentAdmin->isCurrentRoute('list', 'sonata.post.admin.post'));
  516. $this->assertFalse($commentAdmin->isCurrentRoute('edit', 'sonata.post.admin.post'));
  517. $this->assertTrue($commentVoteAdmin->isCurrentRoute('list', 'sonata.post.admin.post'));
  518. $this->assertFalse($commentVoteAdmin->isCurrentRoute('edit', 'sonata.post.admin.post'));
  519. }
  520. /**
  521. * @expectedException \RuntimeException
  522. */
  523. public function testGetBaseRouteNameWithUnreconizedClassname()
  524. {
  525. $admin = new PostAdmin('sonata.post.admin.post', 'News\Thing\Post', 'SonataNewsBundle:PostAdmin');
  526. $admin->getBaseRouteName();
  527. }
  528. public function testGetBaseRouteNameWithSpecifiedName()
  529. {
  530. $postAdmin = new PostWithCustomRouteAdmin('sonata.post.admin.post_with_custom_route', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  531. $this->assertSame('post_custom', $postAdmin->getBaseRouteName());
  532. }
  533. public function testGetBaseRouteNameWithChildAdminAndWithSpecifiedName()
  534. {
  535. $postAdmin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  536. $commentAdmin = new CommentWithCustomRouteAdmin('sonata.post.admin.comment_with_custom_route', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentWithCustomRouteAdmin');
  537. $commentAdmin->setParent($postAdmin);
  538. $this->assertSame('admin_sonata_news_post_comment_custom', $commentAdmin->getBaseRouteName());
  539. }
  540. public function testGetBaseRouteNameWithTwoNestedChildAdminAndWithSpecifiedName()
  541. {
  542. $postAdmin = new PostAdmin(
  543. 'sonata.post.admin.post',
  544. 'Application\Sonata\NewsBundle\Entity\Post',
  545. 'SonataNewsBundle:PostAdmin'
  546. );
  547. $commentAdmin = new CommentWithCustomRouteAdmin(
  548. 'sonata.post.admin.comment_with_custom_route',
  549. 'Application\Sonata\NewsBundle\Entity\Comment',
  550. 'SonataNewsBundle:CommentWithCustomRouteAdmin'
  551. );
  552. $commentVoteAdmin = new CommentVoteAdmin(
  553. 'sonata.post.admin.comment_vote',
  554. 'Application\Sonata\NewsBundle\Entity\CommentVote',
  555. 'SonataNewsBundle:CommentVoteAdmin'
  556. );
  557. $commentAdmin->setParent($postAdmin);
  558. $commentVoteAdmin->setParent($commentAdmin);
  559. $this->assertSame('admin_sonata_news_post_comment_custom_commentvote', $commentVoteAdmin->getBaseRouteName());
  560. }
  561. /**
  562. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::setUniqid
  563. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::getUniqid
  564. */
  565. public function testUniqid()
  566. {
  567. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  568. $uniqid = uniqid();
  569. $admin->setUniqid($uniqid);
  570. $this->assertSame($uniqid, $admin->getUniqid());
  571. }
  572. public function testToString()
  573. {
  574. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  575. $s = new \stdClass();
  576. $this->assertNotEmpty($admin->toString($s));
  577. $s = new FooToString();
  578. $this->assertSame('salut', $admin->toString($s));
  579. // To string method is implemented, but returns null
  580. $s = new FooToStringNull();
  581. $this->assertNotEmpty($admin->toString($s));
  582. $this->assertSame('', $admin->toString(false));
  583. }
  584. public function testIsAclEnabled()
  585. {
  586. $postAdmin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  587. $this->assertFalse($postAdmin->isAclEnabled());
  588. $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  589. $commentAdmin->setSecurityHandler($this->createMock('Sonata\AdminBundle\Security\Handler\AclSecurityHandlerInterface'));
  590. $this->assertTrue($commentAdmin->isAclEnabled());
  591. }
  592. /**
  593. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::getSubClasses
  594. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::getSubClass
  595. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::setSubClasses
  596. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::hasSubClass
  597. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::hasActiveSubClass
  598. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::getActiveSubClass
  599. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::getActiveSubclassCode
  600. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::getClass
  601. */
  602. public function testSubClass()
  603. {
  604. $admin = new PostAdmin(
  605. 'sonata.post.admin.post',
  606. 'Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\Post',
  607. 'SonataNewsBundle:PostAdmin'
  608. );
  609. $this->assertFalse($admin->hasSubClass('test'));
  610. $this->assertFalse($admin->hasActiveSubClass());
  611. $this->assertCount(0, $admin->getSubClasses());
  612. $this->assertNull($admin->getActiveSubClass());
  613. $this->assertNull($admin->getActiveSubclassCode());
  614. $this->assertSame(
  615. 'Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\Post',
  616. $admin->getClass()
  617. );
  618. // Just for the record, if there is no inheritance set, the getSubject is not used
  619. // the getSubject can also lead to some issue
  620. $admin->setSubject(new \Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\BlogPost());
  621. $this->assertSame(
  622. 'Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\BlogPost',
  623. $admin->getClass()
  624. );
  625. $admin->setSubClasses(array('extended1' => 'NewsBundle\Entity\PostExtended1', 'extended2' => 'NewsBundle\Entity\PostExtended2'));
  626. $this->assertFalse($admin->hasSubClass('test'));
  627. $this->assertTrue($admin->hasSubClass('extended1'));
  628. $this->assertFalse($admin->hasActiveSubClass());
  629. $this->assertCount(2, $admin->getSubClasses());
  630. $this->assertNull($admin->getActiveSubClass());
  631. $this->assertNull($admin->getActiveSubclassCode());
  632. $this->assertSame(
  633. 'Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\BlogPost',
  634. $admin->getClass()
  635. );
  636. $request = new \Symfony\Component\HttpFoundation\Request(array('subclass' => 'extended1'));
  637. $admin->setRequest($request);
  638. $this->assertFalse($admin->hasSubClass('test'));
  639. $this->assertTrue($admin->hasSubClass('extended1'));
  640. $this->assertTrue($admin->hasActiveSubClass());
  641. $this->assertCount(2, $admin->getSubClasses());
  642. $this->assertSame(
  643. 'Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\BlogPost',
  644. $admin->getActiveSubClass()
  645. );
  646. $this->assertSame('extended1', $admin->getActiveSubclassCode());
  647. $this->assertSame(
  648. 'Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\BlogPost',
  649. $admin->getClass()
  650. );
  651. $request->query->set('subclass', 'inject');
  652. $this->assertNull($admin->getActiveSubclassCode());
  653. }
  654. /**
  655. * @expectedException \RuntimeException
  656. */
  657. public function testNonExistantSubclass()
  658. {
  659. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  660. $admin->setRequest(new \Symfony\Component\HttpFoundation\Request(array('subclass' => 'inject')));
  661. $admin->setSubClasses(array('extended1' => 'NewsBundle\Entity\PostExtended1', 'extended2' => 'NewsBundle\Entity\PostExtended2'));
  662. $this->assertTrue($admin->hasActiveSubClass());
  663. $admin->getActiveSubClass();
  664. }
  665. /**
  666. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::hasActiveSubClass
  667. */
  668. public function testOnlyOneSubclassNeededToBeActive()
  669. {
  670. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  671. $admin->setSubClasses(array('extended1' => 'NewsBundle\Entity\PostExtended1'));
  672. $request = new \Symfony\Component\HttpFoundation\Request(array('subclass' => 'extended1'));
  673. $admin->setRequest($request);
  674. $this->assertTrue($admin->hasActiveSubClass());
  675. }
  676. public function testGetPerPageOptions()
  677. {
  678. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  679. $this->assertSame(array(16, 32, 64, 128, 192), $admin->getPerPageOptions());
  680. $admin->setPerPageOptions(array(500, 1000));
  681. $this->assertSame(array(500, 1000), $admin->getPerPageOptions());
  682. }
  683. public function testGetLabelTranslatorStrategy()
  684. {
  685. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  686. $this->assertNull($admin->getLabelTranslatorStrategy());
  687. $labelTranslatorStrategy = $this->createMock('Sonata\AdminBundle\Translator\LabelTranslatorStrategyInterface');
  688. $admin->setLabelTranslatorStrategy($labelTranslatorStrategy);
  689. $this->assertSame($labelTranslatorStrategy, $admin->getLabelTranslatorStrategy());
  690. }
  691. public function testGetRouteBuilder()
  692. {
  693. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  694. $this->assertNull($admin->getRouteBuilder());
  695. $routeBuilder = $this->createMock('Sonata\AdminBundle\Builder\RouteBuilderInterface');
  696. $admin->setRouteBuilder($routeBuilder);
  697. $this->assertSame($routeBuilder, $admin->getRouteBuilder());
  698. }
  699. public function testGetMenuFactory()
  700. {
  701. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  702. $this->assertNull($admin->getMenuFactory());
  703. $menuFactory = $this->createMock('Knp\Menu\FactoryInterface');
  704. $admin->setMenuFactory($menuFactory);
  705. $this->assertSame($menuFactory, $admin->getMenuFactory());
  706. }
  707. public function testGetExtensions()
  708. {
  709. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  710. $this->assertSame(array(), $admin->getExtensions());
  711. $adminExtension1 = $this->createMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
  712. $adminExtension2 = $this->createMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
  713. $admin->addExtension($adminExtension1);
  714. $admin->addExtension($adminExtension2);
  715. $this->assertSame(array($adminExtension1, $adminExtension2), $admin->getExtensions());
  716. }
  717. public function testGetFilterTheme()
  718. {
  719. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  720. $this->assertSame(array(), $admin->getFilterTheme());
  721. $admin->setFilterTheme(array('FooTheme'));
  722. $this->assertSame(array('FooTheme'), $admin->getFilterTheme());
  723. }
  724. public function testGetFormTheme()
  725. {
  726. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  727. $this->assertSame(array(), $admin->getFormTheme());
  728. $admin->setFormTheme(array('FooTheme'));
  729. $this->assertSame(array('FooTheme'), $admin->getFormTheme());
  730. }
  731. public function testGetValidator()
  732. {
  733. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  734. $this->assertNull($admin->getValidator());
  735. $validatorClass = '\Symfony\Component\Validator\ValidatorInterface';
  736. if (interface_exists('Symfony\Component\Validator\Validator\ValidatorInterface')) {
  737. $validatorClass = 'Symfony\Component\Validator\Validator\ValidatorInterface';
  738. }
  739. $validator = $this->getMockForAbstractClass($validatorClass);
  740. $admin->setValidator($validator);
  741. $this->assertSame($validator, $admin->getValidator());
  742. }
  743. public function testGetSecurityHandler()
  744. {
  745. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  746. $this->assertNull($admin->getSecurityHandler());
  747. $securityHandler = $this->createMock('Sonata\AdminBundle\Security\Handler\SecurityHandlerInterface');
  748. $admin->setSecurityHandler($securityHandler);
  749. $this->assertSame($securityHandler, $admin->getSecurityHandler());
  750. }
  751. public function testGetSecurityInformation()
  752. {
  753. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  754. $this->assertSame(array(), $admin->getSecurityInformation());
  755. $securityInformation = array(
  756. 'GUEST' => array('VIEW', 'LIST'),
  757. 'STAFF' => array('EDIT', 'LIST', 'CREATE'),
  758. );
  759. $admin->setSecurityInformation($securityInformation);
  760. $this->assertSame($securityInformation, $admin->getSecurityInformation());
  761. }
  762. public function testGetManagerType()
  763. {
  764. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  765. $this->assertNull($admin->getManagerType());
  766. $admin->setManagerType('foo_orm');
  767. $this->assertSame('foo_orm', $admin->getManagerType());
  768. }
  769. public function testGetModelManager()
  770. {
  771. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  772. $this->assertNull($admin->getModelManager());
  773. $modelManager = $this->createMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  774. $admin->setModelManager($modelManager);
  775. $this->assertSame($modelManager, $admin->getModelManager());
  776. }
  777. /**
  778. * NEXT_MAJOR: remove this method.
  779. *
  780. * @group legacy
  781. */
  782. public function testGetBaseCodeRoute()
  783. {
  784. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  785. $this->assertSame('', $admin->getBaseCodeRoute());
  786. $admin->setBaseCodeRoute('foo');
  787. $this->assertSame('foo', $admin->getBaseCodeRoute());
  788. }
  789. // NEXT_MAJOR: uncomment this method.
  790. // public function testGetBaseCodeRoute()
  791. // {
  792. // $postAdmin = new PostAdmin(
  793. // 'sonata.post.admin.post',
  794. // 'NewsBundle\Entity\Post',
  795. // 'SonataNewsBundle:PostAdmin'
  796. // );
  797. // $commentAdmin = new CommentAdmin(
  798. // 'sonata.post.admin.comment',
  799. // 'Application\Sonata\NewsBundle\Entity\Comment',
  800. // 'SonataNewsBundle:CommentAdmin'
  801. // );
  802. //
  803. // $this->assertSame($postAdmin->getCode(), $postAdmin->getBaseCodeRoute());
  804. //
  805. // $postAdmin->addChild($commentAdmin);
  806. //
  807. // $this->assertSame(
  808. // 'sonata.post.admin.post|sonata.post.admin.comment',
  809. // $commentAdmin->getBaseCodeRoute()
  810. // );
  811. // }
  812. public function testGetRouteGenerator()
  813. {
  814. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  815. $this->assertNull($admin->getRouteGenerator());
  816. $routeGenerator = $this->createMock('Sonata\AdminBundle\Route\RouteGeneratorInterface');
  817. $admin->setRouteGenerator($routeGenerator);
  818. $this->assertSame($routeGenerator, $admin->getRouteGenerator());
  819. }
  820. public function testGetConfigurationPool()
  821. {
  822. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  823. $this->assertNull($admin->getConfigurationPool());
  824. $pool = $this->getMockBuilder('Sonata\AdminBundle\Admin\Pool')
  825. ->disableOriginalConstructor()
  826. ->getMock();
  827. $admin->setConfigurationPool($pool);
  828. $this->assertSame($pool, $admin->getConfigurationPool());
  829. }
  830. public function testGetShowBuilder()
  831. {
  832. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  833. $this->assertNull($admin->getShowBuilder());
  834. $showBuilder = $this->createMock('Sonata\AdminBundle\Builder\ShowBuilderInterface');
  835. $admin->setShowBuilder($showBuilder);
  836. $this->assertSame($showBuilder, $admin->getShowBuilder());
  837. }
  838. public function testGetListBuilder()
  839. {
  840. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  841. $this->assertNull($admin->getListBuilder());
  842. $listBuilder = $this->createMock('Sonata\AdminBundle\Builder\ListBuilderInterface');
  843. $admin->setListBuilder($listBuilder);
  844. $this->assertSame($listBuilder, $admin->getListBuilder());
  845. }
  846. public function testGetDatagridBuilder()
  847. {
  848. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  849. $this->assertNull($admin->getDatagridBuilder());
  850. $datagridBuilder = $this->createMock('Sonata\AdminBundle\Builder\DatagridBuilderInterface');
  851. $admin->setDatagridBuilder($datagridBuilder);
  852. $this->assertSame($datagridBuilder, $admin->getDatagridBuilder());
  853. }
  854. public function testGetFormContractor()
  855. {
  856. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  857. $this->assertNull($admin->getFormContractor());
  858. $formContractor = $this->createMock('Sonata\AdminBundle\Builder\FormContractorInterface');
  859. $admin->setFormContractor($formContractor);
  860. $this->assertSame($formContractor, $admin->getFormContractor());
  861. }
  862. public function testGetRequest()
  863. {
  864. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  865. $this->assertFalse($admin->hasRequest());
  866. $request = new Request();
  867. $admin->setRequest($request);
  868. $this->assertSame($request, $admin->getRequest());
  869. $this->assertTrue($admin->hasRequest());
  870. }
  871. public function testGetRequestWithException()
  872. {
  873. $this->setExpectedException('RuntimeException', 'The Request object has not been set');
  874. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  875. $admin->getRequest();
  876. }
  877. public function testGetTranslationDomain()
  878. {
  879. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  880. $this->assertSame('messages', $admin->getTranslationDomain());
  881. $admin->setTranslationDomain('foo');
  882. $this->assertSame('foo', $admin->getTranslationDomain());
  883. }
  884. /**
  885. * @group legacy
  886. */
  887. public function testGetTranslator()
  888. {
  889. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  890. $this->assertNull($admin->getTranslator());
  891. $translator = $this->createMock('Symfony\Component\Translation\TranslatorInterface');
  892. $admin->setTranslator($translator);
  893. $this->assertSame($translator, $admin->getTranslator());
  894. }
  895. public function testGetShowGroups()
  896. {
  897. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  898. $this->assertSame(false, $admin->getShowGroups());
  899. $groups = array('foo', 'bar', 'baz');
  900. $admin->setShowGroups($groups);
  901. $this->assertSame($groups, $admin->getShowGroups());
  902. }
  903. public function testGetFormGroups()
  904. {
  905. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  906. $this->assertSame(false, $admin->getFormGroups());
  907. $groups = array('foo', 'bar', 'baz');
  908. $admin->setFormGroups($groups);
  909. $this->assertSame($groups, $admin->getFormGroups());
  910. }
  911. public function testGetMaxPageLinks()
  912. {
  913. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  914. $this->assertSame(25, $admin->getMaxPageLinks());
  915. $admin->setMaxPageLinks(14);
  916. $this->assertSame(14, $admin->getMaxPageLinks());
  917. }
  918. public function testGetMaxPerPage()
  919. {
  920. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  921. $this->assertSame(32, $admin->getMaxPerPage());
  922. $admin->setMaxPerPage(94);
  923. $this->assertSame(94, $admin->getMaxPerPage());
  924. }
  925. public function testGetLabel()
  926. {
  927. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  928. $this->assertNull($admin->getLabel());
  929. $admin->setLabel('FooLabel');
  930. $this->assertSame('FooLabel', $admin->getLabel());
  931. }
  932. public function testGetBaseController()
  933. {
  934. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  935. $this->assertSame('SonataNewsBundle:PostAdmin', $admin->getBaseControllerName());
  936. $admin->setBaseControllerName('SonataNewsBundle:FooAdmin');
  937. $this->assertSame('SonataNewsBundle:FooAdmin', $admin->getBaseControllerName());
  938. }
  939. public function testGetTemplates()
  940. {
  941. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  942. $this->assertSame(array(), $admin->getTemplates());
  943. $templates = array(
  944. 'list' => 'FooAdminBundle:CRUD:list.html.twig',
  945. 'show' => 'FooAdminBundle:CRUD:show.html.twig',
  946. 'edit' => 'FooAdminBundle:CRUD:edit.html.twig',
  947. );
  948. $admin->setTemplates($templates);
  949. $this->assertSame($templates, $admin->getTemplates());
  950. }
  951. public function testGetTemplate1()
  952. {
  953. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  954. $this->assertNull($admin->getTemplate('edit'));
  955. $admin->setTemplate('edit', 'FooAdminBundle:CRUD:edit.html.twig');
  956. $admin->setTemplate('show', 'FooAdminBundle:CRUD:show.html.twig');
  957. $this->assertSame('FooAdminBundle:CRUD:edit.html.twig', $admin->getTemplate('edit'));
  958. $this->assertSame('FooAdminBundle:CRUD:show.html.twig', $admin->getTemplate('show'));
  959. }
  960. public function testGetTemplate2()
  961. {
  962. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  963. $this->assertNull($admin->getTemplate('edit'));
  964. $templates = array(
  965. 'list' => 'FooAdminBundle:CRUD:list.html.twig',
  966. 'show' => 'FooAdminBundle:CRUD:show.html.twig',
  967. 'edit' => 'FooAdminBundle:CRUD:edit.html.twig',
  968. );
  969. $admin->setTemplates($templates);
  970. $this->assertSame('FooAdminBundle:CRUD:edit.html.twig', $admin->getTemplate('edit'));
  971. $this->assertSame('FooAdminBundle:CRUD:show.html.twig', $admin->getTemplate('show'));
  972. }
  973. public function testGetIdParameter()
  974. {
  975. $postAdmin = new PostAdmin(
  976. 'sonata.post.admin.post',
  977. 'NewsBundle\Entity\Post',
  978. 'SonataNewsBundle:PostAdmin'
  979. );
  980. $this->assertSame('id', $postAdmin->getIdParameter());
  981. $this->assertFalse($postAdmin->isChild());
  982. $commentAdmin = new CommentAdmin(
  983. 'sonata.post.admin.comment',
  984. 'Application\Sonata\NewsBundle\Entity\Comment',
  985. 'SonataNewsBundle:CommentAdmin'
  986. );
  987. $commentAdmin->setParent($postAdmin);
  988. $this->assertTrue($commentAdmin->isChild());
  989. $this->assertSame('childId', $commentAdmin->getIdParameter());
  990. $commentVoteAdmin = new CommentVoteAdmin(
  991. 'sonata.post.admin.comment_vote',
  992. 'Application\Sonata\NewsBundle\Entity\CommentVote',
  993. 'SonataNewsBundle:CommentVoteAdmin'
  994. );
  995. $commentVoteAdmin->setParent($commentAdmin);
  996. $this->assertTrue($commentVoteAdmin->isChild());
  997. $this->assertSame('childChildId', $commentVoteAdmin->getIdParameter());
  998. }
  999. public function testGetExportFormats()
  1000. {
  1001. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1002. $this->assertSame(array('json', 'xml', 'csv', 'xls'), $admin->getExportFormats());
  1003. }
  1004. public function testGetUrlsafeIdentifier()
  1005. {
  1006. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1007. $entity = new \stdClass();
  1008. $modelManager = $this->createMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  1009. $modelManager->expects($this->once())
  1010. ->method('getUrlsafeIdentifier')
  1011. ->with($this->equalTo($entity))
  1012. ->will($this->returnValue('foo'));
  1013. $admin->setModelManager($modelManager);
  1014. $this->assertSame('foo', $admin->getUrlsafeIdentifier($entity));
  1015. }
  1016. public function testDeterminedPerPageValue()
  1017. {
  1018. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1019. $this->assertFalse($admin->determinedPerPageValue('foo'));
  1020. $this->assertFalse($admin->determinedPerPageValue(123));
  1021. $this->assertTrue($admin->determinedPerPageValue(16));
  1022. $this->assertTrue($admin->determinedPerPageValue(32));
  1023. $this->assertTrue($admin->determinedPerPageValue(64));
  1024. $this->assertTrue($admin->determinedPerPageValue(128));
  1025. $this->assertTrue($admin->determinedPerPageValue(192));
  1026. $admin->setPerPageOptions(array(101, 102, 103));
  1027. $this->assertFalse($admin->determinedPerPageValue(15));
  1028. $this->assertFalse($admin->determinedPerPageValue(25));
  1029. $this->assertFalse($admin->determinedPerPageValue(200));
  1030. $this->assertTrue($admin->determinedPerPageValue(101));
  1031. $this->assertTrue($admin->determinedPerPageValue(102));
  1032. $this->assertTrue($admin->determinedPerPageValue(103));
  1033. }
  1034. public function testIsGranted()
  1035. {
  1036. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1037. $entity = new \stdClass();
  1038. $securityHandler = $this->createMock('Sonata\AdminBundle\Security\Handler\AclSecurityHandlerInterface');
  1039. $securityHandler->expects($this->any())
  1040. ->method('isGranted')
  1041. ->will($this->returnCallback(function (AdminInterface $adminIn, $attributes, $object = null) use ($admin, $entity) {
  1042. if ($admin == $adminIn && $attributes == 'FOO') {
  1043. if (($object == $admin) || ($object == $entity)) {
  1044. return true;
  1045. }
  1046. }
  1047. return false;
  1048. }));
  1049. $admin->setSecurityHandler($securityHandler);
  1050. $this->assertTrue($admin->isGranted('FOO'));
  1051. $this->assertTrue($admin->isGranted('FOO', $entity));
  1052. $this->assertFalse($admin->isGranted('BAR'));
  1053. $this->assertFalse($admin->isGranted('BAR', $entity));
  1054. }
  1055. public function testSupportsPreviewMode()
  1056. {
  1057. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1058. $this->assertFalse($admin->supportsPreviewMode());
  1059. }
  1060. public function testGetPermissionsShow()
  1061. {
  1062. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1063. $this->assertSame(array('LIST'), $admin->getPermissionsShow(AbstractAdmin::CONTEXT_DASHBOARD));
  1064. $this->assertSame(array('LIST'), $admin->getPermissionsShow(AbstractAdmin::CONTEXT_MENU));
  1065. $this->assertSame(array('LIST'), $admin->getPermissionsShow('foo'));
  1066. }
  1067. public function testShowIn()
  1068. {
  1069. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1070. $securityHandler = $this->createMock('Sonata\AdminBundle\Security\Handler\AclSecurityHandlerInterface');
  1071. $securityHandler->expects($this->any())
  1072. ->method('isGranted')
  1073. ->will($this->returnCallback(function (AdminInterface $adminIn, $attributes, $object = null) use ($admin) {
  1074. if ($admin == $adminIn && $attributes == array('LIST')) {
  1075. return true;
  1076. }
  1077. return false;
  1078. }));
  1079. $admin->setSecurityHandler($securityHandler);
  1080. $this->assertTrue($admin->showIn(AbstractAdmin::CONTEXT_DASHBOARD));
  1081. $this->assertTrue($admin->showIn(AbstractAdmin::CONTEXT_MENU));
  1082. $this->assertTrue($admin->showIn('foo'));
  1083. }
  1084. public function testGetObjectIdentifier()
  1085. {
  1086. $admin = new PostAdmin('sonata.post.admin.post', 'Acme\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1087. $this->assertSame('sonata.post.admin.post', $admin->getObjectIdentifier());
  1088. }
  1089. /**
  1090. * @group legacy
  1091. */
  1092. public function testTrans()
  1093. {
  1094. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1095. $admin->setTranslationDomain('fooMessageDomain');
  1096. $translator = $this->createMock('Symfony\Component\Translation\TranslatorInterface');
  1097. $admin->setTranslator($translator);
  1098. $translator->expects($this->once())
  1099. ->method('trans')
  1100. ->with($this->equalTo('foo'), $this->equalTo(array()), $this->equalTo('fooMessageDomain'))
  1101. ->will($this->returnValue('fooTranslated'));
  1102. $this->assertSame('fooTranslated', $admin->trans('foo'));
  1103. }
  1104. /**
  1105. * @group legacy
  1106. */
  1107. public function testTransWithMessageDomain()
  1108. {
  1109. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1110. $translator = $this->createMock('Symfony\Component\Translation\TranslatorInterface');
  1111. $admin->setTranslator($translator);
  1112. $translator->expects($this->once())
  1113. ->method('trans')
  1114. ->with($this->equalTo('foo'), $this->equalTo(array('name' => 'Andrej')), $this->equalTo('fooMessageDomain'))
  1115. ->will($this->returnValue('fooTranslated'));
  1116. $this->assertSame('fooTranslated', $admin->trans('foo', array('name' => 'Andrej'), 'fooMessageDomain'));
  1117. }
  1118. /**
  1119. * @group legacy
  1120. */
  1121. public function testTransChoice()
  1122. {
  1123. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1124. $admin->setTranslationDomain('fooMessageDomain');
  1125. $translator = $this->createMock('Symfony\Component\Translation\TranslatorInterface');
  1126. $admin->setTranslator($translator);
  1127. $translator->expects($this->once())
  1128. ->method('transChoice')
  1129. ->with($this->equalTo('foo'), $this->equalTo(2), $this->equalTo(array()), $this->equalTo('fooMessageDomain'))
  1130. ->will($this->returnValue('fooTranslated'));
  1131. $this->assertSame('fooTranslated', $admin->transChoice('foo', 2));
  1132. }
  1133. /**
  1134. * @group legacy
  1135. */
  1136. public function testTransChoiceWithMessageDomain()
  1137. {
  1138. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1139. $translator = $this->createMock('Symfony\Component\Translation\TranslatorInterface');
  1140. $admin->setTranslator($translator);
  1141. $translator->expects($this->once())
  1142. ->method('transChoice')
  1143. ->with($this->equalTo('foo'), $this->equalTo(2), $this->equalTo(array('name' => 'Andrej')), $this->equalTo('fooMessageDomain'))
  1144. ->will($this->returnValue('fooTranslated'));
  1145. $this->assertSame('fooTranslated', $admin->transChoice('foo', 2, array('name' => 'Andrej'), 'fooMessageDomain'));
  1146. }
  1147. public function testSetPersistFilters()
  1148. {
  1149. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1150. $this->assertAttributeSame(false, 'persistFilters', $admin);
  1151. $admin->setPersistFilters(true);
  1152. $this->assertAttributeSame(true, 'persistFilters', $admin);
  1153. }
  1154. public function testGetRootCode()
  1155. {
  1156. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1157. $this->assertSame('sonata.post.admin.post', $admin->getRootCode());
  1158. $parentAdmin = new PostAdmin('sonata.post.admin.post.parent', 'NewsBundle\Entity\PostParent', 'SonataNewsBundle:PostParentAdmin');
  1159. $parentFieldDescription = $this->createMock('Sonata\AdminBundle\Admin\FieldDescriptionInterface');
  1160. $parentFieldDescription->expects($this->once())
  1161. ->method('getAdmin')
  1162. ->will($this->returnValue($parentAdmin));
  1163. $this->assertNull($admin->getParentFieldDescription());
  1164. $admin->setParentFieldDescription($parentFieldDescription);
  1165. $this->assertSame($parentFieldDescription, $admin->getParentFieldDescription());
  1166. $this->assertSame('sonata.post.admin.post.parent', $admin->getRootCode());
  1167. }
  1168. public function testGetRoot()
  1169. {
  1170. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1171. $this->assertSame($admin, $admin->getRoot());
  1172. $parentAdmin = new PostAdmin('sonata.post.admin.post.parent', 'NewsBundle\Entity\PostParent', 'SonataNewsBundle:PostParentAdmin');
  1173. $parentFieldDescription = $this->createMock('Sonata\AdminBundle\Admin\FieldDescriptionInterface');
  1174. $parentFieldDescription->expects($this->once())
  1175. ->method('getAdmin')
  1176. ->will($this->returnValue($parentAdmin));
  1177. $this->assertNull($admin->getParentFieldDescription());
  1178. $admin->setParentFieldDescription($parentFieldDescription);
  1179. $this->assertSame($parentFieldDescription, $admin->getParentFieldDescription());
  1180. $this->assertSame($parentAdmin, $admin->getRoot());
  1181. }
  1182. public function testGetExportFields()
  1183. {
  1184. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1185. $modelManager = $this->createMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  1186. $modelManager->expects($this->once())
  1187. ->method('getExportFields')
  1188. ->with($this->equalTo('NewsBundle\Entity\Post'))
  1189. ->will($this->returnValue(array('foo', 'bar')));
  1190. $admin->setModelManager($modelManager);
  1191. $this->assertSame(array('foo', 'bar'), $admin->getExportFields());
  1192. }
  1193. public function testGetPersistentParametersWithNoExtension()
  1194. {
  1195. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1196. $this->assertEmpty($admin->getPersistentParameters());
  1197. }
  1198. /**
  1199. * @expectedException \RuntimeException
  1200. */
  1201. public function testGetPersistentParametersWithInvalidExtension()
  1202. {
  1203. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1204. $extension = $this->createMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
  1205. $extension->expects($this->once())->method('getPersistentParameters')->will($this->returnValue(null));
  1206. $admin->addExtension($extension);
  1207. $admin->getPersistentParameters();
  1208. }
  1209. public function testGetPersistentParametersWithValidExtension()
  1210. {
  1211. $expected = array(
  1212. 'context' => 'foobar',
  1213. );
  1214. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1215. $extension = $this->createMock('Sonata\AdminBundle\Admin\AdminExtensionInterface');
  1216. $extension->expects($this->once())->method('getPersistentParameters')->will($this->returnValue($expected));
  1217. $admin->addExtension($extension);
  1218. $this->assertSame($expected, $admin->getPersistentParameters());
  1219. }
  1220. public function testGetFormWithNonCollectionParentValue()
  1221. {
  1222. $post = new Post();
  1223. $tagAdmin = $this->createTagAdmin($post);
  1224. $tag = $tagAdmin->getSubject();
  1225. $tag->setPosts(null);
  1226. $tagAdmin->getForm();
  1227. $this->assertSame($post, $tag->getPosts());
  1228. }
  1229. public function testGetFormWithCollectionParentValue()
  1230. {
  1231. $post = new Post();
  1232. $tagAdmin = $this->createTagAdmin($post);
  1233. $tag = $tagAdmin->getSubject();
  1234. // Case of a doctrine collection
  1235. $this->assertInstanceOf('Doctrine\Common\Collections\Collection', $tag->getPosts());
  1236. $this->assertCount(0, $tag->getPosts());
  1237. $tag->addPost(new Post());
  1238. $this->assertCount(1, $tag->getPosts());
  1239. $tagAdmin->getForm();
  1240. $this->assertInstanceOf('Doctrine\Common\Collections\Collection', $tag->getPosts());
  1241. $this->assertCount(2, $tag->getPosts());
  1242. $this->assertContains($post, $tag->getPosts());
  1243. // Case of an array
  1244. $tag->setPosts(array());
  1245. $this->assertCount(0, $tag->getPosts());
  1246. $tag->addPost(new Post());
  1247. $this->assertCount(1, $tag->getPosts());
  1248. $tagAdmin->getForm();
  1249. $this->assertInternalType('array', $tag->getPosts());
  1250. $this->assertCount(2, $tag->getPosts());
  1251. $this->assertContains($post, $tag->getPosts());
  1252. }
  1253. public function testRemoveFieldFromFormGroup()
  1254. {
  1255. $formGroups = array(
  1256. 'foobar' => array(
  1257. 'fields' => array(
  1258. 'foo' => 'foo',
  1259. 'bar' => 'bar',
  1260. ),
  1261. ),
  1262. );
  1263. $admin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1264. $admin->setFormGroups($formGroups);
  1265. $admin->removeFieldFromFormGroup('foo');
  1266. $this->assertSame($admin->getFormGroups(), array(
  1267. 'foobar' => array(
  1268. 'fields' => array(
  1269. 'bar' => 'bar',
  1270. ),
  1271. ),
  1272. ));
  1273. $admin->removeFieldFromFormGroup('bar');
  1274. $this->assertSame($admin->getFormGroups(), array());
  1275. }
  1276. public function testGetFilterParameters()
  1277. {
  1278. $authorId = uniqid();
  1279. $postAdmin = new PostAdmin('sonata.post.admin.post', 'Application\Sonata\NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1280. $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'Application\Sonata\NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  1281. $commentAdmin->setParentAssociationMapping('post.author');
  1282. $commentAdmin->setParent($postAdmin);
  1283. $request = $this->createMock('Symfony\Component\HttpFoundation\Request', array('get'));
  1284. $query = $this->createMock('Symfony\Component\HttpFoundation\ParameterBag', array('get'));
  1285. $query->expects($this->any())
  1286. ->method('get')
  1287. ->will($this->returnValue(array()));
  1288. $request->query = $query;
  1289. $request->expects($this->any())
  1290. ->method('get')
  1291. ->will($this->returnValue($authorId));
  1292. $commentAdmin->setRequest($request);
  1293. $modelManager = $this->createMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  1294. $modelManager->expects($this->any())
  1295. ->method('getDefaultSortValues')
  1296. ->will($this->returnValue(array()));
  1297. $commentAdmin->setModelManager($modelManager);
  1298. $parameters = $commentAdmin->getFilterParameters();
  1299. $this->assertTrue(isset($parameters['post__author']));
  1300. $this->assertSame(array('value' => $authorId), $parameters['post__author']);
  1301. }
  1302. public function testGetFilterFieldDescription()
  1303. {
  1304. $modelAdmin = new ModelAdmin('sonata.post.admin.model', 'Application\Sonata\FooBundle\Entity\Model', 'SonataFooBundle:ModelAdmin');
  1305. $fooFieldDescription = new FieldDescription();
  1306. $barFieldDescription = new FieldDescription();
  1307. $bazFieldDescription = new FieldDescription();
  1308. $modelManager = $this->createMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  1309. $modelManager->expects($this->exactly(3))
  1310. ->method('getNewFieldDescriptionInstance')
  1311. ->will($this->returnCallback(function ($adminClass, $name, $filterOptions) use ($fooFieldDescription, $barFieldDescription, $bazFieldDescription) {
  1312. switch ($name) {
  1313. case 'foo':
  1314. $fieldDescription = $fooFieldDescription;
  1315. break;
  1316. case 'bar':
  1317. $fieldDescription = $barFieldDescription;
  1318. break;
  1319. case 'baz':
  1320. $fieldDescription = $bazFieldDescription;
  1321. break;
  1322. default:
  1323. throw new \RuntimeException(sprintf('Unknown filter name "%s"', $name));
  1324. break;
  1325. }
  1326. $fieldDescription->setName($name);
  1327. return $fieldDescription;
  1328. }));
  1329. $modelAdmin->setModelManager($modelManager);
  1330. $pager = $this->createMock('Sonata\AdminBundle\Datagrid\PagerInterface');
  1331. $datagrid = $this->createMock('Sonata\AdminBundle\Datagrid\DatagridInterface');
  1332. $datagrid->expects($this->once())
  1333. ->method('getPager')
  1334. ->will($this->returnValue($pager));
  1335. $datagridBuilder = $this->createMock('Sonata\AdminBundle\Builder\DatagridBuilderInterface');
  1336. $datagridBuilder->expects($this->once())
  1337. ->method('getBaseDatagrid')
  1338. ->with($this->identicalTo($modelAdmin), array())
  1339. ->will($this->returnValue($datagrid));
  1340. $datagridBuilder->expects($this->exactly(3))
  1341. ->method('addFilter')
  1342. ->will($this->returnCallback(function ($datagrid, $type, $fieldDescription, AdminInterface $admin) {
  1343. $admin->addFilterFieldDescription($fieldDescription->getName(), $fieldDescription);
  1344. $fieldDescription->mergeOption('field_options', array('required' => false));
  1345. }));
  1346. $modelAdmin->setDatagridBuilder($datagridBuilder);
  1347. $this->assertSame(array('foo' => $fooFieldDescription, 'bar' => $barFieldDescription, 'baz' => $bazFieldDescription), $modelAdmin->getFilterFieldDescriptions());
  1348. $this->assertFalse($modelAdmin->hasFilterFieldDescription('fooBar'));
  1349. $this->assertTrue($modelAdmin->hasFilterFieldDescription('foo'));
  1350. $this->assertTrue($modelAdmin->hasFilterFieldDescription('bar'));
  1351. $this->assertTrue($modelAdmin->hasFilterFieldDescription('baz'));
  1352. $this->assertSame($fooFieldDescription, $modelAdmin->getFilterFieldDescription('foo'));
  1353. $this->assertSame($barFieldDescription, $modelAdmin->getFilterFieldDescription('bar'));
  1354. $this->assertSame($bazFieldDescription, $modelAdmin->getFilterFieldDescription('baz'));
  1355. }
  1356. public function testGetSubjectNoRequest()
  1357. {
  1358. $modelManager = $this->createMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  1359. $modelManager
  1360. ->expects($this->never())
  1361. ->method('find');
  1362. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1363. $admin->setModelManager($modelManager);
  1364. $this->assertNull($admin->getSubject());
  1365. }
  1366. public function testGetSideMenu()
  1367. {
  1368. $item = $this->createMock('Knp\Menu\ItemInterface');
  1369. $item
  1370. ->expects($this->once())
  1371. ->method('setChildrenAttribute')
  1372. ->with('class', 'nav navbar-nav');
  1373. $item
  1374. ->expects($this->once())
  1375. ->method('setExtra')
  1376. ->with('translation_domain', 'foo_bar_baz');
  1377. $menuFactory = $this->createMock('Knp\Menu\FactoryInterface');
  1378. $menuFactory
  1379. ->expects($this->once())
  1380. ->method('createItem')
  1381. ->will($this->returnValue($item));
  1382. $modelAdmin = new ModelAdmin('sonata.post.admin.model', 'Application\Sonata\FooBundle\Entity\Model', 'SonataFooBundle:ModelAdmin');
  1383. $modelAdmin->setMenuFactory($menuFactory);
  1384. $modelAdmin->setTranslationDomain('foo_bar_baz');
  1385. $modelAdmin->getSideMenu('foo');
  1386. }
  1387. /**
  1388. * @return array
  1389. */
  1390. public function provideGetSubject()
  1391. {
  1392. return array(
  1393. array(23),
  1394. array('azerty'),
  1395. array('4f69bbb5f14a13347f000092'),
  1396. array('0779ca8d-e2be-11e4-ac58-0242ac11000b'),
  1397. array('123'.AdapterInterface::ID_SEPARATOR.'my_type'), // composite keys are supported
  1398. );
  1399. }
  1400. /**
  1401. * @dataProvider provideGetSubject
  1402. */
  1403. public function testGetSubjectFailed($id)
  1404. {
  1405. $modelManager = $this->createMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  1406. $modelManager
  1407. ->expects($this->once())
  1408. ->method('find')
  1409. ->with('NewsBundle\Entity\Post', $id)
  1410. ->will($this->returnValue(null)); // entity not found
  1411. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1412. $admin->setModelManager($modelManager);
  1413. $admin->setRequest(new Request(array('id' => $id)));
  1414. $this->assertNull($admin->getSubject());
  1415. }
  1416. /**
  1417. * @dataProvider provideGetSubject
  1418. */
  1419. public function testGetSubject($id)
  1420. {
  1421. $entity = new Post();
  1422. $modelManager = $this->createMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  1423. $modelManager
  1424. ->expects($this->once())
  1425. ->method('find')
  1426. ->with('NewsBundle\Entity\Post', $id)
  1427. ->will($this->returnValue($entity));
  1428. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1429. $admin->setModelManager($modelManager);
  1430. $admin->setRequest(new Request(array('id' => $id)));
  1431. $this->assertSame($entity, $admin->getSubject());
  1432. $this->assertSame($entity, $admin->getSubject()); // model manager must be used only once
  1433. }
  1434. public function testGetSubjectWithParentDescription()
  1435. {
  1436. $adminId = 1;
  1437. $comment = new Comment();
  1438. $modelManager = $this->createMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  1439. $modelManager
  1440. ->expects($this->any())
  1441. ->method('find')
  1442. ->with('NewsBundle\Entity\Comment', $adminId)
  1443. ->will($this->returnValue($comment));
  1444. $request = new Request(array('id' => $adminId));
  1445. $postAdmin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1446. $postAdmin->setRequest($request);
  1447. $commentAdmin = new CommentAdmin('sonata.post.admin.comment', 'NewsBundle\Entity\Comment', 'SonataNewsBundle:CommentAdmin');
  1448. $commentAdmin->setRequest($request);
  1449. $commentAdmin->setModelManager($modelManager);
  1450. $this->assertEquals($comment, $commentAdmin->getSubject());
  1451. $commentAdmin->setSubject(null);
  1452. $commentAdmin->setParentFieldDescription(new FieldDescription());
  1453. $this->assertNull($commentAdmin->getSubject());
  1454. }
  1455. /**
  1456. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::configureActionButtons
  1457. */
  1458. public function testGetActionButtonsList()
  1459. {
  1460. $expected = array(
  1461. 'create' => array(
  1462. 'template' => 'Foo.html.twig',
  1463. ),
  1464. );
  1465. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1466. $securityHandler = $this->createMock('Sonata\AdminBundle\Security\Handler\SecurityHandlerInterface');
  1467. $securityHandler
  1468. ->expects($this->once())
  1469. ->method('isGranted')
  1470. ->with($admin, 'CREATE', $admin)
  1471. ->will($this->returnValue(true));
  1472. $admin->setSecurityHandler($securityHandler);
  1473. $routeGenerator = $this->createMock('Sonata\AdminBundle\Route\RouteGeneratorInterface');
  1474. $routeGenerator
  1475. ->expects($this->once())
  1476. ->method('hasAdminRoute')
  1477. ->with($admin, 'create')
  1478. ->will($this->returnValue(true));
  1479. $admin->setRouteGenerator($routeGenerator);
  1480. $admin->setTemplate('button_create', 'Foo.html.twig');
  1481. $this->assertSame($expected, $admin->getActionButtons('list', null));
  1482. }
  1483. /**
  1484. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::configureActionButtons
  1485. */
  1486. public function testGetActionButtonsListCreateDisabled()
  1487. {
  1488. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1489. $securityHandler = $this->createMock('Sonata\AdminBundle\Security\Handler\SecurityHandlerInterface');
  1490. $securityHandler
  1491. ->expects($this->once())
  1492. ->method('isGranted')
  1493. ->with($admin, 'CREATE', $admin)
  1494. ->will($this->returnValue(false));
  1495. $admin->setSecurityHandler($securityHandler);
  1496. $this->assertSame(array(), $admin->getActionButtons('list', null));
  1497. }
  1498. /**
  1499. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::configureBatchActions
  1500. */
  1501. public function testGetBatchActions()
  1502. {
  1503. $expected = array(
  1504. 'delete' => array(
  1505. 'label' => 'action_delete',
  1506. 'translation_domain' => 'SonataAdminBundle',
  1507. 'ask_confirmation' => true, // by default always true
  1508. ),
  1509. 'foo' => array(
  1510. 'label' => 'action_foo',
  1511. 'translation_domain' => 'SonataAdminBundle',
  1512. ),
  1513. 'bar' => array(
  1514. 'label' => 'batch.label_bar',
  1515. 'translation_domain' => 'SonataAdminBundle',
  1516. ),
  1517. 'baz' => array(
  1518. 'label' => 'action_baz',
  1519. 'translation_domain' => 'AcmeAdminBundle',
  1520. ),
  1521. );
  1522. $pathInfo = new \Sonata\AdminBundle\Route\PathInfoBuilder($this->createMock('Sonata\AdminBundle\Model\AuditManagerInterface'));
  1523. $labelTranslatorStrategy = $this->createMock('Sonata\AdminBundle\Translator\LabelTranslatorStrategyInterface');
  1524. $labelTranslatorStrategy->expects($this->any())
  1525. ->method('getLabel')
  1526. ->will($this->returnCallback(function ($label, $context = '', $type = '') {
  1527. return $context.'.'.$type.'_'.$label;
  1528. }));
  1529. $admin = new PostAdmin('sonata.post.admin.model', 'Application\Sonata\FooBundle\Entity\Model', 'SonataFooBundle:ModelAdmin');
  1530. $admin->setRouteBuilder($pathInfo);
  1531. $admin->setTranslationDomain('SonataAdminBundle');
  1532. $admin->setLabelTranslatorStrategy($labelTranslatorStrategy);
  1533. $routeGenerator = $this->createMock('Sonata\AdminBundle\Route\RouteGeneratorInterface');
  1534. $routeGenerator
  1535. ->expects($this->once())
  1536. ->method('hasAdminRoute')
  1537. ->with($admin, 'delete')
  1538. ->will($this->returnValue(true));
  1539. $admin->setRouteGenerator($routeGenerator);
  1540. $securityHandler = $this->createMock('Sonata\AdminBundle\Security\Handler\SecurityHandlerInterface');
  1541. $securityHandler->expects($this->any())
  1542. ->method('isGranted')
  1543. ->will($this->returnCallback(function (AdminInterface $adminIn, $attributes, $object = null) use ($admin) {
  1544. if ($admin == $adminIn && $attributes == 'DELETE') {
  1545. return true;
  1546. }
  1547. return false;
  1548. }));
  1549. $admin->setSecurityHandler($securityHandler);
  1550. $this->assertSame($expected, $admin->getBatchActions());
  1551. }
  1552. /**
  1553. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::showMosaicButton
  1554. */
  1555. public function testShowMosaicButton()
  1556. {
  1557. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1558. $listModes = $admin->getListModes();
  1559. $admin->showMosaicButton(true);
  1560. $this->assertSame($listModes, $admin->getListModes());
  1561. }
  1562. /**
  1563. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::showMosaicButton
  1564. */
  1565. public function testShowMosaicButtonHideMosaic()
  1566. {
  1567. $admin = new PostAdmin('sonata.post.admin.post', 'NewsBundle\Entity\Post', 'SonataNewsBundle:PostAdmin');
  1568. $listModes = $admin->getListModes();
  1569. $expected['list'] = $listModes['list'];
  1570. $admin->showMosaicButton(false);
  1571. $this->assertSame($expected, $admin->getListModes());
  1572. }
  1573. /**
  1574. * @covers \Sonata\AdminBundle\Admin\AbstractAdmin::getDashboardActions
  1575. * @dataProvider provideGetBaseRouteName
  1576. */
  1577. public function testDefaultDashboardActionsArePresent($objFqn, $expected)
  1578. {
  1579. $pathInfo = new \Sonata\AdminBundle\Route\PathInfoBuilder($this->createMock('Sonata\AdminBundle\Model\AuditManagerInterface'));
  1580. $routeGenerator = new DefaultRouteGenerator(
  1581. $this->createMock('Symfony\Component\Routing\RouterInterface'),
  1582. new RoutesCache($this->cacheTempFolder, true)
  1583. );
  1584. $admin = new PostAdmin('sonata.post.admin.post', $objFqn, 'SonataNewsBundle:PostAdmin');
  1585. $admin->setRouteBuilder($pathInfo);
  1586. $admin->setRouteGenerator($routeGenerator);
  1587. $admin->initialize();
  1588. $securityHandler = $this->createMock('Sonata\AdminBundle\Security\Handler\SecurityHandlerInterface');
  1589. $securityHandler->expects($this->any())
  1590. ->method('isGranted')
  1591. ->will($this->returnCallback(function (AdminInterface $adminIn, $attributes, $object = null) use ($admin) {
  1592. if ($admin == $adminIn && ($attributes == 'CREATE' || $attributes == 'LIST')) {
  1593. return true;
  1594. }
  1595. return false;
  1596. }));
  1597. $admin->setSecurityHandler($securityHandler);
  1598. $this->assertArrayHasKey('list', $admin->getDashboardActions());
  1599. $this->assertArrayHasKey('create', $admin->getDashboardActions());
  1600. }
  1601. public function testDefaultFilters()
  1602. {
  1603. $admin = new FilteredAdmin('sonata.post.admin.model', 'Application\Sonata\FooBundle\Entity\Model', 'SonataFooBundle:ModelAdmin');
  1604. $subjectId = uniqid();
  1605. $request = $this->createMock('Symfony\Component\HttpFoundation\Request', array('get'));
  1606. $query = $this->createMock('Symfony\Component\HttpFoundation\ParameterBag', array('set', 'get'));
  1607. $query->expects($this->any())
  1608. ->method('get')
  1609. ->with($this->equalTo('filter'))
  1610. ->will($this->returnValue(array(
  1611. 'a' => array(
  1612. 'value' => 'b',
  1613. ),
  1614. 'foo' => array(
  1615. 'type' => '1',
  1616. 'value' => 'bar',
  1617. ),
  1618. 'baz' => array(
  1619. 'type' => '5',
  1620. 'value' => 'test',
  1621. ),
  1622. )));
  1623. $request->query = $query;
  1624. $request->expects($this->any())
  1625. ->method('get')
  1626. ->will($this->returnValue($subjectId));
  1627. $admin->setRequest($request);
  1628. $modelManager = $this->createMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  1629. $modelManager->expects($this->any())
  1630. ->method('getDefaultSortValues')
  1631. ->will($this->returnValue(array()));
  1632. $admin->setModelManager($modelManager);
  1633. $this->assertEquals(array(
  1634. 'foo' => array(
  1635. 'type' => '1',
  1636. 'value' => 'bar',
  1637. ),
  1638. 'baz' => array(
  1639. 'type' => '5',
  1640. 'value' => 'test',
  1641. ),
  1642. '_page' => 1,
  1643. '_per_page' => 32,
  1644. 'a' => array(
  1645. 'value' => 'b',
  1646. ),
  1647. ), $admin->getFilterParameters());
  1648. $this->assertTrue($admin->isDefaultFilter('foo'));
  1649. $this->assertFalse($admin->isDefaultFilter('bar'));
  1650. $this->assertFalse($admin->isDefaultFilter('a'));
  1651. }
  1652. /**
  1653. * @group legacy
  1654. */
  1655. public function testDefaultBreadcrumbsBuilder()
  1656. {
  1657. $container = $this->createMock('Symfony\Component\DependencyInjection\ContainerInterface');
  1658. $container->expects($this->once())
  1659. ->method('getParameter')
  1660. ->with('sonata.admin.configuration.breadcrumbs')
  1661. ->will($this->returnValue(array()));
  1662. $pool = $this->getMockBuilder('Sonata\AdminBundle\Admin\Pool')
  1663. ->disableOriginalConstructor()
  1664. ->getMock();
  1665. $pool->expects($this->once())
  1666. ->method('getContainer')
  1667. ->will($this->returnValue($container));
  1668. $admin = $this->getMockForAbstractClass('Sonata\AdminBundle\Admin\AbstractAdmin', array(
  1669. 'admin.my_code', 'My\Class', 'MyBundle:ClassAdmin',
  1670. ), '', true, true, true, array('getConfigurationPool'));
  1671. $admin->expects($this->once())
  1672. ->method('getConfigurationPool')
  1673. ->will($this->returnValue($pool));
  1674. $this->assertInstanceOf(
  1675. 'Sonata\AdminBundle\Admin\BreadcrumbsBuilder',
  1676. $admin->getBreadcrumbsBuilder()
  1677. );
  1678. }
  1679. /**
  1680. * @group legacy
  1681. */
  1682. public function testBreadcrumbsBuilderSetter()
  1683. {
  1684. $admin = $this->getMockForAbstractClass('Sonata\AdminBundle\Admin\AbstractAdmin', array(
  1685. 'admin.my_code', 'My\Class', 'MyBundle:ClassAdmin',
  1686. ));
  1687. $this->assertSame($admin, $admin->setBreadcrumbsBuilder($builder = $this->createMock(
  1688. 'Sonata\AdminBundle\Admin\BreadcrumbsBuilderInterface'
  1689. )));
  1690. $this->assertSame($builder, $admin->getBreadcrumbsBuilder());
  1691. }
  1692. /**
  1693. * @group legacy
  1694. */
  1695. public function testGetBreadcrumbs()
  1696. {
  1697. $admin = $this->getMockForAbstractClass('Sonata\AdminBundle\Admin\AbstractAdmin', array(
  1698. 'admin.my_code', 'My\Class', 'MyBundle:ClassAdmin',
  1699. ));
  1700. $builder = $this->prophesize(
  1701. 'Sonata\AdminBundle\Admin\BreadcrumbsBuilderInterface'
  1702. );
  1703. $action = 'myaction';
  1704. $builder->getBreadcrumbs($admin, $action)->shouldBeCalled();
  1705. $admin->setBreadcrumbsBuilder($builder->reveal())->getBreadcrumbs($action);
  1706. }
  1707. /**
  1708. * @group legacy
  1709. */
  1710. public function testBuildBreadcrumbs()
  1711. {
  1712. $admin = $this->getMockForAbstractClass('Sonata\AdminBundle\Admin\AbstractAdmin', array(
  1713. 'admin.my_code', 'My\Class', 'MyBundle:ClassAdmin',
  1714. ));
  1715. $builder = $this->prophesize(
  1716. 'Sonata\AdminBundle\Admin\BreadcrumbsBuilderInterface'
  1717. );
  1718. $action = 'myaction';
  1719. $menu = $this->createMock('Knp\Menu\ItemInterface');
  1720. $builder->buildBreadcrumbs($admin, $action, $menu)
  1721. ->shouldBeCalledTimes(1)
  1722. ->willReturn($menu);
  1723. $admin->setBreadcrumbsBuilder($builder->reveal());
  1724. /* check the called is proxied only once */
  1725. $this->assertSame($menu, $admin->buildBreadcrumbs($action, $menu));
  1726. $this->assertSame($menu, $admin->buildBreadcrumbs($action, $menu));
  1727. }
  1728. /**
  1729. * NEXT_MAJOR: remove this method.
  1730. *
  1731. * @group legacy
  1732. */
  1733. public function testCreateQueryLegacyCallWorks()
  1734. {
  1735. $admin = $this->getMockForAbstractClass('Sonata\AdminBundle\Admin\AbstractAdmin', array(
  1736. 'admin.my_code', 'My\Class', 'MyBundle:ClassAdmin',
  1737. ));
  1738. $modelManager = $this->createMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  1739. $modelManager->expects($this->once())
  1740. ->method('createQuery')
  1741. ->with('My\Class')
  1742. ->willReturn('a query');
  1743. $admin->setModelManager($modelManager);
  1744. $this->assertSame('a query', $admin->createQuery('list'));
  1745. }
  1746. public function testGetDataSourceIterator()
  1747. {
  1748. $datagrid = $this->createMock('Sonata\AdminBundle\Datagrid\DatagridInterface');
  1749. $datagrid->method('buildPager');
  1750. $modelManager = $this->createMock('Sonata\AdminBundle\Model\ModelManagerInterface');
  1751. $modelManager->method('getExportFields')->will($this->returnValue(array(
  1752. 'field',
  1753. 'foo',
  1754. 'bar',
  1755. )));
  1756. $modelManager->expects($this->once())->method('getDataSourceIterator')
  1757. ->with($this->equalTo($datagrid), $this->equalTo(array(
  1758. 'Feld' => 'field',
  1759. 1 => 'foo',
  1760. 2 => 'bar',
  1761. )));
  1762. $admin = $this->getMockBuilder('Sonata\AdminBundle\Admin\AbstractAdmin')
  1763. ->disableOriginalConstructor()
  1764. ->setMethods(array('getDatagrid', 'getTranslationLabel', 'trans'))
  1765. ->getMockForAbstractClass();
  1766. $admin->method('getDatagrid')->will($this->returnValue($datagrid));
  1767. $admin->setModelManager($modelManager);
  1768. $admin->expects($this->any())
  1769. ->method('getTranslationLabel')
  1770. ->will($this->returnCallback(function ($label, $context = '', $type = '') {
  1771. return $context.'.'.$type.'_'.$label;
  1772. }));
  1773. $admin->expects($this->any())
  1774. ->method('trans')
  1775. ->will($this->returnCallback(function ($label) {
  1776. if ($label == 'export.label_field') {
  1777. return 'Feld';
  1778. }
  1779. return $label;
  1780. }));
  1781. $admin->getDataSourceIterator();
  1782. }
  1783. public function testCircularChildAdmin()
  1784. {
  1785. $this->expectException(
  1786. 'RuntimeException',
  1787. 'Circular reference detected! The child admin `sonata.post.admin.post` is already in the parent tree of the `sonata.post.admin.comment` admin.'
  1788. );
  1789. $postAdmin = new PostAdmin(
  1790. 'sonata.post.admin.post',
  1791. 'Application\Sonata\NewsBundle\Entity\Post',
  1792. 'SonataNewsBundle:PostAdmin'
  1793. );
  1794. $commentAdmin = new CommentAdmin(
  1795. 'sonata.post.admin.comment',
  1796. 'Application\Sonata\NewsBundle\Entity\Comment',
  1797. 'SonataNewsBundle:CommentAdmin'
  1798. );
  1799. $postAdmin->addChild($commentAdmin);
  1800. $commentAdmin->addChild($postAdmin);
  1801. }
  1802. public function testCircularChildAdminTripleLevel()
  1803. {
  1804. $this->expectException(
  1805. 'RuntimeException',
  1806. 'Circular reference detected! The child admin `sonata.post.admin.post` is already in the parent tree of the `sonata.post.admin.comment_vote` admin.'
  1807. );
  1808. $postAdmin = new PostAdmin(
  1809. 'sonata.post.admin.post',
  1810. 'Application\Sonata\NewsBundle\Entity\Post',
  1811. 'SonataNewsBundle:PostAdmin'
  1812. );
  1813. $commentAdmin = new CommentAdmin(
  1814. 'sonata.post.admin.comment',
  1815. 'Application\Sonata\NewsBundle\Entity\Comment',
  1816. 'SonataNewsBundle:CommentAdmin'
  1817. );
  1818. $commentVoteAdmin = new CommentVoteAdmin(
  1819. 'sonata.post.admin.comment_vote',
  1820. 'Application\Sonata\NewsBundle\Entity\CommentVote',
  1821. 'SonataNewsBundle:CommentVoteAdmin'
  1822. );
  1823. $postAdmin->addChild($commentAdmin);
  1824. $commentAdmin->addChild($commentVoteAdmin);
  1825. $commentVoteAdmin->addChild($postAdmin);
  1826. }
  1827. public function testCircularChildAdminWithItself()
  1828. {
  1829. $this->expectException(
  1830. 'RuntimeException',
  1831. 'Circular reference detected! The child admin `sonata.post.admin.post` is already in the parent tree of the `sonata.post.admin.post` admin.'
  1832. );
  1833. $postAdmin = new PostAdmin(
  1834. 'sonata.post.admin.post',
  1835. 'Application\Sonata\NewsBundle\Entity\Post',
  1836. 'SonataNewsBundle:PostAdmin'
  1837. );
  1838. $postAdmin->addChild($postAdmin);
  1839. }
  1840. public function testGetRootAncestor()
  1841. {
  1842. $postAdmin = new PostAdmin(
  1843. 'sonata.post.admin.post',
  1844. 'Application\Sonata\NewsBundle\Entity\Post',
  1845. 'SonataNewsBundle:PostAdmin'
  1846. );
  1847. $commentAdmin = new CommentAdmin(
  1848. 'sonata.post.admin.comment',
  1849. 'Application\Sonata\NewsBundle\Entity\Comment',
  1850. 'SonataNewsBundle:CommentAdmin'
  1851. );
  1852. $commentVoteAdmin = new CommentVoteAdmin(
  1853. 'sonata.post.admin.comment_vote',
  1854. 'Application\Sonata\NewsBundle\Entity\CommentVote',
  1855. 'SonataNewsBundle:CommentVoteAdmin'
  1856. );
  1857. $this->assertSame($postAdmin, $postAdmin->getRootAncestor());
  1858. $this->assertSame($commentAdmin, $commentAdmin->getRootAncestor());
  1859. $this->assertSame($commentVoteAdmin, $commentVoteAdmin->getRootAncestor());
  1860. $postAdmin->addChild($commentAdmin);
  1861. $this->assertSame($postAdmin, $postAdmin->getRootAncestor());
  1862. $this->assertSame($postAdmin, $commentAdmin->getRootAncestor());
  1863. $this->assertSame($commentVoteAdmin, $commentVoteAdmin->getRootAncestor());
  1864. $commentAdmin->addChild($commentVoteAdmin);
  1865. $this->assertSame($postAdmin, $postAdmin->getRootAncestor());
  1866. $this->assertSame($postAdmin, $commentAdmin->getRootAncestor());
  1867. $this->assertSame($postAdmin, $commentVoteAdmin->getRootAncestor());
  1868. }
  1869. public function testGetChildDepth()
  1870. {
  1871. $postAdmin = new PostAdmin(
  1872. 'sonata.post.admin.post',
  1873. 'Application\Sonata\NewsBundle\Entity\Post',
  1874. 'SonataNewsBundle:PostAdmin'
  1875. );
  1876. $commentAdmin = new CommentAdmin(
  1877. 'sonata.post.admin.comment',
  1878. 'Application\Sonata\NewsBundle\Entity\Comment',
  1879. 'SonataNewsBundle:CommentAdmin'
  1880. );
  1881. $commentVoteAdmin = new CommentVoteAdmin(
  1882. 'sonata.post.admin.comment_vote',
  1883. 'Application\Sonata\NewsBundle\Entity\CommentVote',
  1884. 'SonataNewsBundle:CommentVoteAdmin'
  1885. );
  1886. $this->assertSame(0, $postAdmin->getChildDepth());
  1887. $this->assertSame(0, $commentAdmin->getChildDepth());
  1888. $this->assertSame(0, $commentVoteAdmin->getChildDepth());
  1889. $postAdmin->addChild($commentAdmin);
  1890. $this->assertSame(0, $postAdmin->getChildDepth());
  1891. $this->assertSame(1, $commentAdmin->getChildDepth());
  1892. $this->assertSame(0, $commentVoteAdmin->getChildDepth());
  1893. $commentAdmin->addChild($commentVoteAdmin);
  1894. $this->assertSame(0, $postAdmin->getChildDepth());
  1895. $this->assertSame(1, $commentAdmin->getChildDepth());
  1896. $this->assertSame(2, $commentVoteAdmin->getChildDepth());
  1897. }
  1898. public function testGetCurrentLeafChildAdmin()
  1899. {
  1900. $postAdmin = new PostAdmin(
  1901. 'sonata.post.admin.post',
  1902. 'Application\Sonata\NewsBundle\Entity\Post',
  1903. 'SonataNewsBundle:PostAdmin'
  1904. );
  1905. $commentAdmin = new CommentAdmin(
  1906. 'sonata.post.admin.comment',
  1907. 'Application\Sonata\NewsBundle\Entity\Comment',
  1908. 'SonataNewsBundle:CommentAdmin'
  1909. );
  1910. $commentVoteAdmin = new CommentVoteAdmin(
  1911. 'sonata.post.admin.comment_vote',
  1912. 'Application\Sonata\NewsBundle\Entity\CommentVote',
  1913. 'SonataNewsBundle:CommentVoteAdmin'
  1914. );
  1915. $postAdmin->addChild($commentAdmin);
  1916. $commentAdmin->addChild($commentVoteAdmin);
  1917. $this->assertNull($postAdmin->getCurrentLeafChildAdmin());
  1918. $this->assertNull($commentAdmin->getCurrentLeafChildAdmin());
  1919. $this->assertNull($commentVoteAdmin->getCurrentLeafChildAdmin());
  1920. $commentAdmin->setCurrentChild(true);
  1921. $this->assertSame($commentAdmin, $postAdmin->getCurrentLeafChildAdmin());
  1922. $this->assertNull($commentAdmin->getCurrentLeafChildAdmin());
  1923. $this->assertNull($commentVoteAdmin->getCurrentLeafChildAdmin());
  1924. $commentVoteAdmin->setCurrentChild(true);
  1925. $this->assertSame($commentVoteAdmin, $postAdmin->getCurrentLeafChildAdmin());
  1926. $this->assertSame($commentVoteAdmin, $commentAdmin->getCurrentLeafChildAdmin());
  1927. $this->assertNull($commentVoteAdmin->getCurrentLeafChildAdmin());
  1928. }
  1929. private function createTagAdmin(Post $post)
  1930. {
  1931. $postAdmin = $this->getMockBuilder('Sonata\AdminBundle\Tests\Fixtures\Admin\PostAdmin')
  1932. ->disableOriginalConstructor()
  1933. ->getMock();
  1934. $postAdmin->expects($this->any())->method('getObject')->will($this->returnValue($post));
  1935. $formBuilder = $this->createMock('Symfony\Component\Form\FormBuilderInterface');
  1936. $formBuilder->expects($this->any())->method('getForm')->will($this->returnValue(null));
  1937. $tagAdmin = $this->getMockBuilder('Sonata\AdminBundle\Tests\Fixtures\Admin\TagAdmin')
  1938. ->setConstructorArgs(array(
  1939. 'admin.tag',
  1940. 'Sonata\AdminBundle\Tests\Fixtures\Bundle\Entity\Tag',
  1941. 'MyBundle:MyController',
  1942. ))
  1943. ->setMethods(array('getFormBuilder'))
  1944. ->getMock();
  1945. $tagAdmin->expects($this->any())->method('getFormBuilder')->will($this->returnValue($formBuilder));
  1946. $tagAdmin->setParent($postAdmin);
  1947. $tag = new Tag();
  1948. $tagAdmin->setSubject($tag);
  1949. $request = $this->createMock('Symfony\Component\HttpFoundation\Request');
  1950. $tagAdmin->setRequest($request);
  1951. $configurationPool = $this->getMockBuilder('Sonata\AdminBundle\Admin\Pool')
  1952. ->disableOriginalConstructor()
  1953. ->getMock();
  1954. $configurationPool->expects($this->any())->method('getPropertyAccessor')->will($this->returnValue(PropertyAccess::createPropertyAccessor()));
  1955. $tagAdmin->setConfigurationPool($configurationPool);
  1956. return $tagAdmin;
  1957. }
  1958. }