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@0: }