3 namespace Drupal\Tests\Core\Plugin;
5 use Drupal\Component\Plugin\Exception\InvalidPluginDefinitionException;
6 use Drupal\Component\Plugin\PluginAwareInterface;
7 use Drupal\Core\DependencyInjection\ClassResolverInterface;
8 use Drupal\Core\Plugin\PluginFormInterface;
9 use Drupal\Core\Plugin\PluginFormFactory;
10 use Drupal\Core\Plugin\PluginWithFormsInterface;
11 use Drupal\Tests\UnitTestCase;
12 use Prophecy\Argument;
15 * @coversDefaultClass \Drupal\Core\Plugin\PluginFormFactory
18 class PluginFormFactoryTest extends UnitTestCase {
23 * @var \Drupal\Core\DependencyInjection\ClassResolverInterface|\Prophecy\Prophecy\ProphecyInterface
25 protected $classResolver;
28 * The manager being tested.
30 * @var \Drupal\Core\Plugin\PluginFormFactory
37 protected function setUp() {
40 $this->classResolver = $this->prophesize(ClassResolverInterface::class);
41 $this->manager = new PluginFormFactory($this->classResolver->reveal());
45 * @covers ::createInstance
47 public function testCreateInstance() {
48 $plugin_form = $this->prophesize(PluginFormInterface::class);
49 $expected = $plugin_form->reveal();
51 $this->classResolver->getInstanceFromDefinition(get_class($expected))->willReturn($expected);
53 $plugin = $this->prophesize(PluginWithFormsInterface::class);
54 $plugin->hasFormClass('standard_class')->willReturn(TRUE);
55 $plugin->getFormClass('standard_class')->willReturn(get_class($expected));
57 $form_object = $this->manager->createInstance($plugin->reveal(), 'standard_class');
58 $this->assertSame($expected, $form_object);
62 * @covers ::createInstance
64 public function testCreateInstanceUsingPlugin() {
65 $this->classResolver->getInstanceFromDefinition(Argument::cetera())->shouldNotBeCalled();
67 $plugin = $this->prophesize(PluginWithFormsInterface::class)->willImplement(PluginFormInterface::class);
68 $plugin->hasFormClass('configure')->willReturn(TRUE);
69 $plugin->getFormClass('configure')->willReturn(get_class($plugin->reveal()));
71 $form_object = $this->manager->createInstance($plugin->reveal(), 'configure');
72 $this->assertSame($plugin->reveal(), $form_object);
76 * @covers ::createInstance
78 public function testCreateInstanceUsingPluginWithSlashes() {
79 $this->classResolver->getInstanceFromDefinition(Argument::cetera())->shouldNotBeCalled();
81 $plugin = $this->prophesize(PluginWithFormsInterface::class)->willImplement(PluginFormInterface::class);
82 $plugin->hasFormClass('configure')->willReturn(TRUE);
83 $plugin->getFormClass('configure')->willReturn('\\' . get_class($plugin->reveal()));
85 $form_object = $this->manager->createInstance($plugin->reveal(), 'configure');
86 $this->assertSame($plugin->reveal(), $form_object);
90 * @covers ::createInstance
92 public function testCreateInstanceDefaultFallback() {
93 $this->classResolver->getInstanceFromDefinition(Argument::cetera())->shouldNotBeCalled();
95 $plugin = $this->prophesize(PluginWithFormsInterface::class)->willImplement(PluginFormInterface::class);
96 $plugin->hasFormClass('missing')->willReturn(FALSE);
97 $plugin->hasFormClass('fallback')->willReturn(TRUE);
98 $plugin->getFormClass('fallback')->willReturn(get_class($plugin->reveal()));
100 $form_object = $this->manager->createInstance($plugin->reveal(), 'missing', 'fallback');
101 $this->assertSame($plugin->reveal(), $form_object);
105 * @covers ::createInstance
107 public function testCreateInstancePluginAware() {
108 $plugin_form = $this->prophesize(PluginFormInterface::class)->willImplement(PluginAwareInterface::class);
110 $expected = $plugin_form->reveal();
112 $this->classResolver->getInstanceFromDefinition(get_class($expected))->willReturn($expected);
114 $plugin = $this->prophesize(PluginWithFormsInterface::class);
115 $plugin->hasFormClass('operation_aware')->willReturn(TRUE);
116 $plugin->getFormClass('operation_aware')->willReturn(get_class($expected));
118 $plugin_form->setPlugin($plugin->reveal())->shouldBeCalled();
120 $form_object = $this->manager->createInstance($plugin->reveal(), 'operation_aware');
121 $this->assertSame($expected, $form_object);
125 * @covers ::createInstance
127 public function testCreateInstanceDefinitionException() {
128 $this->setExpectedException(InvalidPluginDefinitionException::class, 'The "the_plugin_id" plugin did not specify a "anything" form class');
130 $plugin = $this->prophesize(PluginWithFormsInterface::class);
131 $plugin->getPluginId()->willReturn('the_plugin_id');
132 $plugin->hasFormClass('anything')->willReturn(FALSE);
134 $form_object = $this->manager->createInstance($plugin->reveal(), 'anything');
135 $this->assertSame(NULL, $form_object);
139 * @covers ::createInstance
141 public function testCreateInstanceInvalidException() {
142 $this->setExpectedException(InvalidPluginDefinitionException::class, 'The "the_plugin_id" plugin did not specify a valid "invalid" form class, must implement \Drupal\Core\Plugin\PluginFormInterface');
144 $expected = new \stdClass();
145 $this->classResolver->getInstanceFromDefinition(get_class($expected))->willReturn($expected);
147 $plugin = $this->prophesize(PluginWithFormsInterface::class);
148 $plugin->getPluginId()->willReturn('the_plugin_id');
149 $plugin->hasFormClass('invalid')->willReturn(TRUE);
150 $plugin->getFormClass('invalid')->willReturn(get_class($expected));
152 $form_object = $this->manager->createInstance($plugin->reveal(), 'invalid');
153 $this->assertSame(NULL, $form_object);