LCOV - code coverage report
Current view: top level - lib - fake_matrix_api.dart (source / functions) Coverage Total Hit
Test: merged.info Lines: 63.4 % 986 625
Test Date: 2025-06-22 15:00:10 Functions: - 0 0

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

Generated by: LCOV version 2.0-1