'https://bnfexpress.test', 'services.bnfexpress.client_id' => 'ev_admin', 'services.bnfexpress.client_secret' => 'test-secret', ]); Permission::findOrCreate('manage_ai_agent', 'web'); $this->admin = User::factory()->create()->givePermissionTo(['manage_ai_agent']); $this->actingAs($this->admin); }); test('a user without manage_ai_agent cannot access it', function () { $this->actingAs(User::factory()->create()); expect(ViewEvChatHistory::canAccess())->toBeFalse(); }); test('it lists sessions from the client', function () { Http::fake(['bnfexpress.test/admin/ev/history*' => Http::response([ 'total' => 1, 'limit' => 25, 'offset' => 0, 'sessions' => [ ['session_id' => 'sess-1', 'user_id' => 'user-1', 'title' => 'Charging question', 'last_message' => 'Thanks!', 'updated_at' => now()->toIso8601String()], ], ])]); Livewire::test(ViewEvChatHistory::class) ->assertOk() ->loadTable() ->assertSee('Charging question'); }); test('viewing a transcript shows its messages', function () { Http::fake([ 'bnfexpress.test/admin/ev/history/user-1/sess-1' => Http::response([ 'session_id' => 'sess-1', 'user_id' => 'user-1', 'messages' => [ ['author' => 'user', 'text' => 'How do I charge my EV?', 'timestamp' => now()->timestamp], ['author' => 'bnfexpress_ev_agent', 'text' => 'Plug it in at a station.', 'timestamp' => now()->timestamp], ], ]), 'bnfexpress.test/admin/ev/history*' => Http::response([ 'total' => 1, 'limit' => 25, 'offset' => 0, 'sessions' => [ ['session_id' => 'sess-1', 'user_id' => 'user-1', 'title' => 'Charging question', 'last_message' => 'Thanks!', 'updated_at' => now()->toIso8601String()], ], ]), ]); Livewire::test(ViewEvChatHistory::class) ->loadTable() ->mountTableAction('view', 'user-1:sess-1') ->assertMountedActionModalSee('Plug it in at a station.'); }); test('a failed transcript fetch surfaces the gateway detail message', function () { Http::fake([ 'bnfexpress.test/admin/ev/history/user-1/sess-1' => Http::response(['detail' => 'Session not found.'], 404), 'bnfexpress.test/admin/ev/history*' => Http::response([ 'total' => 1, 'limit' => 25, 'offset' => 0, 'sessions' => [ ['session_id' => 'sess-1', 'user_id' => 'user-1', 'title' => 'Charging question', 'last_message' => 'Thanks!', 'updated_at' => now()->toIso8601String()], ], ]), ]); Livewire::test(ViewEvChatHistory::class) ->loadTable() ->mountTableAction('view', 'user-1:sess-1') ->assertMountedActionModalSee('Session not found.') ->assertNotified('Could not load transcript'); });