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

Generated by: LCOV version 1.14