Issue #2174933 by dawehner: Not possible to use same route_name in local_actions.yml.

8.0.x
Alex Pott 2014-02-15 22:18:05 +00:00
parent 094c6e8d5b
commit 9848762852
2 changed files with 394 additions and 5 deletions

View File

@ -11,6 +11,7 @@ use Drupal\Core\Access\AccessManager;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Language\LanguageManager;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Menu\LocalActionInterface;
use Drupal\Core\Plugin\DefaultPluginManager;
use Drupal\Component\Plugin\Discovery\ProcessDecorator;
@ -94,7 +95,7 @@ class LocalActionManager extends DefaultPluginManager {
/**
* The plugin instances.
*
* @var array
* @var \Drupal\Core\Menu\LocalActionInterface[]
*/
protected $instances = array();
@ -112,12 +113,14 @@ class LocalActionManager extends DefaultPluginManager {
* The module handler.
* @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
* Cache backend instance to use.
* @param \Drupal\Core\Language\LanguageManager $language_manager
* @param \Drupal\Core\Language\LanguageManagerInterface $language_manager
* The language manager.
* @param \Drupal\Core\Access\AccessManager $access_manager
* The access manager.
* @param \Drupal\Core\Session\AccountInterface $account
* The current user.
*/
public function __construct(ControllerResolverInterface $controller_resolver, Request $request, RouteProviderInterface $route_provider, ModuleHandlerInterface $module_handler, CacheBackendInterface $cache_backend, LanguageManager $language_manager, AccessManager $access_manager, AccountInterface $account) {
public function __construct(ControllerResolverInterface $controller_resolver, Request $request, RouteProviderInterface $route_provider, ModuleHandlerInterface $module_handler, CacheBackendInterface $cache_backend, LanguageManagerInterface $language_manager, AccessManager $access_manager, AccountInterface $account) {
// Skip calling the parent constructor, since that assumes annotation-based
// discovery.
$this->discovery = new YamlDiscovery('local_actions', $module_handler->getModuleDirectories());
@ -179,10 +182,10 @@ class LocalActionManager extends DefaultPluginManager {
}
}
$links = array();
foreach ($this->instances[$route_appears] as $plugin) {
foreach ($this->instances[$route_appears] as $plugin_id => $plugin) {
$route_name = $plugin->getRouteName();
$route_parameters = $plugin->getRouteParameters($this->request);
$links[$route_name] = array(
$links[$plugin_id] = array(
'#theme' => 'menu_local_action',
'#link' => array(
'title' => $this->getTitle($plugin),

View File

@ -0,0 +1,386 @@
<?php
/**
* @file
* Contains \Drupal\Tests\Core\Menu\LocalActionManagerTest.
*/
namespace Drupal\Tests\Core\Menu;
use Drupal\Component\Plugin\Discovery\DiscoveryInterface;
use Drupal\Component\Plugin\Factory\FactoryInterface;
use Drupal\Core\Access\AccessManager;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Language\Language;
use Drupal\Core\Language\LanguageManagerInterface;
use Drupal\Core\Menu\LocalActionManager;
use Drupal\Core\Routing\RouteProviderInterface;
use Drupal\Core\Session\AccountInterface;
use Drupal\Tests\UnitTestCase;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpKernel\Controller\ControllerResolverInterface;
/**
* Tests the local action manager.
*
* @group Drupal
* @group Menu
*
* @covers \Drupal\Core\Menu\LocalActionManager
*/
class LocalActionManagerTest extends UnitTestCase {
/**
* The mocked controller resolver.
*
* @var \Drupal\Core\Controller\ControllerResolverInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $controllerResolver;
/**
* The mocked request.
*
* @var \Symfony\Component\HttpFoundation\Request|\PHPUnit_Framework_MockObject_MockObject
*/
protected $request;
/**
* The mocked module handler.
*
* @var \Drupal\Core\Extension\ModuleHandlerInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $moduleHandler;
/**
* The mocked router provider.
*
* @var \Drupal\Core\Routing\RouteProviderInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $routeProvider;
/**
* The mocked cache backend.
*
* @var \Drupal\Core\Cache\CacheBackendInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $cacheBackend;
/**
* The mocked language manager.
*
* @var \Drupal\Core\Language\LanguageManagerInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $languageManager;
/**
* The mocked access manager.
*
* @var \Drupal\Core\Access\AccessManager|\PHPUnit_Framework_MockObject_MockObject
*/
protected $accessManager;
/**
* The mocked account.
*
* @var \Drupal\Core\Session\AccountInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $account;
/**
* The mocked factory.
*
* @var \Drupal\Component\Plugin\Factory\FactoryInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $factory;
/**
* The mocked plugin discovery.
*
* @var \Drupal\Component\Plugin\Discovery\DiscoveryInterface|\PHPUnit_Framework_MockObject_MockObject
*/
protected $discovery;
/**
* The tested local action manager
*
* @var \Drupal\Tests\Core\Menu\TestLocalActionManager
*/
protected $localActionManager;
/**
* {@inheritdoc}
*/
public static function getInfo() {
return array(
'name' => 'Local actions manager',
'description' => 'Tests the local action manager.',
'group' => 'Menu',
);
}
/**
* {@inheritdoc}
*/
protected function setUp() {
$this->controllerResolver = $this->getMock('Drupal\Core\Controller\ControllerResolverInterface');
$this->request = $this->getMock('Symfony\Component\HttpFoundation\Request');
$this->routeProvider = $this->getMock('Drupal\Core\Routing\RouteProviderInterface');
$this->moduleHandler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
$this->cacheBackend = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
$this->languageManager = $this->getMock('Drupal\Core\Language\LanguageManagerInterface');
$this->languageManager->expects($this->any())
->method('getCurrentLanguage')
->will($this->returnValue(
new Language(array('langcode' => 'en'))
));
$this->accessManager = $this->getMockBuilder('Drupal\Core\Access\AccessManager')
->disableOriginalConstructor()
->getMock();
$this->account = $this->getMock('Drupal\Core\Session\AccountInterface');
$this->discovery = $this->getMock('Drupal\Component\Plugin\Discovery\DiscoveryInterface');
$this->factory = $this->getMock('Drupal\Component\Plugin\Factory\FactoryInterface');
$this->localActionManager = new TestLocalActionManager($this->controllerResolver, $this->request, $this->routeProvider, $this->moduleHandler, $this->cacheBackend, $this->languageManager, $this->accessManager, $this->account, $this->discovery, $this->factory);
}
/**
* @covers \Drupal\Core\Menu\LocalActionManager::getTitle()
*/
public function testGetTitle() {
$local_action = $this->getMock('Drupal\Core\Menu\LocalActionInterface');
$local_action->expects($this->once())
->method('getTitle')
->with('test');
$this->controllerResolver->expects($this->once())
->method('getArguments')
->with($this->request, array($local_action, 'getTitle'))
->will($this->returnValue(array('test')));
$this->localActionManager->getTitle($local_action);
}
/**
* @covers \Drupal\Core\Menu\LocalActionManager::getActionsForRoute()
*
* @dataProvider getActionsForRouteProvider
*/
public function testGetActionsForRoute($route_appears, array $plugin_definitions, array $expected_actions) {
$this->discovery->expects($this->any())
->method('getDefinitions')
->will($this->returnValue($plugin_definitions));
$map = array();
foreach ($plugin_definitions as $plugin_id => $plugin_definition) {
$plugin = $this->getMock('Drupal\Core\Menu\LocalActionInterface');
$plugin->expects($this->any())
->method('getRouteName')
->will($this->returnValue($plugin_definition['route_name']));
$plugin->expects($this->any())
->method('getRouteParameters')
->will($this->returnValue(isset($plugin_definition['route_parameters']) ? $plugin_definition['route_parameters'] : array()));
$plugin->expects($this->any())
->method('getTitle')
->will($this->returnValue($plugin_definition['title']));
$this->controllerResolver->expects($this->any())
->method('getArguments')
->with($this->request, array($plugin, 'getTitle'))
->will($this->returnValue(array()));
$plugin->expects($this->any())
->method('getWeight')
->will($this->returnValue($plugin_definition['weight']));
$this->controllerResolver->expects($this->any())
->method('getArguments')
->with($this->request, array($plugin, 'getTitle'))
->will($this->returnValue(array()));
$map[] = array($plugin_id, array(), $plugin);
}
$this->factory->expects($this->any())
->method('createInstance')
->will($this->returnValueMap($map));
$this->assertEquals($expected_actions, $this->localActionManager->getActionsForRoute($route_appears));
}
public function getActionsForRouteProvider() {
// Single available and single expected plugins.
$data[] = array(
'test_route',
array(
'plugin_id_1' => array(
'appears_on' => array(
'test_route',
),
'route_name' => 'test_route_2',
'title' => 'Plugin ID 1',
'weight' => 0,
),
),
array(
'plugin_id_1' => array(
'#theme' => 'menu_local_action',
'#link' => array(
'title' => 'Plugin ID 1',
'route_name' => 'test_route_2',
'route_parameters' => array(),
'localized_options' => '',
),
'#access' => NULL,
'#weight' => 0,
),
),
);
// Multiple available and single expected plugins.
$data[] = array(
'test_route',
array(
'plugin_id_1' => array(
'appears_on' => array(
'test_route',
),
'route_name' => 'test_route_2',
'title' => 'Plugin ID 1',
'weight' => 0,
),
'plugin_id_2' => array(
'appears_on' => array(
'test_route2',
),
'route_name' => 'test_route_3',
'title' => 'Plugin ID 2',
'weight' => 0,
),
),
array(
'plugin_id_1' => array(
'#theme' => 'menu_local_action',
'#link' => array(
'title' => 'Plugin ID 1',
'route_name' => 'test_route_2',
'route_parameters' => array(),
'localized_options' => '',
),
'#access' => NULL,
'#weight' => 0,
),
),
);
// Multiple available and multiple expected plugins and specified weight.
$data[] = array(
'test_route',
array(
'plugin_id_1' => array(
'appears_on' => array(
'test_route',
),
'route_name' => 'test_route_2',
'title' => 'Plugin ID 1',
'weight' => 1,
),
'plugin_id_2' => array(
'appears_on' => array(
'test_route',
),
'route_name' => 'test_route_3',
'title' => 'Plugin ID 2',
'weight' => 0,
),
),
array(
'plugin_id_1' => array(
'#theme' => 'menu_local_action',
'#link' => array(
'title' => 'Plugin ID 1',
'route_name' => 'test_route_2',
'route_parameters' => array(),
'localized_options' => '',
),
'#access' => NULL,
'#weight' => 1,
),
'plugin_id_2' => array(
'#theme' => 'menu_local_action',
'#link' => array(
'title' => 'Plugin ID 2',
'route_name' => 'test_route_3',
'route_parameters' => array(),
'localized_options' => '',
),
'#access' => NULL,
'#weight' => 0,
),
),
);
// Two plugins with the same route name but different route parameters.
$data[] = array(
'test_route',
array(
'plugin_id_1' => array(
'appears_on' => array(
'test_route',
),
'route_name' => 'test_route_2',
'route_parameters' => array('test1'),
'title' => 'Plugin ID 1',
'weight' => 1,
),
'plugin_id_2' => array(
'appears_on' => array(
'test_route',
),
'route_name' => 'test_route_2',
'route_parameters' => array('test2'),
'title' => 'Plugin ID 2',
'weight' => 0,
),
),
array(
'plugin_id_1' => array(
'#theme' => 'menu_local_action',
'#link' => array(
'title' => 'Plugin ID 1',
'route_name' => 'test_route_2',
'route_parameters' => array('test1'),
'localized_options' => '',
),
'#access' => NULL,
'#weight' => 1,
),
'plugin_id_2' => array(
'#theme' => 'menu_local_action',
'#link' => array(
'title' => 'Plugin ID 2',
'route_name' => 'test_route_2',
'route_parameters' => array('test2'),
'localized_options' => '',
),
'#access' => NULL,
'#weight' => 0,
),
),
);
return $data;
}
}
class TestLocalActionManager extends LocalActionManager {
public function __construct(ControllerResolverInterface $controller_resolver, Request $request, RouteProviderInterface $route_provider, ModuleHandlerInterface $module_handler, CacheBackendInterface $cache_backend, LanguageManagerInterface $language_manager, AccessManager $access_manager, AccountInterface $account, DiscoveryInterface $discovery, FactoryInterface $factory) {
$this->discovery = $discovery;
$this->factory = $factory;
$this->routeProvider = $route_provider;
$this->accessManager = $access_manager;
$this->account = $account;
$this->controllerResolver = $controller_resolver;
$this->request = $request;
$this->alterInfo($module_handler, 'menu_local_actions');
$this->setCacheBackend($cache_backend, $language_manager, 'local_action_plugins', array('local_action' => TRUE));
}
}