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

Generated by: LCOV version 2.0-1