(string) Str::uuid(), 'name' => 'A', 'email' => 'a+'.uniqid().'@x.com']); } public function test_requires_a_message(): void { config(['afia.api_key' => 'sk-test']); $this->actingAs($this->user())->postJson('/afia/chat', [])->assertStatus(422); } public function test_returns_503_when_not_configured(): void { config(['afia.api_key' => '']); $this->actingAs($this->user())->postJson('/afia/chat', ['message' => 'hi'])->assertStatus(503); } public function test_returns_reply_from_llm(): void { config([ 'afia.api_key' => 'sk-test', 'afia.provider' => 'openai', 'afia.model' => 'gpt-4o-mini', 'afia.product' => 'transfer', ]); Http::fake([ 'api.openai.com/*' => Http::response(['choices' => [['message' => ['content' => 'Open Transfers → New transfer to upload files.']]]]), ]); $this->actingAs($this->user()) ->postJson('/afia/chat', ['message' => 'How do I share files?']) ->assertOk() ->assertJson(['reply' => 'Open Transfers → New transfer to upload files.']); Http::assertSent(fn ($r) => str_contains($r->url(), 'openai.com') && collect($r['messages'])->first()['role'] === 'system' && str_contains(collect($r['messages'])->first()['content'], 'Ladill Transfer')); } }