clock = new Clock(); // Create a mock ContentRenderer $this->contentRenderer = Mockery::mock(ContentRenderer::class); $this->service = new ContentPreviewService( $this->contentRenderer, $this->clock ); }); it('renders preview HTML from ContentBlocks', function () { $blocks = ContentBlocks::fromArray([ [ 'id' => 'block-1', 'type' => 'text', 'data' => ['content' => '

Test content

'], ], ]); $this->contentRenderer ->shouldReceive('render') ->once() ->andReturn('

Test content

'); $html = $this->service->renderPreview($blocks); expect($html)->toBeString(); expect($html)->not->toBeEmpty(); expect($html)->toContain('Test content'); }); it('renders multiple blocks in preview', function () { $blocks = ContentBlocks::fromArray([ [ 'id' => 'block-1', 'type' => 'hero', 'data' => ['title' => 'Hero Title'], ], [ 'id' => 'block-2', 'type' => 'text', 'data' => ['content' => '

Text content

'], ], ]); $this->contentRenderer ->shouldReceive('render') ->once() ->andReturn('
Hero Title

Text content

'); $html = $this->service->renderPreview($blocks); expect($html)->toBeString(); expect($html)->toContain('Hero Title'); expect($html)->toContain('Text content'); }); it('renders empty blocks as empty string', function () { $blocks = ContentBlocks::fromArray([]); $this->contentRenderer ->shouldReceive('render') ->once() ->andReturn(''); $html = $this->service->renderPreview($blocks); expect($html)->toBe(''); }); it('does not use caching for preview', function () { $blocks = ContentBlocks::fromArray([ [ 'id' => 'block-1', 'type' => 'text', 'data' => ['content' => '

Test

'], ], ]); $this->contentRenderer ->shouldReceive('render') ->once() ->andReturn('
Test
'); // Call twice - should render both times (no caching) $html1 = $this->service->renderPreview($blocks); $html2 = $this->service->renderPreview($blocks); expect($html1)->toBe($html2); // Verify render was called twice (no caching) $this->contentRenderer->shouldHaveReceived('render')->twice(); }); });