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

Generated by: LCOV version 1.14