LCOV - code coverage report
Current view: top level - lib - fake_matrix_api.dart (source / functions) Coverage Total Hit
Test: merged.info Lines: 64.0 % 990 634
Test Date: 2025-05-24 18:14:12 Functions: - 0 0

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

Generated by: LCOV version 2.0-1