import 'package:flutter_test/flutter_test.dart'; import 'package:halkyon_app/halkyon_app.dart'; import 'package:halkyon_app/testing.dart'; void main() { late FakeAgentGateway gateway; late AgentsCubit cubit; setUp(() { gateway = FakeAgentGateway(); cubit = AgentsCubit(AgentRepository(gateway)); }); tearDown(() => cubit.close()); test('reads whether agents are offered, and the agents', () async { await cubit.load(); expect(cubit.state.offered, isTrue); expect(cubit.state.agents, isEmpty); expect(cubit.state.shown, isTrue); }); test( 'shows nothing where none are offered and the person has none', () async { gateway.isOffered = false; await cubit.load(); expect(cubit.state.shown, isFalse); }, ); test('still shows the agents made before agents were switched off', () async { await cubit.load(); await cubit.create(name: 'Claude', handle: 'claude_bot'); gateway.isOffered = false; await cubit.load(); expect(cubit.state.shown, isTrue); expect(cubit.state.agents.single.handle, 'claude_bot'); }); test( 'makes an agent, its handle without the @, and hands its token on', () async { await cubit.load(); final made = await cubit.create(name: ' Claude ', handle: '@claude_bot'); expect(made?.token, 'TOKEN-1'); expect(made?.agent.name, 'Claude'); expect(cubit.state.agents.single.handle, 'claude_bot'); expect(cubit.state.busy, isFalse); }, ); test('refuses a handle someone has, saying so, making nothing', () async { gateway.taken.add('claude_bot'); await cubit.load(); final made = await cubit.create(name: 'Claude', handle: 'claude_bot'); expect(made, isNull); expect(cubit.state.makeProblem, AgentProblem.handleTaken); expect(cubit.state.problem, isNull); expect(cubit.state.agents, isEmpty); }); test('refuses more than five agents', () async { await cubit.load(); for (var i = 0; i < maxAgents; i++) { await cubit.create(name: '', handle: 'bot$i'); } final made = await cubit.create(name: '', handle: 'bot_more'); expect(made, isNull); expect(cubit.state.makeProblem, AgentProblem.tooMany); expect(cubit.state.agents, hasLength(maxAgents)); }); test( 'a new token replaces the one before; taking it back leaves none', () async { await cubit.load(); final agent = (await cubit.create(name: '', handle: 'bot'))!.agent; final renewed = await cubit.newToken(agent.id); expect(renewed?.token, 'TOKEN-2'); expect(await cubit.revoke(agent.id), isTrue); expect(cubit.state.agents.single.hasToken, isFalse); }, ); test('deletes an agent; one gone already is said to be', () async { await cubit.load(); final agent = (await cubit.create(name: '', handle: 'bot'))!.agent; expect(await cubit.delete(agent.id), isTrue); expect(cubit.state.agents, isEmpty); expect(await cubit.delete(agent.id), isFalse); expect(cubit.state.problem, AgentProblem.notFound); }); test('an instance out of reach is said to be', () async { gateway.unreachable = true; await cubit.load(); expect(cubit.state.problem, AgentProblem.failed); expect(cubit.state.shown, isFalse); }); }