frindlymap/test/circle_service_test.dart

83 lines
4.3 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:friendly_map/modules/app/app.dart';
import 'package:friendly_map/modules/circles/circles.dart';
import 'package:friendly_map/modules/core/core.dart';
import 'package:friendly_map/modules/storage/storage.dart';
import 'package:friendly_map/modules/transport/transport.dart';
import 'package:friendly_map/modules/work/work.dart';
import 'support/app_device.dart';
void main() {
late AppDevice me;
late FriendlyApp app;
late Person a, b, c;
Future<void> card(Person p, String kind, Map<String, String> f) => app.deps.storage.receivedCards.put(
ReceivedCard(id: 'rc-${p.id}-$kind', personId: p.id, kind: kind, fieldsJson: encodeFields(f), receivedAt: 1, updatedAt: 1));
setUp(() async {
me = await AppDevice.create(MemoryHub(), '010-1111-2222', '+821011112222', '나');
app = me.app;
a = (await app.friends.add('+821033334444', '김선배'))!;
b = (await app.friends.add('+821055556666', '이동기'))!;
c = (await app.friends.add('+821077778888', '박후배'))!;
final mine = (await app.cards.mine());
await app.cards.edit(mine.firstWhere((x) => x.kind == CardKinds.school).id, fields: {'name': '나', 'school': '가람고', 'year': '2006'});
await app.cards.edit(mine.firstWhere((x) => x.kind == CardKinds.company).id, fields: {'name': '나', 'company': '한빛', 'position': '과장'});
await card(a, CardKinds.school, {'year': '2004'});
await card(b, CardKinds.school, {'year': '2006'});
await card(c, CardKinds.school, {'year': '2007년 입학'});
final cls = (await app.groups.add('27회 3반', CardKinds.school, parent: 'school.high'))!;
await app.groups.addMembers('school.high', [b.id, c.id]);
await app.groups.addMembers(cls.id, [a.id]);
final room = (await app.chats.openDirect(c.id, CardKinds.personal))!;
for (var i = 0; i < 3; i++) {
await app.chats.send(room.id, '안녕 $i');
}
});
test('구성원은 가까운 순(대화 많은 사람 먼저), 선배·동기·후배와 하위 그룹(반)이 붙는다', () async {
final ms = await app.circles.members('school.high');
expect(ms.first.person.id, c.id, reason: '대화 3번');
final by = {for (final m in ms) m.person.name: m};
expect(by['김선배']!.cohort, '2년 선배');
expect(by['이동기']!.cohort, '동기');
expect(by['박후배']!.cohort, '1년 후배');
expect(by['김선배']!.subgroup, '27회 3반');
expect(by['이동기']!.subgroup, isNull);
});
test('학교 가운데: 초·중·고·대·대학원 칸과 사람 수, 전체에서 가까운 사람', () async {
final hub = await app.circles.hub(CardKinds.school);
expect(hub.levels.map((l) => l.view.group.name), ['초등학교', '중학교', '고등학교', '대학교', '대학원']);
expect(hub.levels.firstWhere((l) => l.view.group.name == '고등학교').count, 3);
expect(hub.closest.first.person.id, c.id);
});
test('회사: 직책으로 윗사람·같은 급·아래 직원', () async {
await card(a, CardKinds.company, {'position': '부장'});
await card(b, CardKinds.company, {'position': '과장'});
await card(c, CardKinds.company, {'position': '사원'});
final hb = (await app.groups.add('한빛', CardKinds.company, parent: CardKinds.company))!;
await app.groups.addMembers(hb.id, [a.id, b.id, c.id]);
final rel = {for (final m in await app.circles.members(hb.id)) m.person.name: m.rankRelation};
expect(rel, {'김선배': RankRelation.above, '이동기': RankRelation.same, '박후배': RankRelation.below});
});
test('단체 메시지: 고른 사람 각자에게, 긴급이면 긴급 호출로', () async {
expect(await app.circles.broadcast([a.id, b.id, a.id], '동창회 오늘 7시'), 2);
expect(await app.circles.broadcast([b.id], '모임 장소 바뀜', urgent: true), 1);
final rooms = await app.chats.summaries();
final last = rooms.firstWhere((r) => r.room.title == '이동기').last!;
expect(WorkNote.parse(last.body), isA<UrgentNote>());
});
test('나눠 보기 설정은 종류마다 따로', () async {
expect(await app.circles.splitView(CardKinds.school), isFalse);
await app.circles.setSplitView(CardKinds.school, true);
expect(await app.circles.splitView(CardKinds.school), isTrue);
expect(await app.circles.splitView(CardKinds.company), isFalse);
});
}