container = new DefaultContainer(); $this->container->singleton( PlaceholderReplacer::class, new PlaceholderReplacer($this->container) ); $this->processor = new ForProcessor($this->container); }); describe('ForProcessor', function () { it('processes simple for loops with array data', function () { $html = <<
  • {{ item.name }}
  • HTML; $context = new RenderContext( template: 'test', metaData: new MetaData('Test', 'Test'), data: [ 'items' => [ ['name' => 'Item 1'], ['name' => 'Item 2'], ['name' => 'Item 3'], ], ], controllerClass: null ); $dom = DomWrapper::fromString($html); $result = $this->processor->process($dom, $context); $output = $result->toHtml(true); expect($output)->toContain('Item 1'); expect($output)->toContain('Item 2'); expect($output)->toContain('Item 3'); expect(str_contains($output, 'toBeFalse(); }); it('processes table rows in for loops', function () { $html = << {{ check.componentName }} {{ check.status }} HTML; $context = new RenderContext( template: 'health', metaData: new MetaData('Health', 'Health'), data: [ 'health_checks' => [ ['componentName' => 'Database', 'status' => 'healthy'], ['componentName' => 'Cache', 'status' => 'healthy'], ['componentName' => 'Queue', 'status' => 'degraded'], ], ], controllerClass: null ); $dom = DomWrapper::fromString($html); $result = $this->processor->process($dom, $context); $output = $result->toHtml(true); expect($output)->toContain('Database'); expect($output)->toContain('Cache'); expect($output)->toContain('Queue'); expect($output)->toContain('healthy'); expect($output)->toContain('degraded'); expect(str_contains($output, 'toBeFalse(); }); it('handles empty arrays gracefully', function () { $html = <<
  • {{ item.name }}
  • HTML; $context = new RenderContext( template: 'test', metaData: new MetaData('Test', 'Test'), data: ['items' => []], controllerClass: null ); $dom = DomWrapper::fromString($html); $result = $this->processor->process($dom, $context); $output = $result->toHtml(true); expect(str_contains($output, 'toBeFalse(); expect(str_contains($output, '{{ item.name }}'))->toBeFalse(); }); it('processes nested property paths', function () { $html = <<

    {{ user.profile.displayName }}

    HTML; $context = new RenderContext( template: 'test', metaData: new MetaData('Test', 'Test'), data: [ 'data' => [ 'users' => [ ['profile' => ['displayName' => 'John Doe']], ['profile' => ['displayName' => 'Jane Smith']], ], ], ], controllerClass: null ); $dom = DomWrapper::fromString($html); $result = $this->processor->process($dom, $context); $output = $result->toHtml(true); expect($output)->toContain('John Doe'); expect($output)->toContain('Jane Smith'); }); it('handles boolean values correctly', function () { $html = << {{ item.active }} HTML; $context = new RenderContext( template: 'test', metaData: new MetaData('Test', 'Test'), data: [ 'items' => [ ['active' => true], ['active' => false], ], ], controllerClass: null ); $dom = DomWrapper::fromString($html); $result = $this->processor->process($dom, $context); $output = $result->toHtml(true); expect($output)->toContain('true'); expect($output)->toContain('false'); }); });