* * For the full copyright and license information, please view the LICENSE * file that was distributed with this source code. */ namespace Symfony\Component\ErrorHandler\Tests\ErrorRenderer; use PHPUnit\Framework\TestCase; use Symfony\Component\ErrorHandler\ErrorRenderer\HtmlErrorRenderer; class HtmlErrorRendererTest extends TestCase { /** * @dataProvider getRenderData */ public function testRender(\Throwable $exception, HtmlErrorRenderer $errorRenderer, string $expected) { $this->assertStringMatchesFormat($expected, $errorRenderer->render($exception)->getAsString()); } public static function getRenderData(): iterable { $expectedDebug = << %AFoo (500 Internal Server Error) %A
%A HTML; $expectedNonDebug = << %AAn Error Occurred: Internal Server Error %A

The server returned a "500 Internal Server Error".

%A HTML; yield '->render() returns the HTML content WITH stack traces in debug mode' => [ new \RuntimeException('Foo'), new HtmlErrorRenderer(true), $expectedDebug, ]; yield '->render() returns the HTML content WITHOUT stack traces in non-debug mode' => [ new \RuntimeException('Foo'), new HtmlErrorRenderer(false), $expectedNonDebug, ]; } public function testRendersStackWithoutBinaryStrings() { if (\PHP_VERSION_ID >= 70400) { // make sure method arguments are available in stack traces (see https://www.php.net/manual/en/ini.core.php) ini_set('zend.exception_ignore_args', false); } $binaryData = file_get_contents(__DIR__.'/../Fixtures/pixel.png'); $exception = $this->getRuntimeException($binaryData); $rendered = (new HtmlErrorRenderer(true))->render($exception)->getAsString(); $this->assertStringContainsString( "buildRuntimeException('FooException')", $rendered, '->render() contains the method call with "FooException"' ); $this->assertStringContainsString( 'getRuntimeException(binary string)', $rendered, '->render() contains the method call with "binary string" replacement' ); $this->assertStringContainsString( 'binary string', $rendered, '->render() returns the HTML content with "binary string" replacement' ); } private function getRuntimeException(string $unusedArgument): \RuntimeException { return $this->buildRuntimeException('FooException'); } private function buildRuntimeException(string $message): \RuntimeException { return new \RuntimeException($message); } }