Build Android (FCM) / build-android-fcm (push) Canceled after 0s
Build Android / build-android (push) Canceled after 0s
Build iOS / build-ios (push) Canceled after 0s
Build Linux / build-linux (push) Canceled after 0s
Build macOS / build-macos (push) Canceled after 0s
Build Windows / build-windows (push) Canceled after 0s
Release (main) / android (oneme) (push) Canceled after 0s
Release (main) / android (qlyra) (push) Canceled after 0s
Release (main) / windows (push) Canceled after 0s
Release (main) / linux (push) Canceled after 0s
Release (main) / macos (push) Canceled after 0s
Release (main) / ios (push) Canceled after 0s
Release (main) / release (push) Canceled after 0s
133 lines
3.7 KiB
Dart
133 lines
3.7 KiB
Dart
import 'package:flutter_test/flutter_test.dart';
|
|
import 'package:qlyra/backend/modules/chat_parsing.dart';
|
|
import 'package:qlyra/backend/modules/chats.dart';
|
|
import 'package:kusoft/kusoft.dart';
|
|
|
|
const int _me = 501;
|
|
const int _peer = 777;
|
|
const int _chatId = 4242;
|
|
const int _lastMsgId = 9000000;
|
|
|
|
CachedChat _cached({int? senderId, String? status, int? lastMsgId}) =>
|
|
CachedChat(
|
|
id: _chatId,
|
|
accountId: _me,
|
|
type: 'DIALOG',
|
|
title: 'Диалог',
|
|
lastMsgId: lastMsgId ?? _lastMsgId,
|
|
lastMsgTime: 1700000000000,
|
|
lastMsgText: 'привет',
|
|
lastMsgSenderId: senderId,
|
|
lastMsgStatus: status,
|
|
unreadCount: 0,
|
|
lastEventTime: 1700000000000,
|
|
cachedAt: 0,
|
|
dontDisturbUntil: ChatsModule.muteOff,
|
|
isOnline: false,
|
|
seenTime: 0,
|
|
participants: {_me: 1700000000000, _peer: 0},
|
|
);
|
|
|
|
Map<String, dynamic> _serverChat({Object? sender}) => {
|
|
'id': _chatId,
|
|
'type': 'DIALOG',
|
|
'participants': {'$_me': 1700000000000, '$_peer': 0},
|
|
'lastMessage': {
|
|
'id': _lastMsgId,
|
|
'time': 1700000000000,
|
|
'text': 'привет',
|
|
if (sender != null) 'sender': sender,
|
|
},
|
|
};
|
|
|
|
CachedChat _parse(
|
|
Map<String, dynamic> chat, {
|
|
Map<int, CachedChat> existing = const {},
|
|
}) {
|
|
final parsed = parseChatRow(
|
|
chat,
|
|
_me,
|
|
_me,
|
|
const {},
|
|
const {},
|
|
const {},
|
|
existing,
|
|
0,
|
|
);
|
|
expect(parsed, isNotNull);
|
|
return parsed!;
|
|
}
|
|
|
|
void main() {
|
|
group('разбор чата из ответа сервера', () {
|
|
test('числовые ключи участников выбирают имя собеседника', () {
|
|
final decoded = decodeKusoftPayload(
|
|
r'{"participants":{"$int:501":10,"$int:777":20}}',
|
|
);
|
|
final chat = _serverChat()..['participants'] = decoded['participants'];
|
|
final parsed = parseChatRow(
|
|
chat,
|
|
_me,
|
|
_me,
|
|
buildContactsMap([
|
|
{
|
|
'id': _me,
|
|
'names': [
|
|
{'type': 'ONEME', 'name': 'Владелец'},
|
|
],
|
|
},
|
|
{
|
|
'id': _peer,
|
|
'names': [
|
|
{'type': 'ONEME', 'name': 'Собеседник'},
|
|
],
|
|
},
|
|
]),
|
|
const {},
|
|
const {},
|
|
const {},
|
|
0,
|
|
);
|
|
|
|
expect(parsed, isNotNull);
|
|
expect(parsed!.title, 'Собеседник');
|
|
expect(parsed.participants.keys, containsAll([_me, _peer]));
|
|
});
|
|
|
|
test('отправитель последнего сообщения берётся из payload', () {
|
|
final parsed = _parse(_serverChat(sender: _me));
|
|
expect(parsed.lastMsgSenderId, _me);
|
|
});
|
|
|
|
test('отправитель читается и когда сервер прислал его строкой', () {
|
|
final parsed = _parse(_serverChat(sender: '$_me'));
|
|
expect(parsed.lastMsgSenderId, _me);
|
|
expect(parsed.lastMsgId, _lastMsgId);
|
|
});
|
|
|
|
test('без sender в payload отправитель берётся из кэша', () {
|
|
final parsed = _parse(
|
|
_serverChat(),
|
|
existing: {_chatId: _cached(senderId: _me, status: 'read')},
|
|
);
|
|
expect(parsed.lastMsgSenderId, _me);
|
|
expect(parsed.lastMsgStatus, 'read');
|
|
});
|
|
|
|
test('на новом последнем сообщении кэш не подмешивается', () {
|
|
final parsed = _parse(
|
|
_serverChat(sender: _peer),
|
|
existing: {
|
|
_chatId: _cached(
|
|
senderId: _me,
|
|
status: 'read',
|
|
lastMsgId: _lastMsgId - 100,
|
|
),
|
|
},
|
|
);
|
|
expect(parsed.lastMsgSenderId, _peer);
|
|
expect(parsed.lastMsgStatus, isNull);
|
|
});
|
|
});
|
|
}
|