csrf = new class () { public function generateToken(string $formId): CsrfToken { return new CsrfToken('test-csrf-token-' . $formId); } }; } public function getId(): string { return 'test-session'; } public function start(): void { } public function destroy(): void { } public function regenerateId(): void { } public function get(string $key, mixed $default = null): mixed { return $default; } public function set(string $key, mixed $value): void { } public function has(string $key): bool { return false; } public function remove(string $key): void { } public function clear(): void { } public function getFlashBag(): mixed { return null; } }; // Create a mock TemplateRenderer (we won't use it for this test) $templateRenderer = new class () implements TemplateRenderer { public function render(...$args): string { return ''; } public function renderPartial(...$args): string { return ''; } }; // Create LiveComponentRenderer $renderer = new LiveComponentRenderer($templateRenderer, $session); // Test 1: Render WITHOUT SSE channel echo "Test 1: Render without SSE channel\n"; echo "-----------------------------------\n"; $html1 = $renderer->renderWithWrapper( componentId: 'test-component:demo', componentHtml: '
Test Content
', state: ['count' => 0], sseChannel: null ); if (str_contains($html1, 'data-sse-channel=')) { echo "❌ FAIL: data-sse-channel should NOT be present when sseChannel is null\n"; } else { echo "✅ SUCCESS: data-sse-channel not present (as expected)\n"; } // Verify other attributes are present $requiredAttrs = ['data-live-component', 'data-state', 'data-csrf-token']; foreach ($requiredAttrs as $attr) { if (str_contains($html1, $attr . '=')) { echo "✅ {$attr} present\n"; } else { echo "❌ {$attr} MISSING\n"; } } echo "\n"; // Test 2: Render WITH SSE channel echo "Test 2: Render with SSE channel\n"; echo "-----------------------------------\n"; $html2 = $renderer->renderWithWrapper( componentId: 'notification-center:user-123', componentHtml: 'Test
', state: ['test' => true], sseChannel: 'presence:room-