Chris@0: $plugin_id, Chris@0: 'configuration' => $configuration, Chris@0: ]; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Generates a mocked FactoryInterface object with known properties. Chris@0: */ Chris@0: public function getMockFactoryInterface($expects_count) { Chris@0: $mock_factory = $this->getMockBuilder('Drupal\Component\Plugin\Factory\FactoryInterface') Chris@0: ->setMethods(['createInstance']) Chris@0: ->getMockForAbstractClass(); Chris@0: $mock_factory->expects($this->exactly($expects_count)) Chris@0: ->method('createInstance') Chris@0: ->willReturnCallback([$this, 'createInstanceCallback']); Chris@0: return $mock_factory; Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests createInstance() with no fallback methods. Chris@0: * Chris@0: * @covers ::createInstance Chris@0: */ Chris@0: public function testCreateInstance() { Chris@0: $manager = $this->getMockBuilder('Drupal\Component\Plugin\PluginManagerBase') Chris@0: ->getMockForAbstractClass(); Chris@0: // PluginManagerBase::createInstance() looks for a factory object and then Chris@0: // calls createInstance() on it. So we have to mock a factory object. Chris@0: $factory_ref = new \ReflectionProperty($manager, 'factory'); Chris@0: $factory_ref->setAccessible(TRUE); Chris@0: $factory_ref->setValue($manager, $this->getMockFactoryInterface(1)); Chris@0: Chris@0: // Finally the test. Chris@0: $configuration_array = ['config' => 'something']; Chris@0: $result = $manager->createInstance('valid', $configuration_array); Chris@0: $this->assertEquals('valid', $result['plugin_id']); Chris@0: $this->assertEquals($configuration_array, $result['configuration']); Chris@0: } Chris@0: Chris@0: /** Chris@0: * Tests createInstance() with a fallback method. Chris@0: * Chris@0: * @covers ::createInstance Chris@0: */ Chris@0: public function testCreateInstanceFallback() { Chris@0: // We use our special stub class which extends PluginManagerBase and also Chris@0: // implements FallbackPluginManagerInterface. Chris@0: $manager = new StubFallbackPluginManager(); Chris@0: // Put our stubbed factory on the base object. Chris@0: $factory_ref = new \ReflectionProperty($manager, 'factory'); Chris@0: $factory_ref->setAccessible(TRUE); Chris@0: Chris@0: // Set up the configuration array. Chris@0: $configuration_array = ['config' => 'something']; Chris@0: Chris@0: // Test with fallback interface and valid plugin_id. Chris@0: $factory_ref->setValue($manager, $this->getMockFactoryInterface(1)); Chris@0: $no_fallback_result = $manager->createInstance('valid', $configuration_array); Chris@0: $this->assertEquals('valid', $no_fallback_result['plugin_id']); Chris@0: $this->assertEquals($configuration_array, $no_fallback_result['configuration']); Chris@0: Chris@0: // Test with fallback interface and invalid plugin_id. Chris@0: $factory_ref->setValue($manager, $this->getMockFactoryInterface(2)); Chris@0: $fallback_result = $manager->createInstance('invalid', $configuration_array); Chris@0: $this->assertEquals('invalid_fallback', $fallback_result['plugin_id']); Chris@0: $this->assertEquals($configuration_array, $fallback_result['configuration']); Chris@0: } Chris@0: Chris@17: /** Chris@17: * @covers ::getInstance Chris@17: */ Chris@17: public function testGetInstance() { Chris@17: $options = [ Chris@17: 'foo' => 'F00', Chris@17: 'bar' => 'bAr', Chris@17: ]; Chris@17: $instance = new \stdClass(); Chris@17: $mapper = $this->prophesize(MapperInterface::class); Chris@17: $mapper->getInstance($options) Chris@17: ->shouldBeCalledTimes(1) Chris@17: ->willReturn($instance); Chris@17: $manager = new StubPluginManagerBaseWithMapper($mapper->reveal()); Chris@17: $this->assertEquals($instance, $manager->getInstance($options)); Chris@17: } Chris@17: Chris@17: /** Chris@17: * @covers ::getInstance Chris@17: */ Chris@17: public function testGetInstanceWithoutMapperShouldThrowException() { Chris@17: $options = [ Chris@17: 'foo' => 'F00', Chris@17: 'bar' => 'bAr', Chris@17: ]; Chris@17: /** @var \Drupal\Component\Plugin\PluginManagerBase $manager */ Chris@17: $manager = $this->getMockBuilder(PluginManagerBase::class) Chris@17: ->getMockForAbstractClass(); Chris@17: // Set the expected exception thrown by ::getInstance. Chris@17: if (method_exists($this, 'expectException')) { Chris@17: $this->expectException(\BadMethodCallException::class); Chris@17: $this->expectExceptionMessage(sprintf('%s does not support this method unless %s::$mapper is set.', get_class($manager), get_class($manager))); Chris@17: } Chris@17: else { Chris@17: $this->setExpectedException(\BadMethodCallException::class, sprintf('%s does not support this method unless %s::$mapper is set.', get_class($manager), get_class($manager))); Chris@17: } Chris@17: $manager->getInstance($options); Chris@17: } Chris@17: Chris@0: }