/**
  * @dataProvider getGenerateUrlParentFieldDescriptionTests
  */
 public function testGenerateUrlParentFieldDescription($expected, $name, array $parameters)
 {
     $childCollection = new RouteCollection('base.Code.Parent|base.Code.Child', 'admin_acme_child', '/foo/', 'BundleName:ControllerName');
     $childCollection->add('bar');
     $collection = new RouteCollection('base.Code.Parent', 'admin_acme', '/', 'BundleName:ControllerName');
     $collection->add('foo');
     $collection->addCollection($childCollection);
     $admin = $this->getMock('Sonata\\AdminBundle\\Admin\\AdminInterface');
     $admin->expects($this->any())->method('isChild')->will($this->returnValue(false));
     $admin->expects($this->any())->method('getCode')->will($this->returnValue('base.Code.Parent'));
     // embeded admin (not nested ...)
     $admin->expects($this->once())->method('hasParentFieldDescription')->will($this->returnValue(true));
     $admin->expects($this->once())->method('hasRequest')->will($this->returnValue(true));
     $admin->expects($this->any())->method('getUniqid')->will($this->returnValue('foo_uniqueid'));
     $admin->expects($this->any())->method('getCode')->will($this->returnValue('foo_code'));
     $admin->expects($this->once())->method('getPersistentParameters')->will($this->returnValue(array('abc' => 'a123', 'efg' => 'e456')));
     $admin->expects($this->any())->method('getExtensions')->will($this->returnValue(array()));
     $admin->expects($this->any())->method('getRoutes')->will($this->returnValue($collection));
     $router = $this->getMock('Symfony\\Component\\Routing\\RouterInterface');
     $router->expects($this->once())->method('generate')->will($this->returnCallback(function ($name, array $parameters = array()) {
         $params = '';
         if (!empty($parameters)) {
             $params .= '?' . http_build_query($parameters);
         }
         switch ($name) {
             case 'admin_acme_foo':
                 return '/foo' . $params;
             case 'admin_acme_child_bar':
                 return '/foo/bar' . $params;
         }
         return null;
     }));
     $fieldDescription = $this->getMock('Sonata\\AdminBundle\\Admin\\FieldDescriptionInterface');
     $fieldDescription->expects($this->once())->method('getOption')->will($this->returnValue(array()));
     $parentAdmin = $this->getMock('Sonata\\AdminBundle\\Admin\\AdminInterface');
     $parentAdmin->expects($this->any())->method('getUniqid')->will($this->returnValue('parent_foo_uniqueid'));
     $parentAdmin->expects($this->any())->method('getCode')->will($this->returnValue('parent_foo_code'));
     $parentAdmin->expects($this->any())->method('getExtensions')->will($this->returnValue(array()));
     $fieldDescription->expects($this->any())->method('getAdmin')->will($this->returnValue($parentAdmin));
     $admin->expects($this->any())->method('getParentFieldDescription')->will($this->returnValue($fieldDescription));
     $cache = new RoutesCache($this->cacheTempFolder, true);
     $generator = new DefaultRouteGenerator($router, $cache);
     $this->assertEquals($expected, $generator->generateUrl($admin, $name, $parameters));
 }
 /**
  * @dataProvider getGenerateUrlLoadCacheTests
  */
 public function testGenerateUrlLoadCache($expected, $name, array $parameters)
 {
     $childCollection = new RouteCollection('base.Code.Parent|base.Code.Child', 'admin_acme_child', '/foo', 'BundleName:ControllerName');
     $childCollection->add('bar');
     $collection = new RouteCollection('base.Code.Parent', 'admin_acme', '/', 'BundleName:ControllerName');
     $collection->add('foo');
     $collection->addCollection($childCollection);
     $standaloneCollection = new RouteCollection('base.Code.Child', 'admin_acme_child_standalone', '/', 'BundleName:ControllerName');
     $standaloneCollection->add('bar');
     $admin = $this->getMock('Sonata\\AdminBundle\\Admin\\AdminInterface');
     $admin->expects($this->any())->method('isChild')->will($this->returnValue(true));
     $admin->expects($this->any())->method('getCode')->will($this->returnValue('base.Code.Child'));
     $admin->expects($this->any())->method('getBaseCodeRoute')->will($this->returnValue('base.Code.Parent|base.Code.Child'));
     $admin->expects($this->any())->method('getIdParameter')->will($this->returnValue('id'));
     $admin->expects($this->any())->method('hasParentFieldDescription')->will($this->returnValue(false));
     $admin->expects($this->any())->method('hasRequest')->will($this->returnValue(true));
     $admin->expects($this->any())->method('getUniqid')->will($this->returnValue('foo_uniqueid'));
     $admin->expects($this->any())->method('getPersistentParameters')->will($this->returnValue(array('abc' => 'a123', 'efg' => 'e456')));
     $admin->expects($this->any())->method('getRoutes')->will($this->returnValue($childCollection));
     $admin->expects($this->any())->method('getExtensions')->will($this->returnValue(array()));
     $parentAdmin = $this->getMock('Sonata\\AdminBundle\\Admin\\AdminInterface');
     $parentAdmin->expects($this->any())->method('getIdParameter')->will($this->returnValue('childId'));
     $parentAdmin->expects($this->any())->method('getRoutes')->will($this->returnValue($collection));
     $parentAdmin->expects($this->any())->method('getCode')->will($this->returnValue('base.Code.Parent'));
     $parentAdmin->expects($this->any())->method('getExtensions')->will($this->returnValue(array()));
     // no request attached in this test, so this will not be used
     $parentAdmin->expects($this->never())->method('getPersistentParameters')->will($this->returnValue(array('from' => 'parent')));
     $request = $this->getMock('Symfony\\Component\\HttpFoundation\\Request');
     $request->attributes = $this->getMock('Symfony\\Component\\HttpFoundation\\ParameterBag');
     $request->attributes->expects($this->any())->method('has')->will($this->returnValue(true));
     $request->attributes->expects($this->any())->method('get')->will($this->returnCallback(function ($key) {
         if ($key == 'childId') {
             return '987654';
         }
         return;
     }));
     $admin->expects($this->any())->method('getRequest')->will($this->returnValue($request));
     $admin->expects($this->any())->method('getParent')->will($this->returnValue($parentAdmin));
     $standaloneAdmin = $this->getMock('Sonata\\AdminBundle\\Admin\\AdminInterface');
     $standaloneAdmin->expects($this->any())->method('isChild')->will($this->returnValue(false));
     $standaloneAdmin->expects($this->any())->method('getCode')->will($this->returnValue('base.Code.Child'));
     $standaloneAdmin->expects($this->once())->method('hasParentFieldDescription')->will($this->returnValue(false));
     $standaloneAdmin->expects($this->once())->method('hasRequest')->will($this->returnValue(true));
     $standaloneAdmin->expects($this->any())->method('getUniqid')->will($this->returnValue('foo_uniqueid'));
     $standaloneAdmin->expects($this->once())->method('getPersistentParameters')->will($this->returnValue(array('abc' => 'a123', 'efg' => 'e456')));
     $standaloneAdmin->expects($this->any())->method('getRoutes')->will($this->returnValue($standaloneCollection));
     $standaloneAdmin->expects($this->any())->method('getExtensions')->will($this->returnValue(array()));
     $router = $this->getMock('\\Symfony\\Component\\Routing\\RouterInterface');
     $router->expects($this->exactly(2))->method('generate')->will($this->returnCallback(function ($name, array $parameters = array()) {
         $params = '';
         if (!empty($parameters)) {
             $params .= '?' . http_build_query($parameters);
         }
         switch ($name) {
             case 'admin_acme_child_bar':
                 return '/foo/bar' . $params;
             case 'admin_acme_child_standalone_bar':
                 return '/bar' . $params;
         }
         return;
     }));
     $cache = new RoutesCache($this->cacheTempFolder, true);
     $generator = new DefaultRouteGenerator($router, $cache);
     // Generate once to populate cache
     $generator->generateUrl($admin, 'bar', $parameters);
     $this->assertEquals($expected, $generator->generateUrl($standaloneAdmin, $name, $parameters));
 }