import 'package:flutter_test/flutter_test.dart'; import 'package:ikar/backend/modules/chats.dart'; import 'package:ikar/backend/modules/messages.dart'; import 'package:ikar/frontend/screens/chats/chat/unread_message_count.dart'; CachedChat snapshot({int unread = 10, int read = 100, int last = 110}) => CachedChat( id: 2, accountId: 1, type: 'CHANNEL', unreadCount: unread, lastEventTime: last, lastMsgTime: last, cachedAt: 0, dontDisturbUntil: ChatsModule.muteOff, isOnline: false, seenTime: 0, participants: {1: read}, ); CachedMessage message( int time, { int sender = 2, bool control = false, bool deleted = false, }) => CachedMessage( id: '$time', accountId: 1, chatId: 2, senderId: sender, time: time, isControl: control, deleted: deleted, ); void main() { test( 'opening a chat counts existing unread messages before history loads', () { expect( countUnreadMessages( chat: snapshot(unread: 200), messages: [], accountId: 1, readTime: 100, newestLoaded: false, ), 200, ); }, ); test('old read history does not acquire an unread badge', () { expect( countUnreadMessages( chat: snapshot(unread: 0, read: 110), messages: [message(90), message(110)], accountId: 1, readTime: 110, newestLoaded: true, ), 0, ); }); test('reading part of the loaded tail reduces the badge immediately', () { expect( countUnreadMessages( chat: snapshot(), messages: [for (var t = 101; t <= 110; t++) message(t)], accountId: 1, readTime: 106, newestLoaded: true, ), 4, ); }); test('unloaded newer messages remain counted when reading a middle page', () { expect( countUnreadMessages( chat: snapshot(unread: 100, last: 200), messages: [for (var t = 101; t <= 110; t++) message(t)], accountId: 1, readTime: 106, newestLoaded: false, ), 94, ); }); test( 'reaching the last message clears the badge despite a stale snapshot', () { expect( countUnreadMessages( chat: snapshot(), messages: [for (var t = 101; t <= 110; t++) message(t)], accountId: 1, readTime: 110, newestLoaded: true, ), 0, ); }, ); test('live arrivals count once while chat metadata is being saved', () { final incoming = message(111); final messages = [message(110), incoming, incoming]; expect( countUnreadMessages( chat: snapshot(), messages: messages, accountId: 1, readTime: 100, newestLoaded: true, ), 11, ); expect( countUnreadMessages( chat: snapshot(unread: 11, last: 111), messages: messages, accountId: 1, readTime: 100, newestLoaded: true, ), 11, ); }); test('own, control and deleted arrivals do not add unread posts', () { expect( countUnreadMessages( chat: snapshot(), messages: [ message(111, sender: 1), message(112, control: true), message(113, deleted: true), ], accountId: 1, readTime: 100, newestLoaded: true, ), 10, ); }); test('a read marker from another device updates the count', () { expect( countUnreadMessages( chat: snapshot(unread: 2, read: 108), messages: [for (var t = 101; t <= 110; t++) message(t)], accountId: 1, readTime: 100, newestLoaded: true, ), 2, ); }); }