193 lines
5.7 KiB
Dart
193 lines
5.7 KiB
Dart
import 'package:collection/collection.dart';
|
|
import 'package:dio/dio.dart' show MultipartFile;
|
|
import 'package:stream_chat/src/client/channel.dart';
|
|
import 'package:stream_chat/src/core/models/attachment.dart';
|
|
import 'package:stream_chat/src/core/models/channel_state.dart';
|
|
import 'package:stream_chat/src/core/models/event.dart';
|
|
import 'package:stream_chat/src/core/models/message.dart';
|
|
import 'package:stream_chat/src/core/models/user.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
Matcher isSameMultipartFileAs(MultipartFile targetFile) =>
|
|
_IsSameMultipartFileAs(targetFile: targetFile);
|
|
|
|
class _IsSameMultipartFileAs extends Matcher {
|
|
const _IsSameMultipartFileAs({required this.targetFile});
|
|
|
|
final MultipartFile targetFile;
|
|
|
|
@override
|
|
Description describe(Description description) =>
|
|
description.add('is same multipartFile as $targetFile');
|
|
|
|
@override
|
|
bool matches(covariant MultipartFile file, Map matchState) =>
|
|
file.length == targetFile.length;
|
|
}
|
|
|
|
Matcher isSameEventAs(Event targetEvent) =>
|
|
_IsSameEventAs(targetEvent: targetEvent);
|
|
|
|
class _IsSameEventAs extends Matcher {
|
|
const _IsSameEventAs({required this.targetEvent});
|
|
|
|
final Event targetEvent;
|
|
|
|
@override
|
|
Description describe(Description description) =>
|
|
description.add('is same event as $targetEvent');
|
|
|
|
@override
|
|
bool matches(covariant Event event, Map matchState) =>
|
|
event.type == targetEvent.type;
|
|
}
|
|
|
|
Matcher isSameMessageAs(
|
|
Message targetMessage, {
|
|
bool matchText = false,
|
|
bool matchReactions = false,
|
|
bool matchSendingStatus = false,
|
|
bool matchAttachments = false,
|
|
bool matchAttachmentsUploadState = false,
|
|
}) =>
|
|
_IsSameMessageAs(
|
|
targetMessage: targetMessage,
|
|
matchText: matchText,
|
|
matchReactions: matchReactions,
|
|
matchSendingStatus: matchSendingStatus,
|
|
matchAttachments: matchAttachments,
|
|
matchAttachmentsUploadState: matchAttachmentsUploadState,
|
|
);
|
|
|
|
class _IsSameMessageAs extends Matcher {
|
|
const _IsSameMessageAs({
|
|
required this.targetMessage,
|
|
this.matchText = false,
|
|
this.matchReactions = false,
|
|
this.matchSendingStatus = false,
|
|
this.matchAttachments = false,
|
|
this.matchAttachmentsUploadState = false,
|
|
});
|
|
|
|
final Message targetMessage;
|
|
final bool matchText;
|
|
final bool matchReactions;
|
|
final bool matchSendingStatus;
|
|
final bool matchAttachments;
|
|
final bool matchAttachmentsUploadState;
|
|
|
|
@override
|
|
Description describe(Description description) =>
|
|
description.add('is same message as $targetMessage');
|
|
|
|
@override
|
|
bool matches(covariant Message message, Map matchState) {
|
|
var matches = message.id == targetMessage.id;
|
|
if (matchText) {
|
|
matches &= message.text == targetMessage.text;
|
|
}
|
|
if (matchSendingStatus) {
|
|
matches &= message.status == targetMessage.status;
|
|
}
|
|
if (matchReactions) {
|
|
matches &= const ListEquality().equals(
|
|
message.ownReactions
|
|
?.map((it) => '${it.type}-${it.messageId}')
|
|
.toList(),
|
|
targetMessage.ownReactions
|
|
?.map((it) => '${it.type}-${it.messageId}')
|
|
.toList());
|
|
matches &= const ListEquality().equals(
|
|
message.latestReactions
|
|
?.map((it) => '${it.type}-${it.messageId}')
|
|
.toList(),
|
|
targetMessage.latestReactions
|
|
?.map((it) => '${it.type}-${it.messageId}')
|
|
.toList());
|
|
}
|
|
if (matchAttachments) {
|
|
bool matchAttachments() {
|
|
final attachments = message.attachments;
|
|
final targetAttachments = targetMessage.attachments;
|
|
if (identical(attachments, targetAttachments)) return true;
|
|
final length = attachments.length;
|
|
if (length != targetAttachments.length) return false;
|
|
for (var i = 0; i < length; i++) {
|
|
if (!isSameAttachmentAs(
|
|
attachments[i],
|
|
matchUploadState: matchAttachmentsUploadState,
|
|
).matches(targetAttachments[i], matchState)) return false;
|
|
}
|
|
return true;
|
|
}
|
|
|
|
matches &= matchAttachments();
|
|
}
|
|
return matches;
|
|
}
|
|
}
|
|
|
|
Matcher isSameAttachmentAs(
|
|
Attachment targetAttachment, {
|
|
bool matchUploadState = false,
|
|
}) =>
|
|
_IsSameAttachmentAs(
|
|
targetAttachment: targetAttachment,
|
|
matchUploadState: matchUploadState,
|
|
);
|
|
|
|
class _IsSameAttachmentAs extends Matcher {
|
|
const _IsSameAttachmentAs({
|
|
required this.targetAttachment,
|
|
this.matchUploadState = false,
|
|
});
|
|
|
|
final Attachment targetAttachment;
|
|
final bool matchUploadState;
|
|
|
|
@override
|
|
Description describe(Description description) =>
|
|
description.add('is same attachment as $targetAttachment');
|
|
|
|
@override
|
|
bool matches(covariant Attachment attachment, Map matchState) {
|
|
var matches = attachment.id == targetAttachment.id;
|
|
if (matchUploadState) {
|
|
matches &= attachment.uploadState == targetAttachment.uploadState;
|
|
}
|
|
return matches;
|
|
}
|
|
}
|
|
|
|
Matcher isSameUserAs(User targetUser) => _IsSameUserAs(targetUser: targetUser);
|
|
|
|
class _IsSameUserAs extends Matcher {
|
|
const _IsSameUserAs({required this.targetUser});
|
|
|
|
final User targetUser;
|
|
|
|
@override
|
|
Description describe(Description description) =>
|
|
description.add('is same user as $targetUser');
|
|
|
|
@override
|
|
bool matches(covariant User user, Map matchState) => user.id == targetUser.id;
|
|
}
|
|
|
|
Matcher isCorrectChannelFor(ChannelState channelState) =>
|
|
_IsCorrectChannelFor(channelState: channelState);
|
|
|
|
class _IsCorrectChannelFor extends Matcher {
|
|
const _IsCorrectChannelFor({required this.channelState});
|
|
|
|
final ChannelState channelState;
|
|
|
|
@override
|
|
Description describe(Description description) =>
|
|
description.add('is correct channel for $channelState');
|
|
|
|
@override
|
|
bool matches(covariant Channel channel, Map matchState) =>
|
|
channel.cid == channelState.channel?.cid;
|
|
}
|