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

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

Generated by: LCOV version 2.0-1