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

Generated by: LCOV version 1.14