import 'package:flutter_test/flutter_test.dart'; import 'package:friendly_map/modules/work/work.dart'; void main() { final now = DateTime(2026, 10, 26); group('업무 표시', () { test('업무: 담당·제목·마감을 글자로 만들고 다시 읽는다', () { final s = TaskNote('결제 API 정리', assignee: '김민수', due: DateTime(2026, 10, 30)).encode(); expect(s, '📌 업무 [김민수] 결제 API 정리 (마감 10/30)'); final n = WorkNote.parse(s, now: now) as TaskNote; expect(n.title, '결제 API 정리'); expect(n.assignee, '김민수'); expect(n.due, DateTime(2026, 10, 30)); }); test('담당·마감 없이도 되고, 제목이 비면 업무가 아니다', () { final n = WorkNote.parse('📌 업무 회의록 쓰기', now: now) as TaskNote; expect(n.assignee, isNull); expect(n.due, isNull); expect(WorkNote.parse('📌 업무 [나]', now: now), isNull); }); test('마감 월/일은 가까운 앞날: 1월 5일은 내년, 지난주는 올해', () { expect((WorkNote.parse('📌 업무 보고 (마감 1/5)', now: now) as TaskNote).due, DateTime(2027, 1, 5)); expect((WorkNote.parse('📌 업무 보고 (마감 10/20)', now: now) as TaskNote).due, DateTime(2026, 10, 20)); expect((WorkNote.parse('📌 업무 보고 (마감 13/40)', now: now) as TaskNote).due, isNull); }); test('긴급 호출, 보통 대화는 표시 없음', () { expect((WorkNote.parse('🚨 긴급 호출: 서버가 멈췄어요') as UrgentNote).text, '서버가 멈췄어요'); expect(const UrgentNote('').encode(), '🚨 긴급 호출:'); expect(WorkNote.parse('안녕하세요'), isNull); }); test('담당 이름의 ] 는 지운다', () { expect(const TaskNote('일', assignee: 'a]b').encode(), '📌 업무 [ab] 일'); }); }); group('업무 목록', () { Task t(String id, {bool mine = false, DateTime? due, String? msg, String room = 'r', int at = 0}) => Task(id: id, title: id, createdAt: at, roomId: room, messageId: msg, assigneeId: mine ? Task.me : null, due: due); test('같은 대화의 업무는 한 번만, 끝냄 표시와 지우기', () { final b = TaskBook(); expect(b.add(t('a', msg: 'm1')), isTrue); expect(b.add(t('b', msg: 'm1')), isFalse); expect(b.setDone('a', true), isTrue); expect(b.query(), isEmpty); expect(b.query(includeDone: true).single.done, isTrue); expect(b.remove('a'), isTrue); expect(b.remove('a'), isFalse); }); test('정렬: 안 끝난 것, 마감 이른 것, 마감 없는 것은 최근 것 먼저. 내 것·방별로 거르기', () { final b = TaskBook() ..add(t('늦은마감', due: DateTime(2026, 12, 1))) ..add(t('이른마감', due: DateTime(2026, 11, 1), mine: true)) ..add(t('마감없음옛날', at: 1)) ..add(t('마감없음최근', at: 9, room: 'x')); expect(b.query().map((x) => x.id), ['이른마감', '늦은마감', '마감없음최근', '마감없음옛날']); expect(b.query(onlyMine: true).map((x) => x.id), ['이른마감']); expect(b.query(roomId: 'x').map((x) => x.id), ['마감없음최근']); }); test('글자로 저장했다 되살리기, 깨진 글자는 빈 목록', () { final b = TaskBook()..add(Task(id: 'a', title: '일', createdAt: 5, roomId: 'r', messageId: 'm', assigneeId: 'p', assigneeName: '김', due: DateTime(2026, 11, 2))); b.setDone('a', true); final c = TaskBook.fromJson(b.toJson()).all.single; expect((c.title, c.roomId, c.messageId, c.assigneeId, c.assigneeName, c.due, c.done), ('일', 'r', 'm', 'p', '김', DateTime(2026, 11, 2), true)); expect(TaskBook.fromJson('{').all, isEmpty); expect(TaskBook.fromJson('[{"id":1}]').all, isEmpty); }); }); }