LCOV - code coverage report
Current view: top level - lib - fake_matrix_api.dart (source / functions) Hit Total Coverage
Test: merged.info Lines: 631 986 64.0 %
Date: 2024-11-12 07:37:08 Functions: 0 0 -

          Line data    Source code
       1             : /*
       2             :  *   Famedly Matrix SDK
       3             :  *   Copyright (C) 2019, 2020 Famedly GmbH
       4             :  *
       5             :  *   This program is free software: you can redistribute it and/or modify
       6             :  *   it under the terms of the GNU Affero General Public License as
       7             :  *   published by the Free Software Foundation, either version 3 of the
       8             :  *   License, or (at your option) any later version.
       9             :  *
      10             :  *   This program is distributed in the hope that it will be useful,
      11             :  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
      12             :  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
      13             :  *   GNU Affero General Public License for more details.
      14             :  *
      15             :  *   You should have received a copy of the GNU Affero General Public License
      16             :  *   along with this program.  If not, see <https://www.gnu.org/licenses/>.
      17             :  */
      18             : 
      19             : import 'dart:async';
      20             : import 'dart:convert';
      21             : import 'dart:core';
      22             : import 'dart:math';
      23             : 
      24             : import 'package:http/http.dart';
      25             : 
      26             : import 'package:matrix/matrix.dart' as sdk;
      27             : import 'package:matrix/matrix.dart';
      28             : 
      29          10 : T? tryCast<T>(dynamic object) => object is T ? object : null;
      30             : 
      31          13 : Map<String, dynamic> decodeJson(dynamic data) {
      32          13 :   if (data is String) {
      33          13 :     return json.decode(data);
      34             :   }
      35           0 :   if (data.isEmpty) {
      36           0 :     return <String, dynamic>{};
      37             :   }
      38             :   return data;
      39             : }
      40             : 
      41             : class FakeMatrixApi extends BaseClient {
      42             :   static String? expectedAccessToken;
      43             : 
      44          14 :   static Map<String, List<dynamic>> get calledEndpoints =>
      45          14 :       currentApi!._calledEndpoints;
      46          12 :   static int get eventCounter => currentApi!._eventCounter;
      47           6 :   static set eventCounter(int c) {
      48           6 :     currentApi!._eventCounter = c;
      49             :   }
      50             : 
      51          31 :   static set client(sdk.Client? c) {
      52          31 :     currentApi?._client = c;
      53             :   }
      54             : 
      55           1 :   static set failToDevice(bool fail) {
      56           1 :     currentApi?._failToDevice = fail;
      57             :   }
      58             : 
      59           0 :   static set trace(bool t) {
      60           0 :     currentApi?._trace = t;
      61             :   }
      62             : 
      63             :   final _calledEndpoints = <String, List<dynamic>>{};
      64             :   int _eventCounter = 0;
      65             :   sdk.Client? _client;
      66             :   bool _failToDevice = false;
      67             :   bool _trace = false;
      68             :   final _apiCallStream = StreamController<String>.broadcast();
      69             : 
      70             :   static FakeMatrixApi? currentApi;
      71             : 
      72           3 :   static Future<String> firstWhereValue(String value) {
      73           9 :     return firstWhere((v) => v == value);
      74             :   }
      75             : 
      76           5 :   static Future<String> firstWhere(bool Function(String element) test) {
      77          15 :     for (final e in currentApi!._calledEndpoints.entries) {
      78          20 :       if (e.value.isNotEmpty && test(e.key)) {
      79          10 :         return Future.value(e.key);
      80             :       }
      81             :     }
      82             : 
      83           1 :     final completer = Completer<String>();
      84             :     StreamSubscription<String>? sub;
      85           4 :     sub = currentApi!._apiCallStream.stream.listen((action) {
      86           1 :       if (test(action)) {
      87           1 :         sub?.cancel();
      88           1 :         completer.complete(action);
      89             :       }
      90             :     });
      91           1 :     return completer.future;
      92             :   }
      93             : 
      94             :   Set<String> servers = {
      95             :     'https://fakeserver.notexisting',
      96             :     'https://fakeserver.notexisting:1337',
      97             :     'https://fakeserverpriortoauthmedia.notexisting',
      98             :   };
      99             : 
     100          35 :   FutureOr<Response> mockIntercept(Request request) async {
     101             :     // Collect data from Request
     102          70 :     var action = request.url.path;
     103         105 :     if (request.url.path.contains('/_matrix')) {
     104             :       action =
     105         245 :           '${request.url.path.split('/_matrix').last}?${request.url.query}';
     106             :     }
     107             : 
     108             :     // ignore: avoid_print
     109          35 :     if (_trace) print('called $action');
     110             : 
     111          35 :     if (action.endsWith('?')) {
     112         105 :       action = action.substring(0, action.length - 1);
     113             :     }
     114          35 :     if (action.endsWith('?server_name')) {
     115             :       // This can be removed after matrix_api_lite is released with:
     116             :       // https://gitlab.com/famedly/libraries/matrix_api_lite/-/merge_requests/16
     117           0 :       action = action.substring(0, action.length - 12);
     118             :     }
     119          35 :     if (action.endsWith('/')) {
     120          21 :       action = action.substring(0, action.length - 1);
     121             :     }
     122          35 :     final method = request.method;
     123             :     final dynamic data =
     124         138 :         method == 'GET' ? request.url.queryParameters : request.body;
     125          35 :     dynamic res = {};
     126             :     var statusCode = 200;
     127             : 
     128             :     //print('\$method request to $action with Data: $data');
     129             : 
     130         140 :     if (!servers.contains(request.url.origin)) {
     131           1 :       return Response(
     132           3 :         '<html><head></head><body>Not found ${request.url.origin}...</body></html>',
     133             :         404,
     134             :       );
     135             :     }
     136             : 
     137             :     if (!{
     138          35 :           '/client/v3/refresh',
     139          35 :           '/client/v3/login',
     140          35 :           '/client/v3/register',
     141          35 :         }.contains(action) &&
     142             :         expectedAccessToken != null &&
     143           4 :         request.headers['Authorization'] != 'Bearer $expectedAccessToken') {
     144           1 :       return Response(
     145           2 :         jsonEncode({
     146             :           'errcode': 'M_UNKNOWN_TOKEN',
     147             :           'error': 'Soft logged out',
     148             :           'soft_logout': true,
     149             :         }),
     150             :         401,
     151             :       );
     152             :     }
     153             : 
     154             :     // Call API
     155         140 :     (_calledEndpoints[action] ??= <dynamic>[]).add(data);
     156         105 :     if (request.url.origin ==
     157             :             'https://fakeserverpriortoauthmedia.notexisting' &&
     158           2 :         action.contains('/client/versions')) {
     159           2 :       res = {
     160           2 :         'versions': [
     161             :           'r0.0.1',
     162             :           'ra.b.c',
     163             :           'v0.1',
     164             :           'v1.1',
     165             :           'v1.9',
     166             :           'v1.10.1',
     167             :         ],
     168           2 :         'unstable_features': {'m.lazy_load_members': true},
     169             :       };
     170             :     } else {
     171         105 :       final act = api[method]?[action];
     172             :       if (act != null) {
     173          35 :         res = act(data);
     174          70 :         if (res is Map && res.containsKey('errcode')) {
     175           4 :           if (res['errcode'] == 'M_NOT_FOUND') {
     176             :             statusCode = 404;
     177             :           } else {
     178             :             statusCode = 405;
     179             :           }
     180             :         }
     181          31 :       } else if (method == 'PUT' &&
     182          16 :           action.contains('/client/v3/sendToDevice/')) {
     183          10 :         res = {};
     184          10 :         if (_failToDevice) {
     185             :           statusCode = 500;
     186             :         }
     187          31 :       } else if (method == 'GET' &&
     188          31 :           action.contains('/client/v3/rooms/') &&
     189           6 :           action.contains('/state/m.room.member/') &&
     190           6 :           !action.endsWith('%40alicyy%3Aexample.com') &&
     191           6 :           !action.contains('%40getme')) {
     192           4 :         res = {'displayname': '', 'membership': 'ban'};
     193          31 :       } else if (method == 'PUT' &&
     194          10 :           action.contains(
     195             :             '/client/v3/rooms/!1234%3AfakeServer.notExisting/send/',
     196             :           )) {
     197          12 :         res = {'event_id': '\$event${_eventCounter++}'};
     198          31 :       } else if (method == 'PUT' &&
     199           8 :           action.contains(
     200             :             '/client/v3/rooms/!1234%3AfakeServer.notExisting/state/',
     201             :           )) {
     202           4 :         res = {'event_id': '\$event${_eventCounter++}'};
     203          31 :       } else if (action.contains('/client/v3/sync')) {
     204             :         // Sync requests with timeout
     205          93 :         final timeout = request.url.queryParameters['timeout'];
     206          31 :         if (timeout != null && timeout != '0') {
     207          62 :           await Future.delayed(Duration(milliseconds: 50));
     208             :         }
     209          31 :         res = {
     210             :           // So that it is clear which sync we are processing prefix it with 'empty_'
     211          93 :           'next_batch': 'empty_${DateTime.now().millisecondsSinceEpoch}',
     212             :           // ensure we don't generate new keys for no reason
     213          31 :           'device_one_time_keys_count': {
     214             :             'curve25519': 10,
     215             :             'signed_curve25519': 100,
     216             :           },
     217             :         };
     218           7 :       } else if (method == 'PUT' &&
     219           7 :           _client != null &&
     220           7 :           action.contains('/account_data/') &&
     221           3 :           !action.contains('/rooms/')) {
     222           9 :         final type = Uri.decodeComponent(action.split('/').last);
     223           3 :         final syncUpdate = sdk.SyncUpdate(
     224             :           nextBatch: '',
     225           9 :           accountData: [sdk.BasicEvent(content: decodeJson(data), type: type)],
     226             :         );
     227           6 :         if (_client?.database != null) {
     228          12 :           await _client?.database?.transaction(() async {
     229           6 :             await _client?.handleSync(syncUpdate);
     230             :           });
     231             :         } else {
     232           0 :           await _client?.handleSync(syncUpdate);
     233             :         }
     234           3 :         res = {};
     235           5 :       } else if (method == 'PUT' &&
     236           5 :           _client != null &&
     237           5 :           action.contains('/account_data/') &&
     238           1 :           action.contains('/rooms/')) {
     239           1 :         final segments = action.split('/');
     240           2 :         final type = Uri.decodeComponent(segments.last);
     241           4 :         final roomId = Uri.decodeComponent(segments[segments.length - 3]);
     242           1 :         final syncUpdate = sdk.SyncUpdate(
     243             :           nextBatch: '',
     244           1 :           rooms: RoomsUpdate(
     245           1 :             join: {
     246           1 :               roomId: JoinedRoomUpdate(
     247           1 :                 accountData: [
     248           1 :                   sdk.BasicRoomEvent(
     249           1 :                     content: decodeJson(data),
     250             :                     type: type,
     251             :                     roomId: roomId,
     252             :                   ),
     253             :                 ],
     254             :               ),
     255             :             },
     256             :           ),
     257             :         );
     258           2 :         if (_client?.database != null) {
     259           4 :           await _client?.database?.transaction(() async {
     260           2 :             await _client?.handleSync(syncUpdate);
     261             :           });
     262             :         } else {
     263           0 :           await _client?.handleSync(syncUpdate);
     264             :         }
     265           1 :         res = {};
     266             :       } else {
     267           5 :         res = {
     268             :           'errcode': 'M_UNRECOGNIZED',
     269           5 :           'error': 'Unrecognized request: $action',
     270             :         };
     271             :         statusCode = 405;
     272             :       }
     273             :     }
     274             : 
     275          35 :     unawaited(
     276         140 :       Future.delayed(Duration(milliseconds: 1)).then((_) async {
     277          70 :         _apiCallStream.add(action);
     278             :       }),
     279             :     );
     280         105 :     return Response.bytes(utf8.encode(json.encode(res)), statusCode);
     281             :   }
     282             : 
     283          35 :   @override
     284             :   Future<StreamedResponse> send(BaseRequest request) async {
     285          35 :     final bodyStream = request.finalize();
     286          35 :     final bodyBytes = await bodyStream.toBytes();
     287         105 :     final r = Request(request.method, request.url)
     288          70 :       ..persistentConnection = request.persistentConnection
     289          70 :       ..followRedirects = request.followRedirects
     290          70 :       ..maxRedirects = request.maxRedirects
     291         105 :       ..headers.addAll(request.headers)
     292          35 :       ..bodyBytes = bodyBytes
     293          35 :       ..finalize();
     294             : 
     295          35 :     final response = await mockIntercept(r);
     296          35 :     return StreamedResponse(
     297          70 :       ByteStream.fromBytes(response.bodyBytes),
     298          35 :       response.statusCode,
     299          35 :       contentLength: response.contentLength,
     300             :       request: request,
     301          35 :       headers: response.headers,
     302          35 :       isRedirect: response.isRedirect,
     303          35 :       persistentConnection: response.persistentConnection,
     304          35 :       reasonPhrase: response.reasonPhrase,
     305             :     );
     306             :   }
     307             : 
     308          36 :   FakeMatrixApi() {
     309             :     currentApi = this;
     310         109 :     api['POST']?['/client/v3/keys/device_signing/upload'] = (var reqI) {
     311           1 :       if (_client != null) {
     312           1 :         final jsonBody = decodeJson(reqI);
     313           1 :         for (final keyType in {
     314           1 :           'master_key',
     315           1 :           'self_signing_key',
     316           1 :           'user_signing_key',
     317           1 :         }) {
     318           1 :           if (jsonBody[keyType] != null) {
     319             :             final key =
     320           3 :                 sdk.CrossSigningKey.fromJson(jsonBody[keyType], _client!);
     321           6 :             _client!.userDeviceKeys[_client!.userID!]?.crossSigningKeys
     322           6 :                 .removeWhere((k, v) => v.usage.contains(key.usage.first));
     323           5 :             _client!.userDeviceKeys[_client!.userID!]
     324           3 :                 ?.crossSigningKeys[key.publicKey!] = key;
     325             :           }
     326             :         }
     327             :         // and generate a fake sync
     328             :         // ignore: discarded_futures
     329           3 :         _client!.handleSync(sdk.SyncUpdate(nextBatch: ''));
     330             :       }
     331           1 :       return {};
     332             :     };
     333             :   }
     334             : 
     335             :   static const Map<String, dynamic> messagesResponsePast = {
     336             :     'start': 't47429-4392820_219380_26003_2265',
     337             :     'end': 't47409-4357353_219380_26003_2265',
     338             :     'chunk': [
     339             :       {
     340             :         'content': {
     341             :           'body': 'This is an example text message',
     342             :           'msgtype': 'm.text',
     343             :           'format': 'org.matrix.custom.html',
     344             :           'formatted_body': '<b>This is an example text message</b>',
     345             :         },
     346             :         'type': 'm.room.message',
     347             :         'event_id': '3143273582443PhrSn:example.org',
     348             :         'room_id': '!1234:example.com',
     349             :         'sender': '@example:example.org',
     350             :         'origin_server_ts': 1432735824653,
     351             :         'unsigned': {'age': 1234},
     352             :       },
     353             :       {
     354             :         'content': {'name': 'The room name'},
     355             :         'type': 'm.room.name',
     356             :         'event_id': '2143273582443PhrSn:example.org',
     357             :         'room_id': '!1234:example.com',
     358             :         'sender': '@example:example.org',
     359             :         'origin_server_ts': 1432735824653,
     360             :         'unsigned': {'age': 1234},
     361             :         'state_key': '',
     362             :       },
     363             :       {
     364             :         'content': {
     365             :           'body': 'Gangnam Style',
     366             :           'url': 'mxc://example.org/a526eYUSFFxlgbQYZmo442',
     367             :           'info': {
     368             :             'thumbnail_url': 'mxc://example.org/FHyPlCeYUSFFxlgbQYZmoEoe',
     369             :             'thumbnail_info': {
     370             :               'mimetype': 'image/jpeg',
     371             :               'size': 46144,
     372             :               'w': 300,
     373             :               'h': 300,
     374             :             },
     375             :             'w': 480,
     376             :             'h': 320,
     377             :             'duration': 2140786,
     378             :             'size': 1563685,
     379             :             'mimetype': 'video/mp4',
     380             :           },
     381             :           'msgtype': 'm.video',
     382             :         },
     383             :         'type': 'm.room.message',
     384             :         'event_id': '1143273582443PhrSn:example.org',
     385             :         'room_id': '!1234:example.com',
     386             :         'sender': '@example:example.org',
     387             :         'origin_server_ts': 1432735824653,
     388             :         'unsigned': {'age': 1234},
     389             :       }
     390             :     ],
     391             :     'state': [],
     392             :   };
     393             :   static const Map<String, dynamic> messagesResponseFuture = {
     394             :     'start': 't456',
     395             :     'end': 't789',
     396             :     'chunk': [
     397             :       {
     398             :         'content': {
     399             :           'body': 'Gangnam Style',
     400             :           'url': 'mxc://example.org/a526eYUSFFxlgbQYZmo442',
     401             :           'info': {
     402             :             'thumbnail_url': 'mxc://example.org/FHyPlCeYUSFFxlgbQYZmoEoe',
     403             :             'thumbnail_info': {
     404             :               'mimetype': 'image/jpeg',
     405             :               'size': 46144,
     406             :               'w': 300,
     407             :               'h': 300,
     408             :             },
     409             :             'w': 480,
     410             :             'h': 320,
     411             :             'duration': 2140786,
     412             :             'size': 1563685,
     413             :             'mimetype': 'video/mp4',
     414             :           },
     415             :           'msgtype': 'm.video',
     416             :         },
     417             :         'type': 'm.room.message',
     418             :         'event_id': '1143273582443PhrSn:example.org',
     419             :         'room_id': '!1234:example.com',
     420             :         'sender': '@example:example.org',
     421             :         'origin_server_ts': 1432735824653,
     422             :         'unsigned': {'age': 1234},
     423             :       },
     424             :       {
     425             :         'content': {'name': 'The room name'},
     426             :         'type': 'm.room.name',
     427             :         'event_id': '2143273582443PhrSn:example.org',
     428             :         'room_id': '!1234:example.com',
     429             :         'sender': '@example:example.org',
     430             :         'origin_server_ts': 1432735824653,
     431             :         'unsigned': {'age': 1234},
     432             :         'state_key': '',
     433             :       },
     434             :       {
     435             :         'content': {
     436             :           'body': 'This is an example text message',
     437             :           'msgtype': 'm.text',
     438             :           'format': 'org.matrix.custom.html',
     439             :           'formatted_body': '<b>This is an example text message</b>',
     440             :         },
     441             :         'type': 'm.room.message',
     442             :         'event_id': '3143273582443PhrSn:example.org',
     443             :         'room_id': '!1234:example.com',
     444             :         'sender': '@example:example.org',
     445             :         'origin_server_ts': 1432735824653,
     446             :         'unsigned': {'age': 1234},
     447             :       }
     448             :     ],
     449             :     'state': [],
     450             :   };
     451             :   static const Map<String, dynamic> messagesResponseFutureEnd = {
     452             :     'start': 't789',
     453             :     'end': null,
     454             :     'chunk': [],
     455             :     'state': [],
     456             :   };
     457             : 
     458           6 :   static Map<String, dynamic> archivesMessageResponse = {
     459             :     'start': 't47429-4392820_219380_26003_2265',
     460             :     'end': 't47409-4357353_219380_26003_2265',
     461           2 :     'chunk': [
     462           2 :       {
     463           2 :         'content': {
     464             :           'body': 'This is an example text message',
     465             :           'msgtype': 'm.text',
     466             :           'format': 'org.matrix.custom.html',
     467             :           'formatted_body': '<b>This is an example text message</b>',
     468             :         },
     469             :         'type': 'm.room.message',
     470             :         'event_id': '3143273582443PhrSn:example.org',
     471             :         'room_id': '!5345234234:example.com',
     472             :         'sender': '@example:example.org',
     473             :         'origin_server_ts': 1432735824653,
     474           2 :         'unsigned': {'age': 1234},
     475             :       },
     476           2 :       {
     477           2 :         'content': {'name': 'The room name'},
     478             :         'type': 'm.room.name',
     479             :         'event_id': '2143273582443PhrSn:example.org',
     480             :         'room_id': '!5345234234:example.com',
     481             :         'sender': '@example:example.org',
     482             :         'origin_server_ts': 1432735824653,
     483           2 :         'unsigned': {'age': 1234},
     484             :         'state_key': '',
     485             :       },
     486           2 :       {
     487           2 :         'content': {
     488             :           'body': 'Gangnam Style',
     489             :           'url': 'mxc://example.org/a526eYUSFFxlgbQYZmo442',
     490           2 :           'info': {
     491             :             'thumbnail_url': 'mxc://example.org/FHyPlCeYUSFFxlgbQYZmoEoe',
     492           2 :             'thumbnail_info': {
     493             :               'mimetype': 'image/jpeg',
     494             :               'size': 46144,
     495             :               'w': 300,
     496             :               'h': 300,
     497             :             },
     498             :             'w': 480,
     499             :             'h': 320,
     500             :             'duration': 2140786,
     501             :             'size': 1563685,
     502             :             'mimetype': 'video/mp4',
     503             :           },
     504             :           'msgtype': 'm.video',
     505             :         },
     506             :         'type': 'm.room.message',
     507             :         'event_id': '1143273582466PhrSn:example.org',
     508             :         'room_id': '!5345234234:example.com',
     509             :         'sender': '@example:example.org',
     510             :         'origin_server_ts': 1432735824654,
     511           2 :         'unsigned': {'age': 1234},
     512             :       }
     513             :     ],
     514           2 :     'state': [],
     515             :   };
     516             : 
     517          99 :   static Map<String, dynamic> syncResponse = {
     518          99 :     'next_batch': Random().nextDouble().toString(),
     519          33 :     'rooms': {
     520          33 :       'join': {
     521          33 :         '!726s6s6q:example.com': {
     522          33 :           'summary': {
     523          33 :             'm.heroes': ['@alice:example.com'],
     524             :             'm.joined_member_count': 1,
     525             :             'm.invited_member_count': 0,
     526             :           },
     527          33 :           'unread_notifications': {
     528             :             'highlight_count': 2,
     529             :             'notification_count': 2,
     530             :           },
     531          33 :           'state': {
     532          33 :             'events': [
     533          33 :               {
     534             :                 'sender': '@alice:example.com',
     535             :                 'type': 'm.room.member',
     536             :                 'state_key': '@alice:example.com',
     537          33 :                 'content': {
     538             :                   'membership': 'join',
     539             :                   'avatar_url': 'mxc://example.org/SEsfnsuifSDFSSEF',
     540             :                   'displayname': 'Alice Margatroid',
     541             :                 },
     542             :                 'origin_server_ts': 1417731086795,
     543             :                 'event_id': '66697273743031:example.com',
     544             :               },
     545          33 :               {
     546             :                 'sender': '@alice:example.com',
     547             :                 'type': 'm.room.canonical_alias',
     548          33 :                 'content': {
     549             :                   'alias': '#famedlyContactDiscovery:fakeServer.notExisting',
     550             :                 },
     551             :                 'state_key': '',
     552             :                 'origin_server_ts': 1417731086796,
     553             :                 'event_id': '66697273743032:example.com',
     554             :               },
     555          33 :               {
     556             :                 'sender': '@alice:example.com',
     557             :                 'type': 'm.room.encryption',
     558             :                 'state_key': '',
     559          33 :                 'content': {'algorithm': AlgorithmTypes.megolmV1AesSha2},
     560             :                 'origin_server_ts': 1417731086795,
     561             :                 'event_id': '666972737430353:example.com',
     562             :               },
     563          33 :               {
     564          33 :                 'content': {
     565          33 :                   'pinned': ['1234:bla'],
     566             :                 },
     567             :                 'type': 'm.room.pinned_events',
     568             :                 'event_id': '21432735824443PhrSn:example.org',
     569             :                 'room_id': '!1234:example.com',
     570             :                 'sender': '@example:example.org',
     571             :                 'origin_server_ts': 1432735824653,
     572          33 :                 'unsigned': {'age': 1234},
     573             :                 'state_key': '',
     574             :               },
     575             :             ],
     576             :           },
     577          33 :           'timeline': {
     578          33 :             'events': [
     579          33 :               {
     580             :                 'sender': '@bob:example.com',
     581             :                 'type': 'm.room.member',
     582             :                 'state_key': '@bob:example.com',
     583          33 :                 'content': {'membership': 'join'},
     584          33 :                 'prev_content': {'membership': 'invite'},
     585             :                 'origin_server_ts': 1417731086795,
     586             :                 'event_id': '\$7365636s6r6432:example.com',
     587          33 :                 'unsigned': {'foo': 'bar'},
     588             :               },
     589          33 :               {
     590             :                 'sender': '@alice:example.com',
     591             :                 'type': 'm.room.message',
     592          33 :                 'content': {'body': 'I am a fish', 'msgtype': 'm.text'},
     593             :                 'origin_server_ts': 1417731086797,
     594             :                 'event_id': '74686972643033:example.com',
     595             :               }
     596             :             ],
     597             :             'limited': true,
     598             :             'prev_batch': 't34-23535_0_0',
     599             :           },
     600          33 :           'ephemeral': {
     601          33 :             'events': [
     602          33 :               {
     603             :                 'type': 'm.typing',
     604          33 :                 'content': {
     605          33 :                   'user_ids': ['@alice:example.com'],
     606             :                 },
     607             :               },
     608          33 :               {
     609          33 :                 'content': {
     610          33 :                   '\$7365636s6r6432:example.com': {
     611          33 :                     'm.read': {
     612          33 :                       '@alice:example.com': {'ts': 1436451550453},
     613             :                     },
     614             :                   },
     615             :                 },
     616             :                 'room_id': '!726s6s6q:example.com',
     617             :                 'type': 'm.receipt',
     618             :               }
     619             :             ],
     620             :           },
     621          33 :           'account_data': {
     622          33 :             'events': [
     623          33 :               {
     624             :                 'type': 'm.tag',
     625          33 :                 'content': {
     626          33 :                   'tags': {
     627          33 :                     'work': {'order': 1},
     628             :                   },
     629             :                 },
     630             :               },
     631          33 :               {
     632             :                 'type': 'org.example.custom.room.config',
     633          33 :                 'content': {'custom_config_key': 'custom_config_value'},
     634             :               }
     635             :             ],
     636             :           },
     637             :         },
     638          33 :         '!calls:example.com': {
     639          33 :           'state': {
     640          33 :             'events': [
     641          33 :               {
     642             :                 'sender': '@test:fakeServer.notExisting',
     643             :                 'type': 'm.room.member',
     644             :                 'state_key': '@test:fakeServer.notExisting',
     645          33 :                 'content': {
     646             :                   'membership': 'join',
     647             :                   'avatar_url': 'mxc://example.org/SEsfnsuifSDFSSEF',
     648             :                   'displayname': 'Test User',
     649             :                 },
     650             :                 'origin_server_ts': 1417731086795,
     651             :                 'event_id': 'calls_1:example.com',
     652             :               },
     653          33 :               {
     654             :                 'sender': '@alice:example.com',
     655             :                 'type': 'm.room.member',
     656             :                 'state_key': '@alice:example.com',
     657          33 :                 'content': {
     658             :                   'membership': 'join',
     659             :                   'avatar_url': 'mxc://example.org/SEsfnsuifSDFSSEF',
     660             :                   'displayname': 'Alice Margatroid',
     661             :                 },
     662             :                 'origin_server_ts': 1417731086795,
     663             :                 'event_id': 'calls_2:example.com',
     664             :               },
     665             :             ],
     666             :           },
     667             :         },
     668             :       },
     669          33 :       'invite': {
     670          33 :         '!696r7674:example.com': {
     671          33 :           'invite_state': {
     672          33 :             'events': [
     673          33 :               {
     674             :                 'sender': '@alice:example.com',
     675             :                 'type': 'm.room.name',
     676             :                 'state_key': '',
     677          33 :                 'content': {'name': 'My Room Name'},
     678             :               },
     679          33 :               {
     680             :                 'sender': '@alice:example.com',
     681             :                 'type': 'm.room.member',
     682             :                 'state_key': '@bob:example.com',
     683          33 :                 'content': {'membership': 'invite'},
     684             :               }
     685             :             ],
     686             :           },
     687             :         },
     688             :       },
     689          33 :       'leave': {
     690          33 :         '!726s6s6f:example.com': {
     691          33 :           'state': {
     692          33 :             'events': [
     693          33 :               {
     694             :                 'sender': '@charley:example.com',
     695             :                 'type': 'm.room.name',
     696             :                 'state_key': '',
     697          33 :                 'content': {'name': 'left room'},
     698             :                 'origin_server_ts': 1417731086795,
     699             :                 'event_id': '66697273743031:example.com',
     700             :               },
     701             :             ],
     702             :           },
     703          33 :           'timeline': {
     704          33 :             'events': [
     705          33 :               {
     706             :                 'sender': '@bob:example.com',
     707             :                 'type': 'm.room.message',
     708          33 :                 'content': {'text': 'Hallo'},
     709             :                 'origin_server_ts': 1417731086795,
     710             :                 'event_id': '7365636s6r64300:example.com',
     711          33 :                 'unsigned': {'foo': 'bar'},
     712             :               },
     713             :             ],
     714             :             'limited': true,
     715             :             'prev_batch': 't34-23535_0_0',
     716             :           },
     717          33 :           'account_data': {
     718          33 :             'events': [
     719          33 :               {
     720             :                 'type': 'm.tag',
     721          33 :                 'content': {
     722          33 :                   'tags': {
     723          33 :                     'work': {'order': 1},
     724             :                   },
     725             :                 },
     726             :               },
     727          33 :               {
     728             :                 'type': 'org.example.custom.room.config',
     729          33 :                 'content': {'custom_config_key': 'custom_config_value'},
     730             :               }
     731             :             ],
     732             :           },
     733             :         },
     734             :       },
     735             :     },
     736          33 :     'presence': {
     737          33 :       'events': [
     738          33 :         {
     739             :           'sender': '@alice:example.com',
     740             :           'type': 'm.presence',
     741          33 :           'content': {'presence': 'online'},
     742             :         }
     743             :       ],
     744             :     },
     745          33 :     'account_data': {
     746          33 :       'events': [
     747          33 :         {
     748          33 :           'content': {
     749          33 :             'global': {
     750          33 :               'content': [
     751          33 :                 {
     752          33 :                   'actions': [
     753             :                     'notify',
     754          33 :                     {'set_tweak': 'sound', 'value': 'default'},
     755          33 :                     {'set_tweak': 'highlight'},
     756             :                   ],
     757             :                   'default': true,
     758             :                   'enabled': true,
     759             :                   'pattern': 'alice',
     760             :                   'rule_id': '.m.rule.contains_user_name',
     761             :                 }
     762             :               ],
     763          33 :               'override': [
     764          33 :                 {
     765          33 :                   'actions': ['dont_notify'],
     766          33 :                   'conditions': [],
     767             :                   'default': true,
     768             :                   'enabled': false,
     769             :                   'rule_id': '.m.rule.master',
     770             :                 },
     771          33 :                 {
     772          33 :                   'actions': ['dont_notify'],
     773          33 :                   'conditions': [
     774          33 :                     {
     775             :                       'key': 'content.msgtype',
     776             :                       'kind': 'event_match',
     777             :                       'pattern': 'm.notice',
     778             :                     }
     779             :                   ],
     780             :                   'default': true,
     781             :                   'enabled': true,
     782             :                   'rule_id': '.m.rule.suppress_notices',
     783             :                 }
     784             :               ],
     785          33 :               'room': [
     786          33 :                 {
     787          33 :                   'actions': ['dont_notify'],
     788          33 :                   'conditions': [
     789          33 :                     {
     790             :                       'key': 'room_id',
     791             :                       'kind': 'event_match',
     792             :                       'pattern': '!localpart:server.abc',
     793             :                     }
     794             :                   ],
     795             :                   'default': true,
     796             :                   'enabled': true,
     797             :                   'rule_id': '!localpart:server.abc',
     798             :                 }
     799             :               ],
     800          33 :               'sender': [],
     801          33 :               'underride': [
     802          33 :                 {
     803          33 :                   'actions': [
     804             :                     'notify',
     805          33 :                     {'set_tweak': 'sound', 'value': 'ring'},
     806          33 :                     {'set_tweak': 'highlight', 'value': false},
     807             :                   ],
     808          33 :                   'conditions': [
     809          33 :                     {
     810             :                       'key': 'type',
     811             :                       'kind': 'event_match',
     812             :                       'pattern': 'm.call.invite',
     813             :                     }
     814             :                   ],
     815             :                   'default': true,
     816             :                   'enabled': true,
     817             :                   'rule_id': '.m.rule.call',
     818             :                 },
     819          33 :                 {
     820          33 :                   'actions': [
     821             :                     'notify',
     822          33 :                     {'set_tweak': 'sound', 'value': 'default'},
     823          33 :                     {'set_tweak': 'highlight'},
     824             :                   ],
     825          33 :                   'conditions': [
     826          33 :                     {'kind': 'contains_display_name'},
     827             :                   ],
     828             :                   'default': true,
     829             :                   'enabled': true,
     830             :                   'rule_id': '.m.rule.contains_display_name',
     831             :                 },
     832          33 :                 {
     833          33 :                   'actions': [
     834             :                     'notify',
     835          33 :                     {'set_tweak': 'sound', 'value': 'default'},
     836          33 :                     {'set_tweak': 'highlight', 'value': false},
     837             :                   ],
     838          33 :                   'conditions': [
     839          33 :                     {'is': '2', 'kind': 'room_member_count'},
     840          33 :                     {
     841             :                       'key': 'type',
     842             :                       'kind': 'event_match',
     843             :                       'pattern': 'm.room.message',
     844             :                     }
     845             :                   ],
     846             :                   'default': true,
     847             :                   'enabled': true,
     848             :                   'rule_id': '.m.rule.room_one_to_one',
     849             :                 },
     850          33 :                 {
     851          33 :                   'actions': [
     852             :                     'notify',
     853          33 :                     {'set_tweak': 'sound', 'value': 'default'},
     854          33 :                     {'set_tweak': 'highlight', 'value': false},
     855             :                   ],
     856          33 :                   'conditions': [
     857          33 :                     {
     858             :                       'key': 'type',
     859             :                       'kind': 'event_match',
     860             :                       'pattern': 'm.room.member',
     861             :                     },
     862          33 :                     {
     863             :                       'key': 'content.membership',
     864             :                       'kind': 'event_match',
     865             :                       'pattern': 'invite',
     866             :                     },
     867          33 :                     {
     868             :                       'key': 'state_key',
     869             :                       'kind': 'event_match',
     870             :                       'pattern': '@alice:example.com',
     871             :                     }
     872             :                   ],
     873             :                   'default': true,
     874             :                   'enabled': true,
     875             :                   'rule_id': '.m.rule.invite_for_me',
     876             :                 },
     877          33 :                 {
     878          33 :                   'actions': [
     879             :                     'notify',
     880          33 :                     {'set_tweak': 'highlight', 'value': false},
     881             :                   ],
     882          33 :                   'conditions': [
     883          33 :                     {
     884             :                       'key': 'type',
     885             :                       'kind': 'event_match',
     886             :                       'pattern': 'm.room.member',
     887             :                     }
     888             :                   ],
     889             :                   'default': true,
     890             :                   'enabled': true,
     891             :                   'rule_id': '.m.rule.member_event',
     892             :                 },
     893          33 :                 {
     894          33 :                   'actions': [
     895             :                     'notify',
     896          33 :                     {'set_tweak': 'highlight', 'value': false},
     897             :                   ],
     898          33 :                   'conditions': [
     899          33 :                     {
     900             :                       'key': 'type',
     901             :                       'kind': 'event_match',
     902             :                       'pattern': 'm.room.message',
     903             :                     }
     904             :                   ],
     905             :                   'default': true,
     906             :                   'enabled': true,
     907             :                   'rule_id': '.m.rule.message',
     908             :                 }
     909             :               ],
     910             :             },
     911             :           },
     912             :           'type': 'm.push_rules',
     913             :         },
     914          33 :         {
     915             :           'type': 'org.example.custom.config',
     916          33 :           'content': {'custom_config_key': 'custom_config_value'},
     917             :         },
     918          33 :         {
     919          33 :           'content': {
     920          33 :             '@bob:example.com': [
     921             :               '!726s6s6q:example.com',
     922             :               '!hgfedcba:example.com',
     923             :             ],
     924             :           },
     925             :           'type': 'm.direct',
     926             :         },
     927          33 :         {
     928             :           'type': EventTypes.SecretStorageDefaultKey,
     929          33 :           'content': {'key': '0FajDWYaM6wQ4O60OZnLvwZfsBNu4Bu3'},
     930             :         },
     931          33 :         {
     932             :           'type': 'm.secret_storage.key.0FajDWYaM6wQ4O60OZnLvwZfsBNu4Bu3',
     933          33 :           'content': {
     934             :             'algorithm': AlgorithmTypes.secretStorageV1AesHmcSha2,
     935          33 :             'passphrase': {
     936             :               'algorithm': AlgorithmTypes.pbkdf2,
     937             :               'iterations': 500000,
     938             :               'salt': 'F4jJ80mr0Fc8mRwU9JgA3lQDyjPuZXQL',
     939             :             },
     940             :             'iv': 'HjbTgIoQH2pI7jQo19NUzA==',
     941             :             'mac': 'QbJjQzDnAggU0cM4RBnDxw2XyarRGjdahcKukP9xVlk=',
     942             :           },
     943             :         },
     944          33 :         {
     945             :           'type': 'm.cross_signing.master',
     946          33 :           'content': {
     947          33 :             'encrypted': {
     948          33 :               '0FajDWYaM6wQ4O60OZnLvwZfsBNu4Bu3': {
     949             :                 'iv': 'eIb2IITxtmcq+1TrT8D5eQ==',
     950             :                 'ciphertext':
     951             :                     'lWRTPo5qxf4LAVwVPzGHOyMcP181n7bb9/B0lvkLDC2Oy4DvAL0eLx2x3bY=',
     952             :                 'mac': 'Ynx89tIxPkx0o6ljMgxszww17JOgB4tg4etmNnMC9XI=',
     953             :               },
     954             :             },
     955             :           },
     956             :         },
     957          33 :         {
     958             :           'type': EventTypes.CrossSigningSelfSigning,
     959          33 :           'content': {
     960          33 :             'encrypted': {
     961          33 :               '0FajDWYaM6wQ4O60OZnLvwZfsBNu4Bu3': {
     962             :                 'iv': 'YqU2XIjYulYZl+bkZtGgVw==',
     963             :                 'ciphertext':
     964             :                     'kM2TSoy/jR/4d357ZoRPbpPypxQl6XRLo3FsEXz+f7vIOp82GeRp28RYb3k=',
     965             :                 'mac': 'F+DZa5tAFmWsYSryw5EuEpzTmmABRab4GETkM85bGGo=',
     966             :               },
     967             :             },
     968             :           },
     969             :         },
     970          33 :         {
     971             :           'type': EventTypes.CrossSigningUserSigning,
     972          33 :           'content': {
     973          33 :             'encrypted': {
     974          33 :               '0FajDWYaM6wQ4O60OZnLvwZfsBNu4Bu3': {
     975             :                 'iv': 'D7AM3LXFu7ZlyGOkR+OeqQ==',
     976             :                 'ciphertext':
     977             :                     'bYA2+OMgsO6QB1E31aY+ESAWrT0fUBTXqajy4qmL7bVDSZY4Uj64EXNbHuA=',
     978             :                 'mac': 'j2UtyPo/UBSoiaQCWfzCiRZXp3IRt0ZZujuXgUMjnw4=',
     979             :               },
     980             :             },
     981             :           },
     982             :         },
     983          33 :         {
     984             :           'type': EventTypes.MegolmBackup,
     985          33 :           'content': {
     986          33 :             'encrypted': {
     987          33 :               '0FajDWYaM6wQ4O60OZnLvwZfsBNu4Bu3': {
     988             :                 'iv': 'cL/0MJZaiEd3fNU+I9oJrw==',
     989             :                 'ciphertext':
     990             :                     'WL73Pzdk5wZdaaSpaeRH0uZYKcxkuV8IS6Qa2FEfA1+vMeRLuHcWlXbMX0w=',
     991             :                 'mac': '+xozp909S6oDX8KRV8D8ZFVRyh7eEYQpPP76f+DOsnw=',
     992             :               },
     993             :             },
     994             :           },
     995             :         },
     996          33 :         {
     997             :           'type': 'io.element.recent_emoji',
     998          33 :           'content': {
     999          33 :             'recent_emoji': [
    1000          33 :               ['👍️', 1],
    1001          33 :               ['🖇️', 0],
    1002          33 :               ['🙃', 'error'],
    1003          33 :               [null, null],
    1004          33 :               [1, ''],
    1005             :             ],
    1006             :           },
    1007             :         }
    1008             :       ],
    1009             :     },
    1010          33 :     'to_device': {
    1011          33 :       'events': [
    1012          33 :         {
    1013             :           'sender': '@alice:example.com',
    1014             :           'type': 'm.new_device',
    1015          33 :           'content': {
    1016             :             'device_id': 'XYZABCDE',
    1017          33 :             'rooms': ['!726s6s6q:example.com'],
    1018             :           },
    1019             :         },
    1020             : //        {
    1021             : //          'sender': '@othertest:fakeServer.notExisting',
    1022             : //          'content': {
    1023             : //            'algorithm': AlgorithmTypes.megolmV1AesSha2,
    1024             : //            'room_id': '!726s6s6q:example.com',
    1025             : //            'session_id': 'ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU',
    1026             : //            'session_key':
    1027             : //                'AgAAAAAQcQ6XrFJk6Prm8FikZDqfry/NbDz8Xw7T6e+/9Yf/q3YHIPEQlzv7IZMNcYb51ifkRzFejVvtphS7wwG2FaXIp4XS2obla14iKISR0X74ugB2vyb1AydIHE/zbBQ1ic5s3kgjMFlWpu/S3FQCnCrv+DPFGEt3ERGWxIl3Bl5X53IjPyVkz65oljz2TZESwz0GH/QFvyOOm8ci0q/gceaF3S7Dmafg3dwTKYwcA5xkcc+BLyrLRzB6Hn+oMAqSNSscnm4mTeT5zYibIhrzqyUTMWr32spFtI9dNR/RFSzfCw'
    1028             : //          },
    1029             : //          'type': 'm.room_key'
    1030             : //        },
    1031          33 :         {
    1032             :           // this is the commented out m.room_key event - only encrypted
    1033             :           'sender': '@othertest:fakeServer.notExisting',
    1034          33 :           'content': {
    1035             :             'algorithm': AlgorithmTypes.olmV1Curve25519AesSha2,
    1036             :             'sender_key': 'JBG7ZaPn54OBC7TuIEiylW3BZ+7WcGQhFBPB9pogbAg',
    1037          33 :             'ciphertext': {
    1038          33 :               '7rvl3jORJkBiK4XX1e5TnGnqz068XfYJ0W++Ml63rgk': {
    1039             :                 'type': 0,
    1040             :                 'body':
    1041             :                     'Awogyh7K4iLUQjcOxIfi7q7LhBBqv9w0mQ6JI9+U9tv7iF4SIHC6xb5YFWf9voRnmDBbd+0vxD/xDlVNRDlPIKliLGkYGiAkEbtlo+fng4ELtO4gSLKVbcFn7tZwZCEUE8H2miBsCCKABgMKIFrKDJwB7gM3lXPt9yVoh6gQksafKt7VFCNRN5KLKqsDEAAi0AX5EfTV7jJ1ZWAbxftjoSN6kCVIxzGclbyg1HjchmNCX7nxNCHWl+q5ZgqHYZVu2n2mCVmIaKD0kvoEZeY3tV1Itb6zf67BLaU0qgW/QzHCHg5a44tNLjucvL2mumHjIG8k0BY2uh+52HeiMCvSOvtDwHg7nzCASGdqPVCj9Kzw6z7F6nL4e3mYim8zvJd7f+mD9z3ARrypUOLGkTGYbB2PQOovf0Do8WzcaRzfaUCnuu/YVZWKK7DPgG8uhw/TjR6XtraAKZysF+4DJYMG9SQWx558r6s7Z5EUOF5CU2M35w1t1Xxllb3vrS83dtf9LPCrBhLsEBeYEUBE2+bTBfl0BDKqLiB0Cc0N0ixOcHIt6e40wAvW622/gMgHlpNSx8xG12u0s6h6EMWdCXXLWd9fy2q6glFUHvA67A35q7O+M8DVml7Y9xG55Y3DHkMDc9cwgwFkBDCAYQe6pQF1nlKytcVCGREpBs/gq69gHAStMQ8WEg38Lf8u8eBr2DFexrN4U+QAk+S//P3fJgf0bQx/Eosx4fvWSz9En41iC+ADCsWQpMbwHn4JWvtAbn3oW0XmL/OgThTkJMLiCymduYAa1Hnt7a3tP0KTL2/x11F02ggQHL28cCjq5W4zUGjWjl5wo2PsKB6t8aAvMg2ujGD2rCjb4yrv5VIzAKMOZLyj7K0vSK9gwDLQ/4vq+QnKUBG5zrcOze0hX+kz2909/tmAdeCH61Ypw7gbPUJAKnmKYUiB/UgwkJvzMJSsk/SEs5SXosHDI+HsJHJp4Mp4iKD0xRMst+8f9aTjaWwh8ZvELE1ZOhhCbF3RXhxi3x2Nu8ORIz+vhEQ1NOlMc7UIo98Fk/96T36vL/fviowT4C/0AlaapZDJBmKwhmwqisMjY2n1vY29oM2p5BzY1iwP7q9BYdRFst6xwo57TNSuRwQw7IhFsf0k+ABuPEZy5xB5nPHyIRTf/pr3Hw',
    1042             :               },
    1043             :             },
    1044             :           },
    1045             :           'type': 'm.room.encrypted',
    1046             :         },
    1047             :       ],
    1048             :     },
    1049          33 :     'device_lists': {
    1050          33 :       'changed': [
    1051             :         '@alice:example.com',
    1052             :       ],
    1053          33 :       'left': [
    1054             :         '@bob:example.com',
    1055             :       ],
    1056             :     },
    1057          33 :     'device_one_time_keys_count': {'curve25519': 10, 'signed_curve25519': 100},
    1058             :   };
    1059             : 
    1060           9 :   static Map<String, dynamic> archiveSyncResponse = {
    1061           9 :     'next_batch': Random().nextDouble().toString(),
    1062           6 :     'presence': {'events': []},
    1063           6 :     'account_data': {'events': []},
    1064           6 :     'to_device': {'events': []},
    1065           3 :     'rooms': {
    1066           3 :       'join': {},
    1067           3 :       'invite': {},
    1068           3 :       'leave': {
    1069           3 :         '!5345234234:example.com': {
    1070           3 :           'timeline': {
    1071           3 :             'events': [
    1072           3 :               {
    1073           3 :                 'content': {
    1074             :                   'body': 'This is a second text example message',
    1075             :                   'msgtype': 'm.text',
    1076             :                   'format': 'org.matrix.custom.html',
    1077             :                   'formatted_body':
    1078             :                       '<b>This is a second text example message</b>',
    1079             :                 },
    1080             :                 'type': 'm.room.message',
    1081             :                 'event_id': '143274597446PhrSn:example.org',
    1082             :                 'room_id': '!5345234234:example.com',
    1083             :                 'sender': '@example:example.org',
    1084             :                 'origin_server_ts': 1432735824654,
    1085           3 :                 'unsigned': {'age': 1234},
    1086             :               },
    1087           3 :               {
    1088           3 :                 'content': {
    1089             :                   'body': 'This is a first text example message',
    1090             :                   'msgtype': 'm.text',
    1091             :                   'format': 'org.matrix.custom.html',
    1092             :                   'formatted_body':
    1093             :                       '<b>This is a first text example message</b>',
    1094             :                 },
    1095             :                 'type': 'm.room.message',
    1096             :                 'event_id': '143274597443PhrSn:example.org',
    1097             :                 'room_id': '!5345234234:example.com',
    1098             :                 'sender': '@example:example.org',
    1099             :                 'origin_server_ts': 1432735824653,
    1100           3 :                 'unsigned': {'age': 1234},
    1101             :               }
    1102             :             ],
    1103             :             'prev_batch': 't_1234a',
    1104             :           },
    1105           3 :           'state': {
    1106           3 :             'events': [
    1107           3 :               {
    1108           3 :                 'content': {'name': 'The room name'},
    1109             :                 'type': 'm.room.name',
    1110             :                 'event_id': '2143273582443PhrSn:example.org',
    1111             :                 'room_id': '!5345234234:example.com',
    1112             :                 'sender': '@example:example.org',
    1113             :                 'origin_server_ts': 1432735824653,
    1114           3 :                 'unsigned': {'age': 1234},
    1115             :                 'state_key': '',
    1116             :               },
    1117             :             ],
    1118             :           },
    1119           3 :           'account_data': {
    1120           3 :             'events': [
    1121           3 :               {
    1122             :                 'type': 'test.type.data',
    1123           3 :                 'content': {'foo': 'bar'},
    1124             :               },
    1125             :             ],
    1126             :           },
    1127             :         },
    1128           3 :         '!5345234235:example.com': {
    1129           6 :           'timeline': {'events': []},
    1130           3 :           'state': {
    1131           3 :             'events': [
    1132           3 :               {
    1133           3 :                 'content': {'name': 'The room name 2'},
    1134             :                 'type': 'm.room.name',
    1135             :                 'event_id': '2143273582443PhrSn:example.org',
    1136             :                 'room_id': '!5345234235:example.com',
    1137             :                 'sender': '@example:example.org',
    1138             :                 'origin_server_ts': 1432735824653,
    1139           3 :                 'unsigned': {'age': 1234},
    1140             :                 'state_key': '',
    1141             :               },
    1142             :             ],
    1143             :           },
    1144             :           'prev_batch': 't_1234b',
    1145             :         },
    1146             :       },
    1147             :     },
    1148             :   };
    1149             : 
    1150             :   Map<String, Map<String, dynamic>> api = {
    1151             :     'GET': {
    1152           0 :       '/path/to/auth/error': (var req) => {
    1153             :             'errcode': 'M_FORBIDDEN',
    1154             :             'error': 'Blabla',
    1155             :           },
    1156           0 :       '/media/v3/preview_url?url=https%3A%2F%2Fmatrix.org&ts=10': (var req) => {
    1157             :             'og:title': 'Matrix Blog Post',
    1158             :             'og:description': 'This is a really cool blog post from matrix.org',
    1159             :             'og:image': 'mxc://example.com/ascERGshawAWawugaAcauga',
    1160             :             'og:image:type': 'image/png',
    1161             :             'og:image:height': 48,
    1162             :             'og:image:width': 48,
    1163             :             'matrix:image:size': 102400,
    1164             :           },
    1165             :       '/client/v1/media/preview_url?url=https%3A%2F%2Fmatrix.org&ts=10':
    1166           0 :           (var req) => {
    1167             :                 'og:title': 'Matrix Blog Post',
    1168             :                 'og:description':
    1169             :                     'This is a really cool blog post from matrix.org',
    1170             :                 'og:image': 'mxc://example.com/ascERGshawAWawugaAcauga',
    1171             :                 'og:image:type': 'image/png',
    1172             :                 'og:image:height': 48,
    1173             :                 'og:image:width': 48,
    1174             :                 'matrix:image:size': 102400,
    1175             :               },
    1176           0 :       '/media/v3/config': (var req) => {'m.upload.size': 50000000},
    1177           8 :       '/client/v1/media/config': (var req) => {'m.upload.size': 50000000},
    1178           2 :       '/.well-known/matrix/client': (var req) => {
    1179           1 :             'm.homeserver': {'base_url': 'https://fakeserver.notexisting'},
    1180           1 :             'm.identity_server': {'base_url': 'https://identity.example.com'},
    1181           1 :             'org.example.custom.property': {
    1182             :               'app_url': 'https://custom.app.example.org',
    1183             :             },
    1184             :           },
    1185             :       '/client/v3/user/%40alice%3Aexample.com/rooms/!localpart%3Aexample.com/tags':
    1186           0 :           (var req) => {
    1187           0 :                 'tags': {
    1188           0 :                   'm.favourite': {'order': 0.1},
    1189           0 :                   'u.Work': {'order': 0.7},
    1190           0 :                   'u.Customers': {},
    1191             :                 },
    1192             :               },
    1193           0 :       '/client/v3/events?from=1234&timeout=10&roomId=%211234': (var req) => {
    1194             :             'start': 's3456_9_0',
    1195             :             'end': 's3457_9_0',
    1196           0 :             'chunk': [
    1197           0 :               {
    1198           0 :                 'content': {
    1199             :                   'body': 'This is an example text message',
    1200             :                   'msgtype': 'm.text',
    1201             :                   'format': 'org.matrix.custom.html',
    1202             :                   'formatted_body': '<b>This is an example text message</b>',
    1203             :                 },
    1204             :                 'type': 'm.room.message',
    1205             :                 'event_id': '\$143273582443PhrSn:example.org',
    1206             :                 'room_id': '!somewhere:over.the.rainbow',
    1207             :                 'sender': '@example:example.org',
    1208             :                 'origin_server_ts': 1432735824653,
    1209           0 :                 'unsigned': {'age': 1234},
    1210             :               }
    1211             :             ],
    1212             :           },
    1213           0 :       '/client/v3/thirdparty/location?alias=1234': (var req) => [
    1214           0 :             {
    1215             :               'alias': '#freenode_#matrix:matrix.org',
    1216             :               'protocol': 'irc',
    1217           0 :               'fields': {'network': 'freenode', 'channel': '#matrix'},
    1218             :             }
    1219             :           ],
    1220           0 :       '/client/v3/thirdparty/location/irc': (var req) => [
    1221           0 :             {
    1222             :               'alias': '#freenode_#matrix:matrix.org',
    1223             :               'protocol': 'irc',
    1224           0 :               'fields': {'network': 'freenode', 'channel': '#matrix'},
    1225             :             }
    1226             :           ],
    1227           0 :       '/client/v3/thirdparty/user/irc': (var req) => [
    1228           0 :             {
    1229             :               'userid': '@_gitter_jim:matrix.org',
    1230             :               'protocol': 'gitter',
    1231           0 :               'fields': {'user': 'jim'},
    1232             :             }
    1233             :           ],
    1234           0 :       '/client/v3/thirdparty/user?userid=1234': (var req) => [
    1235           0 :             {
    1236             :               'userid': '@_gitter_jim:matrix.org',
    1237             :               'protocol': 'gitter',
    1238           0 :               'fields': {'user': 'jim'},
    1239             :             }
    1240             :           ],
    1241           0 :       '/client/v3/thirdparty/protocol/irc': (var req) => {
    1242           0 :             'user_fields': ['network', 'nickname'],
    1243           0 :             'location_fields': ['network', 'channel'],
    1244             :             'icon': 'mxc://example.org/aBcDeFgH',
    1245           0 :             'field_types': {
    1246           0 :               'network': {
    1247             :                 'regexp': '([a-z0-9]+\\.)*[a-z0-9]+',
    1248             :                 'placeholder': 'irc.example.org',
    1249             :               },
    1250           0 :               'nickname': {'regexp': '[^\\s#]+', 'placeholder': 'username'},
    1251           0 :               'channel': {'regexp': '#[^\\s]+', 'placeholder': '#foobar'},
    1252             :             },
    1253           0 :             'instances': [
    1254           0 :               {
    1255             :                 'desc': 'Freenode',
    1256             :                 'icon': 'mxc://example.org/JkLmNoPq',
    1257           0 :                 'fields': {'network': 'freenode'},
    1258             :                 'network_id': 'freenode',
    1259             :               }
    1260             :             ],
    1261             :           },
    1262           0 :       '/client/v3/thirdparty/protocols': (var req) => {
    1263           0 :             'irc': {
    1264           0 :               'user_fields': ['network', 'nickname'],
    1265           0 :               'location_fields': ['network', 'channel'],
    1266             :               'icon': 'mxc://example.org/aBcDeFgH',
    1267           0 :               'field_types': {
    1268           0 :                 'network': {
    1269             :                   'regexp': '([a-z0-9]+\\.)*[a-z0-9]+',
    1270             :                   'placeholder': 'irc.example.org',
    1271             :                 },
    1272           0 :                 'nickname': {'regexp': '[^\\s]+', 'placeholder': 'username'},
    1273           0 :                 'channel': {'regexp': '#[^\\s]+', 'placeholder': '#foobar'},
    1274             :               },
    1275           0 :               'instances': [
    1276           0 :                 {
    1277             :                   'network_id': 'freenode',
    1278             :                   'desc': 'Freenode',
    1279             :                   'icon': 'mxc://example.org/JkLmNoPq',
    1280           0 :                   'fields': {'network': 'freenode.net'},
    1281             :                 }
    1282             :               ],
    1283             :             },
    1284           0 :             'gitter': {
    1285           0 :               'user_fields': ['username'],
    1286           0 :               'location_fields': ['room'],
    1287             :               'icon': 'mxc://example.org/aBcDeFgH',
    1288           0 :               'field_types': {
    1289           0 :                 'username': {'regexp': '@[^\\s]+', 'placeholder': '@username'},
    1290           0 :                 'room': {
    1291             :                   'regexp': '[^\\s]+\\/[^\\s]+',
    1292             :                   'placeholder': 'matrix-org/matrix-doc',
    1293             :                 },
    1294             :               },
    1295           0 :               'instances': [
    1296           0 :                 {
    1297             :                   'network_id': 'gitter',
    1298             :                   'desc': 'Gitter',
    1299             :                   'icon': 'mxc://example.org/zXyWvUt',
    1300           0 :                   'fields': {},
    1301             :                 }
    1302             :               ],
    1303             :             },
    1304             :           },
    1305           0 :       '/client/v3/account/whoami': (var req) =>
    1306           0 :           {'user_id': 'alice@example.com'},
    1307           0 :       '/client/v3/capabilities': (var req) => {
    1308           0 :             'capabilities': {
    1309           0 :               'm.change_password': {'enabled': false},
    1310           0 :               'm.room_versions': {
    1311             :                 'default': '1',
    1312           0 :                 'available': {
    1313             :                   '1': 'stable',
    1314             :                   '2': 'stable',
    1315             :                   '3': 'unstable',
    1316             :                   'test-version': 'unstable',
    1317             :                 },
    1318             :               },
    1319           0 :               'com.example.custom.ratelimit': {'max_requests_per_hour': 600},
    1320             :             },
    1321             :           },
    1322           0 :       '/client/v3/rooms/1234/context/1234?filter=%7B%7D&limit=10': (var req) =>
    1323           0 :           {
    1324             :             'end': 't29-57_2_0_2',
    1325           0 :             'events_after': [
    1326           0 :               {
    1327           0 :                 'content': {
    1328             :                   'body': 'This is an example text message',
    1329             :                   'msgtype': 'm.text',
    1330             :                   'format': 'org.matrix.custom.html',
    1331             :                   'formatted_body': '<b>This is an example text message</b>',
    1332             :                 },
    1333             :                 'type': 'm.room.message',
    1334             :                 'event_id': '\$143273582443PhrSn:example.org',
    1335             :                 'room_id': '!636q39766251:example.com',
    1336             :                 'sender': '@example:example.org',
    1337             :                 'origin_server_ts': 1432735824653,
    1338           0 :                 'unsigned': {'age': 1234},
    1339             :               }
    1340             :             ],
    1341           0 :             'event': {
    1342           0 :               'content': {
    1343             :                 'body': 'filename.jpg',
    1344           0 :                 'info': {
    1345             :                   'h': 398,
    1346             :                   'w': 394,
    1347             :                   'mimetype': 'image/jpeg',
    1348             :                   'size': 31037,
    1349             :                 },
    1350             :                 'url': 'mxc://example.org/JWEIFJgwEIhweiWJE',
    1351             :                 'msgtype': 'm.image',
    1352             :               },
    1353             :               'type': 'm.room.message',
    1354             :               'event_id': '\$f3h4d129462ha:example.com',
    1355             :               'room_id': '!636q39766251:example.com',
    1356             :               'sender': '@example:example.org',
    1357             :               'origin_server_ts': 1432735824653,
    1358           0 :               'unsigned': {'age': 1234},
    1359             :             },
    1360           0 :             'events_before': [
    1361           0 :               {
    1362           0 :                 'content': {
    1363             :                   'body': 'something-important.doc',
    1364             :                   'filename': 'something-important.doc',
    1365           0 :                   'info': {'mimetype': 'application/msword', 'size': 46144},
    1366             :                   'msgtype': 'm.file',
    1367             :                   'url': 'mxc://example.org/FHyPlCeYUSFFxlgbQYZmoEoe',
    1368             :                 },
    1369             :                 'type': 'm.room.message',
    1370             :                 'event_id': '\$143273582443PhrSn:example.org',
    1371             :                 'room_id': '!636q39766251:example.com',
    1372             :                 'sender': '@example:example.org',
    1373             :                 'origin_server_ts': 1432735824653,
    1374           0 :                 'unsigned': {'age': 1234},
    1375             :               }
    1376             :             ],
    1377             :             'start': 't27-54_2_0_2',
    1378           0 :             'state': [
    1379           0 :               {
    1380           0 :                 'content': {
    1381             :                   'creator': '@example:example.org',
    1382             :                   'room_version': '1',
    1383             :                   'm.federate': true,
    1384           0 :                   'predecessor': {
    1385             :                     'event_id': '\$something:example.org',
    1386             :                     'room_id': '!oldroom:example.org',
    1387             :                   },
    1388             :                 },
    1389             :                 'type': 'm.room.create',
    1390             :                 'event_id': '\$143273582443PhrSn:example.org',
    1391             :                 'room_id': '!636q39766251:example.com',
    1392             :                 'sender': '@example:example.org',
    1393             :                 'origin_server_ts': 1432735824653,
    1394           0 :                 'unsigned': {'age': 1234},
    1395             :                 'state_key': '',
    1396             :               },
    1397           0 :               {
    1398           0 :                 'content': {
    1399             :                   'membership': 'join',
    1400             :                   'avatar_url': 'mxc://example.org/SEsfnsuifSDFSSEF',
    1401             :                   'displayname': 'Alice Margatroid',
    1402             :                 },
    1403             :                 'type': 'm.room.member',
    1404             :                 'event_id': '\$143273582443PhrSn:example.org',
    1405             :                 'room_id': '!636q39766251:example.com',
    1406             :                 'sender': '@example:example.org',
    1407             :                 'origin_server_ts': 1432735824653,
    1408           0 :                 'unsigned': {'age': 1234},
    1409             :                 'state_key': '@alice:example.org',
    1410             :               }
    1411             :             ],
    1412             :           },
    1413           0 :       '/client/v3/admin/whois/%40alice%3Aexample.com': (var req) => {
    1414             :             'user_id': '@peter:rabbit.rocks',
    1415           0 :             'devices': {
    1416           0 :               'teapot': {
    1417           0 :                 'sessions': [
    1418           0 :                   {
    1419           0 :                     'connections': [
    1420           0 :                       {
    1421             :                         'ip': '127.0.0.1',
    1422             :                         'last_seen': 1411996332123,
    1423             :                         'user_agent': 'curl/7.31.0-DEV',
    1424             :                       },
    1425           0 :                       {
    1426             :                         'ip': '10.0.0.2',
    1427             :                         'last_seen': 1411996332123,
    1428             :                         'user_agent':
    1429             :                             'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.120 Safari/537.36',
    1430             :                       }
    1431             :                     ],
    1432             :                   }
    1433             :                 ],
    1434             :               },
    1435             :             },
    1436             :           },
    1437             :       '/client/v3/user/%40alice%3Aexample.com/account_data/test.account.data':
    1438           0 :           (var req) => {'foo': 'bar'},
    1439             :       '/client/v3/user/%40alice%3Aexample.com/rooms/1234/account_data/test.account.data':
    1440           0 :           (var req) => {'foo': 'bar'},
    1441           0 :       '/client/v3/directory/room/%23testalias%3Aexample.com': (var reqI) => {
    1442             :             'room_id': '!abnjk1jdasj98:capuchins.com',
    1443           0 :             'servers': ['capuchins.com', 'matrix.org', 'another.com'],
    1444             :           },
    1445           0 :       '/client/v3/account/3pid': (var req) => {
    1446           0 :             'threepids': [
    1447           0 :               {
    1448             :                 'medium': 'email',
    1449             :                 'address': 'monkey@banana.island',
    1450             :                 'validated_at': 1535176800000,
    1451             :                 'added_at': 1535336848756,
    1452             :               }
    1453             :             ],
    1454             :           },
    1455           0 :       '/client/v3/devices': (var req) => {
    1456           0 :             'devices': [
    1457           0 :               {
    1458             :                 'device_id': 'QBUAZIFURK',
    1459             :                 'display_name': 'android',
    1460             :                 'last_seen_ip': '1.2.3.4',
    1461             :                 'last_seen_ts': 1474491775024,
    1462             :               }
    1463             :             ],
    1464             :           },
    1465           0 :       '/client/v3/notifications?from=1234&limit=10&only=1234': (var req) => {
    1466             :             'next_token': 'abcdef',
    1467           0 :             'notifications': [
    1468           0 :               {
    1469           0 :                 'actions': ['notify'],
    1470             :                 'profile_tag': 'hcbvkzxhcvb',
    1471             :                 'read': true,
    1472             :                 'room_id': '!abcdefg:example.com',
    1473             :                 'ts': 1475508881945,
    1474           0 :                 'event': {
    1475           0 :                   'content': {
    1476             :                     'body': 'This is an example text message',
    1477             :                     'msgtype': 'm.text',
    1478             :                     'format': 'org.matrix.custom.html',
    1479             :                     'formatted_body': '<b>This is an example text message</b>',
    1480             :                   },
    1481             :                   'type': 'm.room.message',
    1482             :                   'event_id': '\$143273582443PhrSn:example.org',
    1483             :                   'room_id': '!jEsUZKDJdhlrceRyVU:example.org',
    1484             :                   'sender': '@example:example.org',
    1485             :                   'origin_server_ts': 1432735824653,
    1486           0 :                   'unsigned': {'age': 1234},
    1487             :                 },
    1488             :               }
    1489             :             ],
    1490             :           },
    1491           0 :       '/client/v3/devices/QBUAZIFURK': (var req) => {
    1492             :             'device_id': 'QBUAZIFURK',
    1493             :             'display_name': 'android',
    1494             :             'last_seen_ip': '1.2.3.4',
    1495             :             'last_seen_ts': 1474491775024,
    1496             :           },
    1497           1 :       '/client/v3/profile/%40test%3AfakeServer.notExisting': (var reqI) =>
    1498           1 :           {'displayname': 'Some First Name Some Last Name'},
    1499           0 :       '/client/v3/profile/%40alice%3Aexample.com/displayname': (var reqI) =>
    1500           0 :           {'displayname': 'Alice M'},
    1501           0 :       '/client/v3/profile/%40alice%3Aexample.com/avatar_url': (var reqI) =>
    1502           0 :           {'avatar_url': 'mxc://test'},
    1503           2 :       '/client/v3/profile/%40alice%3Aexample.com': (var reqI) => {
    1504             :             'avatar_url': 'mxc://test',
    1505             :             'displayname': 'Alice M',
    1506             :           },
    1507           4 :       '/client/v3/voip/turnServer': (var req) => {
    1508             :             'username': '1443779631:@user:example.com',
    1509             :             'password': 'JlKfBy1QwLrO20385QyAtEyIv0=',
    1510           2 :             'uris': [
    1511             :               'turn:turn.example.com:3478?transport=udp',
    1512             :               'turn:10.20.30.40:3478?transport=tcp',
    1513             :               'turns:10.20.30.40:443?transport=tcp',
    1514             :             ],
    1515             :             'ttl': 86400,
    1516             :           },
    1517             :       '/client/v3/presence/${Uri.encodeComponent('@alice:example.com')}/status':
    1518           0 :           (var req) => {
    1519             :                 'presence': 'unavailable',
    1520             :                 'last_active_ago': 420845,
    1521             :                 'status_msg': 'test',
    1522             :                 'currently_active': false,
    1523             :               },
    1524           0 :       '/client/v3/keys/changes?from=1234&to=1234': (var req) => {
    1525           0 :             'changed': ['@alice:example.com', '@bob:example.org'],
    1526           0 :             'left': ['@clara:example.com', '@doug:example.org'],
    1527             :           },
    1528           0 :       '/client/v3/pushers': (var req) => {
    1529           0 :             'pushers': [
    1530           0 :               {
    1531             :                 'pushkey': 'Xp/MzCt8/9DcSNE9cuiaoT5Ac55job3TdLSSmtmYl4A=',
    1532             :                 'kind': 'http',
    1533             :                 'app_id': 'face.mcapp.appy.prod',
    1534             :                 'app_display_name': 'Appy McAppface',
    1535             :                 'device_display_name': 'Alices Phone',
    1536             :                 'profile_tag': 'xyz',
    1537             :                 'lang': 'en-US',
    1538           0 :                 'data': {
    1539             :                   'url': 'https://example.com/_matrix/push/v1/notify',
    1540             :                   'format': 'event_id_only',
    1541             :                 },
    1542             :               }
    1543             :             ],
    1544             :           },
    1545             :       '/client/v3/publicRooms?limit=10&since=1234&server=example.com':
    1546           0 :           (var req) => {
    1547           0 :                 'chunk': [
    1548           0 :                   {
    1549           0 :                     'aliases': ['#murrays:cheese.bar'],
    1550             :                     'canonical_alias': '#murrays:cheese.bar',
    1551             :                     'avatar_url': 'mxc://bleeker.street/CHEDDARandBRIE',
    1552             :                     'guest_can_join': false,
    1553             :                     'name': 'CHEESE',
    1554             :                     'num_joined_members': 37,
    1555             :                     'room_id': '!ol19s:bleecker.street',
    1556             :                     'topic': 'Tasty tasty cheese',
    1557             :                     'world_readable': true,
    1558             :                   }
    1559             :                 ],
    1560             :                 'next_batch': 'p190q',
    1561             :                 'prev_batch': 'p1902',
    1562             :                 'total_room_count_estimate': 115,
    1563             :               },
    1564           0 :       '/client/v3/room/!localpart%3Aexample.com/aliases': (var req) => {
    1565           0 :             'aliases': [
    1566             :               '#somewhere:example.com',
    1567             :               '#another:example.com',
    1568             :               '#hat_trick:example.com',
    1569             :             ],
    1570             :           },
    1571           0 :       '/client/v3/joined_rooms': (var req) => {
    1572           0 :             'joined_rooms': ['!foo:example.com'],
    1573             :           },
    1574           0 :       '/client/v3/directory/list/room/!localpart%3Aexample.com': (var req) =>
    1575           0 :           {'visibility': 'public'},
    1576           0 :       '/client/v3/rooms/1/state/m.room.member/@alice:example.com': (var req) =>
    1577           0 :           {'displayname': 'Alice'},
    1578           4 :       '/client/v3/profile/%40getmeprofile%3Aexample.com': (var req) => {
    1579             :             'avatar_url': 'mxc://test',
    1580             :             'displayname': 'You got me (profile)',
    1581             :           },
    1582           2 :       '/client/v3/profile/%40getme%3Aexample.com': (var req) => {
    1583             :             'avatar_url': 'mxc://test',
    1584             :             'displayname': 'You got me',
    1585             :           },
    1586             :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.member/%40getme%3Aexample.com':
    1587           4 :           (var req) => {
    1588             :                 'avatar_url': 'mxc://test',
    1589             :                 'displayname': 'You got me',
    1590             :                 'membership': 'knock',
    1591             :               },
    1592             :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.member/%40getmeempty%3Aexample.com':
    1593           4 :           (var req) => {
    1594             :                 'membership': 'leave',
    1595             :               },
    1596           4 :       '/client/v3/profile/%40getmeempty%3Aexample.com': (var req) => {
    1597             :             'avatar_url': 'mxc://test',
    1598             :             'displayname': 'You got me (empty)',
    1599             :           },
    1600           0 :       '/client/v3/rooms/!localpart%3Aserver.abc/state': (var req) => [
    1601           0 :             {
    1602           0 :               'content': {'join_rule': 'public'},
    1603             :               'type': 'm.room.join_rules',
    1604             :               'event_id': '\$143273582443PhrSn:example.org',
    1605             :               'room_id': '!636q39766251:example.com',
    1606             :               'sender': '@example:example.org',
    1607             :               'origin_server_ts': 1432735824653,
    1608           0 :               'unsigned': {'age': 1234},
    1609             :               'state_key': '',
    1610             :             },
    1611           0 :             {
    1612           0 :               'content': {
    1613             :                 'membership': 'join',
    1614             :                 'avatar_url': 'mxc://example.org/SEsfnsuifSDFSSEF',
    1615             :                 'displayname': 'Alice Margatroid',
    1616             :               },
    1617             :               'type': 'm.room.member',
    1618             :               'event_id': '\$143273582443PhrSn:example.org',
    1619             :               'room_id': '!636q39766251:example.com',
    1620             :               'sender': '@example:example.org',
    1621             :               'origin_server_ts': 1432735824653,
    1622           0 :               'unsigned': {'age': 1234},
    1623             :               'state_key': '@alice:example.org',
    1624             :             },
    1625           0 :             {
    1626           0 :               'content': {
    1627             :                 'creator': '@example:example.org',
    1628             :                 'room_version': '1',
    1629             :                 'm.federate': true,
    1630           0 :                 'predecessor': {
    1631             :                   'event_id': '\$something:example.org',
    1632             :                   'room_id': '!oldroom:example.org',
    1633             :                 },
    1634             :               },
    1635             :               'type': 'm.room.create',
    1636             :               'event_id': '\$143273582443PhrSn:example.org',
    1637             :               'room_id': '!636q39766251:example.com',
    1638             :               'sender': '@example:example.org',
    1639             :               'origin_server_ts': 1432735824653,
    1640           0 :               'unsigned': {'age': 1234},
    1641             :               'state_key': '',
    1642             :             },
    1643           0 :             {
    1644           0 :               'content': {
    1645             :                 'ban': 50,
    1646           0 :                 'events': {'m.room.name': 100, 'm.room.power_levels': 100},
    1647             :                 'events_default': 0,
    1648             :                 'invite': 50,
    1649             :                 'kick': 50,
    1650             :                 'redact': 50,
    1651             :                 'state_default': 50,
    1652           0 :                 'users': {'@example:localhost': 100},
    1653             :                 'users_default': 0,
    1654           0 :                 'notifications': {'room': 20},
    1655             :               },
    1656             :               'type': 'm.room.power_levels',
    1657             :               'event_id': '\$143273582443PhrSn:example.org',
    1658             :               'room_id': '!636q39766251:example.com',
    1659             :               'sender': '@example:example.org',
    1660             :               'origin_server_ts': 1432735824653,
    1661           0 :               'unsigned': {'age': 1234},
    1662             :               'state_key': '',
    1663             :             }
    1664             :           ],
    1665           0 :       '/client/v3/rooms/!localpart:server.abc/event/1234': (var req) => {
    1666           0 :             'content': {
    1667             :               'body': 'This is an example text message',
    1668             :               'msgtype': 'm.text',
    1669             :               'format': 'org.matrix.custom.html',
    1670             :               'formatted_body': '<b>This is an example text message</b>',
    1671             :             },
    1672             :             'type': 'm.room.message',
    1673             :             'event_id': '143273582443PhrSn:example.org',
    1674             :             'room_id': '!localpart:server.abc',
    1675             :             'sender': '@example:example.org',
    1676             :             'origin_server_ts': 1432735824653,
    1677           0 :             'unsigned': {'age': 1234},
    1678             :           },
    1679           6 :       '/client/v3/rooms/!localpart%3Aserver.abc/event/1234': (var req) => {
    1680           3 :             'content': {
    1681             :               'body': 'This is an example text message',
    1682             :               'msgtype': 'm.text',
    1683             :               'format': 'org.matrix.custom.html',
    1684             :               'formatted_body': '<b>This is an example text message</b>',
    1685             :             },
    1686             :             'type': 'm.room.message',
    1687             :             'event_id': '143273582443PhrSn:example.org',
    1688             :             'room_id': '!localpart:server.abc',
    1689             :             'sender': '@example:example.org',
    1690             :             'origin_server_ts': 1432735824653,
    1691           3 :             'unsigned': {'age': 1234},
    1692             :           },
    1693           4 :       '/client/v3/rooms/!1234%3Aexample.com/event/not_found': (var req) => {
    1694             :             'errcode': 'M_NOT_FOUND',
    1695             :             'error': 'Event not found',
    1696             :           },
    1697             :       '/client/v3/rooms/!1234%3Aexample.com/event/unencrypted_event':
    1698           4 :           (var req) => {
    1699           2 :                 'content': {
    1700             :                   'body': 'This is an example text message',
    1701             :                   'msgtype': 'm.text',
    1702             :                   'format': 'org.matrix.custom.html',
    1703             :                   'formatted_body': '<b>This is an example text message</b>',
    1704             :                 },
    1705             :                 'type': 'm.room.message',
    1706             :                 'event_id': '143273582443PhrSn:example.org',
    1707             :                 'room_id': '!localpart:server.abc',
    1708             :                 'sender': '@example:example.org',
    1709             :                 'origin_server_ts': 1432735824653,
    1710           2 :                 'unsigned': {'age': 1234},
    1711             :               },
    1712           2 :       '/client/v3/rooms/!1234%3Aexample.com/event/encrypted_event': (var req) =>
    1713           2 :           {
    1714           2 :             'content': {
    1715             :               'algorithm': 'm.megolm.v1.aes-sha2',
    1716             :               'ciphertext': 'invalid',
    1717             :               'device_id': 'SOME_DEVICE',
    1718             :               'sender_key': 'invalid',
    1719             :               'session_id': 'not_found',
    1720             :             },
    1721             :             'type': 'm.room.encrypted',
    1722             :             'event_id': '143273582443PhrSn:example.org',
    1723             :             'room_id': '!localpart:server.abc',
    1724             :             'sender': '@example:example.org',
    1725             :             'origin_server_ts': 1432735824653,
    1726           2 :             'unsigned': {'age': 1234},
    1727             :           },
    1728             :       '/client/v3/rooms/!localpart%3Aserver.abc/messages?from=1234&dir=b&to=1234&limit=10&filter=%7B%22lazy_load_members%22%3Atrue%7D':
    1729           0 :           (var req) => messagesResponsePast,
    1730             :       '/client/v3/rooms/!localpart%3Aserver.abc/messages?from=&dir=b&limit=10&filter=%7B%22lazy_load_members%22%3Atrue%7D':
    1731           0 :           (var req) => messagesResponsePast,
    1732             :       '/client/v3/rooms/!1234%3Aexample.com/messages?from=1234&dir=b&limit=30&filter=%7B%22lazy_load_members%22%3Atrue%7D':
    1733           1 :           (var req) => messagesResponsePast,
    1734             :       '/client/v3/rooms/!localpart%3Aserver.abc/messages?from=t456&dir=f&to=1234&limit=10&filter=%7B%22lazy_load_members%22%3Atrue%7D':
    1735           0 :           (var req) => messagesResponseFuture,
    1736             :       '/client/v3/rooms/!1234%3Aexample.com/messages?from=t456&dir=f&limit=30&filter=%7B%22lazy_load_members%22%3Atrue%7D':
    1737           1 :           (var req) => messagesResponseFuture,
    1738             :       '/client/v3/rooms/!localpart%3Aserver.abc/messages?from=t789&dir=f&to=1234&limit=10&filter=%7B%22lazy_load_members%22%3Atrue%7D':
    1739           0 :           (var req) => messagesResponseFutureEnd,
    1740             :       '/client/v3/rooms/!1234%3Aexample.com/messages?from=t789&dir=f&limit=30&filter=%7B%22lazy_load_members%22%3Atrue%7D':
    1741           1 :           (var req) => messagesResponseFutureEnd,
    1742             :       '/client/v3/rooms/!5345234234%3Aexample.com/messages?from=t_1234a&dir=b&limit=30&filter=%7B%22lazy_load_members%22%3Atrue%7D':
    1743           4 :           (var req) => archivesMessageResponse,
    1744          70 :       '/client/versions': (var req) => {
    1745          35 :             'versions': ['v1.1', 'v1.2', 'v1.11'],
    1746          35 :             'unstable_features': {'m.lazy_load_members': true},
    1747             :           },
    1748          70 :       '/client/v3/login': (var req) => {
    1749          35 :             'flows': [
    1750          35 :               {'type': 'm.login.password'},
    1751             :             ],
    1752             :           },
    1753           0 :       '/client/v3/rooms/!localpart%3Aserver.abc/joined_members': (var req) => {
    1754           0 :             'joined': {
    1755           0 :               '@bar:example.com': {
    1756             :                 'display_name': 'Bar',
    1757             :                 'avatar_url': 'mxc://riot.ovh/printErCATzZijQsSDWorRaK',
    1758             :               },
    1759             :             },
    1760             :           },
    1761             :       '/client/v3/rooms/!localpart%3Aserver.abc/members?at=1234&membership=join&not_membership=leave':
    1762           0 :           (var req) => {
    1763           0 :                 'chunk': [
    1764           0 :                   {
    1765           0 :                     'content': {
    1766             :                       'membership': 'join',
    1767             :                       'avatar_url': 'mxc://example.org/SEsfnsuifSDFSSEF',
    1768             :                       'displayname': 'Alice Margatroid',
    1769             :                     },
    1770             :                     'type': 'm.room.member',
    1771             :                     'event_id': '§143273582443PhrSn:example.org',
    1772             :                     'room_id': '!636q39766251:example.com',
    1773             :                     'sender': '@alice:example.com',
    1774             :                     'origin_server_ts': 1432735824653,
    1775           0 :                     'unsigned': {'age': 1234},
    1776             :                     'state_key': '@alice:example.com',
    1777             :                   }
    1778             :                 ],
    1779             :               },
    1780           0 :       '/client/v3/rooms/!696r7674:example.com/members': (var req) => {
    1781           0 :             'chunk': [
    1782           0 :               {
    1783           0 :                 'content': {
    1784             :                   'membership': 'join',
    1785             :                   'avatar_url': 'mxc://example.org/SEsfnsuifSDFSSEF',
    1786             :                   'displayname': 'Alice Margatroid',
    1787             :                 },
    1788             :                 'type': 'm.room.member',
    1789             :                 'event_id': '§143273582443PhrSn:example.org',
    1790             :                 'room_id': '!636q39766251:example.com',
    1791             :                 'sender': '@alice:example.com',
    1792             :                 'origin_server_ts': 1432735824653,
    1793           0 :                 'unsigned': {'age': 1234},
    1794             :                 'state_key': '@alice:example.com',
    1795             :               }
    1796             :             ],
    1797             :           },
    1798           2 :       '/client/v3/rooms/!726s6s6q%3Aexample.com/members': (var req) => {
    1799           1 :             'chunk': [
    1800           1 :               {
    1801           1 :                 'content': {
    1802             :                   'membership': 'join',
    1803             :                   'avatar_url': 'mxc://example.org/SEsfnsuifSDFSSEF',
    1804             :                   'displayname': 'Alice Margatroid',
    1805             :                 },
    1806             :                 'type': 'm.room.member',
    1807             :                 'event_id': '§143273582443PhrSn:example.org',
    1808             :                 'room_id': '!636q39766251:example.com',
    1809             :                 'sender': '@alice:example.com',
    1810             :                 'origin_server_ts': 1432735824653,
    1811           1 :                 'unsigned': {'age': 1234},
    1812             :                 'state_key': '@alice:example.com',
    1813             :               }
    1814             :             ],
    1815             :           },
    1816           4 :       '/client/v3/rooms/!localpart%3Aserver.abc/members': (var req) => {
    1817           2 :             'chunk': [
    1818           2 :               {
    1819             :                 'type': 'm.room.member',
    1820           2 :                 'content': {'membership': 'join', 'displayname': 'YOU'},
    1821             :                 'sender': '@test:fakeServer.notExisting',
    1822             :                 'state_key': '@test:fakeServer.notExisting',
    1823             :                 'room_id': '!localpart%3Aserver.abc',
    1824             :                 'event_id': '§143273582443PhrSn2:example.org',
    1825             :                 'origin_server_ts': 1432735824653,
    1826           2 :                 'unsigned': {'age': 1234},
    1827             :               },
    1828           2 :               {
    1829             :                 'type': 'm.room.member',
    1830           2 :                 'content': {
    1831             :                   'membership': 'join',
    1832             :                   'displayname': 'Alice Margatroid',
    1833             :                 },
    1834             :                 'sender': '@alice:matrix.org',
    1835             :                 'state_key': '@alice:matrix.org',
    1836             :                 'room_id': '!localpart%3Aserver.abc',
    1837             :                 'event_id': '§143273582443PhrSn3:example.org',
    1838             :                 'origin_server_ts': 1432735824653,
    1839           2 :                 'unsigned': {'age': 1234},
    1840             :               },
    1841           2 :               {
    1842             :                 'type': 'm.room.member',
    1843           2 :                 'content': {'membership': 'invite', 'displayname': 'Bob'},
    1844             :                 'sender': '@bob:example.com',
    1845             :                 'state_key': '@bob:example.com',
    1846             :                 'room_id': '!localpart%3Aserver.abc',
    1847             :                 'event_id': '§143273582443PhrSn4:example.org',
    1848             :                 'origin_server_ts': 1432735824653,
    1849           2 :                 'unsigned': {'age': 1234},
    1850             :               },
    1851           2 :               {
    1852             :                 'type': 'm.room.member',
    1853           2 :                 'content': {'membership': 'invite', 'displayname': 'Charley'},
    1854             :                 'sender': '@charley:example.org',
    1855             :                 'state_key': '@charley:example.org',
    1856             :                 'room_id': '!localpart%3Aserver.abc',
    1857             :                 'event_id': '§143273582443PhrSn5:example.org',
    1858             :                 'origin_server_ts': 1432735824653,
    1859           2 :                 'unsigned': {'age': 1234},
    1860             :               },
    1861           2 :               {
    1862             :                 'type': 'm.room.member',
    1863           2 :                 'content': {
    1864             :                   'membership': 'join',
    1865             :                   'avatar_url': 'mxc://example.org/SEsfnsuifSDFSSEF',
    1866             :                   'displayname': 'Alice Margatroid',
    1867             :                 },
    1868             :                 'sender': '@example:example.org',
    1869             :                 'state_key': '@alice:example.org',
    1870             :                 'room_id': '!localpart%3Aserver.abc',
    1871             :                 'event_id': '§143273582443PhrSn6:example.org',
    1872             :                 'origin_server_ts': 1432735824653,
    1873           2 :                 'unsigned': {'age': 1234},
    1874             :               },
    1875             :             ],
    1876             :           },
    1877           0 :       '/client/v3/pushrules/global/content/nocake': (var req) => {
    1878           0 :             'actions': ['dont_notify'],
    1879             :             'pattern': 'cake*lie',
    1880             :             'rule_id': 'nocake',
    1881             :             'enabled': true,
    1882             :             'default': false,
    1883             :           },
    1884           0 :       '/client/v3/pushrules/global/content/nocake/enabled': (var req) => {
    1885             :             'enabled': true,
    1886             :           },
    1887           0 :       '/client/v3/pushrules/global/content/nocake/actions': (var req) => {
    1888           0 :             'actions': ['notify'],
    1889             :           },
    1890           0 :       '/client/v3/pushrules': (var req) => {
    1891           0 :             'global': {
    1892           0 :               'content': [
    1893           0 :                 {
    1894           0 :                   'actions': [
    1895             :                     'notify',
    1896           0 :                     {'set_tweak': 'sound', 'value': 'default'},
    1897           0 :                     {'set_tweak': 'highlight'},
    1898             :                   ],
    1899             :                   'default': true,
    1900             :                   'enabled': true,
    1901             :                   'pattern': 'alice',
    1902             :                   'rule_id': '.m.rule.contains_user_name',
    1903             :                 }
    1904             :               ],
    1905           0 :               'override': [
    1906           0 :                 {
    1907           0 :                   'actions': ['dont_notify'],
    1908           0 :                   'conditions': [],
    1909             :                   'default': true,
    1910             :                   'enabled': false,
    1911             :                   'rule_id': '.m.rule.master',
    1912             :                 },
    1913           0 :                 {
    1914           0 :                   'actions': ['dont_notify'],
    1915           0 :                   'conditions': [
    1916           0 :                     {
    1917             :                       'key': 'content.msgtype',
    1918             :                       'kind': 'event_match',
    1919             :                       'pattern': 'm.notice',
    1920             :                     }
    1921             :                   ],
    1922             :                   'default': true,
    1923             :                   'enabled': true,
    1924             :                   'rule_id': '.m.rule.suppress_notices',
    1925             :                 }
    1926             :               ],
    1927           0 :               'room': [],
    1928           0 :               'sender': [],
    1929           0 :               'underride': [
    1930           0 :                 {
    1931           0 :                   'actions': [
    1932             :                     'notify',
    1933           0 :                     {'set_tweak': 'sound', 'value': 'ring'},
    1934           0 :                     {'set_tweak': 'highlight', 'value': false},
    1935             :                   ],
    1936           0 :                   'conditions': [
    1937           0 :                     {
    1938             :                       'key': 'type',
    1939             :                       'kind': 'event_match',
    1940             :                       'pattern': 'm.call.invite',
    1941             :                     }
    1942             :                   ],
    1943             :                   'default': true,
    1944             :                   'enabled': true,
    1945             :                   'rule_id': '.m.rule.call',
    1946             :                 },
    1947           0 :                 {
    1948           0 :                   'actions': [
    1949             :                     'notify',
    1950           0 :                     {'set_tweak': 'sound', 'value': 'default'},
    1951           0 :                     {'set_tweak': 'highlight'},
    1952             :                   ],
    1953           0 :                   'conditions': [
    1954           0 :                     {'kind': 'contains_display_name'},
    1955             :                   ],
    1956             :                   'default': true,
    1957             :                   'enabled': true,
    1958             :                   'rule_id': '.m.rule.contains_display_name',
    1959             :                 },
    1960           0 :                 {
    1961           0 :                   'actions': [
    1962             :                     'notify',
    1963           0 :                     {'set_tweak': 'sound', 'value': 'default'},
    1964           0 :                     {'set_tweak': 'highlight', 'value': false},
    1965             :                   ],
    1966           0 :                   'conditions': [
    1967           0 :                     {'is': '2', 'kind': 'room_member_count'},
    1968             :                   ],
    1969             :                   'default': true,
    1970             :                   'enabled': true,
    1971             :                   'rule_id': '.m.rule.room_one_to_one',
    1972             :                 },
    1973           0 :                 {
    1974           0 :                   'actions': [
    1975             :                     'notify',
    1976           0 :                     {'set_tweak': 'sound', 'value': 'default'},
    1977           0 :                     {'set_tweak': 'highlight', 'value': false},
    1978             :                   ],
    1979           0 :                   'conditions': [
    1980           0 :                     {
    1981             :                       'key': 'type',
    1982             :                       'kind': 'event_match',
    1983             :                       'pattern': 'm.room.member',
    1984             :                     },
    1985           0 :                     {
    1986             :                       'key': 'content.membership',
    1987             :                       'kind': 'event_match',
    1988             :                       'pattern': 'invite',
    1989             :                     },
    1990           0 :                     {
    1991             :                       'key': 'state_key',
    1992             :                       'kind': 'event_match',
    1993             :                       'pattern': '@alice:example.com',
    1994             :                     }
    1995             :                   ],
    1996             :                   'default': true,
    1997             :                   'enabled': true,
    1998             :                   'rule_id': '.m.rule.invite_for_me',
    1999             :                 },
    2000           0 :                 {
    2001           0 :                   'actions': [
    2002             :                     'notify',
    2003           0 :                     {'set_tweak': 'highlight', 'value': false},
    2004             :                   ],
    2005           0 :                   'conditions': [
    2006           0 :                     {
    2007             :                       'key': 'type',
    2008             :                       'kind': 'event_match',
    2009             :                       'pattern': 'm.room.member',
    2010             :                     }
    2011             :                   ],
    2012             :                   'default': true,
    2013             :                   'enabled': true,
    2014             :                   'rule_id': '.m.rule.member_event',
    2015             :                 },
    2016           0 :                 {
    2017           0 :                   'actions': [
    2018             :                     'notify',
    2019           0 :                     {'set_tweak': 'highlight', 'value': false},
    2020             :                   ],
    2021           0 :                   'conditions': [
    2022           0 :                     {
    2023             :                       'key': 'type',
    2024             :                       'kind': 'event_match',
    2025             :                       'pattern': 'm.room.message',
    2026             :                     }
    2027             :                   ],
    2028             :                   'default': true,
    2029             :                   'enabled': true,
    2030             :                   'rule_id': '.m.rule.message',
    2031             :                 }
    2032             :               ],
    2033             :             },
    2034             :           },
    2035             :       '/client/v3/sync?filter=%7B%22room%22%3A%7B%22include_leave%22%3Atrue%2C%22state%22%3A%7B%22lazy_load_members%22%3Atrue%7D%2C%22timeline%22%3A%7B%22limit%22%3A10%7D%7D%7D&timeout=0':
    2036           6 :           (var req) => archiveSyncResponse,
    2037          66 :       '/client/v3/sync?filter=1234&timeout=0': (var req) => syncResponse,
    2038             :       '/client/v3/sync?filter=1234&since=1234&full_state=false&set_presence=unavailable&timeout=15':
    2039           0 :           (var req) => syncResponse,
    2040           1 :       '/client/v3/register/available?username=testuser': (var req) =>
    2041           1 :           {'available': true},
    2042             :       '/client/v3/user/${Uri.encodeComponent('@test:fakeServer.notExisting')}/filter/1234':
    2043           0 :           (var req) => {
    2044           0 :                 'room': {
    2045           0 :                   'state': {
    2046           0 :                     'types': ['m.room.*'],
    2047           0 :                     'not_rooms': ['!726s6s6q:example.com'],
    2048             :                   },
    2049           0 :                   'timeline': {
    2050             :                     'limit': 10,
    2051           0 :                     'types': ['m.room.message'],
    2052           0 :                     'not_rooms': ['!726s6s6q:example.com'],
    2053           0 :                     'not_senders': ['@spam:example.com'],
    2054             :                   },
    2055           0 :                   'ephemeral': {
    2056           0 :                     'types': ['m.receipt', 'm.typing'],
    2057           0 :                     'not_rooms': ['!726s6s6q:example.com'],
    2058           0 :                     'not_senders': ['@spam:example.com'],
    2059             :                   },
    2060           0 :                   'account_data': {
    2061           0 :                     'types': ['m.receipt', 'm.typing'],
    2062           0 :                     'not_rooms': ['!726s6s6q:example.com'],
    2063           0 :                     'not_senders': ['@spam:example.com'],
    2064             :                   },
    2065             :                 },
    2066           0 :                 'presence': {
    2067           0 :                   'types': ['m.presence'],
    2068           0 :                   'not_senders': ['@alice:example.com'],
    2069             :                 },
    2070             :                 'event_format': 'client',
    2071           0 :                 'event_fields': ['type', 'content', 'sender'],
    2072             :               },
    2073          10 :       '/client/v3/room_keys/version': (var req) => {
    2074             :             'algorithm': AlgorithmTypes.megolmBackupV1Curve25519AesSha2,
    2075           5 :             'auth_data': {
    2076             :               'public_key': 'GXYaxqhNhUK28zUdxOmEsFRguz+PzBsDlTLlF0O0RkM',
    2077           5 :               'signatures': {},
    2078             :             },
    2079             :             'count': 0,
    2080             :             'etag': '0',
    2081             :             'version': '5',
    2082             :           },
    2083             :       '/client/v3/room_keys/keys/${Uri.encodeComponent('!726s6s6q:example.com')}/${Uri.encodeComponent('ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU')}?version=5':
    2084           2 :           (var req) => {
    2085             :                 'first_message_index': 0,
    2086             :                 'forwarded_count': 0,
    2087             :                 'is_verified': true,
    2088           1 :                 'session_data': {
    2089             :                   'ephemeral': 'fwRxYh+seqLykz5mQCLypJ4/59URdcFJ2s69OU1dGRc',
    2090             :                   'ciphertext':
    2091             :                       '19jkQYlbgdP+VL9DH3qY/Dvpk6onJZgf+6frZFl1TinPCm9OMK9AZZLuM1haS9XLAUK1YsREgjBqfl6T+Tq8JlJ5ONZGg2Wttt24sGYc0iTMZJ8rXcNDeKMZhM96ETyjufJSeYoXLqifiVLDw9rrVBmNStF7PskYp040em+0OZ4pF85Cwsdf7l9V7MMynzh9BoXqVUCBiwT03PNYH9AEmNUxXX+6ZwCpe/saONv8MgGt5uGXMZIK29phA3D8jD6uV/WOHsB8NjHNq9FrfSEAsl+dAcS4uiYie4BKSSeQN+zGAQqu1MMW4OAdxGOuf8WpIINx7n+7cKQfxlmc/Cgg5+MmIm2H0oDwQ+Xu7aSxp1OCUzbxQRdjz6+tnbYmZBuH0Ov2RbEvC5tDb261LRqKXpub0llg5fqKHl01D0ahv4OAQgRs5oU+4mq+H2QGTwIFGFqP9tCRo0I+aICawpxYOfoLJpFW6KvEPnM2Lr3sl6Nq2fmkz6RL5F7nUtzxN8OKazLQpv8DOYzXbi7+ayEsqS0/EINetq7RfCqgjrEUgfNWYuFXWqvUT8lnxLdNu+8cyrJqh1UquFjXWTw1kWcJ0pkokVeBtK9YysCnF1UYh/Iv3rl2ZoYSSLNtuvMSYlYHggZ8xV8bz9S3X2/NwBycBiWIy5Ou/OuSX7trIKgkkmda0xjBWEM1a2acVuqu2OFbMn2zFxm2a3YwKP//OlIgMg',
    2092             :                   'mac': 'QzKV/fgAs4U',
    2093             :                 },
    2094             :               },
    2095             :       '/client/v3/room_keys/keys/${Uri.encodeComponent('!getroomkeys726s6s6q:example.com')}?version=5':
    2096           2 :           (var req) => {
    2097           1 :                 'sessions': {
    2098           1 :                   'ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU': {
    2099             :                     'first_message_index': 0,
    2100             :                     'forwarded_count': 0,
    2101             :                     'is_verified': true,
    2102           1 :                     'session_data': {
    2103             :                       'ephemeral':
    2104             :                           'fwRxYh+seqLykz5mQCLypJ4/59URdcFJ2s69OU1dGRc',
    2105             :                       'ciphertext':
    2106             :                           '19jkQYlbgdP+VL9DH3qY/Dvpk6onJZgf+6frZFl1TinPCm9OMK9AZZLuM1haS9XLAUK1YsREgjBqfl6T+Tq8JlJ5ONZGg2Wttt24sGYc0iTMZJ8rXcNDeKMZhM96ETyjufJSeYoXLqifiVLDw9rrVBmNStF7PskYp040em+0OZ4pF85Cwsdf7l9V7MMynzh9BoXqVUCBiwT03PNYH9AEmNUxXX+6ZwCpe/saONv8MgGt5uGXMZIK29phA3D8jD6uV/WOHsB8NjHNq9FrfSEAsl+dAcS4uiYie4BKSSeQN+zGAQqu1MMW4OAdxGOuf8WpIINx7n+7cKQfxlmc/Cgg5+MmIm2H0oDwQ+Xu7aSxp1OCUzbxQRdjz6+tnbYmZBuH0Ov2RbEvC5tDb261LRqKXpub0llg5fqKHl01D0ahv4OAQgRs5oU+4mq+H2QGTwIFGFqP9tCRo0I+aICawpxYOfoLJpFW6KvEPnM2Lr3sl6Nq2fmkz6RL5F7nUtzxN8OKazLQpv8DOYzXbi7+ayEsqS0/EINetq7RfCqgjrEUgfNWYuFXWqvUT8lnxLdNu+8cyrJqh1UquFjXWTw1kWcJ0pkokVeBtK9YysCnF1UYh/Iv3rl2ZoYSSLNtuvMSYlYHggZ8xV8bz9S3X2/NwBycBiWIy5Ou/OuSX7trIKgkkmda0xjBWEM1a2acVuqu2OFbMn2zFxm2a3YwKP//OlIgMg',
    2107             :                       'mac': 'QzKV/fgAs4U',
    2108             :                     },
    2109             :                   },
    2110             :                 },
    2111             :               },
    2112           2 :       '/client/v3/room_keys/keys?version=5': (var req) => {
    2113           1 :             'rooms': {
    2114           1 :               '!getallkeys726s6s6q:example.com': {
    2115           1 :                 'sessions': {
    2116           1 :                   'ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU': {
    2117             :                     'first_message_index': 0,
    2118             :                     'forwarded_count': 0,
    2119             :                     'is_verified': true,
    2120           1 :                     'session_data': {
    2121             :                       'ephemeral':
    2122             :                           'fwRxYh+seqLykz5mQCLypJ4/59URdcFJ2s69OU1dGRc',
    2123             :                       'ciphertext':
    2124             :                           '19jkQYlbgdP+VL9DH3qY/Dvpk6onJZgf+6frZFl1TinPCm9OMK9AZZLuM1haS9XLAUK1YsREgjBqfl6T+Tq8JlJ5ONZGg2Wttt24sGYc0iTMZJ8rXcNDeKMZhM96ETyjufJSeYoXLqifiVLDw9rrVBmNStF7PskYp040em+0OZ4pF85Cwsdf7l9V7MMynzh9BoXqVUCBiwT03PNYH9AEmNUxXX+6ZwCpe/saONv8MgGt5uGXMZIK29phA3D8jD6uV/WOHsB8NjHNq9FrfSEAsl+dAcS4uiYie4BKSSeQN+zGAQqu1MMW4OAdxGOuf8WpIINx7n+7cKQfxlmc/Cgg5+MmIm2H0oDwQ+Xu7aSxp1OCUzbxQRdjz6+tnbYmZBuH0Ov2RbEvC5tDb261LRqKXpub0llg5fqKHl01D0ahv4OAQgRs5oU+4mq+H2QGTwIFGFqP9tCRo0I+aICawpxYOfoLJpFW6KvEPnM2Lr3sl6Nq2fmkz6RL5F7nUtzxN8OKazLQpv8DOYzXbi7+ayEsqS0/EINetq7RfCqgjrEUgfNWYuFXWqvUT8lnxLdNu+8cyrJqh1UquFjXWTw1kWcJ0pkokVeBtK9YysCnF1UYh/Iv3rl2ZoYSSLNtuvMSYlYHggZ8xV8bz9S3X2/NwBycBiWIy5Ou/OuSX7trIKgkkmda0xjBWEM1a2acVuqu2OFbMn2zFxm2a3YwKP//OlIgMg',
    2125             :                       'mac': 'QzKV/fgAs4U',
    2126             :                     },
    2127             :                   },
    2128             :                 },
    2129             :               },
    2130             :             },
    2131             :           },
    2132           4 :       '/client/unstable/org.matrix.msc3814.v1/dehydrated_device': (var _) => {
    2133             :             'device_id': 'DEHYDDEV',
    2134           2 :             'device_data': {'algorithm': 'some.famedly.proprietary.algorithm'},
    2135             :           },
    2136             :     },
    2137             :     'POST': {
    2138           2 :       '/client/v3/refresh': (var req) => {
    2139             :             'access_token': 'a_new_token',
    2140           2 :             'expires_in_ms': 1000 * 60 * 5,
    2141             :             'refresh_token': 'another_new_token',
    2142             :           },
    2143           0 :       '/client/v3/delete_devices': (var req) => {},
    2144           0 :       '/client/v3/account/3pid/add': (var req) => {},
    2145           0 :       '/client/v3/account/3pid/bind': (var req) => {},
    2146           0 :       '/client/v3/account/3pid/delete': (var req) =>
    2147           0 :           {'id_server_unbind_result': 'success'},
    2148           0 :       '/client/v3/account/3pid/unbind': (var req) =>
    2149           0 :           {'id_server_unbind_result': 'success'},
    2150           2 :       '/client/v3/account/password': (var req) => {},
    2151           0 :       '/client/v3/rooms/1234/report/1234': (var req) => {},
    2152           0 :       '/client/v3/search': (var req) => {
    2153           0 :             'search_categories': {
    2154           0 :               'room_events': {
    2155           0 :                 'groups': {
    2156           0 :                   'room_id': {
    2157           0 :                     '!qPewotXpIctQySfjSy:localhost': {
    2158             :                       'order': 1,
    2159             :                       'next_batch': 'BdgFsdfHSf-dsFD',
    2160           0 :                       'results': ['\$144429830826TWwbB:localhost'],
    2161             :                     },
    2162             :                   },
    2163             :                 },
    2164           0 :                 'highlights': ['martians', 'men'],
    2165             :                 'next_batch': '5FdgFsd234dfgsdfFD',
    2166             :                 'count': 1224,
    2167           0 :                 'results': [
    2168           0 :                   {
    2169             :                     'rank': 0.00424866,
    2170           0 :                     'result': {
    2171           0 :                       'content': {
    2172             :                         'body': 'This is an example text message',
    2173             :                         'msgtype': 'm.text',
    2174             :                         'format': 'org.matrix.custom.html',
    2175             :                         'formatted_body':
    2176             :                             '<b>This is an example text message</b>',
    2177             :                       },
    2178             :                       'type': 'm.room.message',
    2179             :                       'event_id': '\$144429830826TWwbB:localhost',
    2180             :                       'room_id': '!qPewotXpIctQySfjSy:localhost',
    2181             :                       'sender': '@example:example.org',
    2182             :                       'origin_server_ts': 1432735824653,
    2183           0 :                       'unsigned': {'age': 1234},
    2184             :                     },
    2185             :                   }
    2186             :                 ],
    2187             :               },
    2188             :             },
    2189             :           },
    2190           0 :       '/client/v3/account/deactivate': (var req) =>
    2191           0 :           {'id_server_unbind_result': 'success'},
    2192           0 :       '/client/v3/user_directory/search': (var req) => {
    2193           0 :             'results': [
    2194           0 :               {
    2195             :                 'user_id': '@foo:bar.com',
    2196             :                 'display_name': 'Foo',
    2197             :                 'avatar_url': 'mxc://bar.com/foo',
    2198             :               }
    2199             :             ],
    2200             :             'limited': false,
    2201             :           },
    2202           0 :       '/client/v3/register/email/requestToken': (var req) => {
    2203             :             'sid': '123abc',
    2204             :             'submit_url': 'https://example.org/path/to/submitToken',
    2205             :           },
    2206           0 :       '/client/v3/register/msisdn/requestToken': (var req) => {
    2207             :             'sid': '123abc',
    2208             :             'submit_url': 'https://example.org/path/to/submitToken',
    2209             :           },
    2210           0 :       '/client/v3/account/password/email/requestToken': (var req) => {
    2211             :             'sid': '123abc',
    2212             :             'submit_url': 'https://example.org/path/to/submitToken',
    2213             :           },
    2214           0 :       '/client/v3/account/password/msisdn/requestToken': (var req) => {
    2215             :             'sid': '123abc',
    2216             :             'submit_url': 'https://example.org/path/to/submitToken',
    2217             :           },
    2218           0 :       '/client/v3/account/3pid/email/requestToken': (var req) => {
    2219             :             'sid': '123abc',
    2220             :             'submit_url': 'https://example.org/path/to/submitToken',
    2221             :           },
    2222           0 :       '/client/v3/account/3pid/msisdn/requestToken': (var req) => {
    2223             :             'sid': '123abc',
    2224             :             'submit_url': 'https://example.org/path/to/submitToken',
    2225             :           },
    2226             :       '/client/v3/rooms/!localpart%3Aexample.com/receipt/m.read/%241234%3Aexample.com':
    2227           0 :           (var req) => {},
    2228           0 :       '/client/v3/rooms/!localpart%3Aexample.com/read_markers': (var req) => {},
    2229           4 :       '/client/v3/rooms/!1234%3Aexample.com/read_markers': (var req) => {},
    2230             :       '/client/v3/user/${Uri.encodeComponent('@othertest:fakeServer.notExisting')}/filter':
    2231           4 :           (var req) => {'filter_id': '1234'},
    2232             :       '/client/v3/user/${Uri.encodeComponent('@test:fakeServer.notExisting')}/filter':
    2233          66 :           (var req) => {'filter_id': '1234'},
    2234           0 :       '/client/v3/publicRooms?server=example.com': (var req) => {
    2235           0 :             'chunk': [
    2236           0 :               {
    2237           0 :                 'aliases': ['#murrays:cheese.bar'],
    2238             :                 'canonical_alias': '#murrays:cheese.bar',
    2239             :                 'avatar_url': 'mxc://bleeker.street/CHEDDARandBRIE',
    2240             :                 'guest_can_join': false,
    2241             :                 'name': 'CHEESE',
    2242             :                 'num_joined_members': 37,
    2243             :                 'room_id': '!ol19s:bleecker.street',
    2244             :                 'topic': 'Tasty tasty cheese',
    2245             :                 'world_readable': true,
    2246             :               }
    2247             :             ],
    2248             :             'next_batch': 'p190q',
    2249             :             'prev_batch': 'p1902',
    2250             :             'total_room_count_estimate': 115,
    2251             :           },
    2252          20 :       '/client/v3/keys/claim': (var req) => {
    2253          10 :             'failures': {},
    2254          10 :             'one_time_keys': {
    2255          30 :               if (decodeJson(req)['one_time_keys']['@alice:example.com'] !=
    2256             :                   null)
    2257          12 :                 '@alice:example.com': {
    2258           6 :                   'JLAFKJWSCS': {
    2259           6 :                     'signed_curve25519:AAAAAQ': {
    2260             :                       'key': 'ikMXajRlkS7Xi9CROrAh3jXnbygk8mLBdSaY9/al0X0',
    2261           6 :                       'signatures': {
    2262           6 :                         '@alice:example.com': {
    2263             :                           'ed25519:JLAFKJWSCS':
    2264             :                               'XdboCa0Ljoh0Y0i/IVnmMqy/+T1hJyu8BA/nRYniJMQ7QWh/pGS5AsWswdARD+MAX+r4u98Qzk0y27HUddZXDA',
    2265             :                         },
    2266             :                       },
    2267             :                     },
    2268             :                   },
    2269             :                 },
    2270          20 :               if (decodeJson(req)['one_time_keys']
    2271          10 :                       ['@test:fakeServer.notExisting'] !=
    2272             :                   null)
    2273          12 :                 '@test:fakeServer.notExisting': {
    2274           6 :                   'GHTYAJCE': {
    2275           6 :                     'signed_curve25519:AAAAAQ': {
    2276             :                       'key': 'qc72ve94cA28iuE0fXa98QO3uls39DHWdQlYyvvhGh0',
    2277           6 :                       'signatures': {
    2278           6 :                         '@test:fakeServer.notExisting': {
    2279             :                           'ed25519:GHTYAJCE':
    2280             :                               'dFwffr5kTKefO7sjnWLMhTzw7oV31nkPIDRxFy5OQT2OP5++Ao0KRbaBZ6qfuT7lW1owKK0Xk3s7QTBvc/eNDA',
    2281             :                         },
    2282             :                       },
    2283             :                     },
    2284             :                   },
    2285             :                 },
    2286             :             },
    2287             :           },
    2288           0 :       '/client/v3/rooms/!localpart%3Aexample.com/invite': (var req) => {},
    2289           2 :       '/client/v3/rooms/!1234%3AfakeServer.notExisting/invite': (var req) => {},
    2290           0 :       '/client/v3/rooms/!localpart%3Aexample.com/leave': (var req) => {},
    2291           2 :       '/client/v3/rooms/!1234%3AfakeServer.notExisting/leave': (var req) => {},
    2292           0 :       '/client/v3/rooms/!localpart%3Aexample.com/forget': (var req) => {},
    2293           8 :       '/client/v3/rooms/!localpart%3Aserver.abc/kick': (var req) => {},
    2294           2 :       '/client/v3/rooms/!1234%3AfakeServer.notExisting/kick': (var req) => {},
    2295           0 :       '/client/v3/rooms/!localpart%3Aexample.com/kick': (var req) => {},
    2296           0 :       '/client/v3/rooms/!localpart%3Aexample.com/ban': (var req) => {},
    2297           2 :       '/client/v3/rooms/!1234%3AfakeServer.notExisting/ban': (var req) => {},
    2298           0 :       '/client/v3/rooms/!localpart%3Aexample.com/unban': (var req) => {},
    2299           2 :       '/client/v3/rooms/!1234%3AfakeServer.notExisting/unban': (var req) => {},
    2300           0 :       '/client/v3/rooms/!localpart%3Aexample.com/join': (var req) =>
    2301           0 :           {'room_id': '!localpart:example.com'},
    2302             :       '/client/v3/join/!localpart%3Aexample.com?server_name=example.com&server_name=example.abc':
    2303           0 :           (var req) => {'room_id': '!localpart:example.com'},
    2304           1 :       '/client/v3/join/!newroom%3Aexample.com': (var req) =>
    2305           1 :           {'room_id': '!newroom%3A:example.com'},
    2306          10 :       '/client/v3/keys/upload': (var req) => {
    2307           5 :             'one_time_key_counts': {
    2308             :               'curve25519': 10,
    2309             :               'signed_curve25519':
    2310          10 :                   tryCast<Map<String, Object?>>(decodeJson(req))
    2311           5 :                           ?.tryGetMap<String, Object?>('one_time_keys')
    2312           5 :                           ?.keys
    2313           5 :                           .length ??
    2314             :                       0,
    2315             :             },
    2316             :           },
    2317          64 :       '/client/v3/keys/query': (var req) => {
    2318          32 :             'failures': {},
    2319          32 :             'device_keys': {
    2320          32 :               '@alice:example.com': {
    2321          32 :                 'JLAFKJWSCS': {
    2322             :                   'user_id': '@alice:example.com',
    2323             :                   'device_id': 'JLAFKJWSCS',
    2324          32 :                   'algorithms': [
    2325             :                     AlgorithmTypes.olmV1Curve25519AesSha2,
    2326             :                     AlgorithmTypes.megolmV1AesSha2,
    2327             :                   ],
    2328          32 :                   'keys': {
    2329             :                     'curve25519:JLAFKJWSCS':
    2330             :                         'L+4+JCl8MD63dgo8z5Ta+9QAHXiANyOVSfgbHA5d3H8',
    2331             :                     'ed25519:JLAFKJWSCS':
    2332             :                         'rUFJftIWpFF/jqqz3bexGGYiG8UobKhzkeabqw1v0zM',
    2333             :                   },
    2334          32 :                   'signatures': {
    2335          32 :                     '@alice:example.com': {
    2336             :                       'ed25519:JLAFKJWSCS':
    2337             :                           'go3mi5o3Ile+Ik+lCEpHmBmyJmKWfnRDCBBvfaVlKsMyha5IORuYcxwEUrAeLyAeeeHvkWDFX+No5eY1jYeKBw',
    2338             :                     },
    2339             :                   },
    2340          32 :                   'unsigned': {'device_display_name': 'Alices mobile phone'},
    2341             :                 },
    2342          32 :                 'OTHERDEVICE': {
    2343             :                   'user_id': '@alice:example.com',
    2344             :                   'device_id': 'OTHERDEVICE',
    2345          32 :                   'algorithms': [
    2346             :                     AlgorithmTypes.olmV1Curve25519AesSha2,
    2347             :                     AlgorithmTypes.megolmV1AesSha2,
    2348             :                   ],
    2349          32 :                   'keys': {
    2350             :                     'curve25519:OTHERDEVICE':
    2351             :                         'wMIDhiQl5jEXQrTB03ePOSQfR8sA/KMrW0CIfFfXKEE',
    2352             :                     'ed25519:OTHERDEVICE':
    2353             :                         '2Lyaj5NB7HPqKZMjZpA/pECXuQ+9wi8AGFdw33y3DuQ',
    2354             :                   },
    2355          32 :                   'signatures': {
    2356          32 :                     '@alice:example.com': {
    2357             :                       'ed25519:OTHERDEVICE':
    2358             :                           'bwHd6ylISP13AICdDPd0HQd4V6dvvd4vno8/OwUNdm9UAprr3YjkDqVw425I74u2UQAarq9bytBqVqFyD6trAw',
    2359             :                     },
    2360             :                   },
    2361             :                 },
    2362             :               },
    2363          32 :               '@test:fakeServer.notExisting': {
    2364          32 :                 'GHTYAJCE': {
    2365             :                   'user_id': '@test:fakeServer.notExisting',
    2366             :                   'device_id': 'GHTYAJCE',
    2367          32 :                   'algorithms': [
    2368             :                     AlgorithmTypes.olmV1Curve25519AesSha2,
    2369             :                     AlgorithmTypes.megolmV1AesSha2,
    2370             :                   ],
    2371          32 :                   'keys': {
    2372             :                     'curve25519:GHTYAJCE':
    2373             :                         '7rvl3jORJkBiK4XX1e5TnGnqz068XfYJ0W++Ml63rgk',
    2374             :                     'ed25519:GHTYAJCE':
    2375             :                         'gjL//fyaFHADt9KBADGag8g7F8Up78B/K1zXeiEPLJo',
    2376             :                   },
    2377          32 :                   'signatures': {
    2378          32 :                     '@test:fakeServer.notExisting': {
    2379             :                       'ed25519:GHTYAJCE':
    2380             :                           'NEQeTgv7ew1IZSLQphWd0y60EdHdcNfHgvoaMQco5XKeIYyiUZIWd7F4x/mkPDjUizv6yWMbTDCWdSg5XcgNBA',
    2381             :                       'ed25519:F9ypFzgbISXCzxQhhSnXMkc1vq12Luna3Nw5rqViOJY':
    2382             :                           'Q4/55vZjEJD7M2EC40bgZqd9Zuy/4C75UPVopJdXeioQVaKtFf6EF0nUUuql0yD+r3hinsZcock0wO6Q2xcoAQ',
    2383             :                     },
    2384             :                   },
    2385             :                 },
    2386          32 :                 'OTHERDEVICE': {
    2387             :                   'user_id': '@test:fakeServer.notExisting',
    2388             :                   'device_id': 'OTHERDEVICE',
    2389          32 :                   'algorithms': [
    2390             :                     AlgorithmTypes.olmV1Curve25519AesSha2,
    2391             :                     AlgorithmTypes.megolmV1AesSha2,
    2392             :                   ],
    2393          32 :                   'keys': {
    2394             :                     'curve25519:OTHERDEVICE':
    2395             :                         'R96BA0qE1+QAWLp7E1jyWSTJ1VXMLpEdiM2SZHlKMXM',
    2396             :                     'ed25519:OTHERDEVICE':
    2397             :                         'EQo9eYbSygIbOR+tVJziqAY1NI6Gga+JQOVIqJe4mr4',
    2398             :                   },
    2399          32 :                   'signatures': {
    2400          32 :                     '@test:fakeServer.notExisting': {
    2401             :                       'ed25519:OTHERDEVICE':
    2402             :                           '/rT6pVRypJWxGos1QcI7jHL9HwcA83nkHLHqMcRPeLSxXHh4oHWvC0/tl0Xg06ogyiGw4NuB7TpOISvJBdt7BA',
    2403             :                       'ed25519:F9ypFzgbISXCzxQhhSnXMkc1vq12Luna3Nw5rqViOJY':
    2404             :                           'qnjiLl36h/1jlLvcAgt46Igaod2T9lOSnoSVkV0KC+c7vYIjG4QBzXpH+hycfufOT/y+a/kl52dUTLQWctMKCA',
    2405             :                     },
    2406             :                   },
    2407             :                 },
    2408             :               },
    2409          32 :               '@othertest:fakeServer.notExisting': {
    2410          32 :                 'FOXDEVICE': {
    2411             :                   'user_id': '@othertest:fakeServer.notExisting',
    2412             :                   'device_id': 'FOXDEVICE',
    2413          32 :                   'algorithms': [
    2414             :                     AlgorithmTypes.olmV1Curve25519AesSha2,
    2415             :                     AlgorithmTypes.megolmV1AesSha2,
    2416             :                   ],
    2417          32 :                   'keys': {
    2418             :                     'curve25519:FOXDEVICE':
    2419             :                         'JBG7ZaPn54OBC7TuIEiylW3BZ+7WcGQhFBPB9pogbAg',
    2420             :                     'ed25519:FOXDEVICE':
    2421             :                         'R5/p04tticvdlNIxiiBIP0j9OQWv8ep6eEU6/lWKDxw',
    2422             :                   },
    2423          32 :                   'signatures': {
    2424          32 :                     '@othertest:fakeServer.notExisting': {
    2425             :                       'ed25519:FOXDEVICE':
    2426             :                           '2lJ3atmRIWgkyQNC9gvWEpxwuozsBQsg33M2IMDJqLhx/+g3Ds1vQ683dJsYIu04ORa4U0L9TqieHVpV/7qqDA',
    2427             :                     },
    2428             :                   },
    2429             :                 },
    2430             :               },
    2431             :             },
    2432          32 :             'master_keys': {
    2433          32 :               '@test:fakeServer.notExisting': {
    2434             :                 'user_id': '@test:fakeServer.notExisting',
    2435          32 :                 'usage': ['master'],
    2436          32 :                 'keys': {
    2437             :                   'ed25519:82mAXjsmbTbrE6zyShpR869jnrANO75H8nYY0nDLoJ8':
    2438             :                       '82mAXjsmbTbrE6zyShpR869jnrANO75H8nYY0nDLoJ8',
    2439             :                 },
    2440          32 :                 'signatures': {},
    2441             :               },
    2442          32 :               '@othertest:fakeServer.notExisting': {
    2443             :                 'user_id': '@othertest:fakeServer.notExisting',
    2444          32 :                 'usage': ['master'],
    2445          32 :                 'keys': {
    2446             :                   'ed25519:92mAXjsmbTbrE6zyShpR869jnrANO75H8nYY0nDLoJ8':
    2447             :                       '92mAXjsmbTbrE6zyShpR869jnrANO75H8nYY0nDLoJ8',
    2448             :                 },
    2449          32 :                 'signatures': {},
    2450             :               },
    2451             :             },
    2452          32 :             'self_signing_keys': {
    2453          32 :               '@test:fakeServer.notExisting': {
    2454             :                 'user_id': '@test:fakeServer.notExisting',
    2455          32 :                 'usage': ['self_signing'],
    2456          32 :                 'keys': {
    2457             :                   'ed25519:F9ypFzgbISXCzxQhhSnXMkc1vq12Luna3Nw5rqViOJY':
    2458             :                       'F9ypFzgbISXCzxQhhSnXMkc1vq12Luna3Nw5rqViOJY',
    2459             :                 },
    2460          32 :                 'signatures': {
    2461          32 :                   '@test:fakeServer.notExisting': {
    2462             :                     'ed25519:82mAXjsmbTbrE6zyShpR869jnrANO75H8nYY0nDLoJ8':
    2463             :                         'afkrbGvPn5Zb5zc7Lk9cz2skI3QrzI/L0st1GS+/GATxNjMzc6vKmGu7r9cMb1GJxy4RdeUpfH3L7Fs/fNL1Dw',
    2464             :                   },
    2465             :                 },
    2466             :               },
    2467          32 :               '@othertest:fakeServer.notExisting': {
    2468             :                 'user_id': '@othertest:fakeServer.notExisting',
    2469          32 :                 'usage': ['self_signing'],
    2470          32 :                 'keys': {
    2471             :                   'ed25519:self_signing': 'self_signing',
    2472             :                 },
    2473          32 :                 'signatures': {},
    2474             :               },
    2475             :             },
    2476          32 :             'user_signing_keys': {
    2477          32 :               '@test:fakeServer.notExisting': {
    2478             :                 'user_id': '@test:fakeServer.notExisting',
    2479          32 :                 'usage': ['user_signing'],
    2480          32 :                 'keys': {
    2481             :                   'ed25519:0PiwulzJ/RU86LlzSSZ8St80HUMN3dqjKa/orIJoA0g':
    2482             :                       '0PiwulzJ/RU86LlzSSZ8St80HUMN3dqjKa/orIJoA0g',
    2483             :                 },
    2484          32 :                 'signatures': {
    2485          32 :                   '@test:fakeServer.notExisting': {
    2486             :                     'ed25519:82mAXjsmbTbrE6zyShpR869jnrANO75H8nYY0nDLoJ8':
    2487             :                         'pvgbZxEbllaElhpiRnb7/uOIUhrglvHCFnpoxr3/5ZrWa0EK/uaefhex9eEV4uBLrHjHg2ymwdNaM7ap9+sBBg',
    2488             :                   },
    2489             :                 },
    2490             :               },
    2491          32 :               '@othertest:fakeServer.notExisting': {
    2492             :                 'user_id': '@othertest:fakeServer.notExisting',
    2493          32 :                 'usage': ['user_signing'],
    2494          32 :                 'keys': {
    2495             :                   'ed25519:user_signing': 'user_signing',
    2496             :                 },
    2497          32 :                 'signatures': {},
    2498             :               },
    2499             :             },
    2500             :           },
    2501           0 :       '/client/v3/register': (var req) => {
    2502             :             'user_id': '@testuser:example.com',
    2503             :             'access_token': '1234',
    2504             :             'device_id': 'ABCD',
    2505             :           },
    2506           0 :       '/client/v3/register?kind=user': (var req) =>
    2507           0 :           {'user_id': '@testuser:example.com'},
    2508           0 :       '/client/v3/register?kind=guest': (var req) =>
    2509           0 :           {'user_id': '@testuser:example.com'},
    2510           0 :       '/client/v3/rooms/1234/upgrade': (var req) => {},
    2511           0 :       '/client/v3/user/1234/openid/request_token': (var req) => {
    2512             :             'access_token': 'SomeT0kenHere',
    2513             :             'token_type': 'Bearer',
    2514             :             'matrix_server_name': 'example.com',
    2515             :             'expires_in': 3600.0,
    2516             :           },
    2517             :       '/client/v3/user/@test:fakeServer.notExisting/openid/request_token':
    2518           0 :           (var req) => {
    2519             :                 'access_token': 'SomeT0kenHere',
    2520             :                 'token_type': 'Bearer',
    2521             :                 'matrix_server_name': 'example.com',
    2522             :                 'expires_in': 3600,
    2523             :               },
    2524          10 :       '/client/v3/login': (var req) => {
    2525             :             'user_id': '@test:fakeServer.notExisting',
    2526             :             'access_token': 'abc123',
    2527             :             'refresh_token': 'refresh_abc123',
    2528             :             'device_id': 'GHTYAJCE',
    2529           5 :             'well_known': {
    2530           5 :               'm.homeserver': {'base_url': 'https://example.org'},
    2531           5 :               'm.identity_server': {'base_url': 'https://id.example.org'},
    2532             :             },
    2533             :           },
    2534           4 :       '/media/v3/upload?filename=file.jpeg': (var req) =>
    2535           4 :           {'content_uri': 'mxc://example.com/AQwafuaFswefuhsfAFAgsw'},
    2536          20 :       '/client/v3/logout': (var reqI) => {},
    2537           0 :       '/client/v3/pushers/set': (var reqI) => {},
    2538           0 :       '/client/v3/join/1234': (var reqI) => {'room_id': '1234'},
    2539           0 :       '/client/v3/logout/all': (var reqI) => {},
    2540          12 :       '/client/v3/createRoom': (var reqI) => {
    2541             :             'room_id': '!1234:fakeServer.notExisting',
    2542             :           },
    2543           4 :       '/client/v3/rooms/!localpart%3Aserver.abc/read_markers': (var reqI) => {},
    2544           0 :       '/client/v3/rooms/!localpart:server.abc/kick': (var reqI) => {},
    2545           8 :       '/client/v3/rooms/!localpart%3Aserver.abc/ban': (var reqI) => {},
    2546           8 :       '/client/v3/rooms/!localpart%3Aserver.abc/unban': (var reqI) => {},
    2547           4 :       '/client/v3/rooms/!localpart%3Aserver.abc/invite': (var reqI) => {},
    2548          21 :       '/client/v3/keys/signatures/upload': (var reqI) => {'failures': {}},
    2549           2 :       '/client/v3/room_keys/version': (var reqI) => {'version': '5'},
    2550             :       '/client/unstable/org.matrix.msc3814.v1/dehydrated_device/DEHYDDEV/events?limit=100':
    2551           4 :           (var _) => {
    2552           2 :                 'events': [
    2553           2 :                   {
    2554             :                     // this is the commented out m.room_key event - only encrypted
    2555             :                     'sender': '@othertest:fakeServer.notExisting',
    2556           2 :                     'content': {
    2557             :                       'algorithm': AlgorithmTypes.olmV1Curve25519AesSha2,
    2558             :                       'sender_key':
    2559             :                           'JBG7ZaPn54OBC7TuIEiylW3BZ+7WcGQhFBPB9pogbAg',
    2560           2 :                       'ciphertext': {
    2561           2 :                         '7rvl3jORJkBiK4XX1e5TnGnqz068XfYJ0W++Ml63rgk': {
    2562             :                           'type': 0,
    2563             :                           'body':
    2564             :                               'Awogyh7K4iLUQjcOxIfi7q7LhBBqv9w0mQ6JI9+U9tv7iF4SIHC6xb5YFWf9voRnmDBbd+0vxD/xDlVNRDlPIKliLGkYGiAkEbtlo+fng4ELtO4gSLKVbcFn7tZwZCEUE8H2miBsCCKABgMKIFrKDJwB7gM3lXPt9yVoh6gQksafKt7VFCNRN5KLKqsDEAAi0AX5EfTV7jJ1ZWAbxftjoSN6kCVIxzGclbyg1HjchmNCX7nxNCHWl+q5ZgqHYZVu2n2mCVmIaKD0kvoEZeY3tV1Itb6zf67BLaU0qgW/QzHCHg5a44tNLjucvL2mumHjIG8k0BY2uh+52HeiMCvSOvtDwHg7nzCASGdqPVCj9Kzw6z7F6nL4e3mYim8zvJd7f+mD9z3ARrypUOLGkTGYbB2PQOovf0Do8WzcaRzfaUCnuu/YVZWKK7DPgG8uhw/TjR6XtraAKZysF+4DJYMG9SQWx558r6s7Z5EUOF5CU2M35w1t1Xxllb3vrS83dtf9LPCrBhLsEBeYEUBE2+bTBfl0BDKqLiB0Cc0N0ixOcHIt6e40wAvW622/gMgHlpNSx8xG12u0s6h6EMWdCXXLWd9fy2q6glFUHvA67A35q7O+M8DVml7Y9xG55Y3DHkMDc9cwgwFkBDCAYQe6pQF1nlKytcVCGREpBs/gq69gHAStMQ8WEg38Lf8u8eBr2DFexrN4U+QAk+S//P3fJgf0bQx/Eosx4fvWSz9En41iC+ADCsWQpMbwHn4JWvtAbn3oW0XmL/OgThTkJMLiCymduYAa1Hnt7a3tP0KTL2/x11F02ggQHL28cCjq5W4zUGjWjl5wo2PsKB6t8aAvMg2ujGD2rCjb4yrv5VIzAKMOZLyj7K0vSK9gwDLQ/4vq+QnKUBG5zrcOze0hX+kz2909/tmAdeCH61Ypw7gbPUJAKnmKYUiB/UgwkJvzMJSsk/SEs5SXosHDI+HsJHJp4Mp4iKD0xRMst+8f9aTjaWwh8ZvELE1ZOhhCbF3RXhxi3x2Nu8ORIz+vhEQ1NOlMc7UIo98Fk/96T36vL/fviowT4C/0AlaapZDJBmKwhmwqisMjY2n1vY29oM2p5BzY1iwP7q9BYdRFst6xwo57TNSuRwQw7IhFsf0k+ABuPEZy5xB5nPHyIRTf/pr3Hw',
    2565             :                         },
    2566             :                       },
    2567             :                     },
    2568             :                     'type': 'm.room.encrypted',
    2569             :                   },
    2570             :                 ],
    2571             :                 'next_batch': 'd1',
    2572             :               },
    2573             :     },
    2574             :     'PUT': {
    2575             :       '/client/v3/user/${Uri.encodeComponent('@alice:example.com')}/account_data/io.element.recent_emoji}':
    2576           0 :           (var req) => {},
    2577             :       '/client/v3/user/%40test%3AfakeServer.notExisting/account_data/io.element.recent_emoji':
    2578           2 :           (var req) => {},
    2579             :       '/client/v3/user/%40test%3AfakeServer.notExisting/account_data/m.ignored_user_list':
    2580           2 :           (var req) => {},
    2581             :       '/client/v3/presence/${Uri.encodeComponent('@alice:example.com')}/status':
    2582           0 :           (var req) => {},
    2583           0 :       '/client/v3/pushrules/global/content/nocake/enabled': (var req) => {},
    2584           0 :       '/client/v3/pushrules/global/content/nocake/actions': (var req) => {},
    2585             :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.history_visibility':
    2586           4 :           (var req) => {'event_id': '1234'},
    2587             :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.join_rules':
    2588           4 :           (var req) => {'event_id': '1234'},
    2589             :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.guest_access':
    2590           4 :           (var req) => {'event_id': '1234'},
    2591             :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.invite/1234':
    2592           4 :           (var req) => {'event_id': '1234'},
    2593             :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.answer/1234':
    2594           4 :           (var req) => {'event_id': '1234'},
    2595             :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.select_answer/1234':
    2596           4 :           (var req) => {'event_id': '1234'},
    2597             :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.reject/1234':
    2598           4 :           (var req) => {'event_id': '1234'},
    2599             :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.negotiate/1234':
    2600           4 :           (var req) => {'event_id': '1234'},
    2601             :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.candidates/1234':
    2602           4 :           (var req) => {'event_id': '1234'},
    2603             :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.hangup/1234':
    2604           4 :           (var req) => {'event_id': '1234'},
    2605             :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.replaces/1234':
    2606           4 :           (var req) => {'event_id': '1234'},
    2607             :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.asserted_identity/1234':
    2608           4 :           (var req) => {'event_id': '1234'},
    2609             :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.sdp_stream_metadata_changed/1234':
    2610           4 :           (var req) => {'event_id': '1234'},
    2611             :       '/client/v3/rooms/!calls%3Aexample.com/send/org.matrix.call.sdp_stream_metadata_changed/1234':
    2612           0 :           (var req) => {'event_id': '1234'},
    2613             :       '/client/v3/rooms/!calls%3Aexample.com/send/org.matrix.call.asserted_identity/1234':
    2614           0 :           (var req) => {'event_id': '1234'},
    2615             :       '/client/v3/rooms/!1234%3Aexample.com/redact/1143273582443PhrSn%3Aexample.org/1234':
    2616           2 :           (var req) => {'event_id': '1234'},
    2617           2 :       '/client/v3/pushrules/global/room/!localpart%3Aserver.abc': (var req) =>
    2618           2 :           {},
    2619             :       '/client/v3/pushrules/global/override/.m.rule.master/enabled':
    2620           2 :           (var req) => {},
    2621             :       '/client/v3/pushrules/global/content/nocake?before=1&after=2':
    2622           0 :           (var req) => {},
    2623           0 :       '/client/v3/devices/QBUAZIFURK': (var req) => {},
    2624           0 :       '/client/v3/directory/room/%23testalias%3Aexample.com': (var reqI) => {},
    2625             :       '/client/v3/rooms/!localpart%3Aserver.abc/send/m.room.message/testtxid':
    2626           4 :           (var reqI) => {
    2627           6 :                 'event_id': '\$event${FakeMatrixApi.eventCounter++}',
    2628             :               },
    2629             :       '/client/v3/rooms/!localpart%3Aserver.abc/send/m.reaction/testtxid':
    2630           4 :           (var reqI) => {
    2631           6 :                 'event_id': '\$event${FakeMatrixApi.eventCounter++}',
    2632             :               },
    2633             :       '/client/v3/rooms/!localpart%3Aexample.com/typing/%40alice%3Aexample.com':
    2634           0 :           (var req) => {},
    2635             :       '/client/v3/rooms/!1234%3Aexample.com/send/m.room.message/1234':
    2636           8 :           (var reqI) => {
    2637          12 :                 'event_id': '\$event${FakeMatrixApi.eventCounter++}',
    2638             :               },
    2639             :       '/client/v3/rooms/!1234%3Aexample.com/send/m.room.message/newresend':
    2640           4 :           (var reqI) => {
    2641           6 :                 'event_id': '\$event${FakeMatrixApi.eventCounter++}',
    2642             :               },
    2643             :       '/client/v3/user/%40test%3AfakeServer.notExisting/rooms/!localpart%3Aserver.abc/tags/m.favourite':
    2644           4 :           (var req) => {},
    2645             :       '/client/v3/user/%40alice%3Aexample.com/rooms/!localpart%3Aexample.com/tags/testtag':
    2646           0 :           (var req) => {},
    2647             :       '/client/v3/user/%40alice%3Aexample.com/account_data/test.account.data':
    2648           0 :           (var req) => {},
    2649             :       '/client/v3/user/%40test%3AfakeServer.notExisting/account_data/best%20animal':
    2650           2 :           (var req) => {},
    2651             :       '/client/v3/user/%40alice%3Aexample.com/rooms/1234/account_data/test.account.data':
    2652           0 :           (var req) => {},
    2653             :       '/client/v3/user/%40test%3AfakeServer.notExisting/rooms/!localpart%3Aserver.abc/account_data/m.marked_unread':
    2654           4 :           (var req) => {},
    2655             :       '/client/v3/user/%40test%3AfakeServer.notExisting/account_data/m.direct':
    2656          16 :           (var req) => {},
    2657             :       '/client/v3/user/%40othertest%3AfakeServer.notExisting/account_data/m.direct':
    2658           0 :           (var req) => {},
    2659           0 :       '/client/v3/profile/%40alice%3Aexample.com/displayname': (var reqI) => {},
    2660           0 :       '/client/v3/profile/%40alice%3Aexample.com/avatar_url': (var reqI) => {},
    2661             :       '/client/v3/profile/%40test%3AfakeServer.notExisting/avatar_url':
    2662           2 :           (var reqI) => {},
    2663             :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.encryption':
    2664           4 :           (var reqI) => {'event_id': 'YUwRidLecu:example.com'},
    2665             :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.avatar':
    2666           4 :           (var reqI) => {'event_id': 'YUwRidLecu:example.com'},
    2667             :       '/client/v3/rooms/!localpart%3Aserver.abc/send/m.room.message/1234':
    2668           0 :           (var reqI) => {'event_id': 'YUwRidLecu:example.com'},
    2669           0 :       '/client/v3/rooms/!localpart%3Aserver.abc/redact/1234/1234': (var reqI) =>
    2670           0 :           {'event_id': 'YUwRidLecu:example.com'},
    2671             :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.name':
    2672           4 :           (var reqI) => {
    2673             :                 'event_id': '42',
    2674             :               },
    2675             :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.topic':
    2676           4 :           (var reqI) => {
    2677             :                 'event_id': '42',
    2678             :               },
    2679             :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.pinned_events':
    2680           0 :           (var reqI) => {
    2681             :                 'event_id': '42',
    2682             :               },
    2683             :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.power_levels':
    2684           8 :           (var reqI) => {
    2685             :                 'event_id': '42',
    2686             :               },
    2687             :       '/client/v3/rooms/!calls%3Aexample.com/state/m.room.power_levels':
    2688           4 :           (var reqI) => {
    2689             :                 'event_id': '42',
    2690             :               },
    2691           0 :       '/client/v3/directory/list/room/!localpart%3Aexample.com': (var req) =>
    2692           0 :           {},
    2693           0 :       '/client/v3/room_keys/version/5': (var req) => {},
    2694             :       '/client/v3/room_keys/keys/${Uri.encodeComponent('!726s6s6q:example.com')}/${Uri.encodeComponent('ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU')}?version=5':
    2695           0 :           (var req) => {
    2696             :                 'etag': 'asdf',
    2697             :                 'count': 1,
    2698             :               },
    2699             :       '/client/v3/room_keys/keys/${Uri.encodeComponent('!726s6s6q:example.com')}?version=5':
    2700           0 :           (var req) => {
    2701             :                 'etag': 'asdf',
    2702             :                 'count': 1,
    2703             :               },
    2704           8 :       '/client/v3/room_keys/keys?version=5': (var req) => {
    2705             :             'etag': 'asdf',
    2706             :             'count': 1,
    2707             :           },
    2708           4 :       '/client/unstable/org.matrix.msc3814.v1/dehydrated_device': (var _) => {
    2709             :             'device_id': 'DEHYDDEV',
    2710             :           },
    2711             :     },
    2712             :     'DELETE': {
    2713           0 :       '/unknown/token': (var req) => {'errcode': 'M_UNKNOWN_TOKEN'},
    2714           0 :       '/client/v3/devices/QBUAZIFURK': (var req) => {},
    2715           0 :       '/client/v3/directory/room/%23testalias%3Aexample.com': (var reqI) => {},
    2716           0 :       '/client/v3/pushrules/global/content/nocake': (var req) => {},
    2717             :       '/client/v3/pushrules/global/override/!localpart%3Aserver.abc':
    2718           4 :           (var req) => {},
    2719             :       '/client/v3/user/%40test%3AfakeServer.notExisting/rooms/!localpart%3Aserver.abc/tags/m.favourite':
    2720           4 :           (var req) => {},
    2721             :       '/client/v3/user/%40alice%3Aexample.com/rooms/!localpart%3Aexample.com/tags/testtag':
    2722           0 :           (var req) => {},
    2723           0 :       '/client/v3/room_keys/version/5': (var req) => {},
    2724             :       '/client/v3/room_keys/keys/${Uri.encodeComponent('!726s6s6q:example.com')}/${Uri.encodeComponent('ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU')}?version=5':
    2725           0 :           (var req) => {
    2726             :                 'etag': 'asdf',
    2727             :                 'count': 1,
    2728             :               },
    2729             :       '/client/v3/room_keys/keys/${Uri.encodeComponent('!726s6s6q:example.com')}?version=5':
    2730           0 :           (var req) => {
    2731             :                 'etag': 'asdf',
    2732             :                 'count': 1,
    2733             :               },
    2734           0 :       '/client/v3/room_keys/keys?version=5': (var req) => {
    2735             :             'etag': 'asdf',
    2736             :             'count': 1,
    2737             :           },
    2738             :     },
    2739             :   };
    2740             : }

Generated by: LCOV version 1.14