responses = ['1. Doe X']; $service = new SupportReplyService( $this->fakeSettings(), $llm, new FakeTicketProcessingLoggerService ); $ticket = Ticket::query()->create(['message' => 'vraag', 'normalized_message' => 'vraag']); $article = Article::query()->create(['title' => 'DNS', 'content' => 'steps']); $reply = $service->build($ticket, $article, 'relevant'); $this->assertSame('1. Doe X', $reply); $this->assertStringContainsString('Gebruikersvraag (genormaliseerd): vraag', $llm->generatedPrompts[0]['prompt']); } public function test_it_falls_back_when_llm_returns_empty(): void { $llm = new FakeLlmClient; $llm->responses = ['']; $service = new SupportReplyService( $this->fakeSettings(), $llm, new FakeTicketProcessingLoggerService ); $ticket = Ticket::query()->create(['message' => 'vraag']); $article = Article::query()->create(['title' => 'DNS', 'content' => 'steps']); $reply = $service->build($ticket, $article, 'relevant'); $this->assertStringContainsString('Gebruik het kennisbankartikel', $reply); } private function fakeSettings(): AppSettingsService { return new class extends AppSettingsService { public function getPrompt(string $key, ?string $default = null): ?string { return 'Prompt'; } }; } }