118 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Dart
		
	
	
	
			
		
		
	
	
			118 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			Dart
		
	
	
	
| import 'dart:async';
 | |
| import 'dart:io';
 | |
| 
 | |
| import 'package:path/path.dart';
 | |
| import 'package:test/test.dart';
 | |
| 
 | |
| import 'package:matrix/matrix.dart';
 | |
| import 'fake_client.dart';
 | |
| 
 | |
| void main() {
 | |
|   group('Event timeout tests', () {
 | |
|     late Client client;
 | |
|     late Room room;
 | |
| 
 | |
|     setUp(() async {
 | |
|       client = await getClient(
 | |
|         sendTimelineEventTimeout: const Duration(seconds: 5),
 | |
|         databasePath: join(Directory.current.path, 'test.sqlite'),
 | |
|       );
 | |
|       room = Room(
 | |
|         id: '!1234:example.com',
 | |
|         client: client,
 | |
|         roomAccountData: {},
 | |
|       );
 | |
|       client.rooms.add(room);
 | |
|     });
 | |
| 
 | |
|     tearDown(() async {
 | |
|       await client.logout();
 | |
|       await client.dispose(closeDatabase: true);
 | |
|     });
 | |
| 
 | |
|     test('Event constructor correctly checks timeout from originServerTs',
 | |
|         () async {
 | |
|       final completer = Completer();
 | |
|       room.sendingQueue.add(completer); // to block the events from being sent
 | |
| 
 | |
|       String? eventId;
 | |
|       // we don't await this because the actual sending will only be done after
 | |
|       // `sendingQueue` is unblocked.
 | |
|       // but the fake sync will be called with this event in sending state right away
 | |
|       unawaited(
 | |
|         room.sendTextEvent('test', txid: '1234').then((value) {
 | |
|           eventId = value;
 | |
|         }),
 | |
|       );
 | |
| 
 | |
|       // do the timeout
 | |
|       final timeout =
 | |
|           Duration(seconds: client.sendTimelineEventTimeout.inSeconds + 2);
 | |
|       await Future.delayed(timeout);
 | |
| 
 | |
|       // this will trigger the check in the Event constructor to see if the
 | |
|       // event is in error state (and call fake sync with updated error status)
 | |
|       await client.oneShotSync();
 | |
|       Timeline timeline = await room.getTimeline();
 | |
|       expect(timeline.events.length, 1);
 | |
|       expect(timeline.events.first.status, EventStatus.sending);
 | |
| 
 | |
|       // fake sync would have been triggered by now (if there was one), which shouldn't happen
 | |
|       await client.oneShotSync();
 | |
|       timeline = await room.getTimeline();
 | |
|       expect(timeline.events.length, 1);
 | |
|       expect(timeline.events.first.status, EventStatus.sending);
 | |
| 
 | |
|       // now we unblock the sending queue and this will make `sendTextEvent`
 | |
|       // actually send the event and the fake sync that's used to update the
 | |
|       // event status to sent
 | |
|       completer.complete();
 | |
|       room.sendingQueue.remove(completer);
 | |
|       await FakeMatrixApi.firstWhere(
 | |
|         (a) => a.startsWith(
 | |
|           '/client/v3/rooms/!1234%3Aexample.com/send/m.room.message/1234',
 | |
|         ),
 | |
|       );
 | |
|       await Future.delayed(const Duration(seconds: 1));
 | |
|       expect(eventId, isNotNull);
 | |
| 
 | |
|       // now the event should be in sent state after the fake sync is called
 | |
|       await client.oneShotSync();
 | |
|       timeline = await room.getTimeline();
 | |
|       expect(timeline.events.length, 1);
 | |
|       expect(timeline.events.first.status, EventStatus.sent);
 | |
| 
 | |
|       // simulate the event being synced from server
 | |
|       await client.handleSync(
 | |
|         SyncUpdate(
 | |
|           nextBatch: '1',
 | |
|           rooms: RoomsUpdate(
 | |
|             join: {
 | |
|               room.id: JoinedRoomUpdate(
 | |
|                 timeline: TimelineUpdate(
 | |
|                   events: [
 | |
|                     Event(
 | |
|                       eventId: eventId!,
 | |
|                       content: {'msgtype': 'm.text', 'body': 'test'},
 | |
|                       type: 'm.room.message',
 | |
|                       senderId: '@test:example.com',
 | |
|                       originServerTs: DateTime.now(),
 | |
|                       room: room,
 | |
|                       unsigned: {
 | |
|                         'transaction_id': '1234',
 | |
|                       },
 | |
|                     ),
 | |
|                   ],
 | |
|                 ),
 | |
|               ),
 | |
|             },
 | |
|           ),
 | |
|         ),
 | |
|       );
 | |
|       timeline = await room.getTimeline();
 | |
|       expect(timeline.events.length, 1);
 | |
|       expect(timeline.events.first.status, EventStatus.synced);
 | |
|     });
 | |
|   });
 | |
| }
 |