LCOV - code coverage report
Current view: top level - lib - fake_matrix_api.dart (source / functions) Coverage Total Hit
Test: merged.info Lines: 64.1 % 988 633
Test Date: 2025-04-10 12:13:24 Functions: - 0 0

            Line data    Source code
       1              : /*
       2              :  *   Famedly Matrix SDK
       3              :  *   Copyright (C) 2019, 2020 Famedly GmbH
       4              :  *
       5              :  *   This program is free software: you can redistribute it and/or modify
       6              :  *   it under the terms of the GNU Affero General Public License as
       7              :  *   published by the Free Software Foundation, either version 3 of the
       8              :  *   License, or (at your option) any later version.
       9              :  *
      10              :  *   This program is distributed in the hope that it will be useful,
      11              :  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
      12              :  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
      13              :  *   GNU Affero General Public License for more details.
      14              :  *
      15              :  *   You should have received a copy of the GNU Affero General Public License
      16              :  *   along with this program.  If not, see <https://www.gnu.org/licenses/>.
      17              :  */
      18              : 
      19              : import 'dart:async';
      20              : import 'dart:convert';
      21              : import 'dart:core';
      22              : import 'dart:math';
      23              : 
      24              : import 'package:http/http.dart';
      25              : 
      26              : import 'package:matrix/matrix.dart' as sdk;
      27              : import 'package:matrix/matrix.dart';
      28              : 
      29           10 : T? tryCast<T>(dynamic object) => object is T ? object : null;
      30              : 
      31           13 : Map<String, dynamic> decodeJson(dynamic data) {
      32           13 :   if (data is String) {
      33           13 :     return json.decode(data);
      34              :   }
      35            0 :   if (data.isEmpty) {
      36            0 :     return <String, dynamic>{};
      37              :   }
      38              :   return data;
      39              : }
      40              : 
      41              : class FakeMatrixApi extends BaseClient {
      42              :   static String? expectedAccessToken;
      43              : 
      44           14 :   static Map<String, List<dynamic>> get calledEndpoints =>
      45           14 :       currentApi!._calledEndpoints;
      46           12 :   static int get eventCounter => currentApi!._eventCounter;
      47            6 :   static set eventCounter(int c) {
      48            6 :     currentApi!._eventCounter = c;
      49              :   }
      50              : 
      51           31 :   static set client(sdk.Client? c) {
      52           31 :     currentApi?._client = c;
      53              :   }
      54              : 
      55            1 :   static set failToDevice(bool fail) {
      56            1 :     currentApi?._failToDevice = fail;
      57              :   }
      58              : 
      59            0 :   static set trace(bool t) {
      60            0 :     currentApi?._trace = t;
      61              :   }
      62              : 
      63              :   final _calledEndpoints = <String, List<dynamic>>{};
      64              :   int _eventCounter = 0;
      65              :   sdk.Client? _client;
      66              :   bool _failToDevice = false;
      67              :   bool _trace = false;
      68              :   final _apiCallStream = StreamController<String>.broadcast();
      69              : 
      70              :   static FakeMatrixApi? currentApi;
      71              : 
      72            3 :   static Future<String> firstWhereValue(String value) {
      73            9 :     return firstWhere((v) => v == value);
      74              :   }
      75              : 
      76            5 :   static Future<String> firstWhere(bool Function(String element) test) {
      77           15 :     for (final e in currentApi!._calledEndpoints.entries) {
      78           20 :       if (e.value.isNotEmpty && test(e.key)) {
      79           10 :         return Future.value(e.key);
      80              :       }
      81              :     }
      82              : 
      83            1 :     final completer = Completer<String>();
      84              :     StreamSubscription<String>? sub;
      85            4 :     sub = currentApi!._apiCallStream.stream.listen((action) {
      86            1 :       if (test(action)) {
      87            1 :         sub?.cancel();
      88            1 :         completer.complete(action);
      89              :       }
      90              :     });
      91            1 :     return completer.future;
      92              :   }
      93              : 
      94              :   Set<String> servers = {
      95              :     'https://fakeserver.notexisting',
      96              :     'https://fakeserver.notexisting:1337',
      97              :     'https://fakeserverpriortoauthmedia.notexisting',
      98              :   };
      99              : 
     100           35 :   FutureOr<Response> mockIntercept(Request request) async {
     101              :     // Collect data from Request
     102           70 :     var action = request.url.path;
     103          105 :     if (request.url.path.contains('/_matrix')) {
     104              :       action =
     105          245 :           '${request.url.path.split('/_matrix').last}?${request.url.query}';
     106              :     }
     107              : 
     108              :     // ignore: avoid_print
     109           35 :     if (_trace) print('called $action');
     110              : 
     111           35 :     if (action.endsWith('?')) {
     112          105 :       action = action.substring(0, action.length - 1);
     113              :     }
     114           35 :     if (action.endsWith('?server_name')) {
     115              :       // This can be removed after matrix_api_lite is released with:
     116              :       // https://gitlab.com/famedly/libraries/matrix_api_lite/-/merge_requests/16
     117            0 :       action = action.substring(0, action.length - 12);
     118              :     }
     119           35 :     if (action.endsWith('/')) {
     120           21 :       action = action.substring(0, action.length - 1);
     121              :     }
     122           35 :     final method = request.method;
     123              :     final dynamic data =
     124          138 :         method == 'GET' ? request.url.queryParameters : request.body;
     125           35 :     dynamic res = {};
     126              :     var statusCode = 200;
     127              : 
     128              :     //print('\$method request to $action with Data: $data');
     129              : 
     130          140 :     if (!servers.contains(request.url.origin)) {
     131            1 :       return Response(
     132            3 :         '<html><head></head><body>Not found ${request.url.origin}...</body></html>',
     133              :         404,
     134              :       );
     135              :     }
     136              : 
     137              :     if (!{
     138           35 :           '/client/v3/refresh',
     139           35 :           '/client/v3/login',
     140           35 :           '/client/v3/register',
     141           35 :         }.contains(action) &&
     142              :         expectedAccessToken != null &&
     143            4 :         request.headers['Authorization'] != 'Bearer $expectedAccessToken') {
     144            1 :       return Response(
     145            2 :         jsonEncode({
     146              :           'errcode': 'M_UNKNOWN_TOKEN',
     147              :           'error': 'Soft logged out',
     148              :           'soft_logout': true,
     149              :         }),
     150              :         401,
     151              :       );
     152              :     }
     153              : 
     154              :     // Call API
     155          140 :     (_calledEndpoints[action] ??= <dynamic>[]).add(data);
     156          105 :     if (request.url.origin ==
     157              :             'https://fakeserverpriortoauthmedia.notexisting' &&
     158            2 :         action.contains('/client/versions')) {
     159            2 :       res = {
     160            2 :         'versions': [
     161              :           'r0.0.1',
     162              :           'ra.b.c',
     163              :           'v0.1',
     164              :           'v1.1',
     165              :           'v1.9',
     166              :           'v1.10.1',
     167              :         ],
     168            2 :         'unstable_features': {'m.lazy_load_members': true},
     169              :       };
     170              :     } else {
     171          105 :       final act = api[method]?[action];
     172              :       if (act != null) {
     173           35 :         res = act(data);
     174           70 :         if (res is Map && res.containsKey('errcode')) {
     175            4 :           if (res['errcode'] == 'M_NOT_FOUND') {
     176              :             statusCode = 404;
     177              :           } else {
     178              :             statusCode = 405;
     179              :           }
     180              :         }
     181           31 :       } else if (method == 'PUT' &&
     182           16 :           action.contains('/client/v3/sendToDevice/')) {
     183           10 :         res = {};
     184           10 :         if (_failToDevice) {
     185              :           statusCode = 500;
     186              :         }
     187           31 :       } else if (method == 'GET' &&
     188           31 :           action.contains('/client/v3/rooms/') &&
     189            6 :           action.contains('/state/m.room.member/') &&
     190            6 :           !action.endsWith('%40alicyy%3Aexample.com') &&
     191            6 :           !action.contains('%40getme')) {
     192            4 :         res = {'displayname': '', 'membership': 'ban'};
     193           31 :       } else if (method == 'PUT' &&
     194           10 :           action.contains(
     195              :             '/client/v3/rooms/!1234%3AfakeServer.notExisting/send/',
     196              :           )) {
     197           12 :         res = {'event_id': '\$event${_eventCounter++}'};
     198           31 :       } else if (method == 'PUT' &&
     199            8 :           action.contains(
     200              :             '/client/v3/rooms/!1234%3AfakeServer.notExisting/state/',
     201              :           )) {
     202            4 :         res = {'event_id': '\$event${_eventCounter++}'};
     203           31 :       } else if (action.contains('/client/v3/sync')) {
     204              :         // Sync requests with timeout
     205           93 :         final timeout = request.url.queryParameters['timeout'];
     206           31 :         if (timeout != null && timeout != '0') {
     207           62 :           await Future.delayed(Duration(milliseconds: 50));
     208              :         }
     209           31 :         res = {
     210              :           // So that it is clear which sync we are processing prefix it with 'empty_'
     211           93 :           'next_batch': 'empty_${DateTime.now().millisecondsSinceEpoch}',
     212              :           // ensure we don't generate new keys for no reason
     213           31 :           'device_one_time_keys_count': {
     214              :             'curve25519': 10,
     215              :             'signed_curve25519': 100,
     216              :           },
     217              :         };
     218            7 :       } else if (method == 'PUT' &&
     219            7 :           _client != null &&
     220            7 :           action.contains('/account_data/') &&
     221            3 :           !action.contains('/rooms/')) {
     222            9 :         final type = Uri.decodeComponent(action.split('/').last);
     223            3 :         final syncUpdate = sdk.SyncUpdate(
     224              :           nextBatch: '',
     225            9 :           accountData: [sdk.BasicEvent(content: decodeJson(data), type: type)],
     226              :         );
     227            6 :         if (_client?.database != null) {
     228           12 :           await _client?.database?.transaction(() async {
     229            6 :             await _client?.handleSync(syncUpdate);
     230              :           });
     231              :         } else {
     232            0 :           await _client?.handleSync(syncUpdate);
     233              :         }
     234            3 :         res = {};
     235            5 :       } else if (method == 'PUT' &&
     236            5 :           _client != null &&
     237            5 :           action.contains('/account_data/') &&
     238            1 :           action.contains('/rooms/')) {
     239            1 :         final segments = action.split('/');
     240            2 :         final type = Uri.decodeComponent(segments.last);
     241            4 :         final roomId = Uri.decodeComponent(segments[segments.length - 3]);
     242            1 :         final syncUpdate = sdk.SyncUpdate(
     243              :           nextBatch: '',
     244            1 :           rooms: RoomsUpdate(
     245            1 :             join: {
     246            1 :               roomId: JoinedRoomUpdate(
     247            1 :                 accountData: [
     248            1 :                   sdk.BasicEvent(
     249            1 :                     content: decodeJson(data),
     250              :                     type: type,
     251              :                   ),
     252              :                 ],
     253              :               ),
     254              :             },
     255              :           ),
     256              :         );
     257            2 :         if (_client?.database != null) {
     258            4 :           await _client?.database?.transaction(() async {
     259            2 :             await _client?.handleSync(syncUpdate);
     260              :           });
     261              :         } else {
     262            0 :           await _client?.handleSync(syncUpdate);
     263              :         }
     264            1 :         res = {};
     265              :       } else {
     266            5 :         res = {
     267              :           'errcode': 'M_UNRECOGNIZED',
     268            5 :           'error': 'Unrecognized request: $action',
     269              :         };
     270              :         statusCode = 405;
     271              :       }
     272              :     }
     273              : 
     274           35 :     unawaited(
     275          140 :       Future.delayed(Duration(milliseconds: 1)).then((_) async {
     276           70 :         _apiCallStream.add(action);
     277              :       }),
     278              :     );
     279          105 :     return Response.bytes(utf8.encode(json.encode(res)), statusCode);
     280              :   }
     281              : 
     282           35 :   @override
     283              :   Future<StreamedResponse> send(BaseRequest request) async {
     284           35 :     final bodyStream = request.finalize();
     285           35 :     final bodyBytes = await bodyStream.toBytes();
     286          105 :     final r = Request(request.method, request.url)
     287           70 :       ..persistentConnection = request.persistentConnection
     288           70 :       ..followRedirects = request.followRedirects
     289           70 :       ..maxRedirects = request.maxRedirects
     290          105 :       ..headers.addAll(request.headers)
     291           35 :       ..bodyBytes = bodyBytes
     292           35 :       ..finalize();
     293              : 
     294           35 :     final response = await mockIntercept(r);
     295           35 :     return StreamedResponse(
     296           70 :       ByteStream.fromBytes(response.bodyBytes),
     297           35 :       response.statusCode,
     298           35 :       contentLength: response.contentLength,
     299              :       request: request,
     300           35 :       headers: response.headers,
     301           35 :       isRedirect: response.isRedirect,
     302           35 :       persistentConnection: response.persistentConnection,
     303           35 :       reasonPhrase: response.reasonPhrase,
     304              :     );
     305              :   }
     306              : 
     307           36 :   FakeMatrixApi() {
     308              :     currentApi = this;
     309          109 :     api['POST']?['/client/v3/keys/device_signing/upload'] = (var reqI) {
     310            1 :       if (_client != null) {
     311            1 :         final jsonBody = decodeJson(reqI);
     312            1 :         for (final keyType in {
     313            1 :           'master_key',
     314            1 :           'self_signing_key',
     315            1 :           'user_signing_key',
     316            1 :         }) {
     317            1 :           if (jsonBody[keyType] != null) {
     318              :             final key =
     319            3 :                 sdk.CrossSigningKey.fromJson(jsonBody[keyType], _client!);
     320            6 :             _client!.userDeviceKeys[_client!.userID!]?.crossSigningKeys
     321            6 :                 .removeWhere((k, v) => v.usage.contains(key.usage.first));
     322            5 :             _client!.userDeviceKeys[_client!.userID!]
     323            3 :                 ?.crossSigningKeys[key.publicKey!] = key;
     324              :           }
     325              :         }
     326              :         // and generate a fake sync
     327              :         // ignore: discarded_futures
     328            3 :         _client!.handleSync(sdk.SyncUpdate(nextBatch: ''));
     329              :       }
     330            1 :       return {};
     331              :     };
     332              :   }
     333              : 
     334              :   // 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           99 :   static Map<String, dynamic> syncResponse = {
     542           99 :     'next_batch': Random().nextDouble().toString(),
     543           33 :     'rooms': {
     544           33 :       'join': {
     545           33 :         '!726s6s6q:example.com': {
     546           33 :           'summary': {
     547           33 :             'm.heroes': ['@alice:example.com'],
     548              :             'm.joined_member_count': 1,
     549              :             'm.invited_member_count': 0,
     550              :           },
     551           33 :           'unread_notifications': {
     552              :             'highlight_count': 2,
     553              :             'notification_count': 2,
     554              :           },
     555           33 :           'state': {
     556           33 :             'events': [
     557           33 :               {
     558              :                 'sender': '@alice:example.com',
     559              :                 'type': 'm.room.member',
     560              :                 'state_key': '@alice:example.com',
     561           33 :                 '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           33 :               {
     570              :                 'sender': '@alice:example.com',
     571              :                 'type': 'm.room.canonical_alias',
     572           33 :                 'content': {
     573              :                   'alias': '#famedlyContactDiscovery:fakeServer.notExisting',
     574              :                 },
     575              :                 'state_key': '',
     576              :                 'origin_server_ts': 1417731086796,
     577              :                 'event_id': '66697273743032:example.com',
     578              :               },
     579           33 :               {
     580              :                 'sender': '@alice:example.com',
     581              :                 'type': 'm.room.encryption',
     582              :                 'state_key': '',
     583           33 :                 'content': {'algorithm': AlgorithmTypes.megolmV1AesSha2},
     584              :                 'origin_server_ts': 1417731086795,
     585              :                 'event_id': '666972737430353:example.com',
     586              :               },
     587           33 :               {
     588           33 :                 'content': {
     589           33 :                   '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           33 :                 'unsigned': {'age': 1234},
     597              :                 'state_key': '',
     598              :               },
     599              :             ],
     600              :           },
     601           33 :           'timeline': {
     602           33 :             'events': [
     603           33 :               {
     604              :                 'sender': '@bob:example.com',
     605              :                 'type': 'm.room.member',
     606              :                 'state_key': '@bob:example.com',
     607           33 :                 'content': {'membership': 'join'},
     608           33 :                 'prev_content': {'membership': 'invite'},
     609              :                 'origin_server_ts': 1417731086795,
     610              :                 'event_id': '\$7365636s6r6432:example.com',
     611           33 :                 'unsigned': {'foo': 'bar'},
     612              :               },
     613           33 :               {
     614              :                 'sender': '@alice:example.com',
     615              :                 'type': 'm.room.message',
     616           33 :                 '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           33 :           'ephemeral': {
     625           33 :             'events': [
     626           33 :               {
     627              :                 'type': 'm.typing',
     628           33 :                 'content': {
     629           33 :                   'user_ids': ['@alice:example.com'],
     630              :                 },
     631              :               },
     632           33 :               {
     633           33 :                 'content': {
     634           33 :                   '\$7365636s6r6432:example.com': {
     635           33 :                     'm.read': {
     636           33 :                       '@alice:example.com': {'ts': 1436451550453},
     637              :                     },
     638              :                   },
     639              :                 },
     640              :                 'room_id': '!726s6s6q:example.com',
     641              :                 'type': 'm.receipt',
     642              :               }
     643              :             ],
     644              :           },
     645           33 :           'account_data': {
     646           33 :             'events': [
     647           33 :               {
     648              :                 'type': 'm.tag',
     649           33 :                 'content': {
     650           33 :                   'tags': {
     651           33 :                     'work': {'order': 1},
     652              :                   },
     653              :                 },
     654              :               },
     655           33 :               {
     656              :                 'type': 'org.example.custom.room.config',
     657           33 :                 'content': {'custom_config_key': 'custom_config_value'},
     658              :               }
     659              :             ],
     660              :           },
     661              :         },
     662           33 :         '!calls:example.com': {
     663           33 :           'state': {
     664           33 :             'events': [
     665           33 :               {
     666              :                 'sender': '@test:fakeServer.notExisting',
     667              :                 'type': 'm.room.member',
     668              :                 'state_key': '@test:fakeServer.notExisting',
     669           33 :                 '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           33 :               {
     678              :                 'sender': '@alice:example.com',
     679              :                 'type': 'm.room.member',
     680              :                 'state_key': '@alice:example.com',
     681           33 :                 '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           33 :       'invite': {
     694           33 :         '!696r7674:example.com': {
     695           33 :           'invite_state': {
     696           33 :             'events': [
     697           33 :               {
     698              :                 'sender': '@alice:example.com',
     699              :                 'type': 'm.room.name',
     700              :                 'state_key': '',
     701           33 :                 'content': {'name': 'My Room Name'},
     702              :               },
     703           33 :               {
     704              :                 'sender': '@alice:example.com',
     705              :                 'type': 'm.room.member',
     706              :                 'state_key': '@bob:example.com',
     707           33 :                 'content': {'membership': 'invite'},
     708              :               }
     709              :             ],
     710              :           },
     711              :         },
     712              :       },
     713           33 :       'leave': {
     714           33 :         '!726s6s6f:example.com': {
     715           33 :           'state': {
     716           33 :             'events': [
     717           33 :               {
     718              :                 'sender': '@charley:example.com',
     719              :                 'type': 'm.room.name',
     720              :                 'state_key': '',
     721           33 :                 'content': {'name': 'left room'},
     722              :                 'origin_server_ts': 1417731086795,
     723              :                 'event_id': '66697273743031:example.com',
     724              :               },
     725              :             ],
     726              :           },
     727           33 :           'timeline': {
     728           33 :             'events': [
     729           33 :               {
     730              :                 'sender': '@bob:example.com',
     731              :                 'type': 'm.room.message',
     732           33 :                 'content': {'text': 'Hallo'},
     733              :                 'origin_server_ts': 1417731086795,
     734              :                 'event_id': '7365636s6r64300:example.com',
     735           33 :                 'unsigned': {'foo': 'bar'},
     736              :               },
     737              :             ],
     738              :             'limited': true,
     739              :             'prev_batch': 't34-23535_0_1',
     740              :           },
     741           33 :           'account_data': {
     742           33 :             'events': [
     743           33 :               {
     744              :                 'type': 'm.tag',
     745           33 :                 'content': {
     746           33 :                   'tags': {
     747           33 :                     'work': {'order': 1},
     748              :                   },
     749              :                 },
     750              :               },
     751           33 :               {
     752              :                 'type': 'org.example.custom.room.config',
     753           33 :                 'content': {'custom_config_key': 'custom_config_value'},
     754              :               }
     755              :             ],
     756              :           },
     757              :         },
     758              :       },
     759              :     },
     760           33 :     'presence': {
     761           33 :       'events': [
     762           33 :         {
     763              :           'sender': '@alice:example.com',
     764              :           'type': 'm.presence',
     765           33 :           'content': {'presence': 'online'},
     766              :         }
     767              :       ],
     768              :     },
     769           33 :     'account_data': {
     770           33 :       'events': [
     771           33 :         {
     772           33 :           'content': {
     773           33 :             'global': {
     774           33 :               'content': [
     775           33 :                 {
     776           33 :                   'actions': [
     777              :                     'notify',
     778           33 :                     {'set_tweak': 'sound', 'value': 'default'},
     779           33 :                     {'set_tweak': 'highlight'},
     780              :                   ],
     781              :                   'default': true,
     782              :                   'enabled': true,
     783              :                   'pattern': 'alice',
     784              :                   'rule_id': '.m.rule.contains_user_name',
     785              :                 }
     786              :               ],
     787           33 :               'override': [
     788           33 :                 {
     789           33 :                   'actions': ['dont_notify'],
     790           33 :                   'conditions': [],
     791              :                   'default': true,
     792              :                   'enabled': false,
     793              :                   'rule_id': '.m.rule.master',
     794              :                 },
     795           33 :                 {
     796           33 :                   'actions': ['dont_notify'],
     797           33 :                   'conditions': [
     798           33 :                     {
     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           33 :               'room': [
     810           33 :                 {
     811           33 :                   'actions': ['dont_notify'],
     812           33 :                   'conditions': [
     813           33 :                     {
     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           33 :               'sender': [],
     825           33 :               'underride': [
     826           33 :                 {
     827           33 :                   'actions': [
     828              :                     'notify',
     829           33 :                     {'set_tweak': 'sound', 'value': 'ring'},
     830           33 :                     {'set_tweak': 'highlight', 'value': false},
     831              :                   ],
     832           33 :                   'conditions': [
     833           33 :                     {
     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           33 :                 {
     844           33 :                   'actions': [
     845              :                     'notify',
     846           33 :                     {'set_tweak': 'sound', 'value': 'default'},
     847           33 :                     {'set_tweak': 'highlight'},
     848              :                   ],
     849           33 :                   'conditions': [
     850           33 :                     {'kind': 'contains_display_name'},
     851              :                   ],
     852              :                   'default': true,
     853              :                   'enabled': true,
     854              :                   'rule_id': '.m.rule.contains_display_name',
     855              :                 },
     856           33 :                 {
     857           33 :                   'actions': [
     858              :                     'notify',
     859           33 :                     {'set_tweak': 'sound', 'value': 'default'},
     860           33 :                     {'set_tweak': 'highlight', 'value': false},
     861              :                   ],
     862           33 :                   'conditions': [
     863           33 :                     {'is': '2', 'kind': 'room_member_count'},
     864           33 :                     {
     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           33 :                 {
     875           33 :                   'actions': [
     876              :                     'notify',
     877           33 :                     {'set_tweak': 'sound', 'value': 'default'},
     878           33 :                     {'set_tweak': 'highlight', 'value': false},
     879              :                   ],
     880           33 :                   'conditions': [
     881           33 :                     {
     882              :                       'key': 'type',
     883              :                       'kind': 'event_match',
     884              :                       'pattern': 'm.room.member',
     885              :                     },
     886           33 :                     {
     887              :                       'key': 'content.membership',
     888              :                       'kind': 'event_match',
     889              :                       'pattern': 'invite',
     890              :                     },
     891           33 :                     {
     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           33 :                 {
     902           33 :                   'actions': [
     903              :                     'notify',
     904           33 :                     {'set_tweak': 'highlight', 'value': false},
     905              :                   ],
     906           33 :                   'conditions': [
     907           33 :                     {
     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           33 :                 {
     918           33 :                   'actions': [
     919              :                     'notify',
     920           33 :                     {'set_tweak': 'highlight', 'value': false},
     921              :                   ],
     922           33 :                   'conditions': [
     923           33 :                     {
     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           33 :         {
     939              :           'type': 'org.example.custom.config',
     940           33 :           'content': {'custom_config_key': 'custom_config_value'},
     941              :         },
     942           33 :         {
     943           33 :           'content': {
     944           33 :             '@bob:example.com': [
     945              :               '!726s6s6q:example.com',
     946              :               '!hgfedcba:example.com',
     947              :             ],
     948              :           },
     949              :           'type': 'm.direct',
     950              :         },
     951           33 :         {
     952              :           'type': EventTypes.SecretStorageDefaultKey,
     953           33 :           'content': {'key': '0FajDWYaM6wQ4O60OZnLvwZfsBNu4Bu3'},
     954              :         },
     955           33 :         {
     956              :           'type': 'm.secret_storage.key.0FajDWYaM6wQ4O60OZnLvwZfsBNu4Bu3',
     957           33 :           'content': {
     958              :             'algorithm': AlgorithmTypes.secretStorageV1AesHmcSha2,
     959           33 :             'passphrase': {
     960              :               'algorithm': AlgorithmTypes.pbkdf2,
     961              :               'iterations': 500000,
     962              :               'salt': 'F4jJ80mr0Fc8mRwU9JgA3lQDyjPuZXQL',
     963              :             },
     964              :             'iv': 'HjbTgIoQH2pI7jQo19NUzA==',
     965              :             'mac': 'QbJjQzDnAggU0cM4RBnDxw2XyarRGjdahcKukP9xVlk=',
     966              :           },
     967              :         },
     968           33 :         {
     969              :           'type': 'm.cross_signing.master',
     970           33 :           'content': {
     971           33 :             'encrypted': {
     972           33 :               '0FajDWYaM6wQ4O60OZnLvwZfsBNu4Bu3': {
     973              :                 'iv': 'eIb2IITxtmcq+1TrT8D5eQ==',
     974              :                 'ciphertext':
     975              :                     'lWRTPo5qxf4LAVwVPzGHOyMcP181n7bb9/B0lvkLDC2Oy4DvAL0eLx2x3bY=',
     976              :                 'mac': 'Ynx89tIxPkx0o6ljMgxszww17JOgB4tg4etmNnMC9XI=',
     977              :               },
     978              :             },
     979              :           },
     980              :         },
     981           33 :         {
     982              :           'type': EventTypes.CrossSigningSelfSigning,
     983           33 :           'content': {
     984           33 :             'encrypted': {
     985           33 :               '0FajDWYaM6wQ4O60OZnLvwZfsBNu4Bu3': {
     986              :                 'iv': 'YqU2XIjYulYZl+bkZtGgVw==',
     987              :                 'ciphertext':
     988              :                     'kM2TSoy/jR/4d357ZoRPbpPypxQl6XRLo3FsEXz+f7vIOp82GeRp28RYb3k=',
     989              :                 'mac': 'F+DZa5tAFmWsYSryw5EuEpzTmmABRab4GETkM85bGGo=',
     990              :               },
     991              :             },
     992              :           },
     993              :         },
     994           33 :         {
     995              :           'type': EventTypes.CrossSigningUserSigning,
     996           33 :           'content': {
     997           33 :             'encrypted': {
     998           33 :               '0FajDWYaM6wQ4O60OZnLvwZfsBNu4Bu3': {
     999              :                 'iv': 'D7AM3LXFu7ZlyGOkR+OeqQ==',
    1000              :                 'ciphertext':
    1001              :                     'bYA2+OMgsO6QB1E31aY+ESAWrT0fUBTXqajy4qmL7bVDSZY4Uj64EXNbHuA=',
    1002              :                 'mac': 'j2UtyPo/UBSoiaQCWfzCiRZXp3IRt0ZZujuXgUMjnw4=',
    1003              :               },
    1004              :             },
    1005              :           },
    1006              :         },
    1007           33 :         {
    1008              :           'type': EventTypes.MegolmBackup,
    1009           33 :           'content': {
    1010           33 :             'encrypted': {
    1011           33 :               '0FajDWYaM6wQ4O60OZnLvwZfsBNu4Bu3': {
    1012              :                 'iv': 'cL/0MJZaiEd3fNU+I9oJrw==',
    1013              :                 'ciphertext':
    1014              :                     'WL73Pzdk5wZdaaSpaeRH0uZYKcxkuV8IS6Qa2FEfA1+vMeRLuHcWlXbMX0w=',
    1015              :                 'mac': '+xozp909S6oDX8KRV8D8ZFVRyh7eEYQpPP76f+DOsnw=',
    1016              :               },
    1017              :             },
    1018              :           },
    1019              :         },
    1020           33 :         {
    1021              :           'type': 'io.element.recent_emoji',
    1022           33 :           'content': {
    1023           33 :             'recent_emoji': [
    1024           33 :               ['👍️', 1],
    1025           33 :               ['🖇️', 0],
    1026           33 :               ['🙃', 'error'],
    1027           33 :               [null, null],
    1028           33 :               [1, ''],
    1029              :             ],
    1030              :           },
    1031              :         }
    1032              :       ],
    1033              :     },
    1034           33 :     'to_device': {
    1035           33 :       'events': [
    1036           33 :         {
    1037              :           'sender': '@alice:example.com',
    1038              :           'type': 'm.new_device',
    1039           33 :           'content': {
    1040              :             'device_id': 'XYZABCDE',
    1041           33 :             '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           33 :         {
    1056              :           // this is the commented out m.room_key event - only encrypted
    1057              :           'sender': '@othertest:fakeServer.notExisting',
    1058           33 :           'content': {
    1059              :             'algorithm': AlgorithmTypes.olmV1Curve25519AesSha2,
    1060              :             'sender_key': 'JBG7ZaPn54OBC7TuIEiylW3BZ+7WcGQhFBPB9pogbAg',
    1061           33 :             'ciphertext': {
    1062           33 :               '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           33 :     'device_lists': {
    1074           33 :       'changed': [
    1075              :         '@alice:example.com',
    1076              :       ],
    1077           33 :       'left': [
    1078              :         '@bob:example.com',
    1079              :       ],
    1080              :     },
    1081           33 :     '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            1 :           (var req) => messagesResponsePast,
    1762              :       '/client/v3/rooms/!localpart%3Aserver.abc/messages?from=t456&dir=f&to=1234&limit=10&filter=%7B%22lazy_load_members%22%3Atrue%7D':
    1763            0 :           (var req) => messagesResponseFuture,
    1764              :       '/client/v3/rooms/!1234%3Aexample.com/messages?from=t456&dir=f&limit=30&filter=%7B%22lazy_load_members%22%3Atrue%7D':
    1765            1 :           (var req) => messagesResponseFuture,
    1766              :       '/client/v3/rooms/!localpart%3Aserver.abc/messages?from=t789&dir=f&to=1234&limit=10&filter=%7B%22lazy_load_members%22%3Atrue%7D':
    1767            0 :           (var req) => messagesResponseFutureEnd,
    1768              :       '/client/v3/rooms/!1234%3Aexample.com/messages?from=t789&dir=f&limit=30&filter=%7B%22lazy_load_members%22%3Atrue%7D':
    1769            1 :           (var req) => messagesResponseFutureEnd,
    1770              :       '/client/v3/rooms/!5345234234%3Aexample.com/messages?from=t_1234a&dir=b&limit=30&filter=%7B%22lazy_load_members%22%3Atrue%7D':
    1771            4 :           (var req) => archivesMessageResponse,
    1772           70 :       '/client/versions': (var req) => {
    1773           35 :             'versions': ['v1.1', 'v1.2', 'v1.11'],
    1774           35 :             'unstable_features': {'m.lazy_load_members': true},
    1775              :           },
    1776           70 :       '/client/v3/login': (var req) => {
    1777           35 :             'flows': [
    1778           35 :               {'type': 'm.login.password'},
    1779              :             ],
    1780              :           },
    1781            0 :       '/client/v3/rooms/!localpart%3Aserver.abc/joined_members': (var req) => {
    1782            0 :             'joined': {
    1783            0 :               '@bar:example.com': {
    1784              :                 'display_name': 'Bar',
    1785              :                 'avatar_url': 'mxc://riot.ovh/printErCATzZijQsSDWorRaK',
    1786              :               },
    1787              :             },
    1788              :           },
    1789              :       '/client/v3/rooms/!localpart%3Aserver.abc/members?at=1234&membership=join&not_membership=leave':
    1790            0 :           (var req) => {
    1791            0 :                 'chunk': [
    1792            0 :                   {
    1793            0 :                     'content': {
    1794              :                       'membership': 'join',
    1795              :                       'avatar_url': 'mxc://example.org/SEsfnsuifSDFSSEF',
    1796              :                       'displayname': 'Alice Margatroid',
    1797              :                     },
    1798              :                     'type': 'm.room.member',
    1799              :                     'event_id': '§143273582443PhrSn:example.org',
    1800              :                     'room_id': '!636q39766251:example.com',
    1801              :                     'sender': '@alice:example.com',
    1802              :                     'origin_server_ts': 1432735824653,
    1803            0 :                     'unsigned': {'age': 1234},
    1804              :                     'state_key': '@alice:example.com',
    1805              :                   }
    1806              :                 ],
    1807              :               },
    1808            0 :       '/client/v3/rooms/!696r7674:example.com/members': (var req) => {
    1809            0 :             'chunk': [
    1810            0 :               {
    1811            0 :                 'content': {
    1812              :                   'membership': 'join',
    1813              :                   'avatar_url': 'mxc://example.org/SEsfnsuifSDFSSEF',
    1814              :                   'displayname': 'Alice Margatroid',
    1815              :                 },
    1816              :                 'type': 'm.room.member',
    1817              :                 'event_id': '§143273582443PhrSn:example.org',
    1818              :                 'room_id': '!636q39766251:example.com',
    1819              :                 'sender': '@alice:example.com',
    1820              :                 'origin_server_ts': 1432735824653,
    1821            0 :                 'unsigned': {'age': 1234},
    1822              :                 'state_key': '@alice:example.com',
    1823              :               }
    1824              :             ],
    1825              :           },
    1826            2 :       '/client/v3/rooms/!726s6s6q%3Aexample.com/members': (var req) => {
    1827            1 :             'chunk': [
    1828            1 :               {
    1829            1 :                 'content': {
    1830              :                   'membership': 'join',
    1831              :                   'avatar_url': 'mxc://example.org/SEsfnsuifSDFSSEF',
    1832              :                   'displayname': 'Alice Margatroid',
    1833              :                 },
    1834              :                 'type': 'm.room.member',
    1835              :                 'event_id': '§143273582443PhrSn:example.org',
    1836              :                 'room_id': '!636q39766251:example.com',
    1837              :                 'sender': '@alice:example.com',
    1838              :                 'origin_server_ts': 1432735824653,
    1839            1 :                 'unsigned': {'age': 1234},
    1840              :                 'state_key': '@alice:example.com',
    1841              :               }
    1842              :             ],
    1843              :           },
    1844            4 :       '/client/v3/rooms/!localpart%3Aserver.abc/members': (var req) => {
    1845            2 :             'chunk': [
    1846            2 :               {
    1847              :                 'type': 'm.room.member',
    1848            2 :                 'content': {'membership': 'join', 'displayname': 'YOU'},
    1849              :                 'sender': '@test:fakeServer.notExisting',
    1850              :                 'state_key': '@test:fakeServer.notExisting',
    1851              :                 'room_id': '!localpart%3Aserver.abc',
    1852              :                 'event_id': '§143273582443PhrSn2:example.org',
    1853              :                 'origin_server_ts': 1432735824653,
    1854            2 :                 'unsigned': {'age': 1234},
    1855              :               },
    1856            2 :               {
    1857              :                 'type': 'm.room.member',
    1858            2 :                 'content': {
    1859              :                   'membership': 'join',
    1860              :                   'displayname': 'Alice Margatroid',
    1861              :                 },
    1862              :                 'sender': '@alice:matrix.org',
    1863              :                 'state_key': '@alice:matrix.org',
    1864              :                 'room_id': '!localpart%3Aserver.abc',
    1865              :                 'event_id': '§143273582443PhrSn3:example.org',
    1866              :                 'origin_server_ts': 1432735824653,
    1867            2 :                 'unsigned': {'age': 1234},
    1868              :               },
    1869            2 :               {
    1870              :                 'type': 'm.room.member',
    1871            2 :                 'content': {'membership': 'invite', 'displayname': 'Bob'},
    1872              :                 'sender': '@bob:example.com',
    1873              :                 'state_key': '@bob:example.com',
    1874              :                 'room_id': '!localpart%3Aserver.abc',
    1875              :                 'event_id': '§143273582443PhrSn4:example.org',
    1876              :                 'origin_server_ts': 1432735824653,
    1877            2 :                 'unsigned': {'age': 1234},
    1878              :               },
    1879            2 :               {
    1880              :                 'type': 'm.room.member',
    1881            2 :                 'content': {'membership': 'invite', 'displayname': 'Charley'},
    1882              :                 'sender': '@charley:example.org',
    1883              :                 'state_key': '@charley:example.org',
    1884              :                 'room_id': '!localpart%3Aserver.abc',
    1885              :                 'event_id': '§143273582443PhrSn5:example.org',
    1886              :                 'origin_server_ts': 1432735824653,
    1887            2 :                 'unsigned': {'age': 1234},
    1888              :               },
    1889            2 :               {
    1890              :                 'type': 'm.room.member',
    1891            2 :                 'content': {
    1892              :                   'membership': 'join',
    1893              :                   'avatar_url': 'mxc://example.org/SEsfnsuifSDFSSEF',
    1894              :                   'displayname': 'Alice Margatroid',
    1895              :                 },
    1896              :                 'sender': '@example:example.org',
    1897              :                 'state_key': '@alice:example.org',
    1898              :                 'room_id': '!localpart%3Aserver.abc',
    1899              :                 'event_id': '§143273582443PhrSn6:example.org',
    1900              :                 'origin_server_ts': 1432735824653,
    1901            2 :                 'unsigned': {'age': 1234},
    1902              :               },
    1903              :             ],
    1904              :           },
    1905            0 :       '/client/v3/pushrules/global/content/nocake': (var req) => {
    1906            0 :             'actions': ['dont_notify'],
    1907              :             'pattern': 'cake*lie',
    1908              :             'rule_id': 'nocake',
    1909              :             'enabled': true,
    1910              :             'default': false,
    1911              :           },
    1912            0 :       '/client/v3/pushrules/global/content/nocake/enabled': (var req) => {
    1913              :             'enabled': true,
    1914              :           },
    1915            0 :       '/client/v3/pushrules/global/content/nocake/actions': (var req) => {
    1916            0 :             'actions': ['notify'],
    1917              :           },
    1918            0 :       '/client/v3/pushrules': (var req) => {
    1919            0 :             'global': {
    1920            0 :               'content': [
    1921            0 :                 {
    1922            0 :                   'actions': [
    1923              :                     'notify',
    1924            0 :                     {'set_tweak': 'sound', 'value': 'default'},
    1925            0 :                     {'set_tweak': 'highlight'},
    1926              :                   ],
    1927              :                   'default': true,
    1928              :                   'enabled': true,
    1929              :                   'pattern': 'alice',
    1930              :                   'rule_id': '.m.rule.contains_user_name',
    1931              :                 }
    1932              :               ],
    1933            0 :               'override': [
    1934            0 :                 {
    1935            0 :                   'actions': ['dont_notify'],
    1936            0 :                   'conditions': [],
    1937              :                   'default': true,
    1938              :                   'enabled': false,
    1939              :                   'rule_id': '.m.rule.master',
    1940              :                 },
    1941            0 :                 {
    1942            0 :                   'actions': ['dont_notify'],
    1943            0 :                   'conditions': [
    1944            0 :                     {
    1945              :                       'key': 'content.msgtype',
    1946              :                       'kind': 'event_match',
    1947              :                       'pattern': 'm.notice',
    1948              :                     }
    1949              :                   ],
    1950              :                   'default': true,
    1951              :                   'enabled': true,
    1952              :                   'rule_id': '.m.rule.suppress_notices',
    1953              :                 }
    1954              :               ],
    1955            0 :               'room': [],
    1956            0 :               'sender': [],
    1957            0 :               'underride': [
    1958            0 :                 {
    1959            0 :                   'actions': [
    1960              :                     'notify',
    1961            0 :                     {'set_tweak': 'sound', 'value': 'ring'},
    1962            0 :                     {'set_tweak': 'highlight', 'value': false},
    1963              :                   ],
    1964            0 :                   'conditions': [
    1965            0 :                     {
    1966              :                       'key': 'type',
    1967              :                       'kind': 'event_match',
    1968              :                       'pattern': 'm.call.invite',
    1969              :                     }
    1970              :                   ],
    1971              :                   'default': true,
    1972              :                   'enabled': true,
    1973              :                   'rule_id': '.m.rule.call',
    1974              :                 },
    1975            0 :                 {
    1976            0 :                   'actions': [
    1977              :                     'notify',
    1978            0 :                     {'set_tweak': 'sound', 'value': 'default'},
    1979            0 :                     {'set_tweak': 'highlight'},
    1980              :                   ],
    1981            0 :                   'conditions': [
    1982            0 :                     {'kind': 'contains_display_name'},
    1983              :                   ],
    1984              :                   'default': true,
    1985              :                   'enabled': true,
    1986              :                   'rule_id': '.m.rule.contains_display_name',
    1987              :                 },
    1988            0 :                 {
    1989            0 :                   'actions': [
    1990              :                     'notify',
    1991            0 :                     {'set_tweak': 'sound', 'value': 'default'},
    1992            0 :                     {'set_tweak': 'highlight', 'value': false},
    1993              :                   ],
    1994            0 :                   'conditions': [
    1995            0 :                     {'is': '2', 'kind': 'room_member_count'},
    1996              :                   ],
    1997              :                   'default': true,
    1998              :                   'enabled': true,
    1999              :                   'rule_id': '.m.rule.room_one_to_one',
    2000              :                 },
    2001            0 :                 {
    2002            0 :                   'actions': [
    2003              :                     'notify',
    2004            0 :                     {'set_tweak': 'sound', 'value': 'default'},
    2005            0 :                     {'set_tweak': 'highlight', 'value': false},
    2006              :                   ],
    2007            0 :                   'conditions': [
    2008            0 :                     {
    2009              :                       'key': 'type',
    2010              :                       'kind': 'event_match',
    2011              :                       'pattern': 'm.room.member',
    2012              :                     },
    2013            0 :                     {
    2014              :                       'key': 'content.membership',
    2015              :                       'kind': 'event_match',
    2016              :                       'pattern': 'invite',
    2017              :                     },
    2018            0 :                     {
    2019              :                       'key': 'state_key',
    2020              :                       'kind': 'event_match',
    2021              :                       'pattern': '@alice:example.com',
    2022              :                     }
    2023              :                   ],
    2024              :                   'default': true,
    2025              :                   'enabled': true,
    2026              :                   'rule_id': '.m.rule.invite_for_me',
    2027              :                 },
    2028            0 :                 {
    2029            0 :                   'actions': [
    2030              :                     'notify',
    2031            0 :                     {'set_tweak': 'highlight', 'value': false},
    2032              :                   ],
    2033            0 :                   'conditions': [
    2034            0 :                     {
    2035              :                       'key': 'type',
    2036              :                       'kind': 'event_match',
    2037              :                       'pattern': 'm.room.member',
    2038              :                     }
    2039              :                   ],
    2040              :                   'default': true,
    2041              :                   'enabled': true,
    2042              :                   'rule_id': '.m.rule.member_event',
    2043              :                 },
    2044            0 :                 {
    2045            0 :                   'actions': [
    2046              :                     'notify',
    2047            0 :                     {'set_tweak': 'highlight', 'value': false},
    2048              :                   ],
    2049            0 :                   'conditions': [
    2050            0 :                     {
    2051              :                       'key': 'type',
    2052              :                       'kind': 'event_match',
    2053              :                       'pattern': 'm.room.message',
    2054              :                     }
    2055              :                   ],
    2056              :                   'default': true,
    2057              :                   'enabled': true,
    2058              :                   'rule_id': '.m.rule.message',
    2059              :                 }
    2060              :               ],
    2061              :             },
    2062              :           },
    2063              :       '/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':
    2064            6 :           (var req) => archiveSyncResponse,
    2065           66 :       '/client/v3/sync?filter=1234&timeout=0': (var req) => syncResponse,
    2066              :       '/client/v3/sync?filter=1234&since=1234&full_state=false&set_presence=unavailable&timeout=15':
    2067            0 :           (var req) => syncResponse,
    2068            1 :       '/client/v3/register/available?username=testuser': (var req) =>
    2069            1 :           {'available': true},
    2070              :       '/client/v3/user/${Uri.encodeComponent('@test:fakeServer.notExisting')}/filter/1234':
    2071            0 :           (var req) => {
    2072            0 :                 'room': {
    2073            0 :                   'state': {
    2074            0 :                     'types': ['m.room.*'],
    2075            0 :                     'not_rooms': ['!726s6s6q:example.com'],
    2076              :                   },
    2077            0 :                   'timeline': {
    2078              :                     'limit': 10,
    2079            0 :                     'types': ['m.room.message'],
    2080            0 :                     'not_rooms': ['!726s6s6q:example.com'],
    2081            0 :                     'not_senders': ['@spam:example.com'],
    2082              :                   },
    2083            0 :                   'ephemeral': {
    2084            0 :                     'types': ['m.receipt', 'm.typing'],
    2085            0 :                     'not_rooms': ['!726s6s6q:example.com'],
    2086            0 :                     'not_senders': ['@spam:example.com'],
    2087              :                   },
    2088            0 :                   'account_data': {
    2089            0 :                     'types': ['m.receipt', 'm.typing'],
    2090            0 :                     'not_rooms': ['!726s6s6q:example.com'],
    2091            0 :                     'not_senders': ['@spam:example.com'],
    2092              :                   },
    2093              :                 },
    2094            0 :                 'presence': {
    2095            0 :                   'types': ['m.presence'],
    2096            0 :                   'not_senders': ['@alice:example.com'],
    2097              :                 },
    2098              :                 'event_format': 'client',
    2099            0 :                 'event_fields': ['type', 'content', 'sender'],
    2100              :               },
    2101           10 :       '/client/v3/room_keys/version': (var req) => {
    2102              :             'algorithm': AlgorithmTypes.megolmBackupV1Curve25519AesSha2,
    2103            5 :             'auth_data': {
    2104              :               'public_key': 'GXYaxqhNhUK28zUdxOmEsFRguz+PzBsDlTLlF0O0RkM',
    2105            5 :               'signatures': {},
    2106              :             },
    2107              :             'count': 0,
    2108              :             'etag': '0',
    2109              :             'version': '5',
    2110              :           },
    2111              :       '/client/v3/room_keys/keys/${Uri.encodeComponent('!726s6s6q:example.com')}/${Uri.encodeComponent('ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU')}?version=5':
    2112            2 :           (var req) => {
    2113              :                 'first_message_index': 0,
    2114              :                 'forwarded_count': 0,
    2115              :                 'is_verified': true,
    2116            1 :                 'session_data': {
    2117              :                   'ephemeral': 'fwRxYh+seqLykz5mQCLypJ4/59URdcFJ2s69OU1dGRc',
    2118              :                   'ciphertext':
    2119              :                       '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',
    2120              :                   'mac': 'QzKV/fgAs4U',
    2121              :                 },
    2122              :               },
    2123              :       '/client/v3/room_keys/keys/${Uri.encodeComponent('!getroomkeys726s6s6q:example.com')}?version=5':
    2124            2 :           (var req) => {
    2125            1 :                 'sessions': {
    2126            1 :                   'ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU': {
    2127              :                     'first_message_index': 0,
    2128              :                     'forwarded_count': 0,
    2129              :                     'is_verified': true,
    2130            1 :                     'session_data': {
    2131              :                       'ephemeral':
    2132              :                           'fwRxYh+seqLykz5mQCLypJ4/59URdcFJ2s69OU1dGRc',
    2133              :                       'ciphertext':
    2134              :                           '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',
    2135              :                       'mac': 'QzKV/fgAs4U',
    2136              :                     },
    2137              :                   },
    2138              :                 },
    2139              :               },
    2140            2 :       '/client/v3/room_keys/keys?version=5': (var req) => {
    2141            1 :             'rooms': {
    2142            1 :               '!getallkeys726s6s6q:example.com': {
    2143            1 :                 'sessions': {
    2144            1 :                   'ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU': {
    2145              :                     'first_message_index': 0,
    2146              :                     'forwarded_count': 0,
    2147              :                     'is_verified': true,
    2148            1 :                     'session_data': {
    2149              :                       'ephemeral':
    2150              :                           'fwRxYh+seqLykz5mQCLypJ4/59URdcFJ2s69OU1dGRc',
    2151              :                       'ciphertext':
    2152              :                           '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',
    2153              :                       'mac': 'QzKV/fgAs4U',
    2154              :                     },
    2155              :                   },
    2156              :                 },
    2157              :               },
    2158              :             },
    2159              :           },
    2160            4 :       '/client/unstable/org.matrix.msc3814.v1/dehydrated_device': (var _) => {
    2161              :             'device_id': 'DEHYDDEV',
    2162            2 :             'device_data': {'algorithm': 'some.famedly.proprietary.algorithm'},
    2163              :           },
    2164              :     },
    2165              :     'POST': {
    2166            2 :       '/client/v3/refresh': (var req) => {
    2167              :             'access_token': 'a_new_token',
    2168            2 :             'expires_in_ms': 1000 * 60 * 5,
    2169              :             'refresh_token': 'another_new_token',
    2170              :           },
    2171            0 :       '/client/v3/delete_devices': (var req) => {},
    2172            0 :       '/client/v3/account/3pid/add': (var req) => {},
    2173            0 :       '/client/v3/account/3pid/bind': (var req) => {},
    2174            0 :       '/client/v3/account/3pid/delete': (var req) =>
    2175            0 :           {'id_server_unbind_result': 'success'},
    2176            0 :       '/client/v3/account/3pid/unbind': (var req) =>
    2177            0 :           {'id_server_unbind_result': 'success'},
    2178            2 :       '/client/v3/account/password': (var req) => {},
    2179            0 :       '/client/v3/rooms/1234/report/1234': (var req) => {},
    2180            0 :       '/client/v3/search': (var req) => {
    2181            0 :             'search_categories': {
    2182            0 :               'room_events': {
    2183            0 :                 'groups': {
    2184            0 :                   'room_id': {
    2185            0 :                     '!qPewotXpIctQySfjSy:localhost': {
    2186              :                       'order': 1,
    2187              :                       'next_batch': 'BdgFsdfHSf-dsFD',
    2188            0 :                       'results': ['\$144429830826TWwbB:localhost'],
    2189              :                     },
    2190              :                   },
    2191              :                 },
    2192            0 :                 'highlights': ['martians', 'men'],
    2193              :                 'next_batch': '5FdgFsd234dfgsdfFD',
    2194              :                 'count': 1224,
    2195            0 :                 'results': [
    2196            0 :                   {
    2197              :                     'rank': 0.00424866,
    2198            0 :                     'result': {
    2199            0 :                       'content': {
    2200              :                         'body': 'This is an example text message',
    2201              :                         'msgtype': 'm.text',
    2202              :                         'format': 'org.matrix.custom.html',
    2203              :                         'formatted_body':
    2204              :                             '<b>This is an example text message</b>',
    2205              :                       },
    2206              :                       'type': 'm.room.message',
    2207              :                       'event_id': '\$144429830826TWwbB:localhost',
    2208              :                       'room_id': '!qPewotXpIctQySfjSy:localhost',
    2209              :                       'sender': '@example:example.org',
    2210              :                       'origin_server_ts': 1432735824653,
    2211            0 :                       'unsigned': {'age': 1234},
    2212              :                     },
    2213              :                   }
    2214              :                 ],
    2215              :               },
    2216              :             },
    2217              :           },
    2218            0 :       '/client/v3/account/deactivate': (var req) =>
    2219            0 :           {'id_server_unbind_result': 'success'},
    2220            0 :       '/client/v3/user_directory/search': (var req) => {
    2221            0 :             'results': [
    2222            0 :               {
    2223              :                 'user_id': '@foo:bar.com',
    2224              :                 'display_name': 'Foo',
    2225              :                 'avatar_url': 'mxc://bar.com/foo',
    2226              :               }
    2227              :             ],
    2228              :             'limited': false,
    2229              :           },
    2230            0 :       '/client/v3/register/email/requestToken': (var req) => {
    2231              :             'sid': '123abc',
    2232              :             'submit_url': 'https://example.org/path/to/submitToken',
    2233              :           },
    2234            0 :       '/client/v3/register/msisdn/requestToken': (var req) => {
    2235              :             'sid': '123abc',
    2236              :             'submit_url': 'https://example.org/path/to/submitToken',
    2237              :           },
    2238            0 :       '/client/v3/account/password/email/requestToken': (var req) => {
    2239              :             'sid': '123abc',
    2240              :             'submit_url': 'https://example.org/path/to/submitToken',
    2241              :           },
    2242            0 :       '/client/v3/account/password/msisdn/requestToken': (var req) => {
    2243              :             'sid': '123abc',
    2244              :             'submit_url': 'https://example.org/path/to/submitToken',
    2245              :           },
    2246            0 :       '/client/v3/account/3pid/email/requestToken': (var req) => {
    2247              :             'sid': '123abc',
    2248              :             'submit_url': 'https://example.org/path/to/submitToken',
    2249              :           },
    2250            0 :       '/client/v3/account/3pid/msisdn/requestToken': (var req) => {
    2251              :             'sid': '123abc',
    2252              :             'submit_url': 'https://example.org/path/to/submitToken',
    2253              :           },
    2254              :       '/client/v3/rooms/!localpart%3Aexample.com/receipt/m.read/%241234%3Aexample.com':
    2255            0 :           (var req) => {},
    2256            0 :       '/client/v3/rooms/!localpart%3Aexample.com/read_markers': (var req) => {},
    2257            4 :       '/client/v3/rooms/!1234%3Aexample.com/read_markers': (var req) => {},
    2258              :       '/client/v3/user/${Uri.encodeComponent('@othertest:fakeServer.notExisting')}/filter':
    2259            4 :           (var req) => {'filter_id': '1234'},
    2260              :       '/client/v3/user/${Uri.encodeComponent('@test:fakeServer.notExisting')}/filter':
    2261           66 :           (var req) => {'filter_id': '1234'},
    2262            0 :       '/client/v3/publicRooms?server=example.com': (var req) => {
    2263            0 :             'chunk': [
    2264            0 :               {
    2265            0 :                 'aliases': ['#murrays:cheese.bar'],
    2266              :                 'canonical_alias': '#murrays:cheese.bar',
    2267              :                 'avatar_url': 'mxc://bleeker.street/CHEDDARandBRIE',
    2268              :                 'guest_can_join': false,
    2269              :                 'name': 'CHEESE',
    2270              :                 'num_joined_members': 37,
    2271              :                 'room_id': '!ol19s:bleecker.street',
    2272              :                 'topic': 'Tasty tasty cheese',
    2273              :                 'world_readable': true,
    2274              :               }
    2275              :             ],
    2276              :             'next_batch': 'p190q',
    2277              :             'prev_batch': 'p1902',
    2278              :             'total_room_count_estimate': 115,
    2279              :           },
    2280           20 :       '/client/v3/keys/claim': (var req) => {
    2281           10 :             'failures': {},
    2282           10 :             'one_time_keys': {
    2283           30 :               if (decodeJson(req)['one_time_keys']['@alice:example.com'] !=
    2284              :                   null)
    2285           12 :                 '@alice:example.com': {
    2286            6 :                   'JLAFKJWSCS': {
    2287            6 :                     'signed_curve25519:AAAAAQ': {
    2288              :                       'key': 'ikMXajRlkS7Xi9CROrAh3jXnbygk8mLBdSaY9/al0X0',
    2289            6 :                       'signatures': {
    2290            6 :                         '@alice:example.com': {
    2291              :                           'ed25519:JLAFKJWSCS':
    2292              :                               'XdboCa0Ljoh0Y0i/IVnmMqy/+T1hJyu8BA/nRYniJMQ7QWh/pGS5AsWswdARD+MAX+r4u98Qzk0y27HUddZXDA',
    2293              :                         },
    2294              :                       },
    2295              :                     },
    2296              :                   },
    2297              :                 },
    2298           20 :               if (decodeJson(req)['one_time_keys']
    2299           10 :                       ['@test:fakeServer.notExisting'] !=
    2300              :                   null)
    2301           12 :                 '@test:fakeServer.notExisting': {
    2302            6 :                   'GHTYAJCE': {
    2303            6 :                     'signed_curve25519:AAAAAQ': {
    2304              :                       'key': 'qc72ve94cA28iuE0fXa98QO3uls39DHWdQlYyvvhGh0',
    2305            6 :                       'signatures': {
    2306            6 :                         '@test:fakeServer.notExisting': {
    2307              :                           'ed25519:GHTYAJCE':
    2308              :                               'dFwffr5kTKefO7sjnWLMhTzw7oV31nkPIDRxFy5OQT2OP5++Ao0KRbaBZ6qfuT7lW1owKK0Xk3s7QTBvc/eNDA',
    2309              :                         },
    2310              :                       },
    2311              :                     },
    2312              :                   },
    2313              :                 },
    2314              :             },
    2315              :           },
    2316            0 :       '/client/v3/rooms/!localpart%3Aexample.com/invite': (var req) => {},
    2317            2 :       '/client/v3/rooms/!1234%3AfakeServer.notExisting/invite': (var req) => {},
    2318            0 :       '/client/v3/rooms/!localpart%3Aexample.com/leave': (var req) => {},
    2319            2 :       '/client/v3/rooms/!1234%3AfakeServer.notExisting/leave': (var req) => {},
    2320            0 :       '/client/v3/rooms/!localpart%3Aexample.com/forget': (var req) => {},
    2321            8 :       '/client/v3/rooms/!localpart%3Aserver.abc/kick': (var req) => {},
    2322            2 :       '/client/v3/rooms/!1234%3AfakeServer.notExisting/kick': (var req) => {},
    2323            0 :       '/client/v3/rooms/!localpart%3Aexample.com/kick': (var req) => {},
    2324            0 :       '/client/v3/rooms/!localpart%3Aexample.com/ban': (var req) => {},
    2325            2 :       '/client/v3/rooms/!1234%3AfakeServer.notExisting/ban': (var req) => {},
    2326            0 :       '/client/v3/rooms/!localpart%3Aexample.com/unban': (var req) => {},
    2327            2 :       '/client/v3/rooms/!1234%3AfakeServer.notExisting/unban': (var req) => {},
    2328            0 :       '/client/v3/rooms/!localpart%3Aexample.com/join': (var req) =>
    2329            0 :           {'room_id': '!localpart:example.com'},
    2330              :       '/client/v3/join/!localpart%3Aexample.com?server_name=example.com&server_name=example.abc':
    2331            0 :           (var req) => {'room_id': '!localpart:example.com'},
    2332            1 :       '/client/v3/join/!newroom%3Aexample.com': (var req) =>
    2333            1 :           {'room_id': '!newroom%3A:example.com'},
    2334           10 :       '/client/v3/keys/upload': (var req) => {
    2335            5 :             'one_time_key_counts': {
    2336              :               'curve25519': 10,
    2337              :               'signed_curve25519':
    2338           10 :                   tryCast<Map<String, Object?>>(decodeJson(req))
    2339            5 :                           ?.tryGetMap<String, Object?>('one_time_keys')
    2340            5 :                           ?.keys
    2341            5 :                           .length ??
    2342              :                       0,
    2343              :             },
    2344              :           },
    2345           64 :       '/client/v3/keys/query': (var req) => {
    2346           32 :             'failures': {},
    2347           32 :             'device_keys': {
    2348           32 :               '@alice:example.com': {
    2349           32 :                 'JLAFKJWSCS': {
    2350              :                   'user_id': '@alice:example.com',
    2351              :                   'device_id': 'JLAFKJWSCS',
    2352           32 :                   'algorithms': [
    2353              :                     AlgorithmTypes.olmV1Curve25519AesSha2,
    2354              :                     AlgorithmTypes.megolmV1AesSha2,
    2355              :                   ],
    2356           32 :                   'keys': {
    2357              :                     'curve25519:JLAFKJWSCS':
    2358              :                         'L+4+JCl8MD63dgo8z5Ta+9QAHXiANyOVSfgbHA5d3H8',
    2359              :                     'ed25519:JLAFKJWSCS':
    2360              :                         'rUFJftIWpFF/jqqz3bexGGYiG8UobKhzkeabqw1v0zM',
    2361              :                   },
    2362           32 :                   'signatures': {
    2363           32 :                     '@alice:example.com': {
    2364              :                       'ed25519:JLAFKJWSCS':
    2365              :                           'go3mi5o3Ile+Ik+lCEpHmBmyJmKWfnRDCBBvfaVlKsMyha5IORuYcxwEUrAeLyAeeeHvkWDFX+No5eY1jYeKBw',
    2366              :                     },
    2367              :                   },
    2368           32 :                   'unsigned': {'device_display_name': 'Alices mobile phone'},
    2369              :                 },
    2370           32 :                 'OTHERDEVICE': {
    2371              :                   'user_id': '@alice:example.com',
    2372              :                   'device_id': 'OTHERDEVICE',
    2373           32 :                   'algorithms': [
    2374              :                     AlgorithmTypes.olmV1Curve25519AesSha2,
    2375              :                     AlgorithmTypes.megolmV1AesSha2,
    2376              :                   ],
    2377           32 :                   'keys': {
    2378              :                     'curve25519:OTHERDEVICE':
    2379              :                         'wMIDhiQl5jEXQrTB03ePOSQfR8sA/KMrW0CIfFfXKEE',
    2380              :                     'ed25519:OTHERDEVICE':
    2381              :                         '2Lyaj5NB7HPqKZMjZpA/pECXuQ+9wi8AGFdw33y3DuQ',
    2382              :                   },
    2383           32 :                   'signatures': {
    2384           32 :                     '@alice:example.com': {
    2385              :                       'ed25519:OTHERDEVICE':
    2386              :                           'bwHd6ylISP13AICdDPd0HQd4V6dvvd4vno8/OwUNdm9UAprr3YjkDqVw425I74u2UQAarq9bytBqVqFyD6trAw',
    2387              :                     },
    2388              :                   },
    2389              :                 },
    2390              :               },
    2391           32 :               '@test:fakeServer.notExisting': {
    2392           32 :                 'GHTYAJCE': {
    2393              :                   'user_id': '@test:fakeServer.notExisting',
    2394              :                   'device_id': 'GHTYAJCE',
    2395           32 :                   'algorithms': [
    2396              :                     AlgorithmTypes.olmV1Curve25519AesSha2,
    2397              :                     AlgorithmTypes.megolmV1AesSha2,
    2398              :                   ],
    2399           32 :                   'keys': {
    2400              :                     'curve25519:GHTYAJCE':
    2401              :                         '7rvl3jORJkBiK4XX1e5TnGnqz068XfYJ0W++Ml63rgk',
    2402              :                     'ed25519:GHTYAJCE':
    2403              :                         'gjL//fyaFHADt9KBADGag8g7F8Up78B/K1zXeiEPLJo',
    2404              :                   },
    2405           32 :                   'signatures': {
    2406           32 :                     '@test:fakeServer.notExisting': {
    2407              :                       'ed25519:GHTYAJCE':
    2408              :                           'NEQeTgv7ew1IZSLQphWd0y60EdHdcNfHgvoaMQco5XKeIYyiUZIWd7F4x/mkPDjUizv6yWMbTDCWdSg5XcgNBA',
    2409              :                       'ed25519:F9ypFzgbISXCzxQhhSnXMkc1vq12Luna3Nw5rqViOJY':
    2410              :                           'Q4/55vZjEJD7M2EC40bgZqd9Zuy/4C75UPVopJdXeioQVaKtFf6EF0nUUuql0yD+r3hinsZcock0wO6Q2xcoAQ',
    2411              :                     },
    2412              :                   },
    2413              :                 },
    2414           32 :                 'OTHERDEVICE': {
    2415              :                   'user_id': '@test:fakeServer.notExisting',
    2416              :                   'device_id': 'OTHERDEVICE',
    2417           32 :                   'algorithms': [
    2418              :                     AlgorithmTypes.olmV1Curve25519AesSha2,
    2419              :                     AlgorithmTypes.megolmV1AesSha2,
    2420              :                   ],
    2421           32 :                   'keys': {
    2422              :                     'curve25519:OTHERDEVICE':
    2423              :                         'R96BA0qE1+QAWLp7E1jyWSTJ1VXMLpEdiM2SZHlKMXM',
    2424              :                     'ed25519:OTHERDEVICE':
    2425              :                         'EQo9eYbSygIbOR+tVJziqAY1NI6Gga+JQOVIqJe4mr4',
    2426              :                   },
    2427           32 :                   'signatures': {
    2428           32 :                     '@test:fakeServer.notExisting': {
    2429              :                       'ed25519:OTHERDEVICE':
    2430              :                           '/rT6pVRypJWxGos1QcI7jHL9HwcA83nkHLHqMcRPeLSxXHh4oHWvC0/tl0Xg06ogyiGw4NuB7TpOISvJBdt7BA',
    2431              :                       'ed25519:F9ypFzgbISXCzxQhhSnXMkc1vq12Luna3Nw5rqViOJY':
    2432              :                           'qnjiLl36h/1jlLvcAgt46Igaod2T9lOSnoSVkV0KC+c7vYIjG4QBzXpH+hycfufOT/y+a/kl52dUTLQWctMKCA',
    2433              :                     },
    2434              :                   },
    2435              :                 },
    2436              :               },
    2437           32 :               '@othertest:fakeServer.notExisting': {
    2438           32 :                 'FOXDEVICE': {
    2439              :                   'user_id': '@othertest:fakeServer.notExisting',
    2440              :                   'device_id': 'FOXDEVICE',
    2441           32 :                   'algorithms': [
    2442              :                     AlgorithmTypes.olmV1Curve25519AesSha2,
    2443              :                     AlgorithmTypes.megolmV1AesSha2,
    2444              :                   ],
    2445           32 :                   'keys': {
    2446              :                     'curve25519:FOXDEVICE':
    2447              :                         'JBG7ZaPn54OBC7TuIEiylW3BZ+7WcGQhFBPB9pogbAg',
    2448              :                     'ed25519:FOXDEVICE':
    2449              :                         'R5/p04tticvdlNIxiiBIP0j9OQWv8ep6eEU6/lWKDxw',
    2450              :                   },
    2451           32 :                   'signatures': {
    2452           32 :                     '@othertest:fakeServer.notExisting': {
    2453              :                       'ed25519:FOXDEVICE':
    2454              :                           '2lJ3atmRIWgkyQNC9gvWEpxwuozsBQsg33M2IMDJqLhx/+g3Ds1vQ683dJsYIu04ORa4U0L9TqieHVpV/7qqDA',
    2455              :                     },
    2456              :                   },
    2457              :                 },
    2458              :               },
    2459              :             },
    2460           32 :             'master_keys': {
    2461           32 :               '@test:fakeServer.notExisting': {
    2462              :                 'user_id': '@test:fakeServer.notExisting',
    2463           32 :                 'usage': ['master'],
    2464           32 :                 'keys': {
    2465              :                   'ed25519:82mAXjsmbTbrE6zyShpR869jnrANO75H8nYY0nDLoJ8':
    2466              :                       '82mAXjsmbTbrE6zyShpR869jnrANO75H8nYY0nDLoJ8',
    2467              :                 },
    2468           32 :                 'signatures': {},
    2469              :               },
    2470           32 :               '@othertest:fakeServer.notExisting': {
    2471              :                 'user_id': '@othertest:fakeServer.notExisting',
    2472           32 :                 'usage': ['master'],
    2473           32 :                 'keys': {
    2474              :                   'ed25519:92mAXjsmbTbrE6zyShpR869jnrANO75H8nYY0nDLoJ8':
    2475              :                       '92mAXjsmbTbrE6zyShpR869jnrANO75H8nYY0nDLoJ8',
    2476              :                 },
    2477           32 :                 'signatures': {},
    2478              :               },
    2479              :             },
    2480           32 :             'self_signing_keys': {
    2481           32 :               '@test:fakeServer.notExisting': {
    2482              :                 'user_id': '@test:fakeServer.notExisting',
    2483           32 :                 'usage': ['self_signing'],
    2484           32 :                 'keys': {
    2485              :                   'ed25519:F9ypFzgbISXCzxQhhSnXMkc1vq12Luna3Nw5rqViOJY':
    2486              :                       'F9ypFzgbISXCzxQhhSnXMkc1vq12Luna3Nw5rqViOJY',
    2487              :                 },
    2488           32 :                 'signatures': {
    2489           32 :                   '@test:fakeServer.notExisting': {
    2490              :                     'ed25519:82mAXjsmbTbrE6zyShpR869jnrANO75H8nYY0nDLoJ8':
    2491              :                         'afkrbGvPn5Zb5zc7Lk9cz2skI3QrzI/L0st1GS+/GATxNjMzc6vKmGu7r9cMb1GJxy4RdeUpfH3L7Fs/fNL1Dw',
    2492              :                   },
    2493              :                 },
    2494              :               },
    2495           32 :               '@othertest:fakeServer.notExisting': {
    2496              :                 'user_id': '@othertest:fakeServer.notExisting',
    2497           32 :                 'usage': ['self_signing'],
    2498           32 :                 'keys': {
    2499              :                   'ed25519:self_signing': 'self_signing',
    2500              :                 },
    2501           32 :                 'signatures': {},
    2502              :               },
    2503              :             },
    2504           32 :             'user_signing_keys': {
    2505           32 :               '@test:fakeServer.notExisting': {
    2506              :                 'user_id': '@test:fakeServer.notExisting',
    2507           32 :                 'usage': ['user_signing'],
    2508           32 :                 'keys': {
    2509              :                   'ed25519:0PiwulzJ/RU86LlzSSZ8St80HUMN3dqjKa/orIJoA0g':
    2510              :                       '0PiwulzJ/RU86LlzSSZ8St80HUMN3dqjKa/orIJoA0g',
    2511              :                 },
    2512           32 :                 'signatures': {
    2513           32 :                   '@test:fakeServer.notExisting': {
    2514              :                     'ed25519:82mAXjsmbTbrE6zyShpR869jnrANO75H8nYY0nDLoJ8':
    2515              :                         'pvgbZxEbllaElhpiRnb7/uOIUhrglvHCFnpoxr3/5ZrWa0EK/uaefhex9eEV4uBLrHjHg2ymwdNaM7ap9+sBBg',
    2516              :                   },
    2517              :                 },
    2518              :               },
    2519           32 :               '@othertest:fakeServer.notExisting': {
    2520              :                 'user_id': '@othertest:fakeServer.notExisting',
    2521           32 :                 'usage': ['user_signing'],
    2522           32 :                 'keys': {
    2523              :                   'ed25519:user_signing': 'user_signing',
    2524              :                 },
    2525           32 :                 'signatures': {},
    2526              :               },
    2527              :             },
    2528              :           },
    2529            0 :       '/client/v3/register': (var req) => {
    2530              :             'user_id': '@testuser:example.com',
    2531              :             'access_token': '1234',
    2532              :             'device_id': 'ABCD',
    2533              :           },
    2534            0 :       '/client/v3/register?kind=user': (var req) =>
    2535            0 :           {'user_id': '@testuser:example.com'},
    2536            0 :       '/client/v3/register?kind=guest': (var req) =>
    2537            0 :           {'user_id': '@testuser:example.com'},
    2538            0 :       '/client/v3/rooms/1234/upgrade': (var req) => {},
    2539            0 :       '/client/v3/user/1234/openid/request_token': (var req) => {
    2540              :             'access_token': 'SomeT0kenHere',
    2541              :             'token_type': 'Bearer',
    2542              :             'matrix_server_name': 'example.com',
    2543              :             'expires_in': 3600.0,
    2544              :           },
    2545              :       '/client/v3/user/@test:fakeServer.notExisting/openid/request_token':
    2546            0 :           (var req) => {
    2547              :                 'access_token': 'SomeT0kenHere',
    2548              :                 'token_type': 'Bearer',
    2549              :                 'matrix_server_name': 'example.com',
    2550              :                 'expires_in': 3600,
    2551              :               },
    2552           10 :       '/client/v3/login': (var req) => {
    2553              :             'user_id': '@test:fakeServer.notExisting',
    2554              :             'access_token': 'abc123',
    2555              :             'refresh_token': 'refresh_abc123',
    2556              :             'device_id': 'GHTYAJCE',
    2557            5 :             'well_known': {
    2558            5 :               'm.homeserver': {'base_url': 'https://example.org'},
    2559            5 :               'm.identity_server': {'base_url': 'https://id.example.org'},
    2560              :             },
    2561              :           },
    2562            4 :       '/media/v3/upload?filename=file.jpeg': (var req) =>
    2563            4 :           {'content_uri': 'mxc://example.com/AQwafuaFswefuhsfAFAgsw'},
    2564           20 :       '/client/v3/logout': (var reqI) => {},
    2565            0 :       '/client/v3/pushers/set': (var reqI) => {},
    2566            0 :       '/client/v3/join/1234': (var reqI) => {'room_id': '1234'},
    2567            0 :       '/client/v3/logout/all': (var reqI) => {},
    2568           12 :       '/client/v3/createRoom': (var reqI) => {
    2569              :             'room_id': '!1234:fakeServer.notExisting',
    2570              :           },
    2571            4 :       '/client/v3/rooms/!localpart%3Aserver.abc/read_markers': (var reqI) => {},
    2572            0 :       '/client/v3/rooms/!localpart:server.abc/kick': (var reqI) => {},
    2573            8 :       '/client/v3/rooms/!localpart%3Aserver.abc/ban': (var reqI) => {},
    2574            8 :       '/client/v3/rooms/!localpart%3Aserver.abc/unban': (var reqI) => {},
    2575            4 :       '/client/v3/rooms/!localpart%3Aserver.abc/invite': (var reqI) => {},
    2576           21 :       '/client/v3/keys/signatures/upload': (var reqI) => {'failures': {}},
    2577            2 :       '/client/v3/room_keys/version': (var reqI) => {'version': '5'},
    2578              :       '/client/unstable/org.matrix.msc3814.v1/dehydrated_device/DEHYDDEV/events?limit=100':
    2579            4 :           (var _) => {
    2580            2 :                 'events': [
    2581            2 :                   {
    2582              :                     // this is the commented out m.room_key event - only encrypted
    2583              :                     'sender': '@othertest:fakeServer.notExisting',
    2584            2 :                     'content': {
    2585              :                       'algorithm': AlgorithmTypes.olmV1Curve25519AesSha2,
    2586              :                       'sender_key':
    2587              :                           'JBG7ZaPn54OBC7TuIEiylW3BZ+7WcGQhFBPB9pogbAg',
    2588            2 :                       'ciphertext': {
    2589            2 :                         '7rvl3jORJkBiK4XX1e5TnGnqz068XfYJ0W++Ml63rgk': {
    2590              :                           'type': 0,
    2591              :                           'body':
    2592              :                               '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',
    2593              :                         },
    2594              :                       },
    2595              :                     },
    2596              :                     'type': 'm.room.encrypted',
    2597              :                   },
    2598              :                 ],
    2599              :                 'next_batch': 'd1',
    2600              :               },
    2601              :     },
    2602              :     'PUT': {
    2603              :       '/client/v3/user/${Uri.encodeComponent('@alice:example.com')}/account_data/io.element.recent_emoji}':
    2604            0 :           (var req) => {},
    2605              :       '/client/v3/user/%40test%3AfakeServer.notExisting/account_data/io.element.recent_emoji':
    2606            2 :           (var req) => {},
    2607              :       '/client/v3/user/%40test%3AfakeServer.notExisting/account_data/m.ignored_user_list':
    2608            2 :           (var req) => {},
    2609              :       '/client/v3/presence/${Uri.encodeComponent('@alice:example.com')}/status':
    2610            0 :           (var req) => {},
    2611            0 :       '/client/v3/pushrules/global/content/nocake/enabled': (var req) => {},
    2612            0 :       '/client/v3/pushrules/global/content/nocake/actions': (var req) => {},
    2613              :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.history_visibility':
    2614            4 :           (var req) => {'event_id': '1234'},
    2615              :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.join_rules':
    2616            4 :           (var req) => {'event_id': '1234'},
    2617              :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.guest_access':
    2618            4 :           (var req) => {'event_id': '1234'},
    2619              :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.invite/1234':
    2620            4 :           (var req) => {'event_id': '1234'},
    2621              :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.answer/1234':
    2622            4 :           (var req) => {'event_id': '1234'},
    2623              :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.select_answer/1234':
    2624            4 :           (var req) => {'event_id': '1234'},
    2625              :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.reject/1234':
    2626            4 :           (var req) => {'event_id': '1234'},
    2627              :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.negotiate/1234':
    2628            4 :           (var req) => {'event_id': '1234'},
    2629              :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.candidates/1234':
    2630            4 :           (var req) => {'event_id': '1234'},
    2631              :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.hangup/1234':
    2632            4 :           (var req) => {'event_id': '1234'},
    2633              :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.replaces/1234':
    2634            4 :           (var req) => {'event_id': '1234'},
    2635              :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.asserted_identity/1234':
    2636            4 :           (var req) => {'event_id': '1234'},
    2637              :       '/client/v3/rooms/!calls%3Aexample.com/send/m.call.sdp_stream_metadata_changed/1234':
    2638            4 :           (var req) => {'event_id': '1234'},
    2639              :       '/client/v3/rooms/!calls%3Aexample.com/send/org.matrix.call.sdp_stream_metadata_changed/1234':
    2640            0 :           (var req) => {'event_id': '1234'},
    2641              :       '/client/v3/rooms/!calls%3Aexample.com/send/org.matrix.call.asserted_identity/1234':
    2642            0 :           (var req) => {'event_id': '1234'},
    2643              :       '/client/v3/rooms/!1234%3Aexample.com/redact/1143273582443PhrSn%3Aexample.org/1234':
    2644            2 :           (var req) => {'event_id': '1234'},
    2645            2 :       '/client/v3/pushrules/global/room/!localpart%3Aserver.abc': (var req) =>
    2646            2 :           {},
    2647              :       '/client/v3/pushrules/global/override/.m.rule.master/enabled':
    2648            2 :           (var req) => {},
    2649              :       '/client/v3/pushrules/global/content/nocake?before=1&after=2':
    2650            0 :           (var req) => {},
    2651            0 :       '/client/v3/devices/QBUAZIFURK': (var req) => {},
    2652            0 :       '/client/v3/directory/room/%23testalias%3Aexample.com': (var reqI) => {},
    2653              :       '/client/v3/rooms/!localpart%3Aserver.abc/send/m.room.message/testtxid':
    2654            4 :           (var reqI) => {
    2655            6 :                 'event_id': '\$event${FakeMatrixApi.eventCounter++}',
    2656              :               },
    2657              :       '/client/v3/rooms/!localpart%3Aserver.abc/send/m.reaction/testtxid':
    2658            4 :           (var reqI) => {
    2659            6 :                 'event_id': '\$event${FakeMatrixApi.eventCounter++}',
    2660              :               },
    2661              :       '/client/v3/rooms/!localpart%3Aexample.com/typing/%40alice%3Aexample.com':
    2662            0 :           (var req) => {},
    2663              :       '/client/v3/rooms/!1234%3Aexample.com/send/m.room.message/1234':
    2664            8 :           (var reqI) => {
    2665           12 :                 'event_id': '\$event${FakeMatrixApi.eventCounter++}',
    2666              :               },
    2667              :       '/client/v3/rooms/!1234%3Aexample.com/send/m.room.message/newresend':
    2668            4 :           (var reqI) => {
    2669            6 :                 'event_id': '\$event${FakeMatrixApi.eventCounter++}',
    2670              :               },
    2671              :       '/client/v3/user/%40test%3AfakeServer.notExisting/rooms/!localpart%3Aserver.abc/tags/m.favourite':
    2672            4 :           (var req) => {},
    2673              :       '/client/v3/user/%40alice%3Aexample.com/rooms/!localpart%3Aexample.com/tags/testtag':
    2674            0 :           (var req) => {},
    2675              :       '/client/v3/user/%40alice%3Aexample.com/account_data/test.account.data':
    2676            0 :           (var req) => {},
    2677              :       '/client/v3/user/%40test%3AfakeServer.notExisting/account_data/best%20animal':
    2678            2 :           (var req) => {},
    2679              :       '/client/v3/user/%40alice%3Aexample.com/rooms/1234/account_data/test.account.data':
    2680            0 :           (var req) => {},
    2681              :       '/client/v3/user/%40test%3AfakeServer.notExisting/rooms/!localpart%3Aserver.abc/account_data/m.marked_unread':
    2682            4 :           (var req) => {},
    2683              :       '/client/v3/user/%40test%3AfakeServer.notExisting/account_data/m.direct':
    2684           16 :           (var req) => {},
    2685              :       '/client/v3/user/%40othertest%3AfakeServer.notExisting/account_data/m.direct':
    2686            0 :           (var req) => {},
    2687            0 :       '/client/v3/profile/%40alice%3Aexample.com/displayname': (var reqI) => {},
    2688            0 :       '/client/v3/profile/%40alice%3Aexample.com/avatar_url': (var reqI) => {},
    2689              :       '/client/v3/profile/%40test%3AfakeServer.notExisting/avatar_url':
    2690            2 :           (var reqI) => {},
    2691              :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.encryption':
    2692            4 :           (var reqI) => {'event_id': 'YUwRidLecu:example.com'},
    2693              :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.avatar':
    2694            4 :           (var reqI) => {'event_id': 'YUwRidLecu:example.com'},
    2695              :       '/client/v3/rooms/!localpart%3Aserver.abc/send/m.room.message/1234':
    2696            0 :           (var reqI) => {'event_id': 'YUwRidLecu:example.com'},
    2697            0 :       '/client/v3/rooms/!localpart%3Aserver.abc/redact/1234/1234': (var reqI) =>
    2698            0 :           {'event_id': 'YUwRidLecu:example.com'},
    2699              :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.name':
    2700            4 :           (var reqI) => {
    2701              :                 'event_id': '42',
    2702              :               },
    2703              :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.topic':
    2704            4 :           (var reqI) => {
    2705              :                 'event_id': '42',
    2706              :               },
    2707              :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.pinned_events':
    2708            0 :           (var reqI) => {
    2709              :                 'event_id': '42',
    2710              :               },
    2711              :       '/client/v3/rooms/!localpart%3Aserver.abc/state/m.room.power_levels':
    2712            8 :           (var reqI) => {
    2713              :                 'event_id': '42',
    2714              :               },
    2715              :       '/client/v3/rooms/!calls%3Aexample.com/state/m.room.power_levels':
    2716            4 :           (var reqI) => {
    2717              :                 'event_id': '42',
    2718              :               },
    2719            0 :       '/client/v3/directory/list/room/!localpart%3Aexample.com': (var req) =>
    2720            0 :           {},
    2721            0 :       '/client/v3/room_keys/version/5': (var req) => {},
    2722              :       '/client/v3/room_keys/keys/${Uri.encodeComponent('!726s6s6q:example.com')}/${Uri.encodeComponent('ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU')}?version=5':
    2723            0 :           (var req) => {
    2724              :                 'etag': 'asdf',
    2725              :                 'count': 1,
    2726              :               },
    2727              :       '/client/v3/room_keys/keys/${Uri.encodeComponent('!726s6s6q:example.com')}?version=5':
    2728            0 :           (var req) => {
    2729              :                 'etag': 'asdf',
    2730              :                 'count': 1,
    2731              :               },
    2732            8 :       '/client/v3/room_keys/keys?version=5': (var req) => {
    2733              :             'etag': 'asdf',
    2734              :             'count': 1,
    2735              :           },
    2736            4 :       '/client/unstable/org.matrix.msc3814.v1/dehydrated_device': (var _) => {
    2737              :             'device_id': 'DEHYDDEV',
    2738              :           },
    2739              :     },
    2740              :     'DELETE': {
    2741            0 :       '/unknown/token': (var req) => {'errcode': 'M_UNKNOWN_TOKEN'},
    2742            0 :       '/client/v3/devices/QBUAZIFURK': (var req) => {},
    2743            0 :       '/client/v3/directory/room/%23testalias%3Aexample.com': (var reqI) => {},
    2744            0 :       '/client/v3/pushrules/global/content/nocake': (var req) => {},
    2745              :       '/client/v3/pushrules/global/override/!localpart%3Aserver.abc':
    2746            4 :           (var req) => {},
    2747              :       '/client/v3/user/%40test%3AfakeServer.notExisting/rooms/!localpart%3Aserver.abc/tags/m.favourite':
    2748            4 :           (var req) => {},
    2749              :       '/client/v3/user/%40alice%3Aexample.com/rooms/!localpart%3Aexample.com/tags/testtag':
    2750            0 :           (var req) => {},
    2751            0 :       '/client/v3/room_keys/version/5': (var req) => {},
    2752              :       '/client/v3/room_keys/keys/${Uri.encodeComponent('!726s6s6q:example.com')}/${Uri.encodeComponent('ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU')}?version=5':
    2753            0 :           (var req) => {
    2754              :                 'etag': 'asdf',
    2755              :                 'count': 1,
    2756              :               },
    2757              :       '/client/v3/room_keys/keys/${Uri.encodeComponent('!726s6s6q:example.com')}?version=5':
    2758            0 :           (var req) => {
    2759              :                 'etag': 'asdf',
    2760              :                 'count': 1,
    2761              :               },
    2762            0 :       '/client/v3/room_keys/keys?version=5': (var req) => {
    2763              :             'etag': 'asdf',
    2764              :             'count': 1,
    2765              :           },
    2766              :     },
    2767              :   };
    2768              : }
        

Generated by: LCOV version 2.0-1