diff --git a/src/Core/Extension/ModuleHandlerTrait.php b/src/Core/Extension/ModuleHandlerTrait.php new file mode 100644 index 0000000..b4007f7 --- /dev/null +++ b/src/Core/Extension/ModuleHandlerTrait.php @@ -0,0 +1,45 @@ +moduleHandler = $moduleHandler; + return $this; + } + + /** + * Gets the module handler. + * + * @return \Drupal\Core\Extension\ModuleHandlerInterface + * The module handler. + */ + public function getModuleHandler() { + if (empty($this->moduleHandler)) { + $this->moduleHandler = \Drupal::service('module_handler'); + } + return $this->moduleHandler; + } + +} diff --git a/tests/src/Core/Extension/ModuleHandlerTraitTest.php b/tests/src/Core/Extension/ModuleHandlerTraitTest.php new file mode 100644 index 0000000..f166153 --- /dev/null +++ b/tests/src/Core/Extension/ModuleHandlerTraitTest.php @@ -0,0 +1,71 @@ +mockContainerWithFakeService(['calls' => 1]); + $this->assertsame($service, $this->getModuleHandler()); + // Multiple calls should fetch the service from the container only once. + $this->getModuleHandler(); + } + + /** + * @covers ::setModuleHandler + */ + public function testSetter() { + // Verify the set service is returned. + $this->mockContainerWithFakeService(['calls' => 0]); + $service = $this->prophesize() + ->willImplement(ModuleHandlerInterface::class) + ->reveal(); + /** @var \Drupal\Core\Extension\ModuleHandlerInterface $service */ + $this->setModuleHandler($service); + $this->assertsame($service, $this->getModuleHandler()); + } + + /** + * Helper to mock the container with a stub service. + * + * @param int[] $options + * An array with the following keys: + * - calls: The number of calls to get the service the mocked container + * expects. + * + * @return object + * The fake service returned by the container. + */ + protected function mockContainerWithFakeService(array $options) { + $service = new \Stdclass(); + $container = $this->prophesize(Container::class); + $prophecy = $container->get($this->serviceId); + /** @var \Prophecy\Prophecy\MethodProphecy $prophecy */ + $prophecy->shouldBeCalledTimes($options['calls']); + $prophecy->willReturn($service); + \Drupal::setContainer($container->reveal()); + return $service; + } + +}