163 lines
3.7 KiB
Dart
163 lines
3.7 KiB
Dart
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,
|
|
);
|
|
});
|
|
}
|