'heading', 'data' => ['text' => 'Hello World', 'level' => 3] ], [ 'type' => 'paragraph', 'data' => ['text' => '

This is a paragraph.

'] ] ]; $html = $renderer->render($content); $this->assertStringContainsString('

Hello World

', $html); $this->assertStringContainsString('

This is a paragraph.

', $html); } public function test_it_supports_theme_overrides(): void { // Setup theme blocks directory $themesPath = base_path('themes'); if (! File::exists($themesPath)) { File::makeDirectory($themesPath); } $themeBlocksPath = "{$themesPath}/test-theme/blocks"; if (! File::exists($themeBlocksPath)) { File::makeDirectory($themeBlocksPath, 0755, true); } File::put("{$themeBlocksPath}/heading.blade.php", "

{{ \$text }}

"); // Add theme to view paths View::addNamespace('themes.test-theme', $themesPath . '/test-theme'); \App\Models\Setting::set('active_theme', 'test-theme', 'cms'); $renderer = new PageRenderer(); $content = [ ['type' => 'heading', 'data' => ['text' => 'Theme Heading']] ]; $html = $renderer->render($content); $this->assertStringContainsString("

Theme Heading

", $html); // Cleanup File::deleteDirectory($themesPath . '/test-theme'); } public function test_it_handles_missing_blocks_gracefully(): void { $renderer = new PageRenderer(); $content = [ ['type' => 'unknown', 'data' => []] ]; $html = $renderer->render($content); $this->assertStringContainsString('', $html); } public function test_it_maps_aliases(): void { $renderer = new PageRenderer(); $content = [ ['type' => 'text', 'data' => ['text' => 'Paragraph text']], ['type' => 'header', 'data' => ['text' => 'Header text']] ]; $html = $renderer->render($content); // Alias 'text' maps to 'paragraph' which might use Icehouse template or fallback $this->assertStringContainsString('Paragraph text', $html); // Alias 'header' maps to 'heading' which should render core

$this->assertStringContainsString('

Header text

', $html); } }