user_id !== (int) $actor->id', $service); } /** * Existing tickets with public comments but a missing first_response_at are repaired on display. */ public function test_ticket_show_synchronises_first_response_from_existing_public_comments(): void { $componentPath = dirname(__DIR__, 2) . '/Livewire/TicketShow.php'; $servicePath = dirname(__DIR__, 2) . '/Services/SlaService.php'; $component = file_get_contents($componentPath); $service = file_get_contents($servicePath); self::assertIsString($component); self::assertIsString($service); self::assertStringContainsString('syncFirstResponseFromComments($ticket)', $component); self::assertStringContainsString("where('is_internal', false)", $service); self::assertStringContainsString("whereNull('tombstoned_at')", $service); } /** * The SLA card should show an accurate response state instead of Awaiting response after public replies exist. */ public function test_sla_card_has_clear_responded_and_awaiting_public_reply_states(): void { $viewPath = dirname(__DIR__, 2) . '/Resources/views/livewire/ticket-show.blade.php'; $view = file_get_contents($viewPath); self::assertIsString($view); self::assertStringContainsString('Responded', $view); self::assertStringContainsString('Awaiting public reply', $view); self::assertStringNotContainsString("?? 'Awaiting response'", $view); } }