$environment, 'MESHVAULT_LIBRARY_DIR' => sys_get_temp_dir(), 'MESHVAULT_DB_HOST' => 'db', 'MESHVAULT_DB_NAME' => 'meshvault', 'MESHVAULT_DB_USER' => 'meshvault', 'MESHVAULT_DB_PASSWORD' => 'private-secret', ])); } public function testHomeUsesContainerResolvedHandlerAndHtmlView(): void { $app = $this->app(); self::assertInstanceOf(\DI\Container::class, $app->getContainer()); self::assertInstanceOf(HomeHandler::class, $app->getContainer()->get(HomeHandler::class)); $app->getContainer()->set(View::class, new View(dirname(__DIR__, 2) . '/templates')); $response = $app->handle((new ServerRequestFactory())->createServerRequest('GET', '/')); self::assertSame(200, $response->getStatusCode()); self::assertSame('text/html; charset=utf-8', $response->getHeaderLine('Content-Type')); self::assertStringContainsString('

MeshVault

', (string) $response->getBody()); self::assertSame(HomeHandler::class, array_values($app->getRouteCollector()->getRoutes())[0]->getCallable()); } public function testViewEscapesDynamicTextAndQuotes(): void { self::assertTrue(class_exists(View::class), 'PHP View must exist'); $html = (new View(dirname(__DIR__, 2) . '/templates'))->render('home', ['title' => '']); self::assertStringContainsString('<script>"&'</script>', $html); self::assertStringNotContainsString(''); }); $response = $app->handle((new ServerRequestFactory())->createServerRequest('GET', '/test-only')); self::assertSame(500, $response->getStatusCode()); self::assertStringContainsString('Internal Server Error', (string) $response->getBody()); self::assertStringNotContainsString('private-secret', (string) $response->getBody()); self::assertStringNotContainsString('AppTest', (string) $response->getBody()); } public function testDevelopmentExceptionIsReadableAndEscaped(): void { $app = $this->app('development'); $app->get('/test-only', function (): never { throw new \RuntimeException('Readable '); }); $response = $app->handle((new ServerRequestFactory())->createServerRequest('GET', '/test-only')); self::assertSame(500, $response->getStatusCode()); $body = (string) $response->getBody(); self::assertStringContainsString('Readable <script>failure</script>', $body); self::assertStringNotContainsString('