src/EventSubscriber/ResourceResponseSubscriber.php | 15 ++++++++++++-- .../ResourceResponseSubscriberTest.php | 24 +++++++++++++++++----- 2 files changed, 32 insertions(+), 7 deletions(-) diff --git a/src/EventSubscriber/ResourceResponseSubscriber.php b/src/EventSubscriber/ResourceResponseSubscriber.php index ff301a5..33bd9dc 100644 --- a/src/EventSubscriber/ResourceResponseSubscriber.php +++ b/src/EventSubscriber/ResourceResponseSubscriber.php @@ -2,6 +2,7 @@ namespace Drupal\jsonapi\EventSubscriber; +use Drupal\Core\Extension\ModuleHandlerInterface; use JsonSchema\Validator; use Drupal\Component\Serialization\Json; use Drupal\Core\Cache\CacheableResponse; @@ -59,6 +60,13 @@ class ResourceResponseSubscriber implements EventSubscriberInterface { protected $logger; /** + * The module handler. + * + * @var \Drupal\Core\Extension\ModuleHandlerInterface + */ + protected $moduleHandler; + + /** * Constructs a ResourceResponseSubscriber object. * * @param \Symfony\Component\Serializer\SerializerInterface $serializer @@ -67,11 +75,14 @@ class ResourceResponseSubscriber implements EventSubscriberInterface { * The renderer. * @param \Psr\Log\LoggerInterface $logger * The JSON API logger channel. + * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler + * The module handler. */ - public function __construct(SerializerInterface $serializer, RendererInterface $renderer, LoggerInterface $logger) { + public function __construct(SerializerInterface $serializer, RendererInterface $renderer, LoggerInterface $logger, ModuleHandlerInterface $module_handler) { $this->serializer = $serializer; $this->renderer = $renderer; $this->logger = $logger; + $this->moduleHandler = $module_handler; } /** @@ -196,7 +207,7 @@ class ResourceResponseSubscriber implements EventSubscriberInterface { return FALSE; } - if (!\Drupal::moduleHandler()->moduleExists('schemata')) { + if (!$this->moduleHandler->moduleExists('schemata')) { return TRUE; } // Get the schema for the current resource. For that we will need to diff --git a/tests/src/Unit/EventSubscriber/ResourceResponseSubscriberTest.php b/tests/src/Unit/EventSubscriber/ResourceResponseSubscriberTest.php index 823b11d..c405347 100644 --- a/tests/src/Unit/EventSubscriber/ResourceResponseSubscriberTest.php +++ b/tests/src/Unit/EventSubscriber/ResourceResponseSubscriberTest.php @@ -2,11 +2,15 @@ namespace Drupal\Tests\jsonapi\Unit\EventSubscriber; +use Drupal\Core\Extension\ModuleHandlerInterface; use Drupal\Core\Render\RendererInterface; use Drupal\jsonapi\EventSubscriber\ResourceResponseSubscriber; use Drupal\rest\ResourceResponse; use Drupal\Tests\UnitTestCase; use Psr\Log\LoggerInterface; +use Symfony\Cmf\Component\Routing\RouteObjectInterface; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\Routing\Route; use Symfony\Component\Serializer\Serializer; /** @@ -19,10 +23,14 @@ class ResourceResponseSubscriberTest extends UnitTestCase { * @covers ::validateResponse */ public function testValidateResponse() { + $module_handler = $this->prophesize(ModuleHandlerInterface::class); + $module_handler->moduleExists('schemata') + ->willReturn(FALSE); $resource_response_subscriber = new ResourceResponseSubscriber( $this->prophesize(Serializer::class)->reveal(), $this->prophesize(RendererInterface::class)->reveal(), - $this->prophesize(LoggerInterface::class)->reveal() + $this->prophesize(LoggerInterface::class)->reveal(), + $module_handler->reveal() ); // Check that the validation class is enabled. @@ -48,10 +56,16 @@ class ResourceResponseSubscriberTest extends UnitTestCase { } } EOD; + $request = new Request(); + $request->attributes->set(RouteObjectInterface::ROUTE_NAME, 'jsonapi.node--article.individual'); + $request->attributes->set(RouteObjectInterface::ROUTE_OBJECT, (new Route('/jsonapi/node/article/{node}'))->setRequirements([ + '_entity_type' => 'node', + '_bundle' => 'article', + ])); $response = new ResourceResponse(); $response->setContent($json); $this->assertFalse( - $validate_response->invoke($resource_response_subscriber, $response), + $validate_response->invoke($resource_response_subscriber, $response, $request), 'Response validation failed to flag an invalid response.' ); @@ -72,7 +86,7 @@ EOD; $response = new ResourceResponse(); $response->setContent($json); $this->assertFalse( - $validate_response->invoke($resource_response_subscriber, $response), + $validate_response->invoke($resource_response_subscriber, $response, $request), 'Response validation failed to flag an invalid response.' ); @@ -91,14 +105,14 @@ EOD; EOD; $response->setContent($json); $this->assertTrue( - $validate_response->invoke($resource_response_subscriber, $response), + $validate_response->invoke($resource_response_subscriber, $response, $request), 'Response validation flagged a valid response.' ); // Test validation of an empty response passes. $response = new ResourceResponse(); $this->assertTrue( - $validate_response->invoke($resource_response_subscriber, $response), + $validate_response->invoke($resource_response_subscriber, $response, $request), 'Response validation flagged a valid empty response.' );