Merge branch 'sdk-refactor-new-linter' into 'master'

[SDK] Refactoring with new linter rules

See merge request famedly/famedlysdk!250
This commit is contained in:
Christian Pauly 2020-03-30 09:08:38 +00:00
commit 0266ab9659
42 changed files with 2827 additions and 2847 deletions

View file

@ -35,8 +35,7 @@ class AccountData {
/// Get a State event from a table row or from the event stream.
factory AccountData.fromJson(Map<String, dynamic> jsonPayload) {
final Map<String, dynamic> content =
Event.getMapFromPayload(jsonPayload['content']);
final content = Event.getMapFromPayload(jsonPayload['content']);
return AccountData(content: content, typeKey: jsonPayload['type']);
}
}

File diff suppressed because it is too large Load diff

View file

@ -47,7 +47,7 @@ class Event {
/// The user who has sent this event if it is not a global account data event.
final String senderId;
User get sender => room.getUserByMXIDSync(senderId ?? "@unknown");
User get sender => room.getUserByMXIDSync(senderId ?? '@unknown');
/// The time this event has received at the server. May be null for events like
/// account data.
@ -78,17 +78,17 @@ class Event {
static const int defaultStatus = 2;
static const Map<String, int> STATUS_TYPE = {
"ERROR": -1,
"SENDING": 0,
"SENT": 1,
"TIMELINE": 2,
"ROOM_STATE": 3,
'ERROR': -1,
'SENDING': 0,
'SENT': 1,
'TIMELINE': 2,
'ROOM_STATE': 3,
};
/// Optional. The event that redacted this event, if any. Otherwise null.
Event get redactedBecause =>
unsigned != null && unsigned.containsKey("redacted_because")
? Event.fromJson(unsigned["redacted_because"], room)
unsigned != null && unsigned.containsKey('redacted_because')
? Event.fromJson(unsigned['redacted_because'], room)
: null;
bool get redacted => redactedBecause != null;
@ -122,12 +122,9 @@ class Event {
/// Get a State event from a table row or from the event stream.
factory Event.fromJson(Map<String, dynamic> jsonPayload, Room room) {
final Map<String, dynamic> content =
Event.getMapFromPayload(jsonPayload['content']);
final Map<String, dynamic> unsigned =
Event.getMapFromPayload(jsonPayload['unsigned']);
final Map<String, dynamic> prevContent =
Event.getMapFromPayload(jsonPayload['prev_content']);
final content = Event.getMapFromPayload(jsonPayload['content']);
final unsigned = Event.getMapFromPayload(jsonPayload['unsigned']);
final prevContent = Event.getMapFromPayload(jsonPayload['prev_content']);
return Event(
status: jsonPayload['status'] ?? defaultStatus,
stateKey: jsonPayload['state_key'],
@ -146,19 +143,19 @@ class Event {
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = Map<String, dynamic>();
if (this.stateKey != null) data['state_key'] = this.stateKey;
if (this.prevContent != null && this.prevContent.isNotEmpty) {
data['prev_content'] = this.prevContent;
final data = <String, dynamic>{};
if (stateKey != null) data['state_key'] = stateKey;
if (prevContent != null && prevContent.isNotEmpty) {
data['prev_content'] = prevContent;
}
data['content'] = this.content;
data['type'] = this.typeKey;
data['event_id'] = this.eventId;
data['room_id'] = this.roomId;
data['sender'] = this.senderId;
data['origin_server_ts'] = this.time.millisecondsSinceEpoch;
if (this.unsigned != null && this.unsigned.isNotEmpty) {
data['unsigned'] = this.unsigned;
data['content'] = content;
data['type'] = typeKey;
data['event_id'] = eventId;
data['room_id'] = roomId;
data['sender'] = senderId;
data['origin_server_ts'] = time.millisecondsSinceEpoch;
if (unsigned != null && unsigned.isNotEmpty) {
data['unsigned'] = unsigned;
}
return data;
}
@ -183,45 +180,45 @@ class Event {
/// Get the real type.
EventTypes get type {
switch (typeKey) {
case "m.room.avatar":
case 'm.room.avatar':
return EventTypes.RoomAvatar;
case "m.room.name":
case 'm.room.name':
return EventTypes.RoomName;
case "m.room.topic":
case 'm.room.topic':
return EventTypes.RoomTopic;
case "m.room.aliases":
case 'm.room.aliases':
return EventTypes.RoomAliases;
case "m.room.canonical_alias":
case 'm.room.canonical_alias':
return EventTypes.RoomCanonicalAlias;
case "m.room.create":
case 'm.room.create':
return EventTypes.RoomCreate;
case "m.room.redaction":
case 'm.room.redaction':
return EventTypes.Redaction;
case "m.room.join_rules":
case 'm.room.join_rules':
return EventTypes.RoomJoinRules;
case "m.room.member":
case 'm.room.member':
return EventTypes.RoomMember;
case "m.room.power_levels":
case 'm.room.power_levels':
return EventTypes.RoomPowerLevels;
case "m.room.guest_access":
case 'm.room.guest_access':
return EventTypes.GuestAccess;
case "m.room.history_visibility":
case 'm.room.history_visibility':
return EventTypes.HistoryVisibility;
case "m.sticker":
case 'm.sticker':
return EventTypes.Sticker;
case "m.room.message":
case 'm.room.message':
return EventTypes.Message;
case "m.room.encrypted":
case 'm.room.encrypted':
return EventTypes.Encrypted;
case "m.room.encryption":
case 'm.room.encryption':
return EventTypes.Encryption;
case "m.call.invite":
case 'm.call.invite':
return EventTypes.CallInvite;
case "m.call.answer":
case 'm.call.answer':
return EventTypes.CallAnswer;
case "m.call.candidates":
case 'm.call.candidates':
return EventTypes.CallCandidates;
case "m.call.hangup":
case 'm.call.hangup':
return EventTypes.CallHangup;
}
return EventTypes.Unknown;
@ -229,29 +226,29 @@ class Event {
///
MessageTypes get messageType {
switch (content["msgtype"] ?? "m.text") {
case "m.text":
if (content.containsKey("m.relates_to")) {
switch (content['msgtype'] ?? 'm.text') {
case 'm.text':
if (content.containsKey('m.relates_to')) {
return MessageTypes.Reply;
}
return MessageTypes.Text;
case "m.notice":
case 'm.notice':
return MessageTypes.Notice;
case "m.emote":
case 'm.emote':
return MessageTypes.Emote;
case "m.image":
case 'm.image':
return MessageTypes.Image;
case "m.video":
case 'm.video':
return MessageTypes.Video;
case "m.audio":
case 'm.audio':
return MessageTypes.Audio;
case "m.file":
case 'm.file':
return MessageTypes.File;
case "m.sticker":
case 'm.sticker':
return MessageTypes.Sticker;
case "m.location":
case 'm.location':
return MessageTypes.Location;
case "m.bad.encrypted":
case 'm.bad.encrypted':
return MessageTypes.BadEncrypted;
default:
if (type == EventTypes.Message) {
@ -263,40 +260,40 @@ class Event {
void setRedactionEvent(Event redactedBecause) {
unsigned = {
"redacted_because": redactedBecause.toJson(),
'redacted_because': redactedBecause.toJson(),
};
prevContent = null;
List<String> contentKeyWhiteList = [];
var contentKeyWhiteList = <String>[];
switch (type) {
case EventTypes.RoomMember:
contentKeyWhiteList.add("membership");
contentKeyWhiteList.add('membership');
break;
case EventTypes.RoomCreate:
contentKeyWhiteList.add("creator");
contentKeyWhiteList.add('creator');
break;
case EventTypes.RoomJoinRules:
contentKeyWhiteList.add("join_rule");
contentKeyWhiteList.add('join_rule');
break;
case EventTypes.RoomPowerLevels:
contentKeyWhiteList.add("ban");
contentKeyWhiteList.add("events");
contentKeyWhiteList.add("events_default");
contentKeyWhiteList.add("kick");
contentKeyWhiteList.add("redact");
contentKeyWhiteList.add("state_default");
contentKeyWhiteList.add("users");
contentKeyWhiteList.add("users_default");
contentKeyWhiteList.add('ban');
contentKeyWhiteList.add('events');
contentKeyWhiteList.add('events_default');
contentKeyWhiteList.add('kick');
contentKeyWhiteList.add('redact');
contentKeyWhiteList.add('state_default');
contentKeyWhiteList.add('users');
contentKeyWhiteList.add('users_default');
break;
case EventTypes.RoomAliases:
contentKeyWhiteList.add("aliases");
contentKeyWhiteList.add('aliases');
break;
case EventTypes.HistoryVisibility:
contentKeyWhiteList.add("history_visibility");
contentKeyWhiteList.add('history_visibility');
break;
default:
break;
}
List<String> toRemoveList = [];
var toRemoveList = <String>[];
for (var entry in content.entries) {
if (!contentKeyWhiteList.contains(entry.key)) {
toRemoveList.add(entry.key);
@ -306,30 +303,30 @@ class Event {
}
/// Returns the body of this event if it has a body.
String get text => content["body"] ?? "";
String get text => content['body'] ?? '';
/// Returns the formatted boy of this event if it has a formatted body.
String get formattedText => content["formatted_body"] ?? "";
String get formattedText => content['formatted_body'] ?? '';
@Deprecated("Use [body] instead.")
@Deprecated('Use [body] instead.')
String getBody() => body;
/// Use this to get the body.
String get body {
if (redacted) return "Redacted";
if (text != "") return text;
if (formattedText != "") return formattedText;
return "$type";
if (redacted) return 'Redacted';
if (text != '') return text;
if (formattedText != '') return formattedText;
return '$type';
}
/// Returns a list of [Receipt] instances for this event.
List<Receipt> get receipts {
if (!(room.roomAccountData.containsKey("m.receipt"))) return [];
List<Receipt> receiptsList = [];
for (var entry in room.roomAccountData["m.receipt"].content.entries) {
if (entry.value["event_id"] == eventId) {
if (!(room.roomAccountData.containsKey('m.receipt'))) return [];
var receiptsList = <Receipt>[];
for (var entry in room.roomAccountData['m.receipt'].content.entries) {
if (entry.value['event_id'] == eventId) {
receiptsList.add(Receipt(room.getUserByMXIDSync(entry.key),
DateTime.fromMillisecondsSinceEpoch(entry.value["ts"])));
DateTime.fromMillisecondsSinceEpoch(entry.value['ts'])));
}
}
return receiptsList;
@ -345,12 +342,12 @@ class Event {
room.client.onEvent.add(EventUpdate(
roomID: room.id,
type: "timeline",
type: 'timeline',
eventType: typeKey,
content: {
"event_id": eventId,
"status": -2,
"content": {"body": "Removed..."}
'event_id': eventId,
'status': -2,
'content': {'body': 'Removed...'}
}));
return true;
}
@ -361,7 +358,7 @@ class Event {
Future<String> sendAgain({String txid}) async {
if (status != -1) return null;
await remove();
final String eventID = await room.sendTextEvent(text, txid: txid);
final eventID = await room.sendTextEvent(text, txid: txid);
return eventID;
}
@ -397,34 +394,34 @@ class Event {
/// in the room. If the event is not encrypted or the decryption failed because
/// of a different error, this throws an exception.
Future<void> requestKey() async {
if (this.type != EventTypes.Encrypted ||
this.messageType != MessageTypes.BadEncrypted ||
this.content["body"] != DecryptError.UNKNOWN_SESSION) {
throw ("Session key not unknown");
if (type != EventTypes.Encrypted ||
messageType != MessageTypes.BadEncrypted ||
content['body'] != DecryptError.UNKNOWN_SESSION) {
throw ('Session key not unknown');
}
final List<User> users = await room.requestParticipants();
final users = await room.requestParticipants();
await room.client.sendToDevice(
[],
"m.room_key_request",
'm.room_key_request',
{
"action": "request_cancellation",
"request_id": base64.encode(utf8.encode(content["session_id"])),
"requesting_device_id": room.client.deviceID,
'action': 'request_cancellation',
'request_id': base64.encode(utf8.encode(content['session_id'])),
'requesting_device_id': room.client.deviceID,
},
toUsers: users);
await room.client.sendToDevice(
[],
"m.room_key_request",
'm.room_key_request',
{
"action": "request",
"body": {
"algorithm": "m.megolm.v1.aes-sha2",
"room_id": roomId,
"sender_key": content["sender_key"],
"session_id": content["session_id"],
'action': 'request',
'body': {
'algorithm': 'm.megolm.v1.aes-sha2',
'room_id': roomId,
'sender_key': content['sender_key'],
'session_id': content['session_id'],
},
"request_id": base64.encode(utf8.encode(content["session_id"])),
"requesting_device_id": room.client.deviceID,
'request_id': base64.encode(utf8.encode(content['session_id'])),
'requesting_device_id': room.client.deviceID,
},
encrypted: false,
toUsers: users);
@ -435,27 +432,27 @@ class Event {
/// event and returns it as a [MatrixFile]. If this event doesn't
/// contain an attachment, this throws an error.
Future<MatrixFile> downloadAndDecryptAttachment() async {
if (![EventTypes.Message, EventTypes.Sticker].contains(this.type)) {
if (![EventTypes.Message, EventTypes.Sticker].contains(type)) {
throw ("This event has the type '$typeKey' and so it can't contain an attachment.");
}
if (!content.containsKey("url") && !content.containsKey("file")) {
if (!content.containsKey('url') && !content.containsKey('file')) {
throw ("This event hasn't any attachment.");
}
final bool isEncrypted = !content.containsKey("url");
final isEncrypted = !content.containsKey('url');
if (isEncrypted && !room.client.encryptionEnabled) {
throw ("Encryption is not enabled in your Client.");
throw ('Encryption is not enabled in your Client.');
}
MxContent mxContent =
MxContent(isEncrypted ? content["file"]["url"] : content["url"]);
var mxContent =
MxContent(isEncrypted ? content['file']['url'] : content['url']);
Uint8List uint8list;
// Is this file storeable?
final bool storeable = room.client.storeAPI.extended &&
content["info"] is Map<String, dynamic> &&
content["info"]["size"] is int &&
content["info"]["size"] <= ExtendedStoreAPI.MAX_FILE_SIZE;
final storeable = room.client.storeAPI.extended &&
content['info'] is Map<String, dynamic> &&
content['info']['size'] is int &&
content['info']['size'] <= ExtendedStoreAPI.MAX_FILE_SIZE;
if (storeable) {
uint8list = await room.client.store.getFile(mxContent.mxc);
@ -470,18 +467,18 @@ class Event {
// Decrypt the file
if (isEncrypted) {
if (!content.containsKey("file") ||
!content["file"]["key"]["key_ops"].contains("decrypt")) {
if (!content.containsKey('file') ||
!content['file']['key']['key_ops'].contains('decrypt')) {
throw ("Missing 'decrypt' in 'key_ops'.");
}
final EncryptedFile encryptedFile = EncryptedFile();
final encryptedFile = EncryptedFile();
encryptedFile.data = uint8list;
encryptedFile.iv = content["file"]["iv"];
encryptedFile.k = content["file"]["key"]["k"];
encryptedFile.sha256 = content["file"]["hashes"]["sha256"];
encryptedFile.iv = content['file']['iv'];
encryptedFile.k = content['file']['key']['k'];
encryptedFile.sha256 = content['file']['hashes']['sha256'];
uint8list = await decryptFile(encryptedFile);
}
return MatrixFile(bytes: uint8list, path: "/$body");
return MatrixFile(bytes: uint8list, path: '/$body');
}
}

View file

@ -44,7 +44,7 @@ class Presence {
Presence.fromJson(Map<String, dynamic> json)
: sender = json['sender'],
displayname = json['content']['displayname'],
avatarUrl = MxContent(json['content']['avatar_url'] ?? ""),
avatarUrl = MxContent(json['content']['avatar_url'] ?? ''),
currentlyActive = json['content']['currently_active'],
lastActiveAgo = json['content']['last_active_ago'],
time = DateTime.fromMillisecondsSinceEpoch(

File diff suppressed because it is too large Load diff

View file

@ -39,8 +39,7 @@ class RoomAccountData extends AccountData {
/// Get a State event from a table row or from the event stream.
factory RoomAccountData.fromJson(
Map<String, dynamic> jsonPayload, Room room) {
final Map<String, dynamic> content =
Event.getMapFromPayload(jsonPayload['content']);
final content = Event.getMapFromPayload(jsonPayload['content']);
return RoomAccountData(
content: content,
typeKey: jsonPayload['type'],

View file

@ -66,13 +66,14 @@ abstract class ExtendedStoreAPI extends StoreAPI {
/// Whether this is a simple store which only stores the client credentials and
/// end to end encryption stuff or the whole sync payloads.
@override
final bool extended = true;
/// The current trans
Future<void> setRoomPrevBatch(String roomId, String prevBatch);
/// Performs these query or queries inside of an transaction.
Future<void> transaction(void queries());
Future<void> transaction(void Function() queries);
/// Will be automatically called on every synchronisation. Must be called inside of
// /// [transaction].

View file

@ -43,11 +43,11 @@ class EventUpdate {
EventUpdate({this.eventType, this.roomID, this.type, this.content});
EventUpdate decrypt(Room room) {
if (eventType != "m.room.encrypted") {
if (eventType != 'm.room.encrypted') {
return this;
}
try {
Event decrpytedEvent =
var decrpytedEvent =
room.decryptGroupMessage(Event.fromJson(content, room));
return EventUpdate(
eventType: eventType,
@ -56,7 +56,7 @@ class EventUpdate {
content: decrpytedEvent.toJson(),
);
} catch (e) {
print("[LibOlm] Could not decrypt megolm event: " + e.toString());
print('[LibOlm] Could not decrypt megolm event: ' + e.toString());
return this;
}
}

View file

@ -25,7 +25,6 @@ import 'dart:async';
import 'event.dart';
import 'room.dart';
import 'user.dart';
import 'sync/event_update.dart';
typedef onTimelineUpdateCallback = void Function();
@ -45,17 +44,17 @@ class Timeline {
StreamSubscription<String> sessionIdReceivedSub;
bool _requestingHistoryLock = false;
Map<String, Event> _eventCache = {};
final Map<String, Event> _eventCache = {};
/// Searches for the event in this timeline. If not
/// found, requests from the server. Requested events
/// are cached.
Future<Event> getEventById(String id) async {
for (int i = 0; i < events.length; i++) {
for (var i = 0; i < events.length; i++) {
if (events[i].eventId == id) return events[i];
}
if (_eventCache.containsKey(id)) return _eventCache[id];
final Event requestedEvent = await room.getEventById(id);
final requestedEvent = await room.getEventById(id);
if (requestedEvent == null) return null;
_eventCache[id] = requestedEvent;
return _eventCache[id];
@ -89,12 +88,12 @@ class Timeline {
}
void _sessionKeyReceived(String sessionId) {
bool decryptAtLeastOneEvent = false;
for (int i = 0; i < events.length; i++) {
var decryptAtLeastOneEvent = false;
for (var i = 0; i < events.length; i++) {
if (events[i].type == EventTypes.Encrypted &&
events[i].messageType == MessageTypes.BadEncrypted &&
events[i].content["body"] == DecryptError.UNKNOWN_SESSION &&
events[i].content["session_id"] == sessionId) {
events[i].content['body'] == DecryptError.UNKNOWN_SESSION &&
events[i].content['session_id'] == sessionId) {
events[i] = events[i].decrypted;
if (events[i].type != EventTypes.Encrypted) {
decryptAtLeastOneEvent = true;
@ -117,26 +116,25 @@ class Timeline {
try {
if (eventUpdate.roomID != room.id) return;
if (eventUpdate.type == "timeline" || eventUpdate.type == "history") {
if (eventUpdate.type == 'timeline' || eventUpdate.type == 'history') {
// Redaction events are handled as modification for existing events.
if (eventUpdate.eventType == "m.room.redaction") {
final int eventId =
_findEvent(event_id: eventUpdate.content["redacts"]);
if (eventUpdate.eventType == 'm.room.redaction') {
final eventId = _findEvent(event_id: eventUpdate.content['redacts']);
if (eventId != null) {
events[eventId]
.setRedactionEvent(Event.fromJson(eventUpdate.content, room));
}
} else if (eventUpdate.content["status"] == -2) {
int i = _findEvent(event_id: eventUpdate.content["event_id"]);
} else if (eventUpdate.content['status'] == -2) {
var i = _findEvent(event_id: eventUpdate.content['event_id']);
if (i < events.length) events.removeAt(i);
}
// Is this event already in the timeline?
else if (eventUpdate.content.containsKey("unsigned") &&
eventUpdate.content["unsigned"]["transaction_id"] is String) {
int i = _findEvent(
event_id: eventUpdate.content["event_id"],
unsigned_txid: eventUpdate.content.containsKey("unsigned")
? eventUpdate.content["unsigned"]["transaction_id"]
else if (eventUpdate.content.containsKey('unsigned') &&
eventUpdate.content['unsigned']['transaction_id'] is String) {
var i = _findEvent(
event_id: eventUpdate.content['event_id'],
unsigned_txid: eventUpdate.content.containsKey('unsigned')
? eventUpdate.content['unsigned']['transaction_id']
: null);
if (i < events.length) {
@ -144,18 +142,18 @@ class Timeline {
}
} else {
Event newEvent;
User senderUser = await room.client.store
?.getUser(matrixID: eventUpdate.content["sender"], room: room);
var senderUser = await room.client.store
?.getUser(matrixID: eventUpdate.content['sender'], room: room);
if (senderUser != null) {
eventUpdate.content["displayname"] = senderUser.displayName;
eventUpdate.content["avatar_url"] = senderUser.avatarUrl.mxc;
eventUpdate.content['displayname'] = senderUser.displayName;
eventUpdate.content['avatar_url'] = senderUser.avatarUrl.mxc;
}
newEvent = Event.fromJson(eventUpdate.content, room);
if (eventUpdate.type == "history" &&
if (eventUpdate.type == 'history' &&
events.indexWhere(
(e) => e.eventId == eventUpdate.content["event_id"]) !=
(e) => e.eventId == eventUpdate.content['event_id']) !=
-1) return;
events.insert(0, newEvent);
@ -165,14 +163,14 @@ class Timeline {
sortAndUpdate();
} catch (e) {
if (room.client.debug) {
print("[WARNING] (_handleEventUpdate) ${e.toString()}");
print('[WARNING] (_handleEventUpdate) ${e.toString()}');
}
}
}
bool sortLock = false;
sort() {
void sort() {
if (sortLock || events.length < 2) return;
sortLock = true;
events?.sort((a, b) =>
@ -180,7 +178,7 @@ class Timeline {
sortLock = false;
}
sortAndUpdate() {
void sortAndUpdate() async {
sort();
if (onUpdate != null) onUpdate();
}

View file

@ -37,14 +37,14 @@ class User extends Event {
String avatarUrl,
Room room,
}) {
Map<String, String> content = {};
if (membership != null) content["membership"] = membership;
if (displayName != null) content["displayname"] = displayName;
if (avatarUrl != null) content["avatar_url"] = avatarUrl;
var content = <String, String>{};
if (membership != null) content['membership'] = membership;
if (displayName != null) content['displayname'] = displayName;
if (avatarUrl != null) content['avatar_url'] = avatarUrl;
return User.fromState(
stateKey: id,
content: content,
typeKey: "m.room.member",
typeKey: 'm.room.member',
roomId: room?.id,
room: room,
time: DateTime.now(),
@ -78,7 +78,7 @@ class User extends Event {
String get id => stateKey;
/// The displayname of the user if the user has set one.
String get displayName => content != null ? content["displayname"] : null;
String get displayName => content != null ? content['displayname'] : null;
/// Returns the power level of this user.
int get powerLevel => room?.getPowerLevelByUserId(id);
@ -89,21 +89,21 @@ class User extends Event {
/// leave
/// ban
Membership get membership => Membership.values.firstWhere((e) {
if (content["membership"] != null) {
if (content['membership'] != null) {
return e.toString() == 'Membership.' + content['membership'];
}
return false;
}, orElse: () => Membership.join);
/// The avatar if the user has one.
MxContent get avatarUrl => content != null && content["avatar_url"] is String
? MxContent(content["avatar_url"])
: MxContent("");
MxContent get avatarUrl => content != null && content['avatar_url'] is String
? MxContent(content['avatar_url'])
: MxContent('');
/// Returns the displayname or the local part of the Matrix ID if the user
/// has no displayname.
String calcDisplayname() => (displayName == null || displayName.isEmpty)
? (stateKey != null ? stateKey.localpart : "Unknown User")
? (stateKey != null ? stateKey.localpart : 'Unknown User')
: displayName;
/// Call the Matrix API to kick this user from this room.
@ -122,20 +122,20 @@ class User extends Event {
/// Returns null on error.
Future<String> startDirectChat() async {
// Try to find an existing direct chat
String roomID = await room.client?.getDirectChatFromUserId(id);
var roomID = await room.client?.getDirectChatFromUserId(id);
if (roomID != null) return roomID;
// Start a new direct chat
final dynamic resp = await room.client.jsonRequest(
type: HTTPType.POST,
action: "/client/r0/createRoom",
action: '/client/r0/createRoom',
data: {
"invite": [id],
"is_direct": true,
"preset": "trusted_private_chat"
'invite': [id],
'is_direct': true,
'preset': 'trusted_private_chat'
});
final String newRoomID = resp["room_id"];
final String newRoomID = resp['room_id'];
if (newRoomID == null) return newRoomID;

View file

@ -1,7 +1,6 @@
import 'dart:convert';
import '../client.dart';
import '../room.dart';
class DeviceKeysList {
String userId;
@ -19,18 +18,20 @@ class DeviceKeysList {
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = Map<String, dynamic>();
data['user_id'] = this.userId;
data['outdated'] = this.outdated ?? true;
var map = <String, dynamic>{};
final data = map;
data['user_id'] = userId;
data['outdated'] = outdated ?? true;
Map<String, dynamic> rawDeviceKeys = {};
for (final deviceKeyEntry in this.deviceKeys.entries) {
var rawDeviceKeys = <String, dynamic>{};
for (final deviceKeyEntry in deviceKeys.entries) {
rawDeviceKeys[deviceKeyEntry.key] = deviceKeyEntry.value.toJson();
}
data['device_keys'] = rawDeviceKeys;
return data;
}
@override
String toString() => json.encode(toJson());
DeviceKeysList(this.userId);
@ -46,8 +47,8 @@ class DeviceKeys {
bool verified;
bool blocked;
String get curve25519Key => keys["curve25519:$deviceId"];
String get ed25519Key => keys["ed25519:$deviceId"];
String get curve25519Key => keys['curve25519:$deviceId'];
String get ed25519Key => keys['ed25519:$deviceId'];
Future<void> setVerified(bool newVerified, Client client) {
verified = newVerified;
@ -56,7 +57,7 @@ class DeviceKeys {
Future<void> setBlocked(bool newBlocked, Client client) {
blocked = newBlocked;
for (Room room in client.rooms) {
for (var room in client.rooms) {
if (!room.encrypted) continue;
if (room.getParticipants().indexWhere((u) => u.id == userId) != -1) {
room.clearOutboundGroupSession();
@ -92,21 +93,21 @@ class DeviceKeys {
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = Map<String, dynamic>();
data['user_id'] = this.userId;
data['device_id'] = this.deviceId;
data['algorithms'] = this.algorithms;
if (this.keys != null) {
data['keys'] = this.keys;
final data = <String, dynamic>{};
data['user_id'] = userId;
data['device_id'] = deviceId;
data['algorithms'] = algorithms;
if (keys != null) {
data['keys'] = keys;
}
if (this.signatures != null) {
data['signatures'] = this.signatures;
if (signatures != null) {
data['signatures'] = signatures;
}
if (this.unsigned != null) {
data['unsigned'] = this.unsigned;
if (unsigned != null) {
data['unsigned'] = unsigned;
}
data['verified'] = this.verified;
data['blocked'] = this.blocked;
data['verified'] = verified;
data['blocked'] = blocked;
return data;
}
}

View file

@ -48,34 +48,34 @@ class MatrixException implements Exception {
/// The unique identifier for this error.
String get errcode =>
raw["errcode"] ??
(requireAdditionalAuthentication ? "M_FORBIDDEN" : "M_UNKNOWN");
raw['errcode'] ??
(requireAdditionalAuthentication ? 'M_FORBIDDEN' : 'M_UNKNOWN');
/// A human readable error description.
String get errorMessage =>
raw["error"] ??
raw['error'] ??
(requireAdditionalAuthentication
? "Require additional authentication"
: "Unknown error");
? 'Require additional authentication'
: 'Unknown error');
/// The frozen request which triggered this Error
http.Response response;
MatrixException(this.response) : this.raw = json.decode(response.body);
MatrixException(this.response) : raw = json.decode(response.body);
@override
String toString() => "$errcode: $errorMessage";
String toString() => '$errcode: $errorMessage';
/// Returns the [ResponseError]. Is ResponseError.NONE if there wasn't an error.
MatrixError get error => MatrixError.values.firstWhere(
(e) => e.toString() == 'MatrixError.${(raw["errcode"] ?? "")}',
orElse: () => MatrixError.M_UNKNOWN);
int get retryAfterMs => raw["retry_after_ms"];
int get retryAfterMs => raw['retry_after_ms'];
/// This is a session identifier that the client must pass back to the homeserver, if one is provided,
/// in subsequent attempts to authenticate in the same API call.
String get session => raw["session"];
String get session => raw['session'];
/// Returns true if the server requires additional authentication.
bool get requireAdditionalAuthentication => response.statusCode == 401;
@ -84,11 +84,11 @@ class MatrixException implements Exception {
/// to authenticate itself. Each flow comprises a series of stages. If this request
/// doesn't need additional authentication, then this is null.
List<AuthenticationFlow> get authenticationFlows {
if (!raw.containsKey("flows") || !(raw["flows"] is List)) return null;
List<AuthenticationFlow> flows = [];
for (Map<String, dynamic> flow in raw["flows"]) {
if (flow["stages"] is List) {
flows.add(AuthenticationFlow(List<String>.from(flow["stages"])));
if (!raw.containsKey('flows') || !(raw['flows'] is List)) return null;
var flows = <AuthenticationFlow>[];
for (Map<String, dynamic> flow in raw['flows']) {
if (flow['stages'] is List) {
flows.add(AuthenticationFlow(List<String>.from(flow['stages'])));
}
}
return flows;
@ -97,10 +97,11 @@ class MatrixException implements Exception {
/// This section contains any information that the client will need to know in order to use a given type
/// of authentication. For each authentication type presented, that type may be present as a key in this
/// dictionary. For example, the public part of an OAuth client ID could be given here.
Map<String, dynamic> get authenticationParams => raw["params"];
Map<String, dynamic> get authenticationParams => raw['params'];
/// Returns the list of already completed authentication flows from previous requests.
List<String> get completedAuthenticationFlows => List<String>.from(raw["completed"] ?? []);
List<String> get completedAuthenticationFlows =>
List<String>.from(raw['completed'] ?? []);
}
/// For each endpoint, a server offers one or more 'flows' that the client can use

View file

@ -11,11 +11,12 @@ class MatrixFile {
/// Encrypts this file, changes the [bytes] and returns the
/// encryption information as an [EncryptedFile].
Future<EncryptedFile> encrypt() async {
final EncryptedFile encryptedFile = await encryptFile(bytes);
this.bytes = encryptedFile.data;
var encryptFile2 = encryptFile(bytes);
final encryptedFile = await encryptFile2;
bytes = encryptedFile.data;
return encryptedFile;
}
MatrixFile({this.bytes, String path}) : this.path = path.toLowerCase();
MatrixFile({this.bytes, String path}) : path = path.toLowerCase();
int get size => bytes.length;
}

View file

@ -1,27 +1,27 @@
extension MatrixIdExtension on String {
static const Set<String> VALID_SIGILS = {"@", "!", "#", "\$", "+"};
static const Set<String> VALID_SIGILS = {'@', '!', '#', '\$', '+'};
static const int MAX_LENGTH = 255;
bool get isValidMatrixId {
if (this?.isEmpty ?? true) return false;
if (this.length > MAX_LENGTH) return false;
if (!VALID_SIGILS.contains(this.substring(0, 1))) {
if (isEmpty ?? true) return false;
if (length > MAX_LENGTH) return false;
if (!VALID_SIGILS.contains(substring(0, 1))) {
return false;
}
final List<String> parts = this.substring(1).split(":");
final parts = substring(1).split(':');
if (parts.length != 2 || parts[0].isEmpty || parts[1].isEmpty) {
return false;
}
return true;
}
String get sigil => isValidMatrixId ? this.substring(0, 1) : null;
String get sigil => isValidMatrixId ? substring(0, 1) : null;
String get localpart =>
isValidMatrixId ? this.substring(1).split(":").first : null;
isValidMatrixId ? substring(1).split(':').first : null;
String get domain => isValidMatrixId ? this.substring(1).split(":")[1] : null;
String get domain => isValidMatrixId ? substring(1).split(':')[1] : null;
bool equals(String other) => this?.toLowerCase() == other?.toLowerCase();
bool equals(String other) => toLowerCase() == other?.toLowerCase();
}

View file

@ -29,7 +29,7 @@ class MxContent {
final String _mxc;
/// Insert a mxc:// uri here.
MxContent(String mxcUrl) : this._mxc = mxcUrl ?? "";
MxContent(String mxcUrl) : _mxc = mxcUrl ?? '';
/// Returns the mxc uri.
String get mxc => _mxc;
@ -37,20 +37,20 @@ class MxContent {
/// Returns a download Link to this content.
String getDownloadLink(Client matrix) => matrix.homeserver != null
? "${matrix.homeserver}/_matrix/media/r0/download/${_mxc.replaceFirst("mxc://", "")}"
: "";
: '';
/// Returns a scaled thumbnail link to this content with the given [width] and
/// [height]. [method] can be [ThumbnailMethod.crop] or
/// [ThumbnailMethod.scale] and defaults to [ThumbnailMethod.scale].
String getThumbnail(Client matrix,
{num width, num height, ThumbnailMethod method}) {
String methodStr = "crop";
if (method == ThumbnailMethod.scale) methodStr = "scale";
var methodStr = 'crop';
if (method == ThumbnailMethod.scale) methodStr = 'scale';
width = width.round();
height = height.round();
return matrix.homeserver != null
? "${matrix.homeserver}/_matrix/media/r0/thumbnail/${_mxc.replaceFirst("mxc://", "")}?width=$width&height=$height&method=$methodStr"
: "";
: '';
}
}

View file

@ -18,11 +18,12 @@ class OpenIdCredentials {
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = Map<String, dynamic>();
data['access_token'] = this.accessToken;
data['token_type'] = this.tokenType;
data['matrix_server_name'] = this.matrixServerName;
data['expires_in'] = this.expiresIn;
var map = <String, dynamic>{};
final data = map;
data['access_token'] = accessToken;
data['token_type'] = tokenType;
data['matrix_server_name'] = matrixServerName;
data['expires_in'] = expiresIn;
return data;
}
}

View file

@ -16,7 +16,7 @@ class Profile {
displayname = json['displayname'],
content = json;
@override
bool operator ==(dynamic other) =>
this.avatarUrl.mxc == other.avatarUrl.mxc &&
this.displayname == other.displayname;
avatarUrl.mxc == other.avatarUrl.mxc && displayname == other.displayname;
}

View file

@ -21,7 +21,7 @@ class PublicRoomsResponse {
client = client,
totalRoomCountEstimate = json['total_room_count_estimate'] {
if (json['chunk'] != null) {
publicRooms = List<PublicRoomEntry>();
publicRooms = <PublicRoomEntry>[];
json['chunk'].forEach((v) {
publicRooms.add(PublicRoomEntry.fromJson(v, client));
});

View file

@ -3,7 +3,7 @@ class PushRules {
final GlobalPushRules global;
PushRules.fromJson(Map<String, dynamic> json)
: this.global = GlobalPushRules.fromJson(json["global"]);
: global = GlobalPushRules.fromJson(json['global']);
}
/// The global ruleset.
@ -15,20 +15,20 @@ class GlobalPushRules {
final List<PushRule> underride;
GlobalPushRules.fromJson(Map<String, dynamic> json)
: this.content = json.containsKey("content")
? PushRule.fromJsonList(json["content"])
: content = json.containsKey('content')
? PushRule.fromJsonList(json['content'])
: null,
this.override = json.containsKey("override")
? PushRule.fromJsonList(json["content"])
override = json.containsKey('override')
? PushRule.fromJsonList(json['content'])
: null,
this.room = json.containsKey("room")
? PushRule.fromJsonList(json["room"])
room = json.containsKey('room')
? PushRule.fromJsonList(json['room'])
: null,
this.sender = json.containsKey("sender")
? PushRule.fromJsonList(json["sender"])
sender = json.containsKey('sender')
? PushRule.fromJsonList(json['sender'])
: null,
this.underride = json.containsKey("underride")
? PushRule.fromJsonList(json["underride"])
underride = json.containsKey('underride')
? PushRule.fromJsonList(json['underride'])
: null;
}
@ -42,7 +42,7 @@ class PushRule {
final String pattern;
static List<PushRule> fromJsonList(List<dynamic> list) {
List<PushRule> objList = [];
var objList = <PushRule>[];
list.forEach((json) {
objList.add(PushRule.fromJson(json));
});
@ -50,14 +50,14 @@ class PushRule {
}
PushRule.fromJson(Map<String, dynamic> json)
: this.actions = json["actions"],
this.isDefault = json["default"],
this.enabled = json["enabled"],
this.ruleId = json["rule_id"],
this.conditions = json.containsKey("conditions")
? PushRuleConditions.fromJsonList(json["conditions"])
: actions = json['actions'],
isDefault = json['default'],
enabled = json['enabled'],
ruleId = json['rule_id'],
conditions = json.containsKey('conditions')
? PushRuleConditions.fromJsonList(json['conditions'])
: null,
this.pattern = json["pattern"];
pattern = json['pattern'];
}
/// Conditions when this pushrule should be active.
@ -68,7 +68,7 @@ class PushRuleConditions {
final String is_;
static List<PushRuleConditions> fromJsonList(List<dynamic> list) {
List<PushRuleConditions> objList = [];
var objList = <PushRuleConditions>[];
list.forEach((json) {
objList.add(PushRuleConditions.fromJson(json));
});
@ -76,8 +76,8 @@ class PushRuleConditions {
}
PushRuleConditions.fromJson(Map<String, dynamic> json)
: this.kind = json["kind"],
this.key = json["key"],
this.pattern = json["pattern"],
this.is_ = json["is"];
: kind = json['kind'],
key = json['key'],
pattern = json['pattern'],
is_ = json['is'];
}

View file

@ -1,35 +1,33 @@
import 'package:famedlysdk/famedlysdk.dart';
import 'package:famedlysdk/src/utils/session_key.dart';
class RoomKeyRequest extends ToDeviceEvent {
Client client;
RoomKeyRequest.fromToDeviceEvent(ToDeviceEvent toDeviceEvent, Client client) {
this.client = client;
this.sender = toDeviceEvent.sender;
this.content = toDeviceEvent.content;
this.type = toDeviceEvent.type;
sender = toDeviceEvent.sender;
content = toDeviceEvent.content;
type = toDeviceEvent.type;
}
Room get room => client.getRoomById(this.content["body"]["room_id"]);
Room get room => client.getRoomById(content['body']['room_id']);
DeviceKeys get requestingDevice =>
client.userDeviceKeys[sender].deviceKeys[content["requesting_device_id"]];
client.userDeviceKeys[sender].deviceKeys[content['requesting_device_id']];
Future<void> forwardKey() async {
Room room = this.room;
final SessionKey session =
room.sessionKeys[this.content["body"]["session_id"]];
List<dynamic> forwardedKeys = [client.identityKey];
var room = this.room;
final session = room.sessionKeys[content['body']['session_id']];
var forwardedKeys = <dynamic>[client.identityKey];
for (final key in session.forwardingCurve25519KeyChain) {
forwardedKeys.add(key);
}
await requestingDevice.setVerified(true, client);
Map<String, dynamic> message = session.content;
message["forwarding_curve25519_key_chain"] = forwardedKeys;
message["session_key"] = session.inboundGroupSession.export_session(0);
var message = session.content;
message['forwarding_curve25519_key_chain'] = forwardedKeys;
message['session_key'] = session.inboundGroupSession.export_session(0);
await client.sendToDevice(
[requestingDevice],
"m.forwarded_room_key",
'm.forwarded_room_key',
message,
);
}

View file

@ -8,35 +8,36 @@ class SessionKey {
InboundGroupSession inboundGroupSession;
final String key;
List<dynamic> get forwardingCurve25519KeyChain =>
content["forwarding_curve25519_key_chain"] ?? [];
content['forwarding_curve25519_key_chain'] ?? [];
String get senderClaimedEd25519Key =>
content["sender_claimed_ed25519_key"] ?? "";
content['sender_claimed_ed25519_key'] ?? '';
SessionKey({this.content, this.inboundGroupSession, this.key, this.indexes});
SessionKey.fromJson(Map<String, dynamic> json, String key) : this.key = key {
SessionKey.fromJson(Map<String, dynamic> json, String key) : key = key {
content = json['content'] != null
? Map<String, dynamic>.from(json['content'])
: null;
indexes = json['indexes'] != null
? Map<String, int>.from(json['indexes'])
: Map<String, int>();
InboundGroupSession newInboundGroupSession = InboundGroupSession();
: <String, int>{};
var newInboundGroupSession = InboundGroupSession();
newInboundGroupSession.unpickle(key, json['inboundGroupSession']);
inboundGroupSession = newInboundGroupSession;
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = Map<String, dynamic>();
if (this.content != null) {
data['content'] = this.content;
final data = <String, dynamic>{};
if (content != null) {
data['content'] = content;
}
if (this.indexes != null) {
data['indexes'] = this.indexes;
if (indexes != null) {
data['indexes'] = indexes;
}
data['inboundGroupSession'] = this.inboundGroupSession.pickle(this.key);
data['inboundGroupSession'] = inboundGroupSession.pickle(key);
return data;
}
String toString() => json.encode(this.toJson());
@override
String toString() => json.encode(toJson());
}

View file

@ -10,13 +10,13 @@ class StatesMap {
dynamic operator [](String key) {
//print("[Warning] This method will be depracated in the future!");
if (key == null) return null;
if (key.startsWith("@") && key.contains(":")) {
if (!states.containsKey("m.room.member")) states["m.room.member"] = {};
return states["m.room.member"][key];
if (key.startsWith('@') && key.contains(':')) {
if (!states.containsKey('m.room.member')) states['m.room.member'] = {};
return states['m.room.member'][key];
}
if (!states.containsKey(key)) states[key] = {};
if (states[key][""] is Event) {
return states[key][""];
if (states[key][''] is Event) {
return states[key][''];
} else if (states[key].isEmpty) {
return null;
} else {
@ -26,12 +26,12 @@ class StatesMap {
void operator []=(String key, Event val) {
//print("[Warning] This method will be depracated in the future!");
if (key.startsWith("@") && key.contains(":")) {
if (!states.containsKey("m.room.member")) states["m.room.member"] = {};
states["m.room.member"][key] = val;
if (key.startsWith('@') && key.contains(':')) {
if (!states.containsKey('m.room.member')) states['m.room.member'] = {};
states['m.room.member'][key] = val;
}
if (!states.containsKey(key)) states[key] = {};
states[key][val.stateKey ?? ""] = val;
states[key][val.stateKey ?? ''] = val;
}
bool containsKey(String key) => states.containsKey(key);

View file

@ -14,11 +14,12 @@ class ToDeviceEvent {
}
Map<String, dynamic> toJson() {
final Map<String, dynamic> data = Map<String, dynamic>();
data['sender'] = this.sender;
data['type'] = this.type;
if (this.content != null) {
data['content'] = this.content;
var map = <String, dynamic>{};
final data = map;
data['sender'] = sender;
data['type'] = type;
if (content != null) {
data['content'] = content;
}
return data;
}

View file

@ -20,8 +20,8 @@ class UserDevice {
Future<void> updateMetaData(String newName) async {
await _client.jsonRequest(
type: HTTPType.PUT,
action: "/client/r0/devices/$deviceId",
data: {"display_name": newName},
action: '/client/r0/devices/$deviceId',
data: {'display_name': newName},
);
return;
}
@ -30,8 +30,8 @@ class UserDevice {
Future<void> deleteDevice(Map<String, dynamic> auth) async {
await _client.jsonRequest(
type: HTTPType.DELETE,
action: "/client/r0/devices/$deviceId",
data: auth != null ? {"auth": auth} : null,
action: '/client/r0/devices/$deviceId',
data: auth != null ? {'auth': auth} : null,
);
return;
}

View file

@ -196,7 +196,7 @@ packages:
name: http
url: "https://pub.dartlang.org"
source: hosted
version: "0.12.0+2"
version: "0.12.0+4"
http_multi_server:
dependency: transitive
description:
@ -333,7 +333,7 @@ packages:
name: pedantic
url: "https://pub.dartlang.org"
source: hosted
version: "1.8.0+1"
version: "1.9.0"
pointycastle:
dependency: transitive
description:

View file

@ -25,4 +25,4 @@ dependencies:
dev_dependencies:
test: ^1.0.0
build_runner: ^1.5.2
pedantic: ^1.5.0 # DO NOT UPDATE AS THIS WOULD CAUSE FLUTTER TO FAIL
pedantic: ^1.9.0 # DO NOT UPDATE AS THIS WOULD CAUSE FLUTTER TO FAIL

View file

@ -26,26 +26,26 @@ import 'package:test/test.dart';
void main() {
/// All Tests related to the ChatTime
group("Canonical Json", () {
Map<String, Map<String, dynamic>> textMap = {
group('Canonical Json', () {
var textMap = <String, Map<String, dynamic>>{
'{}': {},
'{"one":1,"two":"Two"}': {"one": 1, "two": "Two"},
'{"a":"1","b":"2"}': {"b": "2", "a": "1"},
'{"one":1,"two":"Two"}': {'one': 1, 'two': 'Two'},
'{"a":"1","b":"2"}': {'b': '2', 'a': '1'},
'{"auth":{"mxid":"@john.doe:example.com","profile":{"display_name":"John Doe","three_pids":[{"address":"john.doe@example.org","medium":"email"},{"address":"123456789","medium":"msisdn"}]},"success":true}}':
{
"auth": {
"success": true,
"mxid": "@john.doe:example.com",
"profile": {
"display_name": "John Doe",
"three_pids": [
{"medium": "email", "address": "john.doe@example.org"},
{"medium": "msisdn", "address": "123456789"}
'auth': {
'success': true,
'mxid': '@john.doe:example.com',
'profile': {
'display_name': 'John Doe',
'three_pids': [
{'medium': 'email', 'address': 'john.doe@example.org'},
{'medium': 'msisdn', 'address': '123456789'}
]
}
}
},
'{"a":null}': {"a": null},
'{"a":null}': {'a': null},
};
for (final entry in textMap.entries) {
test(entry.key, () async {

View file

@ -29,15 +29,12 @@ import 'package:famedlysdk/famedlysdk.dart';
import 'package:famedlysdk/src/account_data.dart';
import 'package:famedlysdk/src/client.dart';
import 'package:famedlysdk/src/presence.dart';
import 'package:famedlysdk/src/room.dart';
import 'package:famedlysdk/src/user.dart';
import 'package:famedlysdk/src/sync/event_update.dart';
import 'package:famedlysdk/src/sync/room_update.dart';
import 'package:famedlysdk/src/sync/user_update.dart';
import 'package:famedlysdk/src/utils/matrix_exception.dart';
import 'package:famedlysdk/src/utils/matrix_file.dart';
import 'package:famedlysdk/src/utils/profile.dart';
import 'package:famedlysdk/src/utils/user_device.dart';
import 'package:olm/olm.dart' as olm;
import 'package:test/test.dart';
@ -52,35 +49,35 @@ void main() {
Future<List<UserUpdate>> userUpdateListFuture;
Future<List<ToDeviceEvent>> toDeviceUpdateListFuture;
const String pickledOlmAccount =
"N2v1MkIFGcl0mQpo2OCwSopxPQJ0wnl7oe7PKiT4141AijfdTIhRu+ceXzXKy3Kr00nLqXtRv7kid6hU4a+V0rfJWLL0Y51+3Rp/ORDVnQy+SSeo6Fn4FHcXrxifJEJ0djla5u98fBcJ8BSkhIDmtXRPi5/oJAvpiYn+8zMjFHobOeZUAxYR0VfQ9JzSYBsSovoQ7uFkNks1M4EDUvHtuweStA+EKZvvHZO0SnwRp0Hw7sv8UMYvXw";
const String identityKey = "7rvl3jORJkBiK4XX1e5TnGnqz068XfYJ0W++Ml63rgk";
const String fingerprintKey = "gjL//fyaFHADt9KBADGag8g7F8Up78B/K1zXeiEPLJo";
const pickledOlmAccount =
'N2v1MkIFGcl0mQpo2OCwSopxPQJ0wnl7oe7PKiT4141AijfdTIhRu+ceXzXKy3Kr00nLqXtRv7kid6hU4a+V0rfJWLL0Y51+3Rp/ORDVnQy+SSeo6Fn4FHcXrxifJEJ0djla5u98fBcJ8BSkhIDmtXRPi5/oJAvpiYn+8zMjFHobOeZUAxYR0VfQ9JzSYBsSovoQ7uFkNks1M4EDUvHtuweStA+EKZvvHZO0SnwRp0Hw7sv8UMYvXw';
const identityKey = '7rvl3jORJkBiK4XX1e5TnGnqz068XfYJ0W++Ml63rgk';
const fingerprintKey = 'gjL//fyaFHADt9KBADGag8g7F8Up78B/K1zXeiEPLJo';
/// All Tests related to the Login
group("FluffyMatrix", () {
group('FluffyMatrix', () {
/// Check if all Elements get created
matrix = Client("testclient", debug: true);
matrix = Client('testclient', debug: true);
matrix.httpClient = FakeMatrixApi();
roomUpdateListFuture = matrix.onRoomUpdate.stream.toList();
eventUpdateListFuture = matrix.onEvent.stream.toList();
userUpdateListFuture = matrix.onUserEvent.stream.toList();
toDeviceUpdateListFuture = matrix.onToDeviceEvent.stream.toList();
bool olmEnabled = true;
var olmEnabled = true;
try {
olm.init();
olm.Account();
} catch (_) {
olmEnabled = false;
print("[LibOlm] Failed to load LibOlm: " + _.toString());
print('[LibOlm] Failed to load LibOlm: ' + _.toString());
}
print("[LibOlm] Enabled: $olmEnabled");
print('[LibOlm] Enabled: $olmEnabled');
test('Login', () async {
int presenceCounter = 0;
int accountDataCounter = 0;
var presenceCounter = 0;
var accountDataCounter = 0;
matrix.onPresence.stream.listen((Presence data) {
presenceCounter++;
});
@ -92,46 +89,45 @@ void main() {
expect(matrix.matrixVersions, null);
try {
await matrix.checkServer("https://fakeserver.wrongaddress");
await matrix.checkServer('https://fakeserver.wrongaddress');
} on FormatException catch (exception) {
expect(exception != null, true);
}
await matrix.checkServer("https://fakeserver.notexisting");
expect(matrix.homeserver, "https://fakeserver.notexisting");
await matrix.checkServer('https://fakeserver.notexisting');
expect(matrix.homeserver, 'https://fakeserver.notexisting');
expect(matrix.matrixVersions,
["r0.0.1", "r0.1.0", "r0.2.0", "r0.3.0", "r0.4.0", "r0.5.0"]);
['r0.0.1', 'r0.1.0', 'r0.2.0', 'r0.3.0', 'r0.4.0', 'r0.5.0']);
final Map<String, dynamic> resp = await matrix
.jsonRequest(type: HTTPType.POST, action: "/client/r0/login", data: {
"type": "m.login.password",
"user": "test",
"password": "1234",
"initial_device_display_name": "Fluffy Matrix Client"
final resp = await matrix
.jsonRequest(type: HTTPType.POST, action: '/client/r0/login', data: {
'type': 'm.login.password',
'user': 'test',
'password': '1234',
'initial_device_display_name': 'Fluffy Matrix Client'
});
final bool available = await matrix.usernameAvailable("testuser");
final available = await matrix.usernameAvailable('testuser');
expect(available, true);
Map registerResponse = await matrix.register(username: "testuser");
expect(registerResponse["user_id"], "@testuser:example.com");
Map registerResponse = await matrix.register(username: 'testuser');
expect(registerResponse['user_id'], '@testuser:example.com');
registerResponse =
await matrix.register(username: "testuser", kind: "user");
expect(registerResponse["user_id"], "@testuser:example.com");
await matrix.register(username: 'testuser', kind: 'user');
expect(registerResponse['user_id'], '@testuser:example.com');
registerResponse =
await matrix.register(username: "testuser", kind: "guest");
expect(registerResponse["user_id"], "@testuser:example.com");
await matrix.register(username: 'testuser', kind: 'guest');
expect(registerResponse['user_id'], '@testuser:example.com');
Future<LoginState> loginStateFuture =
matrix.onLoginStateChanged.stream.first;
Future<bool> firstSyncFuture = matrix.onFirstSync.stream.first;
Future<dynamic> syncFuture = matrix.onSync.stream.first;
var loginStateFuture = matrix.onLoginStateChanged.stream.first;
var firstSyncFuture = matrix.onFirstSync.stream.first;
var syncFuture = matrix.onSync.stream.first;
matrix.connect(
newToken: resp["access_token"],
newUserID: resp["user_id"],
newToken: resp['access_token'],
newUserID: resp['user_id'],
newHomeserver: matrix.homeserver,
newDeviceName: "Text Matrix Client",
newDeviceID: resp["device_id"],
newDeviceName: 'Text Matrix Client',
newDeviceID: resp['device_id'],
newMatrixVersions: matrix.matrixVersions,
newLazyLoadMembers: matrix.lazyLoadMembers,
newOlmAccount: pickledOlmAccount,
@ -139,13 +135,13 @@ void main() {
await Future.delayed(Duration(milliseconds: 50));
expect(matrix.accessToken == resp["access_token"], true);
expect(matrix.deviceName == "Text Matrix Client", true);
expect(matrix.deviceID == resp["device_id"], true);
expect(matrix.userID == resp["user_id"], true);
expect(matrix.accessToken == resp['access_token'], true);
expect(matrix.deviceName == 'Text Matrix Client', true);
expect(matrix.deviceID == resp['device_id'], true);
expect(matrix.userID == resp['user_id'], true);
LoginState loginState = await loginStateFuture;
bool firstSync = await firstSyncFuture;
var loginState = await loginStateFuture;
var firstSync = await firstSyncFuture;
dynamic sync = await syncFuture;
expect(loginState, LoginState.logged);
@ -156,91 +152,91 @@ void main() {
expect(matrix.identityKey, identityKey);
expect(matrix.fingerprintKey, fingerprintKey);
}
expect(sync["next_batch"] == matrix.prevBatch, true);
expect(sync['next_batch'] == matrix.prevBatch, true);
expect(matrix.accountData.length, 3);
expect(matrix.getDirectChatFromUserId("@bob:example.com"),
"!726s6s6q:example.com");
expect(matrix.rooms[1].directChatMatrixID, "@bob:example.com");
expect(matrix.directChats, matrix.accountData["m.direct"].content);
expect(matrix.getDirectChatFromUserId('@bob:example.com'),
'!726s6s6q:example.com');
expect(matrix.rooms[1].directChatMatrixID, '@bob:example.com');
expect(matrix.directChats, matrix.accountData['m.direct'].content);
expect(matrix.presences.length, 1);
expect(matrix.rooms[1].ephemerals.length, 2);
expect(matrix.rooms[1].sessionKeys.length, 1);
expect(
matrix
.rooms[1]
.sessionKeys["ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU"]
.content["session_key"],
"AgAAAAAQcQ6XrFJk6Prm8FikZDqfry/NbDz8Xw7T6e+/9Yf/q3YHIPEQlzv7IZMNcYb51ifkRzFejVvtphS7wwG2FaXIp4XS2obla14iKISR0X74ugB2vyb1AydIHE/zbBQ1ic5s3kgjMFlWpu/S3FQCnCrv+DPFGEt3ERGWxIl3Bl5X53IjPyVkz65oljz2TZESwz0GH/QFvyOOm8ci0q/gceaF3S7Dmafg3dwTKYwcA5xkcc+BLyrLRzB6Hn+oMAqSNSscnm4mTeT5zYibIhrzqyUTMWr32spFtI9dNR/RFSzfCw");
.sessionKeys['ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU']
.content['session_key'],
'AgAAAAAQcQ6XrFJk6Prm8FikZDqfry/NbDz8Xw7T6e+/9Yf/q3YHIPEQlzv7IZMNcYb51ifkRzFejVvtphS7wwG2FaXIp4XS2obla14iKISR0X74ugB2vyb1AydIHE/zbBQ1ic5s3kgjMFlWpu/S3FQCnCrv+DPFGEt3ERGWxIl3Bl5X53IjPyVkz65oljz2TZESwz0GH/QFvyOOm8ci0q/gceaF3S7Dmafg3dwTKYwcA5xkcc+BLyrLRzB6Hn+oMAqSNSscnm4mTeT5zYibIhrzqyUTMWr32spFtI9dNR/RFSzfCw');
if (olmEnabled) {
expect(
matrix
.rooms[1]
.sessionKeys["ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU"]
.sessionKeys['ciM/JWTPrmiWPPZNkRLDPQYf9AW/I46bxyLSr+Bx5oU']
.inboundGroupSession !=
null,
true);
}
expect(matrix.rooms[1].typingUsers.length, 1);
expect(matrix.rooms[1].typingUsers[0].id, "@alice:example.com");
expect(matrix.rooms[1].typingUsers[0].id, '@alice:example.com');
expect(matrix.rooms[1].roomAccountData.length, 3);
expect(matrix.rooms[1].encrypted, true);
expect(matrix.rooms[1].encryptionAlgorithm,
Client.supportedGroupEncryptionAlgorithms.first);
expect(
matrix.rooms[1].roomAccountData["m.receipt"]
.content["@alice:example.com"]["ts"],
matrix.rooms[1].roomAccountData['m.receipt']
.content['@alice:example.com']['ts'],
1436451550453);
expect(
matrix.rooms[1].roomAccountData["m.receipt"]
.content["@alice:example.com"]["event_id"],
"7365636s6r6432:example.com");
matrix.rooms[1].roomAccountData['m.receipt']
.content['@alice:example.com']['event_id'],
'7365636s6r6432:example.com');
expect(matrix.rooms.length, 2);
expect(matrix.rooms[1].canonicalAlias,
"#famedlyContactDiscovery:${matrix.userID.split(":")[1]}");
final List<User> contacts = await matrix.loadFamedlyContacts();
final contacts = await matrix.loadFamedlyContacts();
expect(contacts.length, 1);
expect(contacts[0].senderId, "@alice:example.com");
expect(contacts[0].senderId, '@alice:example.com');
expect(
matrix.presences["@alice:example.com"].presence, PresenceType.online);
matrix.presences['@alice:example.com'].presence, PresenceType.online);
expect(presenceCounter, 1);
expect(accountDataCounter, 3);
await Future.delayed(Duration(milliseconds: 50));
expect(matrix.userDeviceKeys.length, 2);
expect(matrix.userDeviceKeys["@alice:example.com"].outdated, false);
expect(matrix.userDeviceKeys["@alice:example.com"].deviceKeys.length, 1);
expect(matrix.userDeviceKeys['@alice:example.com'].outdated, false);
expect(matrix.userDeviceKeys['@alice:example.com'].deviceKeys.length, 1);
expect(
matrix.userDeviceKeys["@alice:example.com"].deviceKeys["JLAFKJWSCS"]
matrix.userDeviceKeys['@alice:example.com'].deviceKeys['JLAFKJWSCS']
.verified,
false);
matrix.handleSync({
"device_lists": {
"changed": [
"@alice:example.com",
'device_lists': {
'changed': [
'@alice:example.com',
],
"left": [
"@bob:example.com",
'left': [
'@bob:example.com',
],
}
});
await Future.delayed(Duration(milliseconds: 50));
expect(matrix.userDeviceKeys.length, 2);
expect(matrix.userDeviceKeys["@alice:example.com"].outdated, true);
expect(matrix.userDeviceKeys['@alice:example.com'].outdated, true);
matrix.handleSync({
"rooms": {
"join": {
"!726s6s6q:example.com": {
"state": {
"events": [
'rooms': {
'join': {
'!726s6s6q:example.com': {
'state': {
'events': [
{
"sender": "@alice:example.com",
"type": "m.room.canonical_alias",
"content": {"alias": ""},
"state_key": "",
"origin_server_ts": 1417731086799,
"event_id": "66697273743033:example.com"
'sender': '@alice:example.com',
'type': 'm.room.canonical_alias',
'content': {'alias': ''},
'state_key': '',
'origin_server_ts': 1417731086799,
'event_id': '66697273743033:example.com'
}
]
}
@ -254,17 +250,17 @@ void main() {
matrix.getRoomByAlias(
"#famedlyContactDiscovery:${matrix.userID.split(":")[1]}"),
null);
final List<User> altContacts = await matrix.loadFamedlyContacts();
final altContacts = await matrix.loadFamedlyContacts();
altContacts.forEach((u) => print(u.id));
expect(altContacts.length, 2);
expect(altContacts[0].senderId, "@alice:example.com");
expect(altContacts[0].senderId, '@alice:example.com');
});
test('Try to get ErrorResponse', () async {
MatrixException expectedException;
try {
await matrix.jsonRequest(
type: HTTPType.PUT, action: "/non/existing/path");
type: HTTPType.PUT, action: '/non/existing/path');
} on MatrixException catch (exception) {
expectedException = exception;
}
@ -273,10 +269,9 @@ void main() {
test('Logout', () async {
await matrix.jsonRequest(
type: HTTPType.POST, action: "/client/r0/logout");
type: HTTPType.POST, action: '/client/r0/logout');
Future<LoginState> loginStateFuture =
matrix.onLoginStateChanged.stream.first;
var loginStateFuture = matrix.onLoginStateChanged.stream.first;
matrix.clear();
@ -289,27 +284,27 @@ void main() {
expect(matrix.lazyLoadMembers == null, true);
expect(matrix.prevBatch == null, true);
LoginState loginState = await loginStateFuture;
var loginState = await loginStateFuture;
expect(loginState, LoginState.loggedOut);
});
test('Room Update Test', () async {
await matrix.onRoomUpdate.close();
List<RoomUpdate> roomUpdateList = await roomUpdateListFuture;
var roomUpdateList = await roomUpdateListFuture;
expect(roomUpdateList.length, 3);
expect(roomUpdateList[0].id == "!726s6s6q:example.com", true);
expect(roomUpdateList[0].id == '!726s6s6q:example.com', true);
expect(roomUpdateList[0].membership == Membership.join, true);
expect(roomUpdateList[0].prev_batch == "t34-23535_0_0", true);
expect(roomUpdateList[0].prev_batch == 't34-23535_0_0', true);
expect(roomUpdateList[0].limitedTimeline == true, true);
expect(roomUpdateList[0].notification_count == 2, true);
expect(roomUpdateList[0].highlight_count == 2, true);
expect(roomUpdateList[1].id == "!696r7674:example.com", true);
expect(roomUpdateList[1].id == '!696r7674:example.com', true);
expect(roomUpdateList[1].membership == Membership.invite, true);
expect(roomUpdateList[1].prev_batch == "", true);
expect(roomUpdateList[1].prev_batch == '', true);
expect(roomUpdateList[1].limitedTimeline == false, true);
expect(roomUpdateList[1].notification_count == 0, true);
expect(roomUpdateList[1].highlight_count == 0, true);
@ -318,194 +313,193 @@ void main() {
test('Event Update Test', () async {
await matrix.onEvent.close();
List<EventUpdate> eventUpdateList = await eventUpdateListFuture;
var eventUpdateList = await eventUpdateListFuture;
expect(eventUpdateList.length, 13);
expect(eventUpdateList[0].eventType, "m.room.member");
expect(eventUpdateList[0].roomID, "!726s6s6q:example.com");
expect(eventUpdateList[0].type, "state");
expect(eventUpdateList[0].eventType, 'm.room.member');
expect(eventUpdateList[0].roomID, '!726s6s6q:example.com');
expect(eventUpdateList[0].type, 'state');
expect(eventUpdateList[1].eventType, "m.room.canonical_alias");
expect(eventUpdateList[1].roomID, "!726s6s6q:example.com");
expect(eventUpdateList[1].type, "state");
expect(eventUpdateList[1].eventType, 'm.room.canonical_alias');
expect(eventUpdateList[1].roomID, '!726s6s6q:example.com');
expect(eventUpdateList[1].type, 'state');
expect(eventUpdateList[2].eventType, "m.room.encryption");
expect(eventUpdateList[2].roomID, "!726s6s6q:example.com");
expect(eventUpdateList[2].type, "state");
expect(eventUpdateList[2].eventType, 'm.room.encryption');
expect(eventUpdateList[2].roomID, '!726s6s6q:example.com');
expect(eventUpdateList[2].type, 'state');
expect(eventUpdateList[3].eventType, "m.room.member");
expect(eventUpdateList[3].roomID, "!726s6s6q:example.com");
expect(eventUpdateList[3].type, "timeline");
expect(eventUpdateList[3].eventType, 'm.room.member');
expect(eventUpdateList[3].roomID, '!726s6s6q:example.com');
expect(eventUpdateList[3].type, 'timeline');
expect(eventUpdateList[4].eventType, "m.room.message");
expect(eventUpdateList[4].roomID, "!726s6s6q:example.com");
expect(eventUpdateList[4].type, "timeline");
expect(eventUpdateList[4].eventType, 'm.room.message');
expect(eventUpdateList[4].roomID, '!726s6s6q:example.com');
expect(eventUpdateList[4].type, 'timeline');
expect(eventUpdateList[5].eventType, "m.typing");
expect(eventUpdateList[5].roomID, "!726s6s6q:example.com");
expect(eventUpdateList[5].type, "ephemeral");
expect(eventUpdateList[5].eventType, 'm.typing');
expect(eventUpdateList[5].roomID, '!726s6s6q:example.com');
expect(eventUpdateList[5].type, 'ephemeral');
expect(eventUpdateList[6].eventType, "m.receipt");
expect(eventUpdateList[6].roomID, "!726s6s6q:example.com");
expect(eventUpdateList[6].type, "ephemeral");
expect(eventUpdateList[6].eventType, 'm.receipt');
expect(eventUpdateList[6].roomID, '!726s6s6q:example.com');
expect(eventUpdateList[6].type, 'ephemeral');
expect(eventUpdateList[7].eventType, "m.receipt");
expect(eventUpdateList[7].roomID, "!726s6s6q:example.com");
expect(eventUpdateList[7].type, "account_data");
expect(eventUpdateList[7].eventType, 'm.receipt');
expect(eventUpdateList[7].roomID, '!726s6s6q:example.com');
expect(eventUpdateList[7].type, 'account_data');
expect(eventUpdateList[8].eventType, "m.tag");
expect(eventUpdateList[8].roomID, "!726s6s6q:example.com");
expect(eventUpdateList[8].type, "account_data");
expect(eventUpdateList[8].eventType, 'm.tag');
expect(eventUpdateList[8].roomID, '!726s6s6q:example.com');
expect(eventUpdateList[8].type, 'account_data');
expect(eventUpdateList[9].eventType, "org.example.custom.room.config");
expect(eventUpdateList[9].roomID, "!726s6s6q:example.com");
expect(eventUpdateList[9].type, "account_data");
expect(eventUpdateList[9].eventType, 'org.example.custom.room.config');
expect(eventUpdateList[9].roomID, '!726s6s6q:example.com');
expect(eventUpdateList[9].type, 'account_data');
expect(eventUpdateList[10].eventType, "m.room.name");
expect(eventUpdateList[10].roomID, "!696r7674:example.com");
expect(eventUpdateList[10].type, "invite_state");
expect(eventUpdateList[10].eventType, 'm.room.name');
expect(eventUpdateList[10].roomID, '!696r7674:example.com');
expect(eventUpdateList[10].type, 'invite_state');
expect(eventUpdateList[11].eventType, "m.room.member");
expect(eventUpdateList[11].roomID, "!696r7674:example.com");
expect(eventUpdateList[11].type, "invite_state");
expect(eventUpdateList[11].eventType, 'm.room.member');
expect(eventUpdateList[11].roomID, '!696r7674:example.com');
expect(eventUpdateList[11].type, 'invite_state');
});
test('User Update Test', () async {
await matrix.onUserEvent.close();
List<UserUpdate> eventUpdateList = await userUpdateListFuture;
var eventUpdateList = await userUpdateListFuture;
expect(eventUpdateList.length, 4);
expect(eventUpdateList[0].eventType, "m.presence");
expect(eventUpdateList[0].type, "presence");
expect(eventUpdateList[0].eventType, 'm.presence');
expect(eventUpdateList[0].type, 'presence');
expect(eventUpdateList[1].eventType, "m.push_rules");
expect(eventUpdateList[1].type, "account_data");
expect(eventUpdateList[1].eventType, 'm.push_rules');
expect(eventUpdateList[1].type, 'account_data');
expect(eventUpdateList[2].eventType, "org.example.custom.config");
expect(eventUpdateList[2].type, "account_data");
expect(eventUpdateList[2].eventType, 'org.example.custom.config');
expect(eventUpdateList[2].type, 'account_data');
});
test('To Device Update Test', () async {
await matrix.onToDeviceEvent.close();
List<ToDeviceEvent> eventUpdateList = await toDeviceUpdateListFuture;
var eventUpdateList = await toDeviceUpdateListFuture;
expect(eventUpdateList.length, 2);
expect(eventUpdateList[0].type, "m.new_device");
expect(eventUpdateList[1].type, "m.room_key");
expect(eventUpdateList[0].type, 'm.new_device');
expect(eventUpdateList[1].type, 'm.room_key');
});
test('Login', () async {
matrix = Client("testclient", debug: true);
matrix = Client('testclient', debug: true);
matrix.httpClient = FakeMatrixApi();
roomUpdateListFuture = matrix.onRoomUpdate.stream.toList();
eventUpdateListFuture = matrix.onEvent.stream.toList();
userUpdateListFuture = matrix.onUserEvent.stream.toList();
final bool checkResp =
await matrix.checkServer("https://fakeServer.notExisting");
final checkResp =
await matrix.checkServer('https://fakeServer.notExisting');
final bool loginResp = await matrix.login("test", "1234");
final loginResp = await matrix.login('test', '1234');
expect(checkResp, true);
expect(loginResp, true);
});
test('createRoom', () async {
final OpenIdCredentials openId = await matrix.requestOpenIdCredentials();
expect(openId.accessToken, "SomeT0kenHere");
expect(openId.tokenType, "Bearer");
expect(openId.matrixServerName, "example.com");
final openId = await matrix.requestOpenIdCredentials();
expect(openId.accessToken, 'SomeT0kenHere');
expect(openId.tokenType, 'Bearer');
expect(openId.matrixServerName, 'example.com');
expect(openId.expiresIn, 3600);
});
test('createRoom', () async {
final List<User> users = [
User("@alice:fakeServer.notExisting"),
User("@bob:fakeServer.notExisting")
final users = [
User('@alice:fakeServer.notExisting'),
User('@bob:fakeServer.notExisting')
];
final String newID = await matrix.createRoom(invite: users);
expect(newID, "!1234:fakeServer.notExisting");
final newID = await matrix.createRoom(invite: users);
expect(newID, '!1234:fakeServer.notExisting');
});
test('setAvatar', () async {
final MatrixFile testFile =
MatrixFile(bytes: Uint8List(0), path: "fake/path/file.jpeg");
final testFile =
MatrixFile(bytes: Uint8List(0), path: 'fake/path/file.jpeg');
await matrix.setAvatar(testFile);
});
test('setPushers', () async {
await matrix.setPushers("abcdefg", "http", "com.famedly.famedlysdk",
"famedlySDK", "GitLabCi", "en", "https://examplepushserver.com",
format: "event_id_only");
await matrix.setPushers('abcdefg', 'http', 'com.famedly.famedlysdk',
'famedlySDK', 'GitLabCi', 'en', 'https://examplepushserver.com',
format: 'event_id_only');
});
test('joinRoomById', () async {
final String roomID = "1234";
final roomID = '1234';
final Map<String, dynamic> resp = await matrix.joinRoomById(roomID);
expect(resp["room_id"], roomID);
expect(resp['room_id'], roomID);
});
test('requestUserDevices', () async {
final List<UserDevice> userDevices = await matrix.requestUserDevices();
final userDevices = await matrix.requestUserDevices();
expect(userDevices.length, 1);
expect(userDevices.first.deviceId, "QBUAZIFURK");
expect(userDevices.first.displayName, "android");
expect(userDevices.first.lastSeenIp, "1.2.3.4");
expect(userDevices.first.deviceId, 'QBUAZIFURK');
expect(userDevices.first.displayName, 'android');
expect(userDevices.first.lastSeenIp, '1.2.3.4');
expect(
userDevices.first.lastSeenTs.millisecondsSinceEpoch, 1474491775024);
});
test('get archive', () async {
List<Room> archive = await matrix.archive;
var archive = await matrix.archive;
await Future.delayed(Duration(milliseconds: 50));
expect(archive.length, 2);
expect(archive[0].id, "!5345234234:example.com");
expect(archive[0].id, '!5345234234:example.com');
expect(archive[0].membership, Membership.leave);
expect(archive[0].name, "The room name");
expect(archive[0].lastMessage, "This is an example text message");
expect(archive[0].name, 'The room name');
expect(archive[0].lastMessage, 'This is an example text message');
expect(archive[0].roomAccountData.length, 1);
expect(archive[1].id, "!5345234235:example.com");
expect(archive[1].id, '!5345234235:example.com');
expect(archive[1].membership, Membership.leave);
expect(archive[1].name, "The room name 2");
expect(archive[1].name, 'The room name 2');
});
test('getProfileFromUserId', () async {
final Profile profile =
await matrix.getProfileFromUserId("@getme:example.com");
expect(profile.avatarUrl.mxc, "mxc://test");
expect(profile.displayname, "You got me");
expect(profile.content["avatar_url"], profile.avatarUrl.mxc);
expect(profile.content["displayname"], profile.displayname);
final profile = await matrix.getProfileFromUserId('@getme:example.com');
expect(profile.avatarUrl.mxc, 'mxc://test');
expect(profile.displayname, 'You got me');
expect(profile.content['avatar_url'], profile.avatarUrl.mxc);
expect(profile.content['displayname'], profile.displayname);
});
test('signJson', () {
if (matrix.encryptionEnabled) {
expect(matrix.fingerprintKey.isNotEmpty, true);
expect(matrix.identityKey.isNotEmpty, true);
Map<String, dynamic> payload = {
"unsigned": {
"foo": "bar",
var payload = <String, dynamic>{
'unsigned': {
'foo': 'bar',
},
"auth": {
"success": true,
"mxid": "@john.doe:example.com",
"profile": {
"display_name": "John Doe",
"three_pids": [
{"medium": "email", "address": "john.doe@example.org"},
{"medium": "msisdn", "address": "123456789"}
'auth': {
'success': true,
'mxid': '@john.doe:example.com',
'profile': {
'display_name': 'John Doe',
'three_pids': [
{'medium': 'email', 'address': 'john.doe@example.org'},
{'medium': 'msisdn', 'address': '123456789'}
]
}
}
};
Map<String, dynamic> payloadWithoutUnsigned = Map.from(payload);
payloadWithoutUnsigned.remove("unsigned");
var payloadWithoutUnsigned = Map<String, dynamic>.from(payload);
payloadWithoutUnsigned.remove('unsigned');
expect(
matrix.checkJsonSignature(
@ -517,8 +511,8 @@ void main() {
false);
payload = matrix.signJson(payload);
payloadWithoutUnsigned = matrix.signJson(payloadWithoutUnsigned);
expect(payload["signatures"], payloadWithoutUnsigned["signatures"]);
print(payload["signatures"]);
expect(payload['signatures'], payloadWithoutUnsigned['signatures']);
print(payload['signatures']);
expect(
matrix.checkJsonSignature(
matrix.fingerprintKey, payload, matrix.userID, matrix.deviceID),
@ -531,9 +525,9 @@ void main() {
});
test('Track oneTimeKeys', () async {
if (matrix.encryptionEnabled) {
DateTime last = matrix.lastTimeKeysUploaded ?? DateTime.now();
var last = matrix.lastTimeKeysUploaded ?? DateTime.now();
matrix.handleSync({
"device_one_time_keys_count": {"signed_curve25519": 49}
'device_one_time_keys_count': {'signed_curve25519': 49}
});
await Future.delayed(Duration(milliseconds: 50));
expect(
@ -548,12 +542,12 @@ void main() {
await matrix.rooms[1].createOutboundGroupSession();
expect(matrix.rooms[1].outboundGroupSession != null, true);
matrix.handleSync({
"device_lists": {
"changed": [
"@alice:example.com",
'device_lists': {
'changed': [
'@alice:example.com',
],
"left": [
"@bob:example.com",
'left': [
'@bob:example.com',
],
}
});
@ -568,19 +562,19 @@ void main() {
await matrix.rooms[1].createOutboundGroupSession();
expect(matrix.rooms[1].outboundGroupSession != null, true);
matrix.handleSync({
"rooms": {
"join": {
"!726s6s6q:example.com": {
"state": {
"events": [
'rooms': {
'join': {
'!726s6s6q:example.com': {
'state': {
'events': [
{
"content": {"membership": "leave"},
"event_id": "143273582443PhrSn:example.org",
"origin_server_ts": 1432735824653,
"room_id": "!726s6s6q:example.com",
"sender": "@alice:example.com",
"state_key": "@alice:example.com",
"type": "m.room.member"
'content': {'membership': 'leave'},
'event_id': '143273582443PhrSn:example.org',
'origin_server_ts': 1432735824653,
'room_id': '!726s6s6q:example.com',
'sender': '@alice:example.com',
'state_key': '@alice:example.com',
'type': 'm.room.member'
}
]
}
@ -592,18 +586,18 @@ void main() {
expect(matrix.rooms[1].outboundGroupSession != null, true);
}
});
DeviceKeys deviceKeys = DeviceKeys.fromJson({
"user_id": "@alice:example.com",
"device_id": "JLAFKJWSCS",
"algorithms": ["m.olm.v1.curve25519-aes-sha2", "m.megolm.v1.aes-sha2"],
"keys": {
"curve25519:JLAFKJWSCS": "3C5BFWi2Y8MaVvjM8M22DBmh24PmgR0nPvJOIArzgyI",
"ed25519:JLAFKJWSCS": "lEuiRJBit0IG6nUf5pUzWTUEsRVVe/HJkoKuEww9ULI"
var deviceKeys = DeviceKeys.fromJson({
'user_id': '@alice:example.com',
'device_id': 'JLAFKJWSCS',
'algorithms': ['m.olm.v1.curve25519-aes-sha2', 'm.megolm.v1.aes-sha2'],
'keys': {
'curve25519:JLAFKJWSCS': '3C5BFWi2Y8MaVvjM8M22DBmh24PmgR0nPvJOIArzgyI',
'ed25519:JLAFKJWSCS': 'lEuiRJBit0IG6nUf5pUzWTUEsRVVe/HJkoKuEww9ULI'
},
"signatures": {
"@alice:example.com": {
"ed25519:JLAFKJWSCS":
"dSO80A01XiigH3uBiDVx/EjzaoycHcjq9lfQX0uWsqxl2giMIiSPR8a4d291W1ihKJL/a+myXS367WT6NAIcBA"
'signatures': {
'@alice:example.com': {
'ed25519:JLAFKJWSCS':
'dSO80A01XiigH3uBiDVx/EjzaoycHcjq9lfQX0uWsqxl2giMIiSPR8a4d291W1ihKJL/a+myXS367WT6NAIcBA'
}
}
});
@ -614,52 +608,51 @@ void main() {
.startOutgoingOlmSessions([deviceKeys], checkSignature: false);
expect(matrix.olmSessions.length, 1);
expect(matrix.olmSessions.entries.first.key,
"3C5BFWi2Y8MaVvjM8M22DBmh24PmgR0nPvJOIArzgyI");
'3C5BFWi2Y8MaVvjM8M22DBmh24PmgR0nPvJOIArzgyI');
}
});
test('sendToDevice', () async {
await matrix.sendToDevice(
[deviceKeys],
"m.message",
'm.message',
{
"msgtype": "m.text",
"body": "Hello world",
'msgtype': 'm.text',
'body': 'Hello world',
});
});
test('Logout when token is unknown', () async {
Future<LoginState> loginStateFuture =
matrix.onLoginStateChanged.stream.first;
var loginStateFuture = matrix.onLoginStateChanged.stream.first;
try {
await matrix.jsonRequest(
type: HTTPType.DELETE, action: "/unknown/token");
type: HTTPType.DELETE, action: '/unknown/token');
} on MatrixException catch (exception) {
expect(exception.error, MatrixError.M_UNKNOWN_TOKEN);
}
LoginState state = await loginStateFuture;
var state = await loginStateFuture;
expect(state, LoginState.loggedOut);
expect(matrix.isLogged(), false);
});
test('Test the fake store api', () async {
Client client1 = Client("testclient", debug: true);
var client1 = Client('testclient', debug: true);
client1.httpClient = FakeMatrixApi();
FakeStore fakeStore = FakeStore(client1, {});
var fakeStore = FakeStore(client1, {});
client1.storeAPI = fakeStore;
client1.connect(
newToken: "abc123",
newUserID: "@test:fakeServer.notExisting",
newHomeserver: "https://fakeServer.notExisting",
newDeviceName: "Text Matrix Client",
newDeviceID: "GHTYAJCE",
newToken: 'abc123',
newUserID: '@test:fakeServer.notExisting',
newHomeserver: 'https://fakeServer.notExisting',
newDeviceName: 'Text Matrix Client',
newDeviceID: 'GHTYAJCE',
newMatrixVersions: [
"r0.0.1",
"r0.1.0",
"r0.2.0",
"r0.3.0",
"r0.4.0",
"r0.5.0"
'r0.0.1',
'r0.1.0',
'r0.2.0',
'r0.3.0',
'r0.4.0',
'r0.5.0'
],
newLazyLoadMembers: true,
newOlmAccount: pickledOlmAccount,
@ -677,7 +670,7 @@ void main() {
expect(client1.isLogged(), true);
expect(client1.rooms.length, 2);
Client client2 = Client("testclient", debug: true);
var client2 = Client('testclient', debug: true);
client2.httpClient = FakeMatrixApi();
client2.storeAPI = FakeStore(client2, fakeStore.storeMap);

View file

@ -28,38 +28,38 @@ import 'package:test/test.dart';
void main() {
/// All Tests related to device keys
group("Device keys", () {
test("fromJson", () async {
Map<String, dynamic> rawJson = {
"user_id": "@alice:example.com",
"device_id": "JLAFKJWSCS",
"algorithms": ["m.olm.v1.curve25519-aes-sha2", "m.megolm.v1.aes-sha2"],
"keys": {
"curve25519:JLAFKJWSCS":
"3C5BFWi2Y8MaVvjM8M22DBmh24PmgR0nPvJOIArzgyI",
"ed25519:JLAFKJWSCS": "lEuiRJBit0IG6nUf5pUzWTUEsRVVe/HJkoKuEww9ULI"
group('Device keys', () {
test('fromJson', () async {
var rawJson = <String, dynamic>{
'user_id': '@alice:example.com',
'device_id': 'JLAFKJWSCS',
'algorithms': ['m.olm.v1.curve25519-aes-sha2', 'm.megolm.v1.aes-sha2'],
'keys': {
'curve25519:JLAFKJWSCS':
'3C5BFWi2Y8MaVvjM8M22DBmh24PmgR0nPvJOIArzgyI',
'ed25519:JLAFKJWSCS': 'lEuiRJBit0IG6nUf5pUzWTUEsRVVe/HJkoKuEww9ULI'
},
"signatures": {
"@alice:example.com": {
"ed25519:JLAFKJWSCS":
"dSO80A01XiigH3uBiDVx/EjzaoycHcjq9lfQX0uWsqxl2giMIiSPR8a4d291W1ihKJL/a+myXS367WT6NAIcBA"
'signatures': {
'@alice:example.com': {
'ed25519:JLAFKJWSCS':
'dSO80A01XiigH3uBiDVx/EjzaoycHcjq9lfQX0uWsqxl2giMIiSPR8a4d291W1ihKJL/a+myXS367WT6NAIcBA'
}
},
"unsigned": {"device_display_name": "Alice's mobile phone"},
"verified": false,
"blocked": true,
'unsigned': {'device_display_name': "Alice's mobile phone"},
'verified': false,
'blocked': true,
};
Map<String, dynamic> rawListJson = {
"user_id": "@alice:example.com",
"outdated": true,
"device_keys": {"JLAFKJWSCS": rawJson},
var rawListJson = <String, dynamic>{
'user_id': '@alice:example.com',
'outdated': true,
'device_keys': {'JLAFKJWSCS': rawJson},
};
Map<String, DeviceKeysList> userDeviceKeys = {
"@alice:example.com": DeviceKeysList.fromJson(rawListJson),
var userDeviceKeys = <String, DeviceKeysList>{
'@alice:example.com': DeviceKeysList.fromJson(rawListJson),
};
Map<String, dynamic> userDeviceKeyRaw = {
"@alice:example.com": rawListJson,
var userDeviceKeyRaw = <String, dynamic>{
'@alice:example.com': rawListJson,
};
expect(json.encode(DeviceKeys.fromJson(rawJson).toJson()),
@ -67,7 +67,7 @@ void main() {
expect(json.encode(DeviceKeysList.fromJson(rawListJson).toJson()),
json.encode(rawListJson));
Map<String, DeviceKeysList> mapFromRaw = {};
var mapFromRaw = <String, DeviceKeysList>{};
for (final rawListEntry in userDeviceKeyRaw.entries) {
mapFromRaw[rawListEntry.key] =
DeviceKeysList.fromJson(rawListEntry.value);

View file

@ -31,34 +31,34 @@ import 'fake_matrix_api.dart';
void main() {
/// All Tests related to the Event
group("Event", () {
final int timestamp = DateTime.now().millisecondsSinceEpoch;
final String id = "!4fsdfjisjf:server.abc";
final String senderID = "@alice:server.abc";
final String type = "m.room.message";
final String msgtype = "m.text";
final String body = "Hello World";
final String formatted_body = "<b>Hello</b> World";
group('Event', () {
final timestamp = DateTime.now().millisecondsSinceEpoch;
final id = '!4fsdfjisjf:server.abc';
final senderID = '@alice:server.abc';
final type = 'm.room.message';
final msgtype = 'm.text';
final body = 'Hello World';
final formatted_body = '<b>Hello</b> World';
final String contentJson =
final contentJson =
'{"msgtype":"$msgtype","body":"$body","formatted_body":"$formatted_body","m.relates_to":{"m.in_reply_to":{"event_id":"\$1234:example.com"}}}';
Map<String, dynamic> jsonObj = {
"event_id": id,
"sender": senderID,
"origin_server_ts": timestamp,
"type": type,
"room_id": "1234",
"status": 2,
"content": contentJson,
var jsonObj = <String, dynamic>{
'event_id': id,
'sender': senderID,
'origin_server_ts': timestamp,
'type': type,
'room_id': '1234',
'status': 2,
'content': contentJson,
};
test("Create from json", () async {
Event event = Event.fromJson(jsonObj, null);
jsonObj.remove("status");
jsonObj["content"] = json.decode(contentJson);
test('Create from json', () async {
var event = Event.fromJson(jsonObj, null);
jsonObj.remove('status');
jsonObj['content'] = json.decode(contentJson);
expect(event.toJson(), jsonObj);
jsonObj["content"] = contentJson;
jsonObj['content'] = contentJson;
expect(event.eventId, id);
expect(event.senderId, senderID);
@ -68,181 +68,180 @@ void main() {
expect(event.body, body);
expect(event.type, EventTypes.Message);
expect(event.isReply, true);
jsonObj["state_key"] = "";
Event state = Event.fromJson(jsonObj, null);
jsonObj['state_key'] = '';
var state = Event.fromJson(jsonObj, null);
expect(state.eventId, id);
expect(state.stateKey, "");
expect(state.stateKey, '');
expect(state.status, 2);
});
test("Test all EventTypes", () async {
test('Test all EventTypes', () async {
Event event;
jsonObj["type"] = "m.room.avatar";
jsonObj['type'] = 'm.room.avatar';
event = Event.fromJson(jsonObj, null);
expect(event.type, EventTypes.RoomAvatar);
jsonObj["type"] = "m.room.name";
jsonObj['type'] = 'm.room.name';
event = Event.fromJson(jsonObj, null);
expect(event.type, EventTypes.RoomName);
jsonObj["type"] = "m.room.topic";
jsonObj['type'] = 'm.room.topic';
event = Event.fromJson(jsonObj, null);
expect(event.type, EventTypes.RoomTopic);
jsonObj["type"] = "m.room.aliases";
jsonObj['type'] = 'm.room.aliases';
event = Event.fromJson(jsonObj, null);
expect(event.type, EventTypes.RoomAliases);
jsonObj["type"] = "m.room.canonical_alias";
jsonObj['type'] = 'm.room.canonical_alias';
event = Event.fromJson(jsonObj, null);
expect(event.type, EventTypes.RoomCanonicalAlias);
jsonObj["type"] = "m.room.create";
jsonObj['type'] = 'm.room.create';
event = Event.fromJson(jsonObj, null);
expect(event.type, EventTypes.RoomCreate);
jsonObj["type"] = "m.room.join_rules";
jsonObj['type'] = 'm.room.join_rules';
event = Event.fromJson(jsonObj, null);
expect(event.type, EventTypes.RoomJoinRules);
jsonObj["type"] = "m.room.member";
jsonObj['type'] = 'm.room.member';
event = Event.fromJson(jsonObj, null);
expect(event.type, EventTypes.RoomMember);
jsonObj["type"] = "m.room.power_levels";
jsonObj['type'] = 'm.room.power_levels';
event = Event.fromJson(jsonObj, null);
expect(event.type, EventTypes.RoomPowerLevels);
jsonObj["type"] = "m.room.guest_access";
jsonObj['type'] = 'm.room.guest_access';
event = Event.fromJson(jsonObj, null);
expect(event.type, EventTypes.GuestAccess);
jsonObj["type"] = "m.room.history_visibility";
jsonObj['type'] = 'm.room.history_visibility';
event = Event.fromJson(jsonObj, null);
expect(event.type, EventTypes.HistoryVisibility);
jsonObj["type"] = "m.room.message";
jsonObj["content"] = json.decode(jsonObj["content"]);
jsonObj['type'] = 'm.room.message';
jsonObj['content'] = json.decode(jsonObj['content']);
jsonObj["content"]["msgtype"] = "m.notice";
jsonObj['content']['msgtype'] = 'm.notice';
event = Event.fromJson(jsonObj, null);
expect(event.messageType, MessageTypes.Notice);
jsonObj["content"]["msgtype"] = "m.emote";
jsonObj['content']['msgtype'] = 'm.emote';
event = Event.fromJson(jsonObj, null);
expect(event.messageType, MessageTypes.Emote);
jsonObj["content"]["msgtype"] = "m.image";
jsonObj['content']['msgtype'] = 'm.image';
event = Event.fromJson(jsonObj, null);
expect(event.messageType, MessageTypes.Image);
jsonObj["content"]["msgtype"] = "m.video";
jsonObj['content']['msgtype'] = 'm.video';
event = Event.fromJson(jsonObj, null);
expect(event.messageType, MessageTypes.Video);
jsonObj["content"]["msgtype"] = "m.audio";
jsonObj['content']['msgtype'] = 'm.audio';
event = Event.fromJson(jsonObj, null);
expect(event.messageType, MessageTypes.Audio);
jsonObj["content"]["msgtype"] = "m.file";
jsonObj['content']['msgtype'] = 'm.file';
event = Event.fromJson(jsonObj, null);
expect(event.messageType, MessageTypes.File);
jsonObj["content"]["msgtype"] = "m.location";
jsonObj['content']['msgtype'] = 'm.location';
event = Event.fromJson(jsonObj, null);
expect(event.messageType, MessageTypes.Location);
jsonObj["type"] = "m.room.message";
jsonObj["content"]["msgtype"] = "m.text";
jsonObj["content"]["m.relates_to"] = {};
jsonObj["content"]["m.relates_to"]["m.in_reply_to"] = {
"event_id": "1234",
jsonObj['type'] = 'm.room.message';
jsonObj['content']['msgtype'] = 'm.text';
jsonObj['content']['m.relates_to'] = {};
jsonObj['content']['m.relates_to']['m.in_reply_to'] = {
'event_id': '1234',
};
event = Event.fromJson(jsonObj, null);
expect(event.messageType, MessageTypes.Reply);
});
test("redact", () async {
final Room room =
Room(id: "1234", client: Client("testclient", debug: true));
final Map<String, dynamic> redactionEventJson = {
"content": {"reason": "Spamming"},
"event_id": "143273582443PhrSn:example.org",
"origin_server_ts": 1432735824653,
"redacts": id,
"room_id": "1234",
"sender": "@example:example.org",
"type": "m.room.redaction",
"unsigned": {"age": 1234}
test('redact', () async {
final room = Room(id: '1234', client: Client('testclient', debug: true));
final redactionEventJson = {
'content': {'reason': 'Spamming'},
'event_id': '143273582443PhrSn:example.org',
'origin_server_ts': 1432735824653,
'redacts': id,
'room_id': '1234',
'sender': '@example:example.org',
'type': 'm.room.redaction',
'unsigned': {'age': 1234}
};
Event redactedBecause = Event.fromJson(redactionEventJson, room);
Event event = Event.fromJson(jsonObj, room);
var redactedBecause = Event.fromJson(redactionEventJson, room);
var event = Event.fromJson(jsonObj, room);
event.setRedactionEvent(redactedBecause);
expect(event.redacted, true);
expect(event.redactedBecause.toJson(), redactedBecause.toJson());
expect(event.content.isEmpty, true);
redactionEventJson.remove("redacts");
expect(event.unsigned["redacted_because"], redactionEventJson);
redactionEventJson.remove('redacts');
expect(event.unsigned['redacted_because'], redactionEventJson);
});
test("remove", () async {
Event event = Event.fromJson(
jsonObj, Room(id: "1234", client: Client("testclient", debug: true)));
final bool removed1 = await event.remove();
test('remove', () async {
var event = Event.fromJson(
jsonObj, Room(id: '1234', client: Client('testclient', debug: true)));
final removed1 = await event.remove();
event.status = 0;
final bool removed2 = await event.remove();
final removed2 = await event.remove();
expect(removed1, false);
expect(removed2, true);
});
test("sendAgain", () async {
Client matrix = Client("testclient", debug: true);
test('sendAgain', () async {
var matrix = Client('testclient', debug: true);
matrix.httpClient = FakeMatrixApi();
await matrix.checkServer("https://fakeServer.notExisting");
await matrix.login("test", "1234");
await matrix.checkServer('https://fakeServer.notExisting');
await matrix.login('test', '1234');
Event event = Event.fromJson(
jsonObj, Room(id: "!1234:example.com", client: matrix));
final String resp1 = await event.sendAgain();
var event = Event.fromJson(
jsonObj, Room(id: '!1234:example.com', client: matrix));
final resp1 = await event.sendAgain();
event.status = -1;
final String resp2 = await event.sendAgain(txid: "1234");
final resp2 = await event.sendAgain(txid: '1234');
expect(resp1, null);
expect(resp2, "42");
expect(resp2, '42');
});
test("requestKey", () async {
Client matrix = Client("testclient", debug: true);
test('requestKey', () async {
var matrix = Client('testclient', debug: true);
matrix.httpClient = FakeMatrixApi();
await matrix.checkServer("https://fakeServer.notExisting");
await matrix.login("test", "1234");
await matrix.checkServer('https://fakeServer.notExisting');
await matrix.login('test', '1234');
Event event = Event.fromJson(
jsonObj, Room(id: "!1234:example.com", client: matrix));
var event = Event.fromJson(
jsonObj, Room(id: '!1234:example.com', client: matrix));
String exception;
try {
await event.requestKey();
} catch (e) {
exception = e;
}
expect(exception, "Session key not unknown");
expect(exception, 'Session key not unknown');
event = Event.fromJson({
"event_id": id,
"sender": senderID,
"origin_server_ts": timestamp,
"type": "m.room.encrypted",
"room_id": "1234",
"status": 2,
"content": json.encode({
"msgtype": "m.bad.encrypted",
"body": DecryptError.UNKNOWN_SESSION,
"algorithm": "m.megolm.v1.aes-sha2",
"ciphertext": "AwgAEnACgAkLmt6qF84IK++J7UDH2Za1YVchHyprqTqsg...",
"device_id": "RJYKSTBOIE",
"sender_key": "IlRMeOPX2e0MurIyfWEucYBRVOEEUMrOHqn/8mLqMjA",
"session_id": "X3lUlvLELLYxeTx4yOVu6UDpasGEVO0Jbu+QFnm0cKQ"
'event_id': id,
'sender': senderID,
'origin_server_ts': timestamp,
'type': 'm.room.encrypted',
'room_id': '1234',
'status': 2,
'content': json.encode({
'msgtype': 'm.bad.encrypted',
'body': DecryptError.UNKNOWN_SESSION,
'algorithm': 'm.megolm.v1.aes-sha2',
'ciphertext': 'AwgAEnACgAkLmt6qF84IK++J7UDH2Za1YVchHyprqTqsg...',
'device_id': 'RJYKSTBOIE',
'sender_key': 'IlRMeOPX2e0MurIyfWEucYBRVOEEUMrOHqn/8mLqMjA',
'session_id': 'X3lUlvLELLYxeTx4yOVu6UDpasGEVO0Jbu+QFnm0cKQ'
}),
}, Room(id: "!1234:example.com", client: matrix));
}, Room(id: '!1234:example.com', client: matrix));
await event.requestKey();
});

File diff suppressed because it is too large Load diff

View file

@ -5,83 +5,91 @@ import 'package:famedlysdk/famedlysdk.dart';
class FakeStore implements StoreAPI {
/// Whether this is a simple store which only stores the client credentials and
/// end to end encryption stuff or the whole sync payloads.
@override
final bool extended = false;
Map<String, dynamic> storeMap = {};
/// Link back to the client.
@override
Client client;
FakeStore(this.client, this.storeMap) {
_init();
}
_init() async {
Future<void> _init() async {
final credentialsStr = await getItem(client.clientName);
if (credentialsStr == null || credentialsStr.isEmpty) {
client.onLoginStateChanged.add(LoginState.loggedOut);
return;
}
print("[Matrix] Restoring account credentials");
print('[Matrix] Restoring account credentials');
final Map<String, dynamic> credentials = json.decode(credentialsStr);
client.connect(
newDeviceID: credentials["deviceID"],
newDeviceName: credentials["deviceName"],
newHomeserver: credentials["homeserver"],
newLazyLoadMembers: credentials["lazyLoadMembers"],
newMatrixVersions: List<String>.from(credentials["matrixVersions"]),
newToken: credentials["token"],
newUserID: credentials["userID"],
newPrevBatch: credentials["prev_batch"],
newOlmAccount: credentials["olmAccount"],
newDeviceID: credentials['deviceID'],
newDeviceName: credentials['deviceName'],
newHomeserver: credentials['homeserver'],
newLazyLoadMembers: credentials['lazyLoadMembers'],
newMatrixVersions: List<String>.from(credentials['matrixVersions']),
newToken: credentials['token'],
newUserID: credentials['userID'],
newPrevBatch: credentials['prev_batch'],
newOlmAccount: credentials['olmAccount'],
);
}
/// Will be automatically called when the client is logged in successfully.
@override
Future<void> storeClient() async {
final Map<String, dynamic> credentials = {
"deviceID": client.deviceID,
"deviceName": client.deviceName,
"homeserver": client.homeserver,
"lazyLoadMembers": client.lazyLoadMembers,
"matrixVersions": client.matrixVersions,
"token": client.accessToken,
"userID": client.userID,
"olmAccount": client.pickledOlmAccount,
final credentials = {
'deviceID': client.deviceID,
'deviceName': client.deviceName,
'homeserver': client.homeserver,
'lazyLoadMembers': client.lazyLoadMembers,
'matrixVersions': client.matrixVersions,
'token': client.accessToken,
'userID': client.userID,
'olmAccount': client.pickledOlmAccount,
};
await setItem(client.clientName, json.encode(credentials));
return;
}
/// Clears all tables from the database.
@override
Future<void> clear() async {
storeMap = {};
return;
}
@override
Future<dynamic> getItem(String key) async {
return storeMap[key];
}
@override
Future<void> setItem(String key, String value) async {
storeMap[key] = value;
return;
}
String get _UserDeviceKeysKey => "${client.clientName}.user_device_keys";
String get _UserDeviceKeysKey => '${client.clientName}.user_device_keys';
@override
Future<Map<String, DeviceKeysList>> getUserDeviceKeys() async {
final deviceKeysListString = await getItem(_UserDeviceKeysKey);
if (deviceKeysListString == null) return {};
Map<String, dynamic> rawUserDeviceKeys = json.decode(deviceKeysListString);
Map<String, DeviceKeysList> userDeviceKeys = {};
var userDeviceKeys = <String, DeviceKeysList>{};
for (final entry in rawUserDeviceKeys.entries) {
userDeviceKeys[entry.key] = DeviceKeysList.fromJson(entry.value);
}
return userDeviceKeys;
}
@override
Future<void> storeUserDeviceKeys(
Map<String, DeviceKeysList> userDeviceKeys) async {
await setItem(_UserDeviceKeysKey, json.encode(userDeviceKeys));

View file

@ -26,25 +26,25 @@ import 'package:famedlysdk/src/utils/matrix_id_string_extension.dart';
void main() {
/// All Tests related to the ChatTime
group("Matrix ID String Extension", () {
test("Matrix ID String Extension", () async {
final String mxId = "@test:example.com";
group('Matrix ID String Extension', () {
test('Matrix ID String Extension', () async {
final mxId = '@test:example.com';
expect(mxId.isValidMatrixId, true);
expect("#test:example.com".isValidMatrixId, true);
expect("!test:example.com".isValidMatrixId, true);
expect("+test:example.com".isValidMatrixId, true);
expect("\$test:example.com".isValidMatrixId, true);
expect("test:example.com".isValidMatrixId, false);
expect("@testexample.com".isValidMatrixId, false);
expect("@:example.com".isValidMatrixId, false);
expect("@test:".isValidMatrixId, false);
expect(mxId.sigil, "@");
expect("#test:example.com".sigil, "#");
expect("!test:example.com".sigil, "!");
expect("+test:example.com".sigil, "+");
expect("\$test:example.com".sigil, "\$");
expect(mxId.localpart, "test");
expect(mxId.domain, "example.com");
expect('#test:example.com'.isValidMatrixId, true);
expect('!test:example.com'.isValidMatrixId, true);
expect('+test:example.com'.isValidMatrixId, true);
expect('\$test:example.com'.isValidMatrixId, true);
expect('test:example.com'.isValidMatrixId, false);
expect('@testexample.com'.isValidMatrixId, false);
expect('@:example.com'.isValidMatrixId, false);
expect('@test:'.isValidMatrixId, false);
expect(mxId.sigil, '@');
expect('#test:example.com'.sigil, '#');
expect('!test:example.com'.sigil, '!');
expect('+test:example.com'.sigil, '+');
expect('\$test:example.com'.sigil, '\$');
expect(mxId.localpart, 'test');
expect(mxId.domain, 'example.com');
});
});
}

View file

@ -29,30 +29,30 @@ import 'fake_matrix_api.dart';
void main() {
/// All Tests related to the MxContent
group("MxContent", () {
test("Formatting", () async {
Client client = Client("testclient");
group('MxContent', () {
test('Formatting', () async {
var client = Client('testclient');
client.httpClient = FakeMatrixApi();
await client.checkServer("https://fakeserver.notexisting");
final String mxc = "mxc://exampleserver.abc/abcdefghijklmn";
final MxContent content = MxContent(mxc);
await client.checkServer('https://fakeserver.notexisting');
final mxc = 'mxc://exampleserver.abc/abcdefghijklmn';
final content = MxContent(mxc);
expect(content.getDownloadLink(client),
"${client.homeserver}/_matrix/media/r0/download/exampleserver.abc/abcdefghijklmn");
'${client.homeserver}/_matrix/media/r0/download/exampleserver.abc/abcdefghijklmn');
expect(content.getThumbnail(client, width: 50, height: 50),
"${client.homeserver}/_matrix/media/r0/thumbnail/exampleserver.abc/abcdefghijklmn?width=50&height=50&method=crop");
'${client.homeserver}/_matrix/media/r0/thumbnail/exampleserver.abc/abcdefghijklmn?width=50&height=50&method=crop');
expect(
content.getThumbnail(client,
width: 50, height: 50, method: ThumbnailMethod.scale),
"${client.homeserver}/_matrix/media/r0/thumbnail/exampleserver.abc/abcdefghijklmn?width=50&height=50&method=scale");
'${client.homeserver}/_matrix/media/r0/thumbnail/exampleserver.abc/abcdefghijklmn?width=50&height=50&method=scale');
});
test("Not crashing if null", () async {
Client client = Client("testclient");
test('Not crashing if null', () async {
var client = Client('testclient');
client.httpClient = FakeMatrixApi();
await client.checkServer("https://fakeserver.notexisting");
final MxContent content = MxContent(null);
await client.checkServer('https://fakeserver.notexisting');
final content = MxContent(null);
expect(content.getDownloadLink(client),
"${client.homeserver}/_matrix/media/r0/download/");
'${client.homeserver}/_matrix/media/r0/download/');
});
});
}

View file

@ -26,26 +26,26 @@ import 'package:test/test.dart';
void main() {
/// All Tests related to the ChatTime
group("Presence", () {
test("fromJson", () async {
Map<String, dynamic> rawPresence = {
"content": {
"avatar_url": "mxc://localhost:wefuiwegh8742w",
"currently_active": false,
"last_active_ago": 2478593,
"presence": "online",
"status_msg": "Making cupcakes"
group('Presence', () {
test('fromJson', () async {
var rawPresence = <String, dynamic>{
'content': {
'avatar_url': 'mxc://localhost:wefuiwegh8742w',
'currently_active': false,
'last_active_ago': 2478593,
'presence': 'online',
'status_msg': 'Making cupcakes'
},
"sender": "@example:localhost",
"type": "m.presence"
'sender': '@example:localhost',
'type': 'm.presence'
};
Presence presence = Presence.fromJson(rawPresence);
expect(presence.sender, "@example:localhost");
expect(presence.avatarUrl.mxc, "mxc://localhost:wefuiwegh8742w");
var presence = Presence.fromJson(rawPresence);
expect(presence.sender, '@example:localhost');
expect(presence.avatarUrl.mxc, 'mxc://localhost:wefuiwegh8742w');
expect(presence.currentlyActive, false);
expect(presence.lastActiveAgo, 2478593);
expect(presence.presence, PresenceType.online);
expect(presence.statusMsg, "Making cupcakes");
expect(presence.statusMsg, 'Making cupcakes');
});
});
}

View file

@ -26,154 +26,154 @@ import 'package:test/test.dart';
void main() {
/// All Tests related to the MxContent
group("PushRules", () {
test("Create", () async {
final Map<String, dynamic> json = {
"global": {
"content": [
group('PushRules', () {
test('Create', () async {
final json = {
'global': {
'content': [
{
"actions": [
"notify",
{"set_tweak": "sound", "value": "default"},
{"set_tweak": "highlight"}
'actions': [
'notify',
{'set_tweak': 'sound', 'value': 'default'},
{'set_tweak': 'highlight'}
],
"default": true,
"enabled": true,
"pattern": "alice",
"rule_id": ".m.rule.contains_user_name"
'default': true,
'enabled': true,
'pattern': 'alice',
'rule_id': '.m.rule.contains_user_name'
}
],
"override": [
'override': [
{
"actions": ["dont_notify"],
"conditions": [],
"default": true,
"enabled": false,
"rule_id": ".m.rule.master"
'actions': ['dont_notify'],
'conditions': [],
'default': true,
'enabled': false,
'rule_id': '.m.rule.master'
},
{
"actions": ["dont_notify"],
"conditions": [
'actions': ['dont_notify'],
'conditions': [
{
"key": "content.msgtype",
"kind": "event_match",
"pattern": "m.notice"
'key': 'content.msgtype',
'kind': 'event_match',
'pattern': 'm.notice'
}
],
"default": true,
"enabled": true,
"rule_id": ".m.rule.suppress_notices"
'default': true,
'enabled': true,
'rule_id': '.m.rule.suppress_notices'
}
],
"room": [],
"sender": [],
"underride": [
'room': [],
'sender': [],
'underride': [
{
"actions": [
"notify",
{"set_tweak": "sound", "value": "ring"},
{"set_tweak": "highlight", "value": false}
'actions': [
'notify',
{'set_tweak': 'sound', 'value': 'ring'},
{'set_tweak': 'highlight', 'value': false}
],
"conditions": [
'conditions': [
{
"key": "type",
"kind": "event_match",
"pattern": "m.call.invite"
'key': 'type',
'kind': 'event_match',
'pattern': 'm.call.invite'
}
],
"default": true,
"enabled": true,
"rule_id": ".m.rule.call"
'default': true,
'enabled': true,
'rule_id': '.m.rule.call'
},
{
"actions": [
"notify",
{"set_tweak": "sound", "value": "default"},
{"set_tweak": "highlight"}
'actions': [
'notify',
{'set_tweak': 'sound', 'value': 'default'},
{'set_tweak': 'highlight'}
],
"conditions": [
{"kind": "contains_display_name"}
'conditions': [
{'kind': 'contains_display_name'}
],
"default": true,
"enabled": true,
"rule_id": ".m.rule.contains_display_name"
'default': true,
'enabled': true,
'rule_id': '.m.rule.contains_display_name'
},
{
"actions": [
"notify",
{"set_tweak": "sound", "value": "default"},
{"set_tweak": "highlight", "value": false}
'actions': [
'notify',
{'set_tweak': 'sound', 'value': 'default'},
{'set_tweak': 'highlight', 'value': false}
],
"conditions": [
{"kind": "room_member_count", "is": "2"},
'conditions': [
{'kind': 'room_member_count', 'is': '2'},
{
"kind": "event_match",
"key": "type",
"pattern": "m.room.message"
'kind': 'event_match',
'key': 'type',
'pattern': 'm.room.message'
}
],
"default": true,
"enabled": true,
"rule_id": ".m.rule.room_one_to_one"
'default': true,
'enabled': true,
'rule_id': '.m.rule.room_one_to_one'
},
{
"actions": [
"notify",
{"set_tweak": "sound", "value": "default"},
{"set_tweak": "highlight", "value": false}
'actions': [
'notify',
{'set_tweak': 'sound', 'value': 'default'},
{'set_tweak': 'highlight', 'value': false}
],
"conditions": [
'conditions': [
{
"key": "type",
"kind": "event_match",
"pattern": "m.room.member"
'key': 'type',
'kind': 'event_match',
'pattern': 'm.room.member'
},
{
"key": "content.membership",
"kind": "event_match",
"pattern": "invite"
'key': 'content.membership',
'kind': 'event_match',
'pattern': 'invite'
},
{
"key": "state_key",
"kind": "event_match",
"pattern": "@alice:example.com"
'key': 'state_key',
'kind': 'event_match',
'pattern': '@alice:example.com'
}
],
"default": true,
"enabled": true,
"rule_id": ".m.rule.invite_for_me"
'default': true,
'enabled': true,
'rule_id': '.m.rule.invite_for_me'
},
{
"actions": [
"notify",
{"set_tweak": "highlight", "value": false}
'actions': [
'notify',
{'set_tweak': 'highlight', 'value': false}
],
"conditions": [
'conditions': [
{
"key": "type",
"kind": "event_match",
"pattern": "m.room.member"
'key': 'type',
'kind': 'event_match',
'pattern': 'm.room.member'
}
],
"default": true,
"enabled": true,
"rule_id": ".m.rule.member_event"
'default': true,
'enabled': true,
'rule_id': '.m.rule.member_event'
},
{
"actions": [
"notify",
{"set_tweak": "highlight", "value": false}
'actions': [
'notify',
{'set_tweak': 'highlight', 'value': false}
],
"conditions": [
'conditions': [
{
"key": "type",
"kind": "event_match",
"pattern": "m.room.message"
'key': 'type',
'kind': 'event_match',
'pattern': 'm.room.message'
}
],
"default": true,
"enabled": true,
"rule_id": ".m.rule.message"
'default': true,
'enabled': true,
'rule_id': '.m.rule.message'
}
]
}

View file

@ -29,39 +29,39 @@ import 'fake_store.dart';
void main() {
/// All Tests related to device keys
group("Room Key Request", () {
test("fromJson", () async {
Map<String, dynamic> rawJson = {
"content": {
"action": "request",
"body": {
"algorithm": "m.megolm.v1.aes-sha2",
"room_id": "!726s6s6q:example.com",
"sender_key": "RF3s+E7RkTQTGF2d8Deol0FkQvgII2aJDf3/Jp5mxVU",
"session_id": "X3lUlvLELLYxeTx4yOVu6UDpasGEVO0Jbu+QFnm0cKQ"
group('Room Key Request', () {
test('fromJson', () async {
var rawJson = <String, dynamic>{
'content': {
'action': 'request',
'body': {
'algorithm': 'm.megolm.v1.aes-sha2',
'room_id': '!726s6s6q:example.com',
'sender_key': 'RF3s+E7RkTQTGF2d8Deol0FkQvgII2aJDf3/Jp5mxVU',
'session_id': 'X3lUlvLELLYxeTx4yOVu6UDpasGEVO0Jbu+QFnm0cKQ'
},
"request_id": "1495474790150.19",
"requesting_device_id": "JLAFKJWSCS"
'request_id': '1495474790150.19',
'requesting_device_id': 'JLAFKJWSCS'
},
"type": "m.room_key_request",
"sender": "@alice:example.com"
'type': 'm.room_key_request',
'sender': '@alice:example.com'
};
ToDeviceEvent toDeviceEvent = ToDeviceEvent.fromJson(rawJson);
expect(toDeviceEvent.content, rawJson["content"]);
expect(toDeviceEvent.sender, rawJson["sender"]);
expect(toDeviceEvent.type, rawJson["type"]);
var toDeviceEvent = ToDeviceEvent.fromJson(rawJson);
expect(toDeviceEvent.content, rawJson['content']);
expect(toDeviceEvent.sender, rawJson['sender']);
expect(toDeviceEvent.type, rawJson['type']);
Client matrix = Client("testclient", debug: true);
var matrix = Client('testclient', debug: true);
matrix.httpClient = FakeMatrixApi();
matrix.storeAPI = FakeStore(matrix, {});
await matrix.checkServer("https://fakeServer.notExisting");
await matrix.login("test", "1234");
Room room = matrix.getRoomById("!726s6s6q:example.com");
await matrix.checkServer('https://fakeServer.notExisting');
await matrix.login('test', '1234');
var room = matrix.getRoomById('!726s6s6q:example.com');
if (matrix.encryptionEnabled) {
await room.createOutboundGroupSession();
rawJson["content"]["body"]["session_id"] = room.sessionKeys.keys.first;
rawJson['content']['body']['session_id'] = room.sessionKeys.keys.first;
RoomKeyRequest roomKeyRequest = RoomKeyRequest.fromToDeviceEvent(
var roomKeyRequest = RoomKeyRequest.fromToDeviceEvent(
ToDeviceEvent.fromJson(rawJson), matrix);
await roomKeyRequest.forwardKey();
}

View file

@ -24,7 +24,6 @@
import 'package:famedlysdk/src/client.dart';
import 'package:famedlysdk/src/event.dart';
import 'package:famedlysdk/src/room.dart';
import 'package:famedlysdk/src/timeline.dart';
import 'package:famedlysdk/src/user.dart';
import 'package:famedlysdk/src/utils/matrix_file.dart';
import 'package:test/test.dart';
@ -38,61 +37,61 @@ void main() {
Room room;
/// All Tests related to the Event
group("Room", () {
group('Room', () {
test('Login', () async {
matrix = Client("testclient", debug: true);
matrix = Client('testclient', debug: true);
matrix.httpClient = FakeMatrixApi();
final bool checkResp =
await matrix.checkServer("https://fakeServer.notExisting");
final checkResp =
await matrix.checkServer('https://fakeServer.notExisting');
final bool loginResp = await matrix.login("test", "1234");
final loginResp = await matrix.login('test', '1234');
expect(checkResp, true);
expect(loginResp, true);
});
test("Create from json", () async {
final String id = "!localpart:server.abc";
final Membership membership = Membership.join;
final int notificationCount = 2;
final int highlightCount = 1;
final List<String> heroes = [
"@alice:matrix.org",
"@bob:example.com",
"@charley:example.org"
test('Create from json', () async {
final id = '!localpart:server.abc';
final membership = Membership.join;
final notificationCount = 2;
final highlightCount = 1;
final heroes = [
'@alice:matrix.org',
'@bob:example.com',
'@charley:example.org'
];
Map<String, dynamic> jsonObj = {
"room_id": id,
"membership": membership.toString().split('.').last,
"avatar_url": "",
"notification_count": notificationCount,
"highlight_count": highlightCount,
"prev_batch": "",
"joined_member_count": notificationCount,
"invited_member_count": notificationCount,
"heroes": heroes.join(","),
var jsonObj = <String, dynamic>{
'room_id': id,
'membership': membership.toString().split('.').last,
'avatar_url': '',
'notification_count': notificationCount,
'highlight_count': highlightCount,
'prev_batch': '',
'joined_member_count': notificationCount,
'invited_member_count': notificationCount,
'heroes': heroes.join(','),
};
Function states = () async => [
{
"content": {"join_rule": "public"},
"event_id": "143273582443PhrSn:example.org",
"origin_server_ts": 1432735824653,
"room_id": id,
"sender": "@example:example.org",
"state_key": "",
"type": "m.room.join_rules",
"unsigned": {"age": 1234}
'content': {'join_rule': 'public'},
'event_id': '143273582443PhrSn:example.org',
'origin_server_ts': 1432735824653,
'room_id': id,
'sender': '@example:example.org',
'state_key': '',
'type': 'm.room.join_rules',
'unsigned': {'age': 1234}
}
];
Function roomAccountData = () async => [
{
"content": {"foo": "bar"},
"room_id": id,
"type": "com.test.foo"
'content': {'foo': 'bar'},
'room_id': id,
'type': 'com.test.foo'
}
];
@ -110,131 +109,131 @@ void main() {
expect(room.mJoinedMemberCount, notificationCount);
expect(room.mInvitedMemberCount, notificationCount);
expect(room.mHeroes, heroes);
expect(room.displayname, "alice, bob, charley");
expect(room.getState("m.room.join_rules").content["join_rule"], "public");
expect(room.roomAccountData["com.test.foo"].content["foo"], "bar");
expect(room.displayname, 'alice, bob, charley');
expect(room.getState('m.room.join_rules').content['join_rule'], 'public');
expect(room.roomAccountData['com.test.foo'].content['foo'], 'bar');
room.states["m.room.canonical_alias"] = Event(
senderId: "@test:example.com",
typeKey: "m.room.canonical_alias",
room.states['m.room.canonical_alias'] = Event(
senderId: '@test:example.com',
typeKey: 'm.room.canonical_alias',
roomId: room.id,
room: room,
eventId: "123",
content: {"alias": "#testalias:example.com"},
stateKey: "");
expect(room.displayname, "testalias");
expect(room.canonicalAlias, "#testalias:example.com");
eventId: '123',
content: {'alias': '#testalias:example.com'},
stateKey: '');
expect(room.displayname, 'testalias');
expect(room.canonicalAlias, '#testalias:example.com');
room.states["m.room.name"] = Event(
senderId: "@test:example.com",
typeKey: "m.room.name",
room.states['m.room.name'] = Event(
senderId: '@test:example.com',
typeKey: 'm.room.name',
roomId: room.id,
room: room,
eventId: "123",
content: {"name": "testname"},
stateKey: "");
expect(room.displayname, "testname");
eventId: '123',
content: {'name': 'testname'},
stateKey: '');
expect(room.displayname, 'testname');
expect(room.topic, "");
room.states["m.room.topic"] = Event(
senderId: "@test:example.com",
typeKey: "m.room.topic",
expect(room.topic, '');
room.states['m.room.topic'] = Event(
senderId: '@test:example.com',
typeKey: 'm.room.topic',
roomId: room.id,
room: room,
eventId: "123",
content: {"topic": "testtopic"},
stateKey: "");
expect(room.topic, "testtopic");
eventId: '123',
content: {'topic': 'testtopic'},
stateKey: '');
expect(room.topic, 'testtopic');
expect(room.avatar.mxc, "");
room.states["m.room.avatar"] = Event(
senderId: "@test:example.com",
typeKey: "m.room.avatar",
expect(room.avatar.mxc, '');
room.states['m.room.avatar'] = Event(
senderId: '@test:example.com',
typeKey: 'm.room.avatar',
roomId: room.id,
room: room,
eventId: "123",
content: {"url": "mxc://testurl"},
stateKey: "");
expect(room.avatar.mxc, "mxc://testurl");
room.states["m.room.message"] = Event(
senderId: "@test:example.com",
typeKey: "m.room.message",
eventId: '123',
content: {'url': 'mxc://testurl'},
stateKey: '');
expect(room.avatar.mxc, 'mxc://testurl');
room.states['m.room.message'] = Event(
senderId: '@test:example.com',
typeKey: 'm.room.message',
roomId: room.id,
room: room,
eventId: "12345",
eventId: '12345',
time: DateTime.now(),
content: {"msgtype": "m.text", "body": "test"},
stateKey: "");
expect(room.lastEvent.eventId, "12345");
expect(room.lastMessage, "test");
content: {'msgtype': 'm.text', 'body': 'test'},
stateKey: '');
expect(room.lastEvent.eventId, '12345');
expect(room.lastMessage, 'test');
expect(room.timeCreated, room.lastEvent.time);
});
test("sendReadReceipt", () async {
await room.sendReadReceipt("§1234:fakeServer.notExisting");
test('sendReadReceipt', () async {
await room.sendReadReceipt('§1234:fakeServer.notExisting');
});
test("requestParticipants", () async {
final List<User> participants = await room.requestParticipants();
test('requestParticipants', () async {
final participants = await room.requestParticipants();
expect(participants.length, 1);
User user = participants[0];
expect(user.id, "@alice:example.org");
expect(user.displayName, "Alice Margatroid");
var user = participants[0];
expect(user.id, '@alice:example.org');
expect(user.displayName, 'Alice Margatroid');
expect(user.membership, Membership.join);
expect(user.avatarUrl.mxc, "mxc://example.org/SEsfnsuifSDFSSEF");
expect(user.room.id, "!localpart:server.abc");
expect(user.avatarUrl.mxc, 'mxc://example.org/SEsfnsuifSDFSSEF');
expect(user.room.id, '!localpart:server.abc');
});
test("getEventByID", () async {
final Event event = await room.getEventById("1234");
expect(event.eventId, "143273582443PhrSn:example.org");
test('getEventByID', () async {
final event = await room.getEventById('1234');
expect(event.eventId, '143273582443PhrSn:example.org');
});
test("setName", () async {
final String eventId = await room.setName("Testname");
expect(eventId, "42");
test('setName', () async {
final eventId = await room.setName('Testname');
expect(eventId, '42');
});
test("setDescription", () async {
final String eventId = await room.setDescription("Testname");
expect(eventId, "42");
test('setDescription', () async {
final eventId = await room.setDescription('Testname');
expect(eventId, '42');
});
test("kick", () async {
await room.kick("Testname");
test('kick', () async {
await room.kick('Testname');
});
test("ban", () async {
await room.ban("Testname");
test('ban', () async {
await room.ban('Testname');
});
test("unban", () async {
await room.unban("Testname");
test('unban', () async {
await room.unban('Testname');
});
test("PowerLevels", () async {
room.states["m.room.power_levels"] = Event(
senderId: "@test:example.com",
typeKey: "m.room.power_levels",
test('PowerLevels', () async {
room.states['m.room.power_levels'] = Event(
senderId: '@test:example.com',
typeKey: 'm.room.power_levels',
roomId: room.id,
room: room,
eventId: "123",
eventId: '123',
content: {
"ban": 50,
"events": {"m.room.name": 100, "m.room.power_levels": 100},
"events_default": 0,
"invite": 50,
"kick": 50,
"notifications": {"room": 20},
"redact": 50,
"state_default": 50,
"users": {"@test:fakeServer.notExisting": 100},
"users_default": 10
'ban': 50,
'events': {'m.room.name': 100, 'm.room.power_levels': 100},
'events_default': 0,
'invite': 50,
'kick': 50,
'notifications': {'room': 20},
'redact': 50,
'state_default': 50,
'users': {'@test:fakeServer.notExisting': 100},
'users_default': 10
},
stateKey: "");
stateKey: '');
expect(room.ownPowerLevel, 100);
expect(room.getPowerLevelByUserId(matrix.userID), room.ownPowerLevel);
expect(room.getPowerLevelByUserId("@nouser:example.com"), 10);
expect(room.getPowerLevelByUserId('@nouser:example.com'), 10);
expect(room.ownPowerLevel, 100);
expect(room.canBan, true);
expect(room.canInvite, true);
@ -243,31 +242,31 @@ void main() {
expect(room.canSendDefaultMessages, true);
expect(room.canSendDefaultStates, true);
expect(room.canChangePowerLevel, true);
expect(room.canSendEvent("m.room.name"), true);
expect(room.canSendEvent("m.room.power_levels"), true);
expect(room.canSendEvent("m.room.member"), true);
expect(room.canSendEvent('m.room.name'), true);
expect(room.canSendEvent('m.room.power_levels'), true);
expect(room.canSendEvent('m.room.member'), true);
expect(room.powerLevels,
room.states["m.room.power_levels"].content["users"]);
room.states['m.room.power_levels'].content['users']);
room.states["m.room.power_levels"] = Event(
senderId: "@test:example.com",
typeKey: "m.room.power_levels",
room.states['m.room.power_levels'] = Event(
senderId: '@test:example.com',
typeKey: 'm.room.power_levels',
roomId: room.id,
room: room,
eventId: "123abc",
eventId: '123abc',
content: {
"ban": 50,
"events": {"m.room.name": 0, "m.room.power_levels": 100},
"events_default": 0,
"invite": 50,
"kick": 50,
"notifications": {"room": 20},
"redact": 50,
"state_default": 50,
"users": {},
"users_default": 0
'ban': 50,
'events': {'m.room.name': 0, 'm.room.power_levels': 100},
'events_default': 0,
'invite': 50,
'kick': 50,
'notifications': {'room': 20},
'redact': 50,
'state_default': 50,
'users': {},
'users_default': 0
},
stateKey: "");
stateKey: '');
expect(room.ownPowerLevel, 0);
expect(room.canBan, false);
expect(room.canInvite, false);
@ -276,70 +275,69 @@ void main() {
expect(room.canSendDefaultMessages, true);
expect(room.canSendDefaultStates, false);
expect(room.canChangePowerLevel, false);
expect(room.canSendEvent("m.room.name"), true);
expect(room.canSendEvent("m.room.power_levels"), false);
expect(room.canSendEvent("m.room.member"), false);
expect(room.canSendEvent("m.room.message"), true);
final String resp =
await room.setPower("@test:fakeServer.notExisting", 90);
expect(resp, "42");
expect(room.canSendEvent('m.room.name'), true);
expect(room.canSendEvent('m.room.power_levels'), false);
expect(room.canSendEvent('m.room.member'), false);
expect(room.canSendEvent('m.room.message'), true);
final resp = await room.setPower('@test:fakeServer.notExisting', 90);
expect(resp, '42');
});
test("invite", () async {
await room.invite("Testname");
test('invite', () async {
await room.invite('Testname');
});
test("getParticipants", () async {
test('getParticipants', () async {
room.setState(Event(
senderId: "@alice:test.abc",
typeKey: "m.room.member",
senderId: '@alice:test.abc',
typeKey: 'm.room.member',
roomId: room.id,
room: room,
eventId: "12345",
eventId: '12345',
time: DateTime.now(),
content: {"displayname": "alice"},
stateKey: "@alice:test.abc"));
final List<User> userList = room.getParticipants();
content: {'displayname': 'alice'},
stateKey: '@alice:test.abc'));
final userList = room.getParticipants();
expect(userList.length, 5);
expect(userList[3].displayName, "Alice Margatroid");
expect(userList[3].displayName, 'Alice Margatroid');
});
test("addToDirectChat", () async {
await room.addToDirectChat("Testname");
test('addToDirectChat', () async {
await room.addToDirectChat('Testname');
});
test("getTimeline", () async {
final Timeline timeline = await room.getTimeline();
test('getTimeline', () async {
final timeline = await room.getTimeline();
expect(timeline.events, []);
});
test("getUserByMXID", () async {
test('getUserByMXID', () async {
User user;
try {
user = await room.getUserByMXID("@getme:example.com");
user = await room.getUserByMXID('@getme:example.com');
} catch (_) {}
expect(user.stateKey, "@getme:example.com");
expect(user.calcDisplayname(), "You got me");
expect(user.stateKey, '@getme:example.com');
expect(user.calcDisplayname(), 'You got me');
});
test('setAvatar', () async {
final MatrixFile testFile =
MatrixFile(bytes: Uint8List(0), path: "fake/path/file.jpeg");
final testFile =
MatrixFile(bytes: Uint8List(0), path: 'fake/path/file.jpeg');
final dynamic resp = await room.setAvatar(testFile);
expect(resp, "YUwRidLecu:example.com");
expect(resp, 'YUwRidLecu:example.com');
});
test('sendEvent', () async {
final dynamic resp = await room.sendEvent(
{"msgtype": "m.text", "body": "hello world"},
txid: "testtxid");
expect(resp, "42");
{'msgtype': 'm.text', 'body': 'hello world'},
txid: 'testtxid');
expect(resp, '42');
});
test('sendEvent', () async {
final dynamic resp =
await room.sendTextEvent("Hello world", txid: "testtxid");
expect(resp, "42");
await room.sendTextEvent('Hello world', txid: 'testtxid');
expect(resp, '42');
});
// Not working because there is no real file to test it...
@ -351,38 +349,38 @@ void main() {
});*/
test('sendFileEvent', () async {
final MatrixFile testFile =
MatrixFile(bytes: Uint8List(0), path: "fake/path/file.jpeg");
final testFile =
MatrixFile(bytes: Uint8List(0), path: 'fake/path/file.jpeg');
final dynamic resp = await room.sendFileEvent(testFile,
msgType: "m.file", txid: "testtxid");
expect(resp, "mxc://example.com/AQwafuaFswefuhsfAFAgsw");
msgType: 'm.file', txid: 'testtxid');
expect(resp, 'mxc://example.com/AQwafuaFswefuhsfAFAgsw');
});
test('pushRuleState', () async {
expect(room.pushRuleState, PushRuleState.mentions_only);
matrix.accountData["m.push_rules"].content["global"]["override"]
.add(matrix.accountData["m.push_rules"].content["global"]["room"][0]);
matrix.accountData['m.push_rules'].content['global']['override']
.add(matrix.accountData['m.push_rules'].content['global']['room'][0]);
expect(room.pushRuleState, PushRuleState.dont_notify);
});
test('Enable encryption', () async {
room.setState(
Event(
senderId: "@alice:test.abc",
typeKey: "m.room.encryption",
senderId: '@alice:test.abc',
typeKey: 'm.room.encryption',
roomId: room.id,
room: room,
eventId: "12345",
eventId: '12345',
time: DateTime.now(),
content: {
"algorithm": "m.megolm.v1.aes-sha2",
"rotation_period_ms": 604800000,
"rotation_period_msgs": 100
'algorithm': 'm.megolm.v1.aes-sha2',
'rotation_period_ms': 604800000,
'rotation_period_msgs': 100
},
stateKey: ""),
stateKey: ''),
);
expect(room.encrypted, true);
expect(room.encryptionAlgorithm, "m.megolm.v1.aes-sha2");
expect(room.encryptionAlgorithm, 'm.megolm.v1.aes-sha2');
expect(room.outboundGroupSession, null);
});
@ -396,7 +394,7 @@ void main() {
true);
expect(
room.sessionKeys[room.outboundGroupSession.session_id()]
.content["session_key"],
.content['session_key'],
room.outboundGroupSession.session_key());
expect(
room.sessionKeys[room.outboundGroupSession.session_id()].indexes
@ -412,30 +410,29 @@ void main() {
test('encryptGroupMessagePayload and decryptGroupMessage', () async {
if (!room.client.encryptionEnabled) return;
final Map<String, dynamic> payload = {
"msgtype": "m.text",
"body": "Hello world",
final payload = {
'msgtype': 'm.text',
'body': 'Hello world',
};
final Map<String, dynamic> encryptedPayload =
await room.encryptGroupMessagePayload(payload);
expect(encryptedPayload["algorithm"], "m.megolm.v1.aes-sha2");
expect(encryptedPayload["ciphertext"].isNotEmpty, true);
expect(encryptedPayload["device_id"], room.client.deviceID);
expect(encryptedPayload["sender_key"], room.client.identityKey);
expect(encryptedPayload["session_id"],
final encryptedPayload = await room.encryptGroupMessagePayload(payload);
expect(encryptedPayload['algorithm'], 'm.megolm.v1.aes-sha2');
expect(encryptedPayload['ciphertext'].isNotEmpty, true);
expect(encryptedPayload['device_id'], room.client.deviceID);
expect(encryptedPayload['sender_key'], room.client.identityKey);
expect(encryptedPayload['session_id'],
room.outboundGroupSession.session_id());
Event encryptedEvent = Event(
var encryptedEvent = Event(
content: encryptedPayload,
typeKey: "m.room.encrypted",
typeKey: 'm.room.encrypted',
senderId: room.client.userID,
eventId: "1234",
eventId: '1234',
roomId: room.id,
room: room,
time: DateTime.now(),
);
Event decryptedEvent = room.decryptGroupMessage(encryptedEvent);
expect(decryptedEvent.typeKey, "m.room.message");
var decryptedEvent = room.decryptGroupMessage(encryptedEvent);
expect(decryptedEvent.typeKey, 'm.room.message');
expect(decryptedEvent.content, payload);
});
});

View file

@ -27,48 +27,48 @@ import 'package:famedlysdk/src/utils/states_map.dart';
void main() {
/// All Tests related to the ChatTime
group("StateKeys", () {
test("Operator overload", () async {
StatesMap states = StatesMap();
states["m.room.name"] = Event(
eventId: "1",
content: {"name": "test"},
typeKey: "m.room.name",
stateKey: "",
roomId: "!test:test.test",
senderId: "@alice:test.test");
group('StateKeys', () {
test('Operator overload', () async {
var states = StatesMap();
states['m.room.name'] = Event(
eventId: '1',
content: {'name': 'test'},
typeKey: 'm.room.name',
stateKey: '',
roomId: '!test:test.test',
senderId: '@alice:test.test');
states["@alice:test.test"] = Event(
eventId: "2",
content: {"membership": "join"},
typeKey: "m.room.name",
stateKey: "@alice:test.test",
roomId: "!test:test.test",
senderId: "@alice:test.test");
states['@alice:test.test'] = Event(
eventId: '2',
content: {'membership': 'join'},
typeKey: 'm.room.name',
stateKey: '@alice:test.test',
roomId: '!test:test.test',
senderId: '@alice:test.test');
states["m.room.member"]["@bob:test.test"] = Event(
eventId: "3",
content: {"membership": "join"},
typeKey: "m.room.name",
stateKey: "@bob:test.test",
roomId: "!test:test.test",
senderId: "@bob:test.test");
states['m.room.member']['@bob:test.test'] = Event(
eventId: '3',
content: {'membership': 'join'},
typeKey: 'm.room.name',
stateKey: '@bob:test.test',
roomId: '!test:test.test',
senderId: '@bob:test.test');
states["com.test.custom"] = Event(
eventId: "4",
content: {"custom": "stuff"},
typeKey: "com.test.custom",
stateKey: "customStateKey",
roomId: "!test:test.test",
senderId: "@bob:test.test");
states['com.test.custom'] = Event(
eventId: '4',
content: {'custom': 'stuff'},
typeKey: 'com.test.custom',
stateKey: 'customStateKey',
roomId: '!test:test.test',
senderId: '@bob:test.test');
expect(states["m.room.name"].eventId, "1");
expect(states["@alice:test.test"].eventId, "2");
expect(states["m.room.member"]["@alice:test.test"].eventId, "2");
expect(states["@bob:test.test"].eventId, "3");
expect(states["m.room.member"]["@bob:test.test"].eventId, "3");
expect(states["m.room.member"].length, 2);
expect(states["com.test.custom"]["customStateKey"].eventId, "4");
expect(states['m.room.name'].eventId, '1');
expect(states['@alice:test.test'].eventId, '2');
expect(states['m.room.member']['@alice:test.test'].eventId, '2');
expect(states['@bob:test.test'].eventId, '3');
expect(states['m.room.member']['@bob:test.test'].eventId, '3');
expect(states['m.room.member'].length, 2);
expect(states['com.test.custom']['customStateKey'].eventId, '4');
});
});
}

View file

@ -31,18 +31,18 @@ import 'fake_matrix_api.dart';
void main() {
/// All Tests related to the MxContent
group("Timeline", () {
final String roomID = "!1234:example.com";
group('Timeline', () {
final roomID = '!1234:example.com';
final testTimeStamp = DateTime.now().millisecondsSinceEpoch;
int updateCount = 0;
List<int> insertList = [];
var updateCount = 0;
var insertList = <int>[];
Client client = Client("testclient", debug: true);
var client = Client('testclient', debug: true);
client.httpClient = FakeMatrixApi();
Room room = Room(
id: roomID, client: client, prev_batch: "1234", roomAccountData: {});
Timeline timeline = Timeline(
var room = Room(
id: roomID, client: client, prev_batch: '1234', roomAccountData: {});
var timeline = Timeline(
room: room,
events: [],
onUpdate: () {
@ -52,32 +52,32 @@ void main() {
insertList.add(insertID);
});
test("Create", () async {
await client.checkServer("https://fakeServer.notExisting");
test('Create', () async {
await client.checkServer('https://fakeServer.notExisting');
client.onEvent.add(EventUpdate(
type: "timeline",
type: 'timeline',
roomID: roomID,
eventType: "m.room.message",
eventType: 'm.room.message',
content: {
"type": "m.room.message",
"content": {"msgtype": "m.text", "body": "Testcase"},
"sender": "@alice:example.com",
"status": 2,
"event_id": "1",
"origin_server_ts": testTimeStamp
'type': 'm.room.message',
'content': {'msgtype': 'm.text', 'body': 'Testcase'},
'sender': '@alice:example.com',
'status': 2,
'event_id': '1',
'origin_server_ts': testTimeStamp
}));
client.onEvent.add(EventUpdate(
type: "timeline",
type: 'timeline',
roomID: roomID,
eventType: "m.room.message",
eventType: 'm.room.message',
content: {
"type": "m.room.message",
"content": {"msgtype": "m.text", "body": "Testcase"},
"sender": "@alice:example.com",
"status": 2,
"event_id": "2",
"origin_server_ts": testTimeStamp - 1000
'type': 'm.room.message',
'content': {'msgtype': 'm.text', 'body': 'Testcase'},
'sender': '@alice:example.com',
'status': 2,
'event_id': '2',
'origin_server_ts': testTimeStamp - 1000
}));
expect(timeline.sub != null, true);
@ -88,43 +88,43 @@ void main() {
expect(insertList, [0, 0]);
expect(insertList.length, timeline.events.length);
expect(timeline.events.length, 2);
expect(timeline.events[0].eventId, "1");
expect(timeline.events[0].sender.id, "@alice:example.com");
expect(timeline.events[0].eventId, '1');
expect(timeline.events[0].sender.id, '@alice:example.com');
expect(timeline.events[0].time.millisecondsSinceEpoch, testTimeStamp);
expect(timeline.events[0].body, "Testcase");
expect(timeline.events[0].body, 'Testcase');
expect(
timeline.events[0].time.millisecondsSinceEpoch >
timeline.events[1].time.millisecondsSinceEpoch,
true);
expect(timeline.events[0].receipts, []);
room.roomAccountData["m.receipt"] = RoomAccountData.fromJson({
"type": "m.receipt",
"content": {
"@alice:example.com": {
"event_id": "1",
"ts": 1436451550453,
room.roomAccountData['m.receipt'] = RoomAccountData.fromJson({
'type': 'm.receipt',
'content': {
'@alice:example.com': {
'event_id': '1',
'ts': 1436451550453,
}
},
"room_id": roomID,
'room_id': roomID,
}, room);
await Future.delayed(Duration(milliseconds: 50));
expect(timeline.events[0].receipts.length, 1);
expect(timeline.events[0].receipts[0].user.id, "@alice:example.com");
expect(timeline.events[0].receipts[0].user.id, '@alice:example.com');
client.onEvent.add(EventUpdate(
type: "timeline",
type: 'timeline',
roomID: roomID,
eventType: "m.room.redaction",
eventType: 'm.room.redaction',
content: {
"type": "m.room.redaction",
"content": {"reason": "spamming"},
"sender": "@alice:example.com",
"redacts": "2",
"event_id": "3",
"origin_server_ts": testTimeStamp + 1000
'type': 'm.room.redaction',
'content': {'reason': 'spamming'},
'sender': '@alice:example.com',
'redacts': '2',
'event_id': '3',
'origin_server_ts': testTimeStamp + 1000
}));
await Future.delayed(Duration(milliseconds: 50));
@ -136,29 +136,29 @@ void main() {
expect(timeline.events[1].redacted, true);
});
test("Send message", () async {
await room.sendTextEvent("test", txid: "1234");
test('Send message', () async {
await room.sendTextEvent('test', txid: '1234');
await Future.delayed(Duration(milliseconds: 50));
expect(updateCount, 5);
expect(insertList, [0, 0, 0]);
expect(insertList.length, timeline.events.length);
expect(timeline.events[0].eventId, "42");
expect(timeline.events[0].eventId, '42');
expect(timeline.events[0].status, 1);
client.onEvent.add(EventUpdate(
type: "timeline",
type: 'timeline',
roomID: roomID,
eventType: "m.room.message",
eventType: 'm.room.message',
content: {
"type": "m.room.message",
"content": {"msgtype": "m.text", "body": "test"},
"sender": "@alice:example.com",
"status": 2,
"event_id": "42",
"unsigned": {"transaction_id": "1234"},
"origin_server_ts": DateTime.now().millisecondsSinceEpoch
'type': 'm.room.message',
'content': {'msgtype': 'm.text', 'body': 'test'},
'sender': '@alice:example.com',
'status': 2,
'event_id': '42',
'unsigned': {'transaction_id': '1234'},
'origin_server_ts': DateTime.now().millisecondsSinceEpoch
}));
await Future.delayed(Duration(milliseconds: 50));
@ -166,29 +166,29 @@ void main() {
expect(updateCount, 6);
expect(insertList, [0, 0, 0]);
expect(insertList.length, timeline.events.length);
expect(timeline.events[0].eventId, "42");
expect(timeline.events[0].eventId, '42');
expect(timeline.events[0].status, 2);
});
test("Send message with error", () async {
test('Send message with error', () async {
client.onEvent.add(EventUpdate(
type: "timeline",
type: 'timeline',
roomID: roomID,
eventType: "m.room.message",
eventType: 'm.room.message',
content: {
"type": "m.room.message",
"content": {"msgtype": "m.text", "body": "Testcase"},
"sender": "@alice:example.com",
"status": 0,
"event_id": "abc",
"origin_server_ts": testTimeStamp
'type': 'm.room.message',
'content': {'msgtype': 'm.text', 'body': 'Testcase'},
'sender': '@alice:example.com',
'status': 0,
'event_id': 'abc',
'origin_server_ts': testTimeStamp
}));
await Future.delayed(Duration(milliseconds: 50));
await room.sendTextEvent("test", txid: "errortxid");
await room.sendTextEvent('test', txid: 'errortxid');
await Future.delayed(Duration(milliseconds: 50));
await room.sendTextEvent("test", txid: "errortxid2");
await room.sendTextEvent('test', txid: 'errortxid2');
await Future.delayed(Duration(milliseconds: 50));
await room.sendTextEvent("test", txid: "errortxid3");
await room.sendTextEvent('test', txid: 'errortxid3');
await Future.delayed(Duration(milliseconds: 50));
expect(updateCount, 13);
@ -199,7 +199,7 @@ void main() {
expect(timeline.events[2].status, -1);
});
test("Remove message", () async {
test('Remove message', () async {
await timeline.events[0].remove();
await Future.delayed(Duration(milliseconds: 50));
@ -211,8 +211,8 @@ void main() {
expect(timeline.events[0].status, -1);
});
test("Resend message", () async {
await timeline.events[0].sendAgain(txid: "1234");
test('Resend message', () async {
await timeline.events[0].sendAgain(txid: '1234');
await Future.delayed(Duration(milliseconds: 50));
@ -223,17 +223,17 @@ void main() {
expect(timeline.events[0].status, 1);
});
test("Request history", () async {
test('Request history', () async {
await room.requestHistory();
await Future.delayed(Duration(milliseconds: 50));
expect(updateCount, 20);
expect(timeline.events.length, 9);
expect(timeline.events[6].eventId, "1143273582443PhrSn:example.org");
expect(timeline.events[7].eventId, "2143273582443PhrSn:example.org");
expect(timeline.events[8].eventId, "3143273582443PhrSn:example.org");
expect(room.prev_batch, "t47409-4357353_219380_26003_2265");
expect(timeline.events[6].eventId, '1143273582443PhrSn:example.org');
expect(timeline.events[7].eventId, '2143273582443PhrSn:example.org');
expect(timeline.events[8].eventId, '3143273582443PhrSn:example.org');
expect(room.prev_batch, 't47409-4357353_219380_26003_2265');
});
});
}

View file

@ -27,29 +27,29 @@ import 'package:test/test.dart';
void main() {
/// All Tests related to the Event
group("User", () {
test("Create from json", () async {
final String id = "@alice:server.abc";
final Membership membership = Membership.join;
final String displayName = "Alice";
final String avatarUrl = "";
group('User', () {
test('Create from json', () async {
final id = '@alice:server.abc';
final membership = Membership.join;
final displayName = 'Alice';
final avatarUrl = '';
final Map<String, dynamic> jsonObj = {
"content": {
"membership": "join",
"avatar_url": avatarUrl,
"displayname": displayName
final jsonObj = {
'content': {
'membership': 'join',
'avatar_url': avatarUrl,
'displayname': displayName
},
"type": "m.room.member",
"event_id": "143273582443PhrSn:example.org",
"room_id": "!636q39766251:example.com",
"sender": id,
"origin_server_ts": 1432735824653,
"unsigned": {"age": 1234},
"state_key": id
'type': 'm.room.member',
'event_id': '143273582443PhrSn:example.org',
'room_id': '!636q39766251:example.com',
'sender': id,
'origin_server_ts': 1432735824653,
'unsigned': {'age': 1234},
'state_key': id
};
User user = Event.fromJson(jsonObj, null).asUser;
var user = Event.fromJson(jsonObj, null).asUser;
expect(user.id, id);
expect(user.membership, membership);
@ -58,13 +58,13 @@ void main() {
expect(user.calcDisplayname(), displayName);
});
test("calcDisplayname", () async {
final User user1 = User("@alice:example.com");
final User user2 = User("@SuperAlice:example.com");
final User user3 = User("@alice:example.com");
expect(user1.calcDisplayname(), "alice");
expect(user2.calcDisplayname(), "SuperAlice");
expect(user3.calcDisplayname(), "alice");
test('calcDisplayname', () async {
final user1 = User('@alice:example.com');
final user2 = User('@SuperAlice:example.com');
final user3 = User('@alice:example.com');
expect(user1.calcDisplayname(), 'alice');
expect(user2.calcDisplayname(), 'SuperAlice');
expect(user3.calcDisplayname(), 'alice');
});
});
}

View file

@ -3,36 +3,36 @@ import '../test/fake_store.dart';
void main() => test();
const String homeserver = "https://matrix.test.famedly.de";
const String testUserA = "@tick:test.famedly.de";
const String testPasswordA = "test";
const String testUserB = "@trick:test.famedly.de";
const String testPasswordB = "test";
const String testMessage = "Hello world";
const String testMessage2 = "Hello moon";
const String testMessage3 = "Hello sun";
const String testMessage4 = "Hello star";
const String testMessage5 = "Hello earth";
const String testMessage6 = "Hello mars";
const String homeserver = 'https://matrix.test.famedly.de';
const String testUserA = '@tick:test.famedly.de';
const String testPasswordA = 'test';
const String testUserB = '@trick:test.famedly.de';
const String testPasswordB = 'test';
const String testMessage = 'Hello world';
const String testMessage2 = 'Hello moon';
const String testMessage3 = 'Hello sun';
const String testMessage4 = 'Hello star';
const String testMessage5 = 'Hello earth';
const String testMessage6 = 'Hello mars';
void test() async {
print("++++ Login $testUserA ++++");
Client testClientA = Client("TestClient", debug: false);
testClientA.storeAPI = FakeStore(testClientA, Map<String, dynamic>());
print('++++ Login $testUserA ++++');
var testClientA = Client('TestClient', debug: false);
testClientA.storeAPI = FakeStore(testClientA, <String, dynamic>{});
await testClientA.checkServer(homeserver);
await testClientA.login(testUserA, testPasswordA);
assert(testClientA.encryptionEnabled);
print("++++ Login $testUserB ++++");
Client testClientB = Client("TestClient", debug: false);
testClientB.storeAPI = FakeStore(testClientB, Map<String, dynamic>());
print('++++ Login $testUserB ++++');
var testClientB = Client('TestClient', debug: false);
testClientB.storeAPI = FakeStore(testClientB, <String, dynamic>{});
await testClientB.checkServer(homeserver);
await testClientB.login(testUserB, testPasswordA);
assert(testClientB.encryptionEnabled);
print("++++ ($testUserA) Leave all rooms ++++");
print('++++ ($testUserA) Leave all rooms ++++');
while (testClientA.rooms.isNotEmpty) {
Room room = testClientA.rooms.first;
var room = testClientA.rooms.first;
if (room.canonicalAlias?.isNotEmpty ?? false) {
break;
}
@ -44,10 +44,10 @@ void test() async {
}
}
print("++++ ($testUserB) Leave all rooms ++++");
for (int i = 0; i < 3; i++) {
print('++++ ($testUserB) Leave all rooms ++++');
for (var i = 0; i < 3; i++) {
if (testClientB.rooms.isNotEmpty) {
Room room = testClientB.rooms.first;
var room = testClientB.rooms.first;
try {
await room.leave();
await room.forget();
@ -57,7 +57,7 @@ void test() async {
}
}
print("++++ Check if own olm device is verified by default ++++");
print('++++ Check if own olm device is verified by default ++++');
assert(testClientA.userDeviceKeys.containsKey(testUserA));
assert(testClientA.userDeviceKeys[testUserA].deviceKeys
.containsKey(testClientA.deviceID));
@ -73,27 +73,27 @@ void test() async {
assert(!testClientB
.userDeviceKeys[testUserB].deviceKeys[testClientB.deviceID].blocked);
print("++++ ($testUserA) Create room and invite $testUserB ++++");
print('++++ ($testUserA) Create room and invite $testUserB ++++');
await testClientA.createRoom(invite: [User(testUserB)]);
await Future.delayed(Duration(seconds: 1));
Room room = testClientA.rooms.first;
var room = testClientA.rooms.first;
assert(room != null);
final String roomId = room.id;
final roomId = room.id;
print("++++ ($testUserB) Join room ++++");
Room inviteRoom = testClientB.getRoomById(roomId);
print('++++ ($testUserB) Join room ++++');
var inviteRoom = testClientB.getRoomById(roomId);
await inviteRoom.join();
await Future.delayed(Duration(seconds: 1));
assert(inviteRoom.membership == Membership.join);
print("++++ ($testUserA) Enable encryption ++++");
print('++++ ($testUserA) Enable encryption ++++');
assert(room.encrypted == false);
await room.enableEncryption();
await Future.delayed(Duration(seconds: 5));
assert(room.encrypted == true);
assert(room.outboundGroupSession == null);
print("++++ ($testUserA) Check known olm devices ++++");
print('++++ ($testUserA) Check known olm devices ++++');
assert(testClientA.userDeviceKeys.containsKey(testUserB));
assert(testClientA.userDeviceKeys[testUserB].deviceKeys
.containsKey(testClientB.deviceID));
@ -111,7 +111,7 @@ void test() async {
await testClientA.userDeviceKeys[testUserB].deviceKeys[testClientB.deviceID]
.setVerified(true, testClientA);
print("++++ Check if own olm device is verified by default ++++");
print('++++ Check if own olm device is verified by default ++++');
assert(testClientA.userDeviceKeys.containsKey(testUserA));
assert(testClientA.userDeviceKeys[testUserA].deviceKeys
.containsKey(testClientA.deviceID));
@ -127,7 +127,7 @@ void test() async {
await room.sendTextEvent(testMessage);
await Future.delayed(Duration(seconds: 5));
assert(room.outboundGroupSession != null);
String currentSessionIdA = room.outboundGroupSession.session_id();
var currentSessionIdA = room.outboundGroupSession.session_id();
assert(room.sessionKeys.containsKey(room.outboundGroupSession.session_id()));
assert(testClientA.olmSessions[testClientB.identityKey].length == 1);
assert(testClientB.olmSessions[testClientA.identityKey].length == 1);
@ -172,9 +172,9 @@ void test() async {
print(
"++++ ($testUserA) Received decrypted message: '${room.lastMessage}' ++++");
print("++++ Login $testUserB in another client ++++");
Client testClientC = Client("TestClient", debug: false);
testClientC.storeAPI = FakeStore(testClientC, Map<String, dynamic>());
print('++++ Login $testUserB in another client ++++');
var testClientC = Client('TestClient', debug: false);
testClientC.storeAPI = FakeStore(testClientC, <String, dynamic>{});
await testClientC.checkServer(homeserver);
await testClientC.login(testUserB, testPasswordA);
await Future.delayed(Duration(seconds: 3));
@ -200,7 +200,7 @@ void test() async {
print(
"++++ ($testUserB) Received decrypted message: '${inviteRoom.lastMessage}' ++++");
print("++++ Logout $testUserB another client ++++");
print('++++ Logout $testUserB another client ++++');
await testClientC.logout();
testClientC = null;
await Future.delayed(Duration(seconds: 5));
@ -223,20 +223,20 @@ void test() async {
print(
"++++ ($testUserB) Received decrypted message: '${inviteRoom.lastMessage}' ++++");
print("++++ ($testUserA) Restore user ++++");
print('++++ ($testUserA) Restore user ++++');
FakeStore clientAStore = testClientA.storeAPI;
testClientA = null;
testClientA = Client("TestClient", debug: false);
testClientA = Client('TestClient', debug: false);
testClientA.storeAPI = FakeStore(testClientA, clientAStore.storeMap);
await Future.delayed(Duration(seconds: 3));
Room restoredRoom = testClientA.rooms.first;
var restoredRoom = testClientA.rooms.first;
assert(room != null);
assert(restoredRoom.id == room.id);
assert(restoredRoom.outboundGroupSession.session_id() ==
room.outboundGroupSession.session_id());
assert(restoredRoom.sessionKeys.length == 4);
assert(restoredRoom.sessionKeys.length == room.sessionKeys.length);
for (int i = 0; i < restoredRoom.sessionKeys.length; i++) {
for (var i = 0; i < restoredRoom.sessionKeys.length; i++) {
assert(restoredRoom.sessionKeys.keys.toList()[i] ==
room.sessionKeys.keys.toList()[i]);
}
@ -261,16 +261,16 @@ void test() async {
print(
"++++ ($testUserB) Received decrypted message: '${inviteRoom.lastMessage}' ++++");
print("++++ Logout $testUserA and $testUserB ++++");
print('++++ Logout $testUserA and $testUserB ++++');
await room.leave();
await room.forget();
await inviteRoom.leave();
await inviteRoom.forget();
await Future.delayed(Duration(seconds: 1));
await testClientA.jsonRequest(
type: HTTPType.POST, action: "/client/r0/logout/all");
type: HTTPType.POST, action: '/client/r0/logout/all');
await testClientB.jsonRequest(
type: HTTPType.POST, action: "/client/r0/logout/all");
type: HTTPType.POST, action: '/client/r0/logout/all');
testClientA = null;
testClientB = null;
return;