frindlymap/test/reconnect_display_test.dart

94 lines
4.4 KiB
Dart

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<void> 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);
});
});
}