View source
<?php
namespace Drupal\Tests\Core\Plugin;
use Drupal\Component\Plugin\Definition\PluginDefinitionInterface;
use Drupal\Component\Plugin\DependentPluginInterface;
use Drupal\Component\Plugin\PluginInspectionInterface;
use Drupal\Core\Extension\ModuleHandlerInterface;
use Drupal\Core\Extension\ThemeHandlerInterface;
use Drupal\Core\Plugin\Definition\DependentPluginDefinitionInterface;
use Drupal\Core\Plugin\PluginDependencyTrait;
use Drupal\Tests\UnitTestCase;
use Prophecy\Prophecy\ProphecyInterface;
class PluginDependencyTraitTest extends UnitTestCase {
public function testGetPluginDependencies(ProphecyInterface $plugin, $definition, array $expected) {
$test_class = new TestPluginDependency();
$module_handler = $this
->prophesize(ModuleHandlerInterface::class);
$module_handler
->moduleExists('test_module1')
->willReturn(TRUE);
$module_handler
->moduleExists('test_theme1')
->willReturn(FALSE);
$test_class
->setModuleHandler($module_handler
->reveal());
$theme_handler = $this
->prophesize(ThemeHandlerInterface::class);
$theme_handler
->themeExists('test_module1')
->willReturn(FALSE);
$theme_handler
->themeExists('test_theme1')
->willReturn(TRUE);
$test_class
->setThemeHandler($theme_handler
->reveal());
$plugin
->getPluginDefinition()
->willReturn($definition);
$actual = $test_class
->getPluginDependencies($plugin
->reveal());
$this
->assertEquals($expected, $actual);
$this
->assertEmpty($test_class
->getDependencies());
}
public function testCalculatePluginDependencies(ProphecyInterface $plugin, $definition, array $expected) {
$test_class = new TestPluginDependency();
$module_handler = $this
->prophesize(ModuleHandlerInterface::class);
$module_handler
->moduleExists('test_module1')
->willReturn(TRUE);
$module_handler
->moduleExists('test_theme1')
->willReturn(FALSE);
$test_class
->setModuleHandler($module_handler
->reveal());
$theme_handler = $this
->prophesize(ThemeHandlerInterface::class);
$theme_handler
->themeExists('test_module1')
->willReturn(FALSE);
$theme_handler
->themeExists('test_theme1')
->willReturn(TRUE);
$test_class
->setThemeHandler($theme_handler
->reveal());
$plugin
->getPluginDefinition()
->willReturn($definition);
$test_class
->calculatePluginDependencies($plugin
->reveal());
$this
->assertEquals($expected, $test_class
->getDependencies());
}
public function providerTestPluginDependencies() {
$data = [];
$plugin = $this
->prophesize(PluginInspectionInterface::class);
$dependent_plugin = $this
->prophesize(PluginInspectionInterface::class)
->willImplement(DependentPluginInterface::class);
$dependent_plugin
->calculateDependencies()
->willReturn([
'module' => [
'test_module2',
],
]);
$data['dependent_plugin_from_module'] = [
$dependent_plugin,
[
'provider' => 'test_module1',
],
[
'module' => [
'test_module1',
'test_module2',
],
],
];
$data['dependent_plugin_from_core'] = [
$dependent_plugin,
[
'provider' => 'core',
],
[
'module' => [
'core',
'test_module2',
],
],
];
$data['dependent_plugin_from_theme'] = [
$dependent_plugin,
[
'provider' => 'test_theme1',
],
[
'module' => [
'test_module2',
],
'theme' => [
'test_theme1',
],
],
];
$data['array_with_config_dependencies'] = [
$plugin,
[
'provider' => 'test_module1',
'config_dependencies' => [
'module' => [
'test_module2',
],
],
],
[
'module' => [
'test_module1',
'test_module2',
],
],
];
$definition = $this
->prophesize(PluginDefinitionInterface::class);
$definition
->getProvider()
->willReturn('test_module1');
$data['object_definition'] = [
$plugin,
$definition
->reveal(),
[
'module' => [
'test_module1',
],
],
];
$dependent_definition = $this
->prophesize(PluginDefinitionInterface::class)
->willImplement(DependentPluginDefinitionInterface::class);
$dependent_definition
->getProvider()
->willReturn('test_module1');
$dependent_definition
->getConfigDependencies()
->willReturn([
'module' => [
'test_module2',
],
]);
$data['dependent_object_definition'] = [
$plugin,
$dependent_definition
->reveal(),
[
'module' => [
'test_module1',
'test_module2',
],
],
];
return $data;
}
public function testNeitherThemeNorModule() {
$test_class = new TestPluginDependency();
$plugin = $this
->prophesize(PluginInspectionInterface::class);
$definition = $this
->prophesize(PluginDefinitionInterface::class);
$definition
->getProvider()
->willReturn('neither_theme_nor_module');
$module_handler = $this
->prophesize(ModuleHandlerInterface::class);
$module_handler
->moduleExists('neither_theme_nor_module')
->willReturn(FALSE);
$test_class
->setModuleHandler($module_handler
->reveal());
$theme_handler = $this
->prophesize(ThemeHandlerInterface::class);
$theme_handler
->themeExists('neither_theme_nor_module')
->willReturn(FALSE);
$test_class
->setThemeHandler($theme_handler
->reveal());
$plugin
->getPluginDefinition()
->willReturn($definition);
$actual = $test_class
->getPluginDependencies($plugin
->reveal());
$expected = [
'module' => [
'neither_theme_nor_module',
],
];
$this
->assertEquals($expected, $actual);
}
}
class TestPluginDependency {
use PluginDependencyTrait {
calculatePluginDependencies as public;
getPluginDependencies as public;
}
protected $moduleHandler;
protected $themeHandler;
public function setModuleHandler(ModuleHandlerInterface $module_handler) {
$this->moduleHandler = $module_handler;
}
public function setThemeHandler(ThemeHandlerInterface $theme_handler) {
$this->themeHandler = $theme_handler;
}
protected function moduleHandler() {
return $this->moduleHandler;
}
protected function themeHandler() {
return $this->themeHandler;
}
public function getDependencies() {
return $this->dependencies;
}
}