import 'package:flutter_test/flutter_test.dart'; import 'package:friendly_map/modules/app/app.dart'; import 'package:friendly_map/modules/transport/transport.dart'; import 'support/app_device.dart'; Future befriend(AppDevice a, AppDevice b) async { await a.app.friends.add(b.phone, b.name); await AppDevice.settleAll(); await b.app.friends.accept(a.phone); await AppDevice.settleAll(); } void main() { group('보여 주기', () { test('전화번호는 010-0000-0000 처럼', () { expect(displayPhone('+821033334444'), '010-3333-4444'); expect(displayPhone('+82313334444'), '031-333-4444'); expect(displayPhone('+8225551234'), '02-555-1234'); expect(displayPhone('+82255512345'), '02-5551-2345'); expect(displayPhone('+14155550000'), '+14155550000'); expect(displayPhone('local:abc'), ''); }); test('목록 시각: 오늘은 시:분, 어제, 올해는 월 일, 그 전은 연도까지', () { final now = DateTime(2026, 10, 26, 18); int s(DateTime t) => t.millisecondsSinceEpoch ~/ 10; expect(listTime(s(DateTime(2026, 10, 26, 15, 5)), now: now), '오후 3:05'); expect(listTime(s(DateTime(2026, 10, 26, 0, 7)), now: now), '오전 12:07'); expect(listTime(s(DateTime(2026, 10, 25, 23)), now: now), '어제'); expect(listTime(s(DateTime(2026, 3, 1)), now: now), '3월 1일'); expect(listTime(s(DateTime(2025, 3, 1)), now: now), '2025. 3. 1.'); expect(dayLabel(DateTime(2026, 10, 26)), '2026년 10월 26일 월요일'); expect(dueText(DateTime(2026, 10, 30), now: now), 'D-4'); expect(dueText(DateTime(2026, 10, 26), now: now), '오늘 마감'); expect(dueText(DateTime(2026, 10, 24), now: now), '2일 지남'); }); test('미리보기: 업무·긴급 표시는 읽는 말로', () { expect(previewOf('📌 업무 [김민수] 결제 API 정리 (마감 10/30)'), '업무 · 결제 API 정리 (담당 김민수)'); expect(previewOf('🚨 긴급 호출: 서버가 멈췄어요'), '긴급 호출 · 서버가 멈췄어요'); expect(previewOf('안녕\n하세요'), '안녕 하세요'); }); }); group('새 기기로 다시 연결 · 영구 제명', () { late MemoryHub hub; late AppDevice me, old; setUp(() async { hub = MemoryHub(); me = await AppDevice.create(hub, '010-1111-2222', '+821011112222', '나'); old = await AppDevice.create(hub, '010-3333-4444', '+821033334444', '김민수'); await befriend(me, old); }); test('관계가 있던 번호가 새 키로 오면 "다시 연결 요청", 승인하면 새 키로 이어진다', () async { final known = (await me.app.deps.storage.people.byPhone(old.phone))!; final oldKey = known.publicKey; final fresh = await AppDevice.create(hub, '010-3333-4444', '+821033334444', '김민수새폰'); await fresh.app.friends.add(me.phone, '나'); await AppDevice.settleAll(); final reqs = await me.app.blocks.incoming(); expect(reqs.single.reconnect, isTrue); expect(reqs.single.known!.id, known.id); await me.app.blocks.approve(old.phone); final after = (await me.app.deps.storage.people.byPhone(old.phone))!; expect(after.id, known.id, reason: '같은 사람으로 이어진다'); expect(after.publicKey, isNot(oldKey)); }); test('제명하면 요청이 사라지고 그 번호의 인사는 다시 받지 않는다', () async { final fresh = await AppDevice.create(hub, '010-3333-4444', '+821033334444', '김민수새폰2'); await fresh.app.friends.add(me.phone, '나'); await AppDevice.settleAll(); await me.app.blocks.expel(old.phone); expect(await me.app.blocks.incoming(), isEmpty); expect(await me.app.blocks.isBlocked(old.phone), isTrue); await fresh.app.friends.add(me.phone, '나'); await AppDevice.settleAll(); expect(await me.app.blocks.incoming(), isEmpty, reason: '다시 청해도 안 들어온다'); await me.app.blocks.unblock(old.phone); expect(await me.app.blocks.isBlocked(old.phone), isFalse); }); test('처음 보는 사람의 요청은 다시 연결이 아니다', () async { final stranger = await AppDevice.create(hub, '010-9999-0000', '+821099990000', '처음'); await stranger.app.friends.add(me.phone, '나'); await AppDevice.settleAll(); expect((await me.app.blocks.incoming()).single.reconnect, isFalse); }); }); }