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 card(Person p, String kind, Map 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()); }); 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); }); }