From c12ad876c0423342529af29c84a7441249259c85 Mon Sep 17 00:00:00 2001 From: Vidar Langseid Date: Wed, 29 Oct 2025 12:23:51 +0100 Subject: [PATCH 1/9] IBX-3035: As a developer, I want to pass extra atrributes when using ibexa_render Twig function --- src/bundle/Core/Fragment/DirectFragmentRenderer.php | 2 ++ src/bundle/Core/Fragment/InlineFragmentRenderer.php | 4 ++++ src/lib/MVC/Symfony/Templating/RenderContentStrategy.php | 2 +- src/lib/MVC/Symfony/Templating/RenderLocationStrategy.php | 2 +- 4 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/bundle/Core/Fragment/DirectFragmentRenderer.php b/src/bundle/Core/Fragment/DirectFragmentRenderer.php index 9a832a5eae..7c6daf736d 100644 --- a/src/bundle/Core/Fragment/DirectFragmentRenderer.php +++ b/src/bundle/Core/Fragment/DirectFragmentRenderer.php @@ -145,6 +145,8 @@ public function render( if ($response instanceof Response) { return $response; } elseif ($response instanceof View) { + $response->addParameters($options['params'] ?? []); + return new Response($this->viewTemplateRenderer->render($response)); } elseif (is_string($response)) { return new Response($response); diff --git a/src/bundle/Core/Fragment/InlineFragmentRenderer.php b/src/bundle/Core/Fragment/InlineFragmentRenderer.php index 020a211e84..5235fe4c4a 100644 --- a/src/bundle/Core/Fragment/InlineFragmentRenderer.php +++ b/src/bundle/Core/Fragment/InlineFragmentRenderer.php @@ -58,6 +58,10 @@ public function render($uri, Request $request, array $options = []) if ($request->attributes->has('viewParametersString')) { $uri->attributes['viewParametersString'] = $request->attributes->get('viewParametersString'); } + if ($options['params'] ?? false) { + $uri->attributes['params'] = $options['params']; + unset($options['params']); + } } return $this->innerRenderer->render($uri, $request, $options); diff --git a/src/lib/MVC/Symfony/Templating/RenderContentStrategy.php b/src/lib/MVC/Symfony/Templating/RenderContentStrategy.php index fead09659d..23b4990806 100644 --- a/src/lib/MVC/Symfony/Templating/RenderContentStrategy.php +++ b/src/lib/MVC/Symfony/Templating/RenderContentStrategy.php @@ -45,7 +45,7 @@ public function render(ValueObject $valueObject, RenderOptions $options): string $renderer = $this->getFragmentRenderer($options->get('method', $this->defaultRenderer)); - return $renderer->render($controllerReference, $currentRequest)->getContent(); + return $renderer->render($controllerReference, $currentRequest, $options->has('params') ? ['params' => $options->get('params')] : [])->getContent(); } } diff --git a/src/lib/MVC/Symfony/Templating/RenderLocationStrategy.php b/src/lib/MVC/Symfony/Templating/RenderLocationStrategy.php index 15b794d85e..bcc7c18514 100644 --- a/src/lib/MVC/Symfony/Templating/RenderLocationStrategy.php +++ b/src/lib/MVC/Symfony/Templating/RenderLocationStrategy.php @@ -46,7 +46,7 @@ public function render(ValueObject $valueObject, RenderOptions $options): string $renderer = $this->getFragmentRenderer($options->get('method', $this->defaultRenderer)); - return $renderer->render($controllerReference, $currentRequest)->getContent(); + return $renderer->render($controllerReference, $currentRequest, $options->has('params') ? ['params' => $options->get('params')] : [])->getContent(); } } From 213ca800282f6428cdd7c4acab863c20543fe571 Mon Sep 17 00:00:00 2001 From: Vidar Langseid Date: Thu, 27 Nov 2025 11:21:04 +0100 Subject: [PATCH 2/9] fixup! IBX-3035: As a developer, I want to pass extra atrributes when using ibexa_render Twig function --- src/bundle/Core/Fragment/DirectFragmentRenderer.php | 2 -- src/bundle/Core/Fragment/InlineFragmentRenderer.php | 4 ---- src/lib/MVC/Symfony/Templating/RenderContentStrategy.php | 3 ++- src/lib/MVC/Symfony/Templating/RenderLocationStrategy.php | 3 ++- 4 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/bundle/Core/Fragment/DirectFragmentRenderer.php b/src/bundle/Core/Fragment/DirectFragmentRenderer.php index 7c6daf736d..9a832a5eae 100644 --- a/src/bundle/Core/Fragment/DirectFragmentRenderer.php +++ b/src/bundle/Core/Fragment/DirectFragmentRenderer.php @@ -145,8 +145,6 @@ public function render( if ($response instanceof Response) { return $response; } elseif ($response instanceof View) { - $response->addParameters($options['params'] ?? []); - return new Response($this->viewTemplateRenderer->render($response)); } elseif (is_string($response)) { return new Response($response); diff --git a/src/bundle/Core/Fragment/InlineFragmentRenderer.php b/src/bundle/Core/Fragment/InlineFragmentRenderer.php index 5235fe4c4a..020a211e84 100644 --- a/src/bundle/Core/Fragment/InlineFragmentRenderer.php +++ b/src/bundle/Core/Fragment/InlineFragmentRenderer.php @@ -58,10 +58,6 @@ public function render($uri, Request $request, array $options = []) if ($request->attributes->has('viewParametersString')) { $uri->attributes['viewParametersString'] = $request->attributes->get('viewParametersString'); } - if ($options['params'] ?? false) { - $uri->attributes['params'] = $options['params']; - unset($options['params']); - } } return $this->innerRenderer->render($uri, $request, $options); diff --git a/src/lib/MVC/Symfony/Templating/RenderContentStrategy.php b/src/lib/MVC/Symfony/Templating/RenderContentStrategy.php index 23b4990806..dc66831680 100644 --- a/src/lib/MVC/Symfony/Templating/RenderContentStrategy.php +++ b/src/lib/MVC/Symfony/Templating/RenderContentStrategy.php @@ -41,11 +41,12 @@ public function render(ValueObject $valueObject, RenderOptions $options): string $controllerReference = new ControllerReference('ibexa_content::viewAction', [ 'contentId' => $content->id, 'viewType' => $options->get('viewType', self::DEFAULT_VIEW_TYPE), + 'params' => $options->get('params', []), ]); $renderer = $this->getFragmentRenderer($options->get('method', $this->defaultRenderer)); - return $renderer->render($controllerReference, $currentRequest, $options->has('params') ? ['params' => $options->get('params')] : [])->getContent(); + return $renderer->render($controllerReference, $currentRequest)->getContent(); } } diff --git a/src/lib/MVC/Symfony/Templating/RenderLocationStrategy.php b/src/lib/MVC/Symfony/Templating/RenderLocationStrategy.php index bcc7c18514..f1182c51ac 100644 --- a/src/lib/MVC/Symfony/Templating/RenderLocationStrategy.php +++ b/src/lib/MVC/Symfony/Templating/RenderLocationStrategy.php @@ -42,11 +42,12 @@ public function render(ValueObject $valueObject, RenderOptions $options): string 'contentId' => $content->id, 'locationId' => $location->id, 'viewType' => $options->get('viewType', self::DEFAULT_VIEW_TYPE), + 'params' => $options->get('params', []), ]); $renderer = $this->getFragmentRenderer($options->get('method', $this->defaultRenderer)); - return $renderer->render($controllerReference, $currentRequest, $options->has('params') ? ['params' => $options->get('params')] : [])->getContent(); + return $renderer->render($controllerReference, $currentRequest)->getContent(); } } From 15bedfa21f19700158be816c50ea4ed2a81014b7 Mon Sep 17 00:00:00 2001 From: Vidar Langseid Date: Mon, 3 Nov 2025 14:50:32 +0100 Subject: [PATCH 3/9] Added tests for IBX-3035 --- phpstan-baseline.neon | 12 --- .../Fragment/DirectFragmentRendererTest.php | 67 +++++++++---- .../Fragment/FragmentRendererBaseTest.php | 14 +-- .../Fragment/InlineFragmentRendererTest.php | 62 +++++++++--- .../Templating/BaseRenderStrategyTest.php | 2 +- .../Templating/RenderContentStrategyTest.php | 97 +++++++++++++++---- .../Templating/RenderLocationStrategyTest.php | 20 +++- 7 files changed, 197 insertions(+), 77 deletions(-) diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 75fc31118b..5486afafc7 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -30570,12 +30570,6 @@ parameters: count: 1 path: tests/bundle/Core/Fragment/DirectFragmentRendererTest.php - - - message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Symfony\\\\Component\\\\HttpFoundation\\\\Response'' and Symfony\\Component\\HttpFoundation\\Response will always evaluate to true\.$#' - identifier: method.alreadyNarrowedType - count: 4 - path: tests/bundle/Core/Fragment/DirectFragmentRendererTest.php - - message: '#^Method Ibexa\\Tests\\Bundle\\Core\\Fragment\\FragmentListenerFactoryTest\:\:buildFragmentListenerProvider\(\) has no return type specified\.$#' identifier: missingType.return @@ -58764,12 +58758,6 @@ parameters: count: 1 path: tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php - - - message: '#^Call to method PHPUnit\\Framework\\Assert\:\:assertInstanceOf\(\) with ''Symfony\\\\Component\\\\HttpKernel\\\\Controller\\\\ControllerReference'' and Symfony\\Component\\HttpKernel\\Controller\\ControllerReference will always evaluate to true\.$#' - identifier: method.alreadyNarrowedType - count: 1 - path: tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php - - message: '#^Anonymous function has an unused use \$content\.$#' identifier: closure.unusedUse diff --git a/tests/bundle/Core/Fragment/DirectFragmentRendererTest.php b/tests/bundle/Core/Fragment/DirectFragmentRendererTest.php index 8d18c1aacf..1893336433 100644 --- a/tests/bundle/Core/Fragment/DirectFragmentRendererTest.php +++ b/tests/bundle/Core/Fragment/DirectFragmentRendererTest.php @@ -31,13 +31,13 @@ public function testSubRequestBuilding(): void $controllerResolver ->expects($this->any()) ->method('getController') - ->with($this->callback(function (Request $request) { - $this->assertEquals('/_fragment', $request->getPathInfo()); - $this->assertEquals('some::controller', $request->attributes->get('_controller')); - $this->assertEquals('attribute_value', $request->attributes->get('some')); - $this->assertEquals('else', $request->attributes->get('something')); - $this->assertInstanceOf(SiteAccess::class, $request->attributes->get('siteaccess')); - $this->assertEquals('test', $request->attributes->get('siteaccess')->name); + ->with($this->callback(static function (Request $request) { + self::assertEquals('/_fragment', $request->getPathInfo()); + self::assertEquals('some::controller', $request->attributes->get('_controller')); + self::assertEquals('attribute_value', $request->attributes->get('some')); + self::assertEquals('else', $request->attributes->get('something')); + self::assertInstanceOf(SiteAccess::class, $request->attributes->get('siteaccess')); + self::assertEquals('test', $request->attributes->get('siteaccess')->name); return true; })) @@ -65,8 +65,7 @@ public function testSubRequestBuilding(): void $directFragmentRenderer = $this->getDirectFragmentRenderer($controllerResolver); $response = $directFragmentRenderer->render($controllerReference, $request); - $this->assertInstanceOf(Response::class, $response); - $this->assertSame('rendered_response', $response->getContent()); + self::assertSame('rendered_response', $response->getContent()); } public function testControllerResponse(): void @@ -82,11 +81,27 @@ public function testControllerResponse(): void $directFragmentRenderer = $this->getDirectFragmentRenderer($controllerResolver); $response = $directFragmentRenderer->render('', new Request(), []); - $this->assertInstanceOf(Response::class, $response); - $this->assertSame('response_body', $response->getContent()); + self::assertSame('response_body', $response->getContent()); } - public function testControllerViewResponse(): void + /** + * @return iterable|null}> + */ + public function controllerViewResponseDataProvider(): iterable + { + yield [[ + 'my_param1' => 'custom_data', + 'my_param2' => 'foobar', + ]]; + + yield [null]; + } + + /** + * @param array|null $params + * @dataProvider controllerViewResponseDataProvider + */ + public function testControllerViewResponse(?array $params = null): void { $contentView = new ContentView(); $contentView->setTemplateIdentifier('template_identifier'); @@ -105,16 +120,33 @@ public function testControllerViewResponse(): void ->expects($this->once()) ->method('render') ->with($contentView) - ->willReturn('rendered_' . $contentView->getTemplateIdentifier()); + ->willReturnCallback( + static function (ContentView $cV) use ($params): string { + if ($params !== null) { + foreach ($params as $key => $value) { + self::assertArrayHasKey($key, $cV->getParameters()); + } + } + + return 'rendered_' . $cV->getTemplateIdentifier(); + } + ); $directFragmentRenderer = $this->getDirectFragmentRenderer( $controllerResolverMock, $templateRendererMock ); - $response = $directFragmentRenderer->render('', new Request(), []); + $response = $directFragmentRenderer->render( + '', + new Request(), + [ + 'viewType' => 'line', + 'method' => 'direct', + 'params' => $params, + ] + ); - $this->assertInstanceOf(Response::class, $response); - $this->assertSame('rendered_template_identifier', $response->getContent()); + self::assertSame('rendered_template_identifier', $response->getContent()); } public function testControllerStringResponse(): void @@ -130,8 +162,7 @@ public function testControllerStringResponse(): void $directFragmentRenderer = $this->getDirectFragmentRenderer($controllerResolver); $response = $directFragmentRenderer->render('', new Request(), []); - $this->assertInstanceOf(Response::class, $response); - $this->assertSame('some_prerendered_response', $response->getContent()); + self::assertSame('some_prerendered_response', $response->getContent()); } public function testControllerUnhandledStringResponse(): void diff --git a/tests/bundle/Core/Fragment/FragmentRendererBaseTest.php b/tests/bundle/Core/Fragment/FragmentRendererBaseTest.php index c62c68b6df..d312b1597d 100644 --- a/tests/bundle/Core/Fragment/FragmentRendererBaseTest.php +++ b/tests/bundle/Core/Fragment/FragmentRendererBaseTest.php @@ -43,12 +43,12 @@ public function testRendererControllerReferenceWithCompoundMatcher(): Controller ->will($this->returnValue($expectedReturn)); $renderer = $this->getRenderer(); - $this->assertSame($expectedReturn, $renderer->render($reference, $request, $options)); - $this->assertArrayHasKey('serialized_siteaccess', $reference->attributes); + self::assertSame($expectedReturn, $renderer->render($reference, $request, $options)); + self::assertArrayHasKey('serialized_siteaccess', $reference->attributes); $serializedSiteAccess = json_encode($siteAccess); - $this->assertSame($serializedSiteAccess, $reference->attributes['serialized_siteaccess']); - $this->assertArrayHasKey('serialized_siteaccess_matcher', $reference->attributes); - $this->assertSame( + self::assertSame($serializedSiteAccess, $reference->attributes['serialized_siteaccess']); + self::assertArrayHasKey('serialized_siteaccess_matcher', $reference->attributes); + self::assertSame( $this->getSerializer()->serialize( $siteAccess->matcher, 'json', @@ -56,9 +56,9 @@ public function testRendererControllerReferenceWithCompoundMatcher(): Controller ), $reference->attributes['serialized_siteaccess_matcher'] ); - $this->assertArrayHasKey('serialized_siteaccess_sub_matchers', $reference->attributes); + self::assertArrayHasKey('serialized_siteaccess_sub_matchers', $reference->attributes); foreach ($siteAccess->matcher->getSubMatchers() as $subMatcher) { - $this->assertSame( + self::assertSame( $this->getSerializer()->serialize( $subMatcher, 'json', diff --git a/tests/bundle/Core/Fragment/InlineFragmentRendererTest.php b/tests/bundle/Core/Fragment/InlineFragmentRendererTest.php index a57ef663f7..4eea7ad7fd 100644 --- a/tests/bundle/Core/Fragment/InlineFragmentRendererTest.php +++ b/tests/bundle/Core/Fragment/InlineFragmentRendererTest.php @@ -11,6 +11,7 @@ use Ibexa\Core\MVC\Symfony\Component\Serializer\SerializerTrait; use Ibexa\Core\MVC\Symfony\SiteAccess; use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Controller\ControllerReference; use Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface; use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; @@ -22,7 +23,24 @@ class InlineFragmentRendererTest extends DecoratedFragmentRendererTest { use SerializerTrait; - public function testRendererControllerReference() + /** + * @return iterable|null}> + */ + public function rendererControllerReferenceDataProvider(): iterable + { + yield [[ + 'my_param1' => 'custom_data', + 'my_param2' => 'foobar', + ]]; + + yield [null]; + } + + /** + * @param array|null $params + * @dataProvider rendererControllerReferenceDataProvider + */ + public function testRendererControllerReference(?array $params = null) { $reference = new ControllerReference('FooBundle:bar:baz'); $matcher = new SiteAccess\Matcher\HostElement(1); @@ -36,20 +54,34 @@ public function testRendererControllerReference() $request->attributes->set('semanticPathinfo', '/foo/bar'); $request->attributes->set('viewParametersString', '/(foo)/bar'); $options = ['foo' => 'bar']; + $expectedReturn = '/_fragment?foo=bar'; $this->innerRenderer ->expects($this->once()) ->method('render') ->with($reference, $request, $options) - ->will($this->returnValue($expectedReturn)); + ->willReturnCallback( + static function (ControllerReference $url, Request $request, array $callBackOptions) use ($expectedReturn, $params, $options): Response { + if ($params !== null) { + self::assertEquals($params, $url->attributes['params']); + } + self::assertEquals($options, $callBackOptions); + + return new Response($expectedReturn); + } + ); + + if ($params !== null) { + $options['params'] = $params; + } $renderer = $this->getRenderer(); - $this->assertSame($expectedReturn, $renderer->render($reference, $request, $options)); - $this->assertTrue(isset($reference->attributes['serialized_siteaccess'])); + self::assertEquals(new Response($expectedReturn), $renderer->render($reference, $request, $options)); + self::assertTrue(isset($reference->attributes['serialized_siteaccess'])); $serializedSiteAccess = json_encode($siteAccess); - $this->assertSame($serializedSiteAccess, $reference->attributes['serialized_siteaccess']); - $this->assertTrue(isset($reference->attributes['serialized_siteaccess_matcher'])); - $this->assertSame( + self::assertSame($serializedSiteAccess, $reference->attributes['serialized_siteaccess']); + self::assertTrue(isset($reference->attributes['serialized_siteaccess_matcher'])); + self::assertSame( $this->getSerializer()->serialize( $siteAccess->matcher, 'json', @@ -57,20 +89,20 @@ public function testRendererControllerReference() ), $reference->attributes['serialized_siteaccess_matcher'] ); - $this->assertTrue(isset($reference->attributes['semanticPathinfo'])); - $this->assertSame('/foo/bar', $reference->attributes['semanticPathinfo']); - $this->assertTrue(isset($reference->attributes['viewParametersString'])); - $this->assertSame('/(foo)/bar', $reference->attributes['viewParametersString']); + self::assertTrue(isset($reference->attributes['semanticPathinfo'])); + self::assertSame('/foo/bar', $reference->attributes['semanticPathinfo']); + self::assertTrue(isset($reference->attributes['viewParametersString'])); + self::assertSame('/(foo)/bar', $reference->attributes['viewParametersString']); } public function testRendererControllerReferenceWithCompoundMatcher(): ControllerReference { $reference = parent::testRendererControllerReferenceWithCompoundMatcher(); - $this->assertArrayHasKey('semanticPathinfo', $reference->attributes); - $this->assertSame('/foo/bar', $reference->attributes['semanticPathinfo']); - $this->assertArrayHasKey('viewParametersString', $reference->attributes); - $this->assertSame('/(foo)/bar', $reference->attributes['viewParametersString']); + self::assertArrayHasKey('semanticPathinfo', $reference->attributes); + self::assertSame('/foo/bar', $reference->attributes['semanticPathinfo']); + self::assertArrayHasKey('viewParametersString', $reference->attributes); + self::assertSame('/(foo)/bar', $reference->attributes['viewParametersString']); return $reference; } diff --git a/tests/lib/MVC/Symfony/Templating/BaseRenderStrategyTest.php b/tests/lib/MVC/Symfony/Templating/BaseRenderStrategyTest.php index 66f71a4bf1..8fae0cd46a 100644 --- a/tests/lib/MVC/Symfony/Templating/BaseRenderStrategyTest.php +++ b/tests/lib/MVC/Symfony/Templating/BaseRenderStrategyTest.php @@ -24,7 +24,7 @@ abstract class BaseRenderStrategyTest extends TestCase { - public function createRenderStrategy( + public static function createRenderStrategy( string $typeClass, array $fragmentRenderers, string $defaultMethod = 'inline', diff --git a/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php b/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php index 8c12857349..7d8063a0cd 100644 --- a/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php +++ b/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php @@ -14,6 +14,7 @@ use Ibexa\Core\MVC\Symfony\SiteAccess; use Ibexa\Core\MVC\Symfony\Templating\RenderContentStrategy; use Ibexa\Core\MVC\Symfony\Templating\RenderOptions; +use PHPUnit\Framework\MockObject\MockObject; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Controller\ControllerReference; @@ -23,7 +24,7 @@ class RenderContentStrategyTest extends BaseRenderStrategyTest { public function testUnsupportedValueObject(): void { - $renderContentStrategy = $this->createRenderStrategy( + $renderContentStrategy = self::createRenderStrategy( RenderContentStrategy::class, [ $this->createFragmentRenderer(), @@ -32,7 +33,7 @@ public function testUnsupportedValueObject(): void $valueObject = new class() extends ValueObject { }; - $this->assertFalse($renderContentStrategy->supports($valueObject)); + self::assertFalse($renderContentStrategy->supports($valueObject)); $this->expectException(InvalidArgumentException::class); $renderContentStrategy->render($valueObject, new RenderOptions()); @@ -40,7 +41,7 @@ public function testUnsupportedValueObject(): void public function testDefaultFragmentRenderer(): void { - $renderContentStrategy = $this->createRenderStrategy( + $renderContentStrategy = self::createRenderStrategy( RenderContentStrategy::class, [ $this->createFragmentRenderer('inline'), @@ -49,9 +50,9 @@ public function testDefaultFragmentRenderer(): void ); $contentMock = $this->createMock(Content::class); - $this->assertTrue($renderContentStrategy->supports($contentMock)); + self::assertTrue($renderContentStrategy->supports($contentMock)); - $this->assertSame( + self::assertSame( 'inline_rendered', $renderContentStrategy->render($contentMock, new RenderOptions()) ); @@ -59,13 +60,13 @@ public function testDefaultFragmentRenderer(): void public function testUnknownFragmentRenderer(): void { - $renderContentStrategy = $this->createRenderStrategy( + $renderContentStrategy = self::createRenderStrategy( RenderContentStrategy::class, [], ); $contentMock = $this->createMock(Content::class); - $this->assertTrue($renderContentStrategy->supports($contentMock)); + self::assertTrue($renderContentStrategy->supports($contentMock)); $this->expectException(InvalidArgumentException::class); $renderContentStrategy->render($contentMock, new RenderOptions()); @@ -73,7 +74,7 @@ public function testUnknownFragmentRenderer(): void public function testMultipleFragmentRenderers(): void { - $renderContentStrategy = $this->createRenderStrategy( + $renderContentStrategy = self::createRenderStrategy( RenderContentStrategy::class, [ $this->createFragmentRenderer('method_a'), @@ -83,9 +84,9 @@ public function testMultipleFragmentRenderers(): void ); $contentMock = $this->createMock(Content::class); - $this->assertTrue($renderContentStrategy->supports($contentMock)); + self::assertTrue($renderContentStrategy->supports($contentMock)); - $this->assertSame( + self::assertSame( 'method_b_rendered', $renderContentStrategy->render($contentMock, new RenderOptions([ 'method' => 'method_b', @@ -93,9 +94,67 @@ public function testMultipleFragmentRenderers(): void ); } + public function testForwardParamOptionsToFragmentRenderer(): void + { + static::forwardParamOptionsToFragmentRenderer( + $this->createMock(FragmentRendererInterface::class), + $this->createMock(Content::class), + RenderContentStrategy::class, + ); + } + + /** + * @param MockObject&FragmentRendererInterface $fragmentRendererMock + * @param MockObject&ValueObject $valueObjectMock + * @param class-string $renderStrategyClass + */ + public static function forwardParamOptionsToFragmentRenderer(MockObject $fragmentRendererMock, MockObject $valueObjectMock, string $renderStrategyClass): void + { + $params = [ + 'param1' => 'value1', + 'param2' => 'value2', + ]; + + $fragmentRendererMock + ->method('getName') + ->willReturn('fragment_render_mock'); + $fragmentRendererMock->expects(self::once()) + ->method('render') + ->with( + self::callback(static function ($controllerReference) use ($params) { + if (!$controllerReference instanceof ControllerReference) { + return false; + } + + return $controllerReference->attributes['params'] === $params; + }), + self::anything(), + ) + ->willReturn(new Response('fragment_render_mock_rendered')); + + $renderContentStrategy = self::createRenderStrategy( + $renderStrategyClass, + [ + $fragmentRendererMock, + ], + ); + + /** @var \Ibexa\Contracts\Core\Repository\Values\ValueObject&\PHPUnit\Framework\MockObject\MockObject $valueObjectMock */ + self::assertTrue($renderContentStrategy->supports($valueObjectMock)); + + self::assertSame( + 'fragment_render_mock_rendered', + $renderContentStrategy->render($valueObjectMock, new RenderOptions([ + 'method' => 'fragment_render_mock', + 'viewType' => 'awesome', + 'params' => $params, + ])) + ); + } + public function testDuplicatedFragmentRenderers(): void { - $renderContentStrategy = $this->createRenderStrategy( + $renderContentStrategy = self::createRenderStrategy( RenderContentStrategy::class, [ $this->createFragmentRenderer('method_a', 'decorator service used'), @@ -127,19 +186,19 @@ public function testExpectedMethodRenderArgumentsFormat(): void ->method('getName') ->willReturn('method_b'); - $controllerReferenceCallback = $this->callback(function (ControllerReference $controllerReference) { - $this->assertInstanceOf(ControllerReference::class, $controllerReference); - $this->assertEquals('ibexa_content::viewAction', $controllerReference->controller); - $this->assertSame([ + $controllerReferenceCallback = $this->callback(static function (ControllerReference $controllerReference) { + self::assertEquals('ibexa_content::viewAction', $controllerReference->controller); + self::assertSame([ 'contentId' => 123, 'viewType' => 'awesome', + 'params' => [], ], $controllerReference->attributes); return true; }); - $requestCallback = $this->callback(function (Request $request) use ($siteAccess, $content): bool { - $this->assertSame('TEST/1.0', $request->headers->get('Surrogate-Capability')); + $requestCallback = $this->callback(static function (Request $request) use ($siteAccess, $content): bool { + self::assertSame('TEST/1.0', $request->headers->get('Surrogate-Capability')); return true; }); @@ -150,7 +209,7 @@ public function testExpectedMethodRenderArgumentsFormat(): void ->with($controllerReferenceCallback, $requestCallback) ->willReturn(new Response('some_rendered_content')); - $renderContentStrategy = $this->createRenderStrategy( + $renderContentStrategy = self::createRenderStrategy( RenderContentStrategy::class, [ $this->createFragmentRenderer('method_a'), @@ -162,7 +221,7 @@ public function testExpectedMethodRenderArgumentsFormat(): void $request ); - $this->assertSame('some_rendered_content', $renderContentStrategy->render( + self::assertSame('some_rendered_content', $renderContentStrategy->render( $content, new RenderOptions([ 'method' => 'method_b', diff --git a/tests/lib/MVC/Symfony/Templating/RenderLocationStrategyTest.php b/tests/lib/MVC/Symfony/Templating/RenderLocationStrategyTest.php index 94e28a4f64..21af1c2b41 100644 --- a/tests/lib/MVC/Symfony/Templating/RenderLocationStrategyTest.php +++ b/tests/lib/MVC/Symfony/Templating/RenderLocationStrategyTest.php @@ -23,7 +23,7 @@ class RenderLocationStrategyTest extends BaseRenderStrategyTest { public function testUnsupportedValueObject(): void { - $renderLocationStrategy = $this->createRenderStrategy( + $renderLocationStrategy = self::createRenderStrategy( RenderLocationStrategy::class, [ $this->createFragmentRenderer(), @@ -40,7 +40,7 @@ public function testUnsupportedValueObject(): void public function testDefaultFragmentRenderer(): void { - $renderLocationStrategy = $this->createRenderStrategy( + $renderLocationStrategy = self::createRenderStrategy( RenderLocationStrategy::class, [ $this->createFragmentRenderer('inline'), @@ -59,7 +59,7 @@ public function testDefaultFragmentRenderer(): void public function testUnknownFragmentRenderer(): void { - $renderLocationStrategy = $this->createRenderStrategy( + $renderLocationStrategy = self::createRenderStrategy( RenderLocationStrategy::class, [], ); @@ -73,7 +73,7 @@ public function testUnknownFragmentRenderer(): void public function testMultipleFragmentRenderers(): void { - $renderLocationStrategy = $this->createRenderStrategy( + $renderLocationStrategy = self::createRenderStrategy( RenderLocationStrategy::class, [ $this->createFragmentRenderer('method_a'), @@ -93,6 +93,15 @@ public function testMultipleFragmentRenderers(): void ); } + public function testForwardParamOptionsToFragmentRenderer(): void + { + RenderContentStrategyTest::forwardParamOptionsToFragmentRenderer( + $this->createMock(FragmentRendererInterface::class), + $this->createMock(Location::class), + RenderLocationStrategy::class, + ); + } + public function testExpectedMethodRenderRequestFormat(): void { $request = new Request(); @@ -114,6 +123,7 @@ public function testExpectedMethodRenderRequestFormat(): void 'contentId' => 234, 'locationId' => 345, 'viewType' => 'awesome', + 'params' => [], ], $controllerReference->attributes); return true; @@ -131,7 +141,7 @@ public function testExpectedMethodRenderRequestFormat(): void ->with($controllerReferenceCallback, $requestCallback) ->willReturn(new Response('some_rendered_content')); - $renderLocationStrategy = $this->createRenderStrategy( + $renderLocationStrategy = self::createRenderStrategy( RenderLocationStrategy::class, [ $this->createFragmentRenderer('method_a'), From 8cecc06b2df439662033e656d2d4b6f493a4d48e Mon Sep 17 00:00:00 2001 From: Vidar Langseid Date: Thu, 27 Nov 2025 15:04:17 +0100 Subject: [PATCH 4/9] Revert "Added tests for IBX-3035" This reverts commit 15bedfa21f19700158be816c50ea4ed2a81014b7. --- .../Fragment/DirectFragmentRendererTest.php | 67 +++++-------------- .../Fragment/FragmentRendererBaseTest.php | 14 ++-- .../Fragment/InlineFragmentRendererTest.php | 62 +++++------------ 3 files changed, 40 insertions(+), 103 deletions(-) diff --git a/tests/bundle/Core/Fragment/DirectFragmentRendererTest.php b/tests/bundle/Core/Fragment/DirectFragmentRendererTest.php index 1893336433..8d18c1aacf 100644 --- a/tests/bundle/Core/Fragment/DirectFragmentRendererTest.php +++ b/tests/bundle/Core/Fragment/DirectFragmentRendererTest.php @@ -31,13 +31,13 @@ public function testSubRequestBuilding(): void $controllerResolver ->expects($this->any()) ->method('getController') - ->with($this->callback(static function (Request $request) { - self::assertEquals('/_fragment', $request->getPathInfo()); - self::assertEquals('some::controller', $request->attributes->get('_controller')); - self::assertEquals('attribute_value', $request->attributes->get('some')); - self::assertEquals('else', $request->attributes->get('something')); - self::assertInstanceOf(SiteAccess::class, $request->attributes->get('siteaccess')); - self::assertEquals('test', $request->attributes->get('siteaccess')->name); + ->with($this->callback(function (Request $request) { + $this->assertEquals('/_fragment', $request->getPathInfo()); + $this->assertEquals('some::controller', $request->attributes->get('_controller')); + $this->assertEquals('attribute_value', $request->attributes->get('some')); + $this->assertEquals('else', $request->attributes->get('something')); + $this->assertInstanceOf(SiteAccess::class, $request->attributes->get('siteaccess')); + $this->assertEquals('test', $request->attributes->get('siteaccess')->name); return true; })) @@ -65,7 +65,8 @@ public function testSubRequestBuilding(): void $directFragmentRenderer = $this->getDirectFragmentRenderer($controllerResolver); $response = $directFragmentRenderer->render($controllerReference, $request); - self::assertSame('rendered_response', $response->getContent()); + $this->assertInstanceOf(Response::class, $response); + $this->assertSame('rendered_response', $response->getContent()); } public function testControllerResponse(): void @@ -81,27 +82,11 @@ public function testControllerResponse(): void $directFragmentRenderer = $this->getDirectFragmentRenderer($controllerResolver); $response = $directFragmentRenderer->render('', new Request(), []); - self::assertSame('response_body', $response->getContent()); + $this->assertInstanceOf(Response::class, $response); + $this->assertSame('response_body', $response->getContent()); } - /** - * @return iterable|null}> - */ - public function controllerViewResponseDataProvider(): iterable - { - yield [[ - 'my_param1' => 'custom_data', - 'my_param2' => 'foobar', - ]]; - - yield [null]; - } - - /** - * @param array|null $params - * @dataProvider controllerViewResponseDataProvider - */ - public function testControllerViewResponse(?array $params = null): void + public function testControllerViewResponse(): void { $contentView = new ContentView(); $contentView->setTemplateIdentifier('template_identifier'); @@ -120,33 +105,16 @@ public function testControllerViewResponse(?array $params = null): void ->expects($this->once()) ->method('render') ->with($contentView) - ->willReturnCallback( - static function (ContentView $cV) use ($params): string { - if ($params !== null) { - foreach ($params as $key => $value) { - self::assertArrayHasKey($key, $cV->getParameters()); - } - } - - return 'rendered_' . $cV->getTemplateIdentifier(); - } - ); + ->willReturn('rendered_' . $contentView->getTemplateIdentifier()); $directFragmentRenderer = $this->getDirectFragmentRenderer( $controllerResolverMock, $templateRendererMock ); - $response = $directFragmentRenderer->render( - '', - new Request(), - [ - 'viewType' => 'line', - 'method' => 'direct', - 'params' => $params, - ] - ); + $response = $directFragmentRenderer->render('', new Request(), []); - self::assertSame('rendered_template_identifier', $response->getContent()); + $this->assertInstanceOf(Response::class, $response); + $this->assertSame('rendered_template_identifier', $response->getContent()); } public function testControllerStringResponse(): void @@ -162,7 +130,8 @@ public function testControllerStringResponse(): void $directFragmentRenderer = $this->getDirectFragmentRenderer($controllerResolver); $response = $directFragmentRenderer->render('', new Request(), []); - self::assertSame('some_prerendered_response', $response->getContent()); + $this->assertInstanceOf(Response::class, $response); + $this->assertSame('some_prerendered_response', $response->getContent()); } public function testControllerUnhandledStringResponse(): void diff --git a/tests/bundle/Core/Fragment/FragmentRendererBaseTest.php b/tests/bundle/Core/Fragment/FragmentRendererBaseTest.php index d312b1597d..c62c68b6df 100644 --- a/tests/bundle/Core/Fragment/FragmentRendererBaseTest.php +++ b/tests/bundle/Core/Fragment/FragmentRendererBaseTest.php @@ -43,12 +43,12 @@ public function testRendererControllerReferenceWithCompoundMatcher(): Controller ->will($this->returnValue($expectedReturn)); $renderer = $this->getRenderer(); - self::assertSame($expectedReturn, $renderer->render($reference, $request, $options)); - self::assertArrayHasKey('serialized_siteaccess', $reference->attributes); + $this->assertSame($expectedReturn, $renderer->render($reference, $request, $options)); + $this->assertArrayHasKey('serialized_siteaccess', $reference->attributes); $serializedSiteAccess = json_encode($siteAccess); - self::assertSame($serializedSiteAccess, $reference->attributes['serialized_siteaccess']); - self::assertArrayHasKey('serialized_siteaccess_matcher', $reference->attributes); - self::assertSame( + $this->assertSame($serializedSiteAccess, $reference->attributes['serialized_siteaccess']); + $this->assertArrayHasKey('serialized_siteaccess_matcher', $reference->attributes); + $this->assertSame( $this->getSerializer()->serialize( $siteAccess->matcher, 'json', @@ -56,9 +56,9 @@ public function testRendererControllerReferenceWithCompoundMatcher(): Controller ), $reference->attributes['serialized_siteaccess_matcher'] ); - self::assertArrayHasKey('serialized_siteaccess_sub_matchers', $reference->attributes); + $this->assertArrayHasKey('serialized_siteaccess_sub_matchers', $reference->attributes); foreach ($siteAccess->matcher->getSubMatchers() as $subMatcher) { - self::assertSame( + $this->assertSame( $this->getSerializer()->serialize( $subMatcher, 'json', diff --git a/tests/bundle/Core/Fragment/InlineFragmentRendererTest.php b/tests/bundle/Core/Fragment/InlineFragmentRendererTest.php index 4eea7ad7fd..a57ef663f7 100644 --- a/tests/bundle/Core/Fragment/InlineFragmentRendererTest.php +++ b/tests/bundle/Core/Fragment/InlineFragmentRendererTest.php @@ -11,7 +11,6 @@ use Ibexa\Core\MVC\Symfony\Component\Serializer\SerializerTrait; use Ibexa\Core\MVC\Symfony\SiteAccess; use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Controller\ControllerReference; use Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface; use Symfony\Component\Serializer\Normalizer\AbstractNormalizer; @@ -23,24 +22,7 @@ class InlineFragmentRendererTest extends DecoratedFragmentRendererTest { use SerializerTrait; - /** - * @return iterable|null}> - */ - public function rendererControllerReferenceDataProvider(): iterable - { - yield [[ - 'my_param1' => 'custom_data', - 'my_param2' => 'foobar', - ]]; - - yield [null]; - } - - /** - * @param array|null $params - * @dataProvider rendererControllerReferenceDataProvider - */ - public function testRendererControllerReference(?array $params = null) + public function testRendererControllerReference() { $reference = new ControllerReference('FooBundle:bar:baz'); $matcher = new SiteAccess\Matcher\HostElement(1); @@ -54,34 +36,20 @@ public function testRendererControllerReference(?array $params = null) $request->attributes->set('semanticPathinfo', '/foo/bar'); $request->attributes->set('viewParametersString', '/(foo)/bar'); $options = ['foo' => 'bar']; - $expectedReturn = '/_fragment?foo=bar'; $this->innerRenderer ->expects($this->once()) ->method('render') ->with($reference, $request, $options) - ->willReturnCallback( - static function (ControllerReference $url, Request $request, array $callBackOptions) use ($expectedReturn, $params, $options): Response { - if ($params !== null) { - self::assertEquals($params, $url->attributes['params']); - } - self::assertEquals($options, $callBackOptions); - - return new Response($expectedReturn); - } - ); - - if ($params !== null) { - $options['params'] = $params; - } + ->will($this->returnValue($expectedReturn)); $renderer = $this->getRenderer(); - self::assertEquals(new Response($expectedReturn), $renderer->render($reference, $request, $options)); - self::assertTrue(isset($reference->attributes['serialized_siteaccess'])); + $this->assertSame($expectedReturn, $renderer->render($reference, $request, $options)); + $this->assertTrue(isset($reference->attributes['serialized_siteaccess'])); $serializedSiteAccess = json_encode($siteAccess); - self::assertSame($serializedSiteAccess, $reference->attributes['serialized_siteaccess']); - self::assertTrue(isset($reference->attributes['serialized_siteaccess_matcher'])); - self::assertSame( + $this->assertSame($serializedSiteAccess, $reference->attributes['serialized_siteaccess']); + $this->assertTrue(isset($reference->attributes['serialized_siteaccess_matcher'])); + $this->assertSame( $this->getSerializer()->serialize( $siteAccess->matcher, 'json', @@ -89,20 +57,20 @@ static function (ControllerReference $url, Request $request, array $callBackOpti ), $reference->attributes['serialized_siteaccess_matcher'] ); - self::assertTrue(isset($reference->attributes['semanticPathinfo'])); - self::assertSame('/foo/bar', $reference->attributes['semanticPathinfo']); - self::assertTrue(isset($reference->attributes['viewParametersString'])); - self::assertSame('/(foo)/bar', $reference->attributes['viewParametersString']); + $this->assertTrue(isset($reference->attributes['semanticPathinfo'])); + $this->assertSame('/foo/bar', $reference->attributes['semanticPathinfo']); + $this->assertTrue(isset($reference->attributes['viewParametersString'])); + $this->assertSame('/(foo)/bar', $reference->attributes['viewParametersString']); } public function testRendererControllerReferenceWithCompoundMatcher(): ControllerReference { $reference = parent::testRendererControllerReferenceWithCompoundMatcher(); - self::assertArrayHasKey('semanticPathinfo', $reference->attributes); - self::assertSame('/foo/bar', $reference->attributes['semanticPathinfo']); - self::assertArrayHasKey('viewParametersString', $reference->attributes); - self::assertSame('/(foo)/bar', $reference->attributes['viewParametersString']); + $this->assertArrayHasKey('semanticPathinfo', $reference->attributes); + $this->assertSame('/foo/bar', $reference->attributes['semanticPathinfo']); + $this->assertArrayHasKey('viewParametersString', $reference->attributes); + $this->assertSame('/(foo)/bar', $reference->attributes['viewParametersString']); return $reference; } From b69aac1adf8ab5450441f508bf2846574c81c196 Mon Sep 17 00:00:00 2001 From: Vidar Langseid Date: Thu, 27 Nov 2025 15:30:19 +0100 Subject: [PATCH 5/9] fixup! Added tests for IBX-3035 --- tests/bundle/Core/Fragment/DirectFragmentRendererTest.php | 4 ---- .../lib/MVC/Symfony/Templating/RenderContentStrategyTest.php | 3 ++- 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/tests/bundle/Core/Fragment/DirectFragmentRendererTest.php b/tests/bundle/Core/Fragment/DirectFragmentRendererTest.php index 8d18c1aacf..4e67b3a731 100644 --- a/tests/bundle/Core/Fragment/DirectFragmentRendererTest.php +++ b/tests/bundle/Core/Fragment/DirectFragmentRendererTest.php @@ -65,7 +65,6 @@ public function testSubRequestBuilding(): void $directFragmentRenderer = $this->getDirectFragmentRenderer($controllerResolver); $response = $directFragmentRenderer->render($controllerReference, $request); - $this->assertInstanceOf(Response::class, $response); $this->assertSame('rendered_response', $response->getContent()); } @@ -82,7 +81,6 @@ public function testControllerResponse(): void $directFragmentRenderer = $this->getDirectFragmentRenderer($controllerResolver); $response = $directFragmentRenderer->render('', new Request(), []); - $this->assertInstanceOf(Response::class, $response); $this->assertSame('response_body', $response->getContent()); } @@ -113,7 +111,6 @@ public function testControllerViewResponse(): void ); $response = $directFragmentRenderer->render('', new Request(), []); - $this->assertInstanceOf(Response::class, $response); $this->assertSame('rendered_template_identifier', $response->getContent()); } @@ -130,7 +127,6 @@ public function testControllerStringResponse(): void $directFragmentRenderer = $this->getDirectFragmentRenderer($controllerResolver); $response = $directFragmentRenderer->render('', new Request(), []); - $this->assertInstanceOf(Response::class, $response); $this->assertSame('some_prerendered_response', $response->getContent()); } diff --git a/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php b/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php index 7d8063a0cd..1861715f03 100644 --- a/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php +++ b/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php @@ -8,6 +8,7 @@ namespace Ibexa\Tests\Core\MVC\Symfony\Templating; +use Ibexa\Contracts\Core\MVC\Templating\RenderStrategy; use Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException; use Ibexa\Contracts\Core\Repository\Values\Content\Content; use Ibexa\Contracts\Core\Repository\Values\ValueObject; @@ -106,7 +107,7 @@ public function testForwardParamOptionsToFragmentRenderer(): void /** * @param MockObject&FragmentRendererInterface $fragmentRendererMock * @param MockObject&ValueObject $valueObjectMock - * @param class-string $renderStrategyClass + * @param class-string $renderStrategyClass */ public static function forwardParamOptionsToFragmentRenderer(MockObject $fragmentRendererMock, MockObject $valueObjectMock, string $renderStrategyClass): void { From 02dffc2978d59448f696c2b8ea9443918f6df3a3 Mon Sep 17 00:00:00 2001 From: Vidar Langseid Date: Thu, 27 Nov 2025 15:38:36 +0100 Subject: [PATCH 6/9] fixup! Added tests for IBX-3035 --- .../lib/MVC/Symfony/Templating/RenderContentStrategyTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php b/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php index 1861715f03..1b2bd21407 100644 --- a/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php +++ b/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php @@ -105,8 +105,8 @@ public function testForwardParamOptionsToFragmentRenderer(): void } /** - * @param MockObject&FragmentRendererInterface $fragmentRendererMock - * @param MockObject&ValueObject $valueObjectMock + * @param \PHPUnit\Framework\MockObject\MockObject&\Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface $fragmentRendererMock + * @param \PHPUnit\Framework\MockObject\MockObject&\Ibexa\Contracts\Core\Repository\Values\ValueObject $valueObjectMock * @param class-string $renderStrategyClass */ public static function forwardParamOptionsToFragmentRenderer(MockObject $fragmentRendererMock, MockObject $valueObjectMock, string $renderStrategyClass): void From 0eccc29062311c64a254806e80d6edfe71bad072 Mon Sep 17 00:00:00 2001 From: Vidar Langseid Date: Mon, 1 Dec 2025 14:52:52 +0100 Subject: [PATCH 7/9] Revert "Added tests for IBX-3035" - Reverted Making createRenderStrategy static This reverts commit 15bedfa21f19700158be816c50ea4ed2a81014b7. --- .../Symfony/Templating/BaseRenderStrategyTest.php | 2 +- .../Symfony/Templating/RenderContentStrategyTest.php | 12 ++++++------ .../Templating/RenderLocationStrategyTest.php | 10 +++++----- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/tests/lib/MVC/Symfony/Templating/BaseRenderStrategyTest.php b/tests/lib/MVC/Symfony/Templating/BaseRenderStrategyTest.php index 8fae0cd46a..66f71a4bf1 100644 --- a/tests/lib/MVC/Symfony/Templating/BaseRenderStrategyTest.php +++ b/tests/lib/MVC/Symfony/Templating/BaseRenderStrategyTest.php @@ -24,7 +24,7 @@ abstract class BaseRenderStrategyTest extends TestCase { - public static function createRenderStrategy( + public function createRenderStrategy( string $typeClass, array $fragmentRenderers, string $defaultMethod = 'inline', diff --git a/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php b/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php index 1b2bd21407..730d32d7d7 100644 --- a/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php +++ b/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php @@ -25,7 +25,7 @@ class RenderContentStrategyTest extends BaseRenderStrategyTest { public function testUnsupportedValueObject(): void { - $renderContentStrategy = self::createRenderStrategy( + $renderContentStrategy = $this->createRenderStrategy( RenderContentStrategy::class, [ $this->createFragmentRenderer(), @@ -42,7 +42,7 @@ public function testUnsupportedValueObject(): void public function testDefaultFragmentRenderer(): void { - $renderContentStrategy = self::createRenderStrategy( + $renderContentStrategy = $this->createRenderStrategy( RenderContentStrategy::class, [ $this->createFragmentRenderer('inline'), @@ -61,7 +61,7 @@ public function testDefaultFragmentRenderer(): void public function testUnknownFragmentRenderer(): void { - $renderContentStrategy = self::createRenderStrategy( + $renderContentStrategy = $this->createRenderStrategy( RenderContentStrategy::class, [], ); @@ -75,7 +75,7 @@ public function testUnknownFragmentRenderer(): void public function testMultipleFragmentRenderers(): void { - $renderContentStrategy = self::createRenderStrategy( + $renderContentStrategy = $this->createRenderStrategy( RenderContentStrategy::class, [ $this->createFragmentRenderer('method_a'), @@ -155,7 +155,7 @@ public static function forwardParamOptionsToFragmentRenderer(MockObject $fragmen public function testDuplicatedFragmentRenderers(): void { - $renderContentStrategy = self::createRenderStrategy( + $renderContentStrategy = $this->createRenderStrategy( RenderContentStrategy::class, [ $this->createFragmentRenderer('method_a', 'decorator service used'), @@ -210,7 +210,7 @@ public function testExpectedMethodRenderArgumentsFormat(): void ->with($controllerReferenceCallback, $requestCallback) ->willReturn(new Response('some_rendered_content')); - $renderContentStrategy = self::createRenderStrategy( + $renderContentStrategy = $this->createRenderStrategy( RenderContentStrategy::class, [ $this->createFragmentRenderer('method_a'), diff --git a/tests/lib/MVC/Symfony/Templating/RenderLocationStrategyTest.php b/tests/lib/MVC/Symfony/Templating/RenderLocationStrategyTest.php index 21af1c2b41..e80f4b554f 100644 --- a/tests/lib/MVC/Symfony/Templating/RenderLocationStrategyTest.php +++ b/tests/lib/MVC/Symfony/Templating/RenderLocationStrategyTest.php @@ -23,7 +23,7 @@ class RenderLocationStrategyTest extends BaseRenderStrategyTest { public function testUnsupportedValueObject(): void { - $renderLocationStrategy = self::createRenderStrategy( + $renderLocationStrategy = $this->createRenderStrategy( RenderLocationStrategy::class, [ $this->createFragmentRenderer(), @@ -40,7 +40,7 @@ public function testUnsupportedValueObject(): void public function testDefaultFragmentRenderer(): void { - $renderLocationStrategy = self::createRenderStrategy( + $renderLocationStrategy = $this->createRenderStrategy( RenderLocationStrategy::class, [ $this->createFragmentRenderer('inline'), @@ -59,7 +59,7 @@ public function testDefaultFragmentRenderer(): void public function testUnknownFragmentRenderer(): void { - $renderLocationStrategy = self::createRenderStrategy( + $renderLocationStrategy = $this->createRenderStrategy( RenderLocationStrategy::class, [], ); @@ -73,7 +73,7 @@ public function testUnknownFragmentRenderer(): void public function testMultipleFragmentRenderers(): void { - $renderLocationStrategy = self::createRenderStrategy( + $renderLocationStrategy = $this->createRenderStrategy( RenderLocationStrategy::class, [ $this->createFragmentRenderer('method_a'), @@ -141,7 +141,7 @@ public function testExpectedMethodRenderRequestFormat(): void ->with($controllerReferenceCallback, $requestCallback) ->willReturn(new Response('some_rendered_content')); - $renderLocationStrategy = self::createRenderStrategy( + $renderLocationStrategy = $this->createRenderStrategy( RenderLocationStrategy::class, [ $this->createFragmentRenderer('method_a'), From 988d77fe3b16b90613f7909ff42a2abbff9adfe6 Mon Sep 17 00:00:00 2001 From: Vidar Langseid Date: Mon, 1 Dec 2025 15:23:50 +0100 Subject: [PATCH 8/9] Transformed static method forwardParamOptionsToFragmentRenderer to a trait --- ...ardParamOptionsToFragmentRendererTrait.php | 70 +++++++++++++++++++ .../Templating/RenderContentStrategyTest.php | 55 +-------------- .../Templating/RenderLocationStrategyTest.php | 4 +- 3 files changed, 76 insertions(+), 53 deletions(-) create mode 100644 tests/lib/MVC/Symfony/Templating/ForwardParamOptionsToFragmentRendererTrait.php diff --git a/tests/lib/MVC/Symfony/Templating/ForwardParamOptionsToFragmentRendererTrait.php b/tests/lib/MVC/Symfony/Templating/ForwardParamOptionsToFragmentRendererTrait.php new file mode 100644 index 0000000000..aa49bb5886 --- /dev/null +++ b/tests/lib/MVC/Symfony/Templating/ForwardParamOptionsToFragmentRendererTrait.php @@ -0,0 +1,70 @@ + $renderStrategyClass + */ + public function forwardParamOptionsToFragmentRenderer( + object $fragmentRendererMock, + object $valueObjectMock, + string $renderStrategyClass + ): void { + $params = [ + 'param1' => 'value1', + 'param2' => 'value2', + ]; + + $fragmentRendererMock + ->method('getName') + ->willReturn('fragment_render_mock'); + $fragmentRendererMock->expects(self::once()) + ->method('render') + ->with( + self::callback(static function ($controllerReference) use ($params) { + if (!$controllerReference instanceof ControllerReference) { + return false; + } + + return $controllerReference->attributes['params'] === $params; + }), + self::anything(), + ) + ->willReturn(new Response('fragment_render_mock_rendered')); + + $renderContentStrategy = self::createRenderStrategy( + $renderStrategyClass, + [ + $fragmentRendererMock, + ], + ); + + /** @var \Ibexa\Contracts\Core\Repository\Values\ValueObject&\PHPUnit\Framework\MockObject\MockObject $valueObjectMock */ + TestCase::assertTrue($renderContentStrategy->supports($valueObjectMock)); + + TestCase::assertSame( + 'fragment_render_mock_rendered', + $renderContentStrategy->render($valueObjectMock, new RenderOptions([ + 'method' => 'fragment_render_mock', + 'viewType' => 'awesome', + 'params' => $params, + ])) + ); + } +} diff --git a/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php b/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php index 730d32d7d7..d181a20728 100644 --- a/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php +++ b/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php @@ -8,14 +8,12 @@ namespace Ibexa\Tests\Core\MVC\Symfony\Templating; -use Ibexa\Contracts\Core\MVC\Templating\RenderStrategy; use Ibexa\Contracts\Core\Repository\Exceptions\InvalidArgumentException; use Ibexa\Contracts\Core\Repository\Values\Content\Content; use Ibexa\Contracts\Core\Repository\Values\ValueObject; use Ibexa\Core\MVC\Symfony\SiteAccess; use Ibexa\Core\MVC\Symfony\Templating\RenderContentStrategy; use Ibexa\Core\MVC\Symfony\Templating\RenderOptions; -use PHPUnit\Framework\MockObject\MockObject; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\HttpKernel\Controller\ControllerReference; @@ -23,6 +21,8 @@ class RenderContentStrategyTest extends BaseRenderStrategyTest { + use ForwardParamOptionsToFragmentRendererTrait; + public function testUnsupportedValueObject(): void { $renderContentStrategy = $this->createRenderStrategy( @@ -97,62 +97,13 @@ public function testMultipleFragmentRenderers(): void public function testForwardParamOptionsToFragmentRenderer(): void { - static::forwardParamOptionsToFragmentRenderer( + $this->forwardParamOptionsToFragmentRenderer( $this->createMock(FragmentRendererInterface::class), $this->createMock(Content::class), RenderContentStrategy::class, ); } - /** - * @param \PHPUnit\Framework\MockObject\MockObject&\Symfony\Component\HttpKernel\Fragment\FragmentRendererInterface $fragmentRendererMock - * @param \PHPUnit\Framework\MockObject\MockObject&\Ibexa\Contracts\Core\Repository\Values\ValueObject $valueObjectMock - * @param class-string $renderStrategyClass - */ - public static function forwardParamOptionsToFragmentRenderer(MockObject $fragmentRendererMock, MockObject $valueObjectMock, string $renderStrategyClass): void - { - $params = [ - 'param1' => 'value1', - 'param2' => 'value2', - ]; - - $fragmentRendererMock - ->method('getName') - ->willReturn('fragment_render_mock'); - $fragmentRendererMock->expects(self::once()) - ->method('render') - ->with( - self::callback(static function ($controllerReference) use ($params) { - if (!$controllerReference instanceof ControllerReference) { - return false; - } - - return $controllerReference->attributes['params'] === $params; - }), - self::anything(), - ) - ->willReturn(new Response('fragment_render_mock_rendered')); - - $renderContentStrategy = self::createRenderStrategy( - $renderStrategyClass, - [ - $fragmentRendererMock, - ], - ); - - /** @var \Ibexa\Contracts\Core\Repository\Values\ValueObject&\PHPUnit\Framework\MockObject\MockObject $valueObjectMock */ - self::assertTrue($renderContentStrategy->supports($valueObjectMock)); - - self::assertSame( - 'fragment_render_mock_rendered', - $renderContentStrategy->render($valueObjectMock, new RenderOptions([ - 'method' => 'fragment_render_mock', - 'viewType' => 'awesome', - 'params' => $params, - ])) - ); - } - public function testDuplicatedFragmentRenderers(): void { $renderContentStrategy = $this->createRenderStrategy( diff --git a/tests/lib/MVC/Symfony/Templating/RenderLocationStrategyTest.php b/tests/lib/MVC/Symfony/Templating/RenderLocationStrategyTest.php index e80f4b554f..4a30f44b99 100644 --- a/tests/lib/MVC/Symfony/Templating/RenderLocationStrategyTest.php +++ b/tests/lib/MVC/Symfony/Templating/RenderLocationStrategyTest.php @@ -21,6 +21,8 @@ class RenderLocationStrategyTest extends BaseRenderStrategyTest { + use ForwardParamOptionsToFragmentRendererTrait; + public function testUnsupportedValueObject(): void { $renderLocationStrategy = $this->createRenderStrategy( @@ -95,7 +97,7 @@ public function testMultipleFragmentRenderers(): void public function testForwardParamOptionsToFragmentRenderer(): void { - RenderContentStrategyTest::forwardParamOptionsToFragmentRenderer( + $this->forwardParamOptionsToFragmentRenderer( $this->createMock(FragmentRendererInterface::class), $this->createMock(Location::class), RenderLocationStrategy::class, From 3c65ba0d54a10d29e102cea27e53bdd9e8e905cb Mon Sep 17 00:00:00 2001 From: Vidar Langseid Date: Tue, 2 Dec 2025 09:20:27 +0100 Subject: [PATCH 9/9] fixup! Added tests for IBX-3035 --- tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php b/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php index d181a20728..b1e66892cb 100644 --- a/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php +++ b/tests/lib/MVC/Symfony/Templating/RenderContentStrategyTest.php @@ -149,7 +149,7 @@ public function testExpectedMethodRenderArgumentsFormat(): void return true; }); - $requestCallback = $this->callback(static function (Request $request) use ($siteAccess, $content): bool { + $requestCallback = $this->callback(static function (Request $request): bool { self::assertSame('TEST/1.0', $request->headers->get('Surrogate-Capability')); return true;