Files
IKAR/test/outgoing_media_preview_test.dart

136 lines
4.4 KiB
Dart

import 'package:flutter_test/flutter_test.dart';
import 'package:ikar/backend/modules/chat_preview.dart';
import 'package:ikar/backend/modules/messages.dart';
import 'package:ikar/models/attachment.dart';
import 'package:ikar/models/chat_preview_media.dart';
const int _accountId = 77;
const int _chatId = 4242;
CachedMessage _pending(List<MessageAttachment> attachments, {String? text}) =>
CachedMessage(
id: 'temp_1_1700000000000000',
accountId: _accountId,
chatId: _chatId,
senderId: _accountId,
text: text,
time: 1700000000000,
status: 'sending',
attachments: attachments,
);
ChatPreviewMedia _media(CachedMessage message) {
final decoded = ChatPreviewMedia.decode(
messagePreviewMedia(message.previewPayload),
);
expect(decoded, isNotNull);
return decoded!;
}
void main() {
group('превью своего медиа, которое ещё грузится', () {
test('фото без подписи показывает файл с диска как миниатюру', () {
final message = _pending([
const PhotoAttachment(localPath: '/tmp/komet/shot.jpg'),
]);
final media = _media(message);
expect(media.kind, ChatPreviewKind.photo);
expect(media.label, 'Изображение');
expect(media.thumbs.single.source, 'file:///tmp/komet/shot.jpg');
expect(media.thumbs.single.video, isFalse);
expect(messagePreviewText(message.previewPayload), 'Изображение');
});
test('альбом отдаёт миниатюру на каждое фото', () {
final message = _pending([
const PhotoAttachment(localPath: '/tmp/komet/one.jpg'),
const PhotoAttachment(localPath: '/tmp/komet/two.jpg'),
]);
final media = _media(message);
expect(media.label, 'Изображения');
expect(media.thumbs.map((t) => t.source), [
'file:///tmp/komet/one.jpg',
'file:///tmp/komet/two.jpg',
]);
});
test('подпись к фото вытесняет словесную метку', () {
final message = _pending([
const PhotoAttachment(localPath: '/tmp/komet/shot.jpg'),
], text: 'смотри какой закат');
final media = _media(message);
expect(media.captioned, isTrue);
expect(media.label, isNull);
expect(
messagePreviewText(message.previewPayload),
'смотри какой закат',
);
});
test('видео берёт свой кадр, а не файл с диска', () {
const thumb = 'data:image/jpeg;base64,AAAA';
final message = _pending([
const VideoAttachment(
localPath: '/tmp/komet/clip.mp4',
previewData: thumb,
duration: 3000,
),
]);
final media = _media(message);
expect(media.kind, ChatPreviewKind.video);
expect(media.thumbs.single.source, thumb);
expect(media.thumbs.single.video, isTrue);
});
test('кружок без кадра остаётся без миниатюры', () {
final message = _pending([
const VideoAttachment(
localPath: '/tmp/komet/note.mp4',
videoType: 1,
duration: 3000,
),
]);
final media = _media(message);
expect(media.kind, ChatPreviewKind.videoNote);
expect(media.thumbs, isEmpty);
expect(media.label, 'Видео-сообщение');
});
test('файл подписывается именем', () {
final message = _pending([
const FileAttachment(name: 'отчёт.pdf', size: 1024),
]);
final media = _media(message);
expect(media.kind, ChatPreviewKind.file);
expect(media.label, 'Файл');
expect(media.detail, 'отчёт.pdf');
});
test('ответ сервера вытесняет локальный payload', () {
final real = CachedMessage.fromPushPayload(_accountId, _chatId, {
'id': '900',
'sender': _accountId,
'time': 1700000001000,
'text': '',
'attaches': [
{
'_type': 'PHOTO',
'photoId': 5,
'baseUrl': 'https://cdn.example.test/shot.jpg',
},
],
});
final media = _media(real);
expect(media.kind, ChatPreviewKind.photo);
expect(media.thumbs.single.source, 'https://cdn.example.test/shot.jpg');
});
});
}