import 'package:flutter_test/flutter_test.dart'; import 'package:ikar/backend/modules/messages.dart'; import 'package:ikar/frontend/screens/chats/chat/chat_controller.dart'; import 'package:ikar/models/attachment.dart'; CachedMessage videoMessage({String? thumbnail, bool payload = true}) { final attachment = VideoAttachment( videoId: 121, videoToken: 'synthetic-video-token', thumbnail: thumbnail, baseUrl: thumbnail, duration: thumbnail == null ? null : 5178, width: thumbnail == null ? null : 2160, height: thumbnail == null ? null : 3840, ); return CachedMessage( id: '119', accountId: 1, chatId: 3, senderId: 1, text: '', time: 1000, status: 'sent', attachments: [attachment], payload: payload ? { 'id': 119, 'attaches': [attachment.toMap()], } : null, ); } void main() { test('existing video is redrawn when its preview and metadata arrive', () { final controller = ChatController()..messages = [videoMessage()]; addTearDown(controller.dispose); final refreshed = videoMessage( thumbnail: 'https://media.example.test/thumbnail?access_token=new', ); expect(controller.mergeMessages([refreshed]), isTrue); expect(controller.messages.single, same(refreshed)); expect( (controller.messages.single.attachments!.single as VideoAttachment) .duration, 5178, ); expect(controller.messagesRev.value, 1); expect( controller.mergeMessages([ videoMessage( thumbnail: 'https://media.example.test/thumbnail?access_token=new', ), ]), isFalse, ); expect(controller.messagesRev.value, 1); }); test('refreshed signed preview URL replaces an expired URL', () { final controller = ChatController() ..messages = [ videoMessage( thumbnail: 'https://media.example.test/thumbnail?access_token=expired', ), ]; addTearDown(controller.dispose); final refreshed = videoMessage( thumbnail: 'https://media.example.test/thumbnail?access_token=fresh', ); expect(controller.mergeMessages([refreshed]), isTrue); expect(controller.messages.single.time, 1000); expect(controller.messages.single.id, '119'); expect(controller.messages.single, same(refreshed)); }); test( 'attachment updates without a raw server payload also redraw the video', () { final controller = ChatController() ..messages = [videoMessage(payload: false)]; addTearDown(controller.dispose); final refreshed = videoMessage( payload: false, thumbnail: 'https://media.example.test/thumbnail', ); expect(controller.mergeMessages([refreshed]), isTrue); expect(controller.messages.single, same(refreshed)); }, ); }