Updated to Drupal 8.5. Core Media not yet in use.
[yaffs-website] / web / core / tests / Drupal / Tests / Core / Plugin / PluginFormFactoryTest.php
1 <?php
2
3 namespace Drupal\Tests\Core\Plugin;
4
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;
13
14 /**
15  * @coversDefaultClass \Drupal\Core\Plugin\PluginFormFactory
16  * @group Plugin
17  */
18 class PluginFormFactoryTest extends UnitTestCase {
19
20   /**
21    * The class resolver.
22    *
23    * @var \Drupal\Core\DependencyInjection\ClassResolverInterface|\Prophecy\Prophecy\ProphecyInterface
24    */
25   protected $classResolver;
26
27   /**
28    * The manager being tested.
29    *
30    * @var \Drupal\Core\Plugin\PluginFormFactory
31    */
32   protected $manager;
33
34   /**
35    * {@inheritdoc}
36    */
37   protected function setUp() {
38     parent::setUp();
39
40     $this->classResolver = $this->prophesize(ClassResolverInterface::class);
41     $this->manager = new PluginFormFactory($this->classResolver->reveal());
42   }
43
44   /**
45    * @covers ::createInstance
46    */
47   public function testCreateInstance() {
48     $plugin_form = $this->prophesize(PluginFormInterface::class);
49     $expected = $plugin_form->reveal();
50
51     $this->classResolver->getInstanceFromDefinition(get_class($expected))->willReturn($expected);
52
53     $plugin = $this->prophesize(PluginWithFormsInterface::class);
54     $plugin->hasFormClass('standard_class')->willReturn(TRUE);
55     $plugin->getFormClass('standard_class')->willReturn(get_class($expected));
56
57     $form_object = $this->manager->createInstance($plugin->reveal(), 'standard_class');
58     $this->assertSame($expected, $form_object);
59   }
60
61   /**
62    * @covers ::createInstance
63    */
64   public function testCreateInstanceUsingPlugin() {
65     $this->classResolver->getInstanceFromDefinition(Argument::cetera())->shouldNotBeCalled();
66
67     $plugin = $this->prophesize(PluginWithFormsInterface::class)->willImplement(PluginFormInterface::class);
68     $plugin->hasFormClass('configure')->willReturn(TRUE);
69     $plugin->getFormClass('configure')->willReturn(get_class($plugin->reveal()));
70
71     $form_object = $this->manager->createInstance($plugin->reveal(), 'configure');
72     $this->assertSame($plugin->reveal(), $form_object);
73   }
74
75   /**
76    * @covers ::createInstance
77    */
78   public function testCreateInstanceUsingPluginWithSlashes() {
79     $this->classResolver->getInstanceFromDefinition(Argument::cetera())->shouldNotBeCalled();
80
81     $plugin = $this->prophesize(PluginWithFormsInterface::class)->willImplement(PluginFormInterface::class);
82     $plugin->hasFormClass('configure')->willReturn(TRUE);
83     $plugin->getFormClass('configure')->willReturn('\\' . get_class($plugin->reveal()));
84
85     $form_object = $this->manager->createInstance($plugin->reveal(), 'configure');
86     $this->assertSame($plugin->reveal(), $form_object);
87   }
88
89   /**
90    * @covers ::createInstance
91    */
92   public function testCreateInstanceDefaultFallback() {
93     $this->classResolver->getInstanceFromDefinition(Argument::cetera())->shouldNotBeCalled();
94
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()));
99
100     $form_object = $this->manager->createInstance($plugin->reveal(), 'missing', 'fallback');
101     $this->assertSame($plugin->reveal(), $form_object);
102   }
103
104   /**
105    * @covers ::createInstance
106    */
107   public function testCreateInstancePluginAware() {
108     $plugin_form = $this->prophesize(PluginFormInterface::class)->willImplement(PluginAwareInterface::class);
109
110     $expected = $plugin_form->reveal();
111
112     $this->classResolver->getInstanceFromDefinition(get_class($expected))->willReturn($expected);
113
114     $plugin = $this->prophesize(PluginWithFormsInterface::class);
115     $plugin->hasFormClass('operation_aware')->willReturn(TRUE);
116     $plugin->getFormClass('operation_aware')->willReturn(get_class($expected));
117
118     $plugin_form->setPlugin($plugin->reveal())->shouldBeCalled();
119
120     $form_object = $this->manager->createInstance($plugin->reveal(), 'operation_aware');
121     $this->assertSame($expected, $form_object);
122   }
123
124   /**
125    * @covers ::createInstance
126    */
127   public function testCreateInstanceDefinitionException() {
128     $this->setExpectedException(InvalidPluginDefinitionException::class, 'The "the_plugin_id" plugin did not specify a "anything" form class');
129
130     $plugin = $this->prophesize(PluginWithFormsInterface::class);
131     $plugin->getPluginId()->willReturn('the_plugin_id');
132     $plugin->hasFormClass('anything')->willReturn(FALSE);
133
134     $form_object = $this->manager->createInstance($plugin->reveal(), 'anything');
135     $this->assertSame(NULL, $form_object);
136   }
137
138   /**
139    * @covers ::createInstance
140    */
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');
143
144     $expected = new \stdClass();
145     $this->classResolver->getInstanceFromDefinition(get_class($expected))->willReturn($expected);
146
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));
151
152     $form_object = $this->manager->createInstance($plugin->reveal(), 'invalid');
153     $this->assertSame(NULL, $form_object);
154   }
155
156 }