118 lines
3.2 KiB
Dart
118 lines
3.2 KiB
Dart
|
|
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);
|
||
|
|
});
|
||
|
|
}
|