chore: merge latest dev

This commit is contained in:
groovinchip
2021-08-02 13:15:28 -04:00
176 changed files with 7089 additions and 489 deletions
@@ -0,0 +1,174 @@
import 'package:flutter_test/flutter_test.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
void main() {
test('Default translations should exist', () {
const translations = DefaultTranslations.instance;
expect(translations.launchUrlError, isNotNull);
expect(translations.loadingUsersError, isNotNull);
expect(translations.noUsersLabel, isNotNull);
expect(translations.retryLabel, isNotNull);
expect(translations.userLastOnlineText, isNotNull);
expect(translations.userOnlineText, isNotNull);
expect(translations.userOnlineText, isNotNull);
// no users
expect(translations.userTypingText([]), isNotNull);
// single user
expect(translations.userTypingText([User(id: 'test-id')]), isNotNull);
// multiple users
expect(
translations.userTypingText([
User(id: 'test-id-1'),
User(id: 'test-id-2'),
]),
isNotNull,
);
expect(translations.threadReplyLabel, isNotNull);
expect(translations.onlyVisibleToYouText, isNotNull);
expect(translations.threadReplyCountText(3), isNotNull);
expect(
translations.attachmentsUploadProgressText(remaining: 3, total: 10),
isNotNull,
);
expect(
translations.pinnedByUserText(
pinnedBy: User(id: 'pinned-by-user-id'),
currentUser: OwnUser(id: 'current-user-id'),
),
isNotNull,
);
expect(translations.emptyMessagesText, isNotNull);
expect(translations.genericErrorText, isNotNull);
expect(translations.loadingMessagesError, isNotNull);
expect(translations.resultCountText(3), isNotNull);
expect(translations.messageDeletedText, isNotNull);
expect(translations.messageDeletedLabel, isNotNull);
expect(translations.messageReactionsLabel, isNotNull);
expect(translations.emptyChatMessagesText, isNotNull);
expect(translations.threadSeparatorText(3), isNotNull);
expect(translations.connectedLabel, isNotNull);
expect(translations.disconnectedLabel, isNotNull);
expect(translations.reconnectingLabel, isNotNull);
expect(translations.alsoSendAsDirectMessageLabel, isNotNull);
expect(translations.addACommentOrSendLabel, isNotNull);
expect(translations.searchGifLabel, isNotNull);
expect(translations.writeAMessageLabel, isNotNull);
expect(translations.instantCommandsLabel, isNotNull);
expect(translations.fileTooLargeAfterCompressionError(33), isNotNull);
expect(translations.fileTooLargeError(33), isNotNull);
expect(translations.emojiMatchingQueryText('sahil'), isNotNull);
expect(translations.addAFileLabel, isNotNull);
expect(translations.photoFromCameraLabel, isNotNull);
expect(translations.uploadAFileLabel, isNotNull);
expect(translations.uploadAPhotoLabel, isNotNull);
expect(translations.uploadAVideoLabel, isNotNull);
expect(translations.videoFromCameraLabel, isNotNull);
expect(translations.okLabel, isNotNull);
expect(translations.somethingWentWrongError, isNotNull);
expect(translations.addMoreFilesLabel, isNotNull);
expect(translations.enablePhotoAndVideoAccessMessage, isNotNull);
expect(translations.allowGalleryAccessMessage, isNotNull);
expect(translations.flagMessageLabel, isNotNull);
expect(translations.flagMessageQuestion, isNotNull);
expect(translations.flagLabel, isNotNull);
expect(translations.cancelLabel, isNotNull);
expect(translations.flagMessageSuccessfulLabel, isNotNull);
expect(translations.flagMessageSuccessfulText, isNotNull);
expect(translations.deleteLabel, isNotNull);
expect(translations.deleteMessageLabel, isNotNull);
expect(translations.deleteMessageQuestion, isNotNull);
expect(translations.operationCouldNotBeCompletedText, isNotNull);
expect(translations.replyLabel, isNotNull);
// pinned
expect(translations.togglePinUnpinText(pinned: true), isNotNull);
// un-pinned
expect(translations.togglePinUnpinText(pinned: false), isNotNull);
// delete-failed
expect(
translations.toggleDeleteRetryDeleteMessageText(isDeleteFailed: true),
isNotNull,
);
// first-delete
expect(
translations.toggleDeleteRetryDeleteMessageText(isDeleteFailed: false),
isNotNull,
);
expect(translations.copyMessageLabel, isNotNull);
expect(translations.editMessageLabel, isNotNull);
// resend-failed
expect(
translations.toggleResendOrResendEditedMessage(isUpdateFailed: true),
isNotNull,
);
// first resend
expect(
translations.toggleResendOrResendEditedMessage(isUpdateFailed: false),
isNotNull,
);
expect(translations.photosLabel, isNotNull);
// today
expect(
translations.sentAtText(
date: DateTime.now(),
time: DateTime.now(),
),
isNotNull,
);
// yesterday
expect(
translations.sentAtText(
date: DateTime.now().subtract(const Duration(days: 1)),
time: DateTime.now(),
),
isNotNull,
);
// any other day
expect(
translations.sentAtText(
date: DateTime.now().subtract(const Duration(days: 3)),
time: DateTime.now(),
),
isNotNull,
);
expect(translations.todayLabel, isNotNull);
expect(translations.yesterdayLabel, isNotNull);
expect(translations.channelIsMutedText, isNotNull);
expect(translations.noTitleText, isNotNull);
expect(translations.letsStartChattingLabel, isNotNull);
expect(translations.sendingFirstMessageLabel, isNotNull);
expect(translations.startAChatLabel, isNotNull);
expect(translations.loadingChannelsError, isNotNull);
expect(translations.deleteConversationLabel, isNotNull);
expect(translations.deleteConversationQuestion, isNotNull);
expect(translations.streamChatLabel, isNotNull);
expect(translations.searchingForNetworkText, isNotNull);
expect(translations.offlineLabel, isNotNull);
expect(translations.tryAgainLabel, isNotNull);
// 1 member
expect(translations.membersCountText(1), isNotNull);
// 3 members
expect(translations.membersCountText(3), isNotNull);
// 1 member
expect(translations.watchersCountText(1), isNotNull);
// 3 members
expect(translations.watchersCountText(3), isNotNull);
expect(translations.viewInfoLabel, isNotNull);
expect(translations.leaveGroupLabel, isNotNull);
expect(translations.leaveLabel, isNotNull);
expect(translations.leaveConversationLabel, isNotNull);
expect(translations.leaveConversationQuestion, isNotNull);
expect(translations.showInChatLabel, isNotNull);
expect(translations.saveImageLabel, isNotNull);
expect(translations.saveVideoLabel, isNotNull);
expect(translations.uploadErrorLabel, isNotNull);
expect(translations.giphyLabel, isNotNull);
expect(translations.shuffleLabel, isNotNull);
expect(translations.sendLabel, isNotNull);
expect(translations.withText, isNotNull);
expect(translations.inText, isNotNull);
expect(translations.youText, isNotNull);
expect(translations.ofText, isNotNull);
expect(translations.fileText, isNotNull);
expect(translations.replyToMessageLabel, isNotNull);
});
}
@@ -717,7 +717,7 @@ void main() {
await tester.tap(find.text('Delete Message'));
await tester.pumpAndSettle();
expect(find.text('Delete message'), findsOneWidget);
expect(find.text('Delete Message'), findsOneWidget);
await tester.tap(find.text('DELETE'));
await tester.pumpAndSettle();
@@ -773,7 +773,7 @@ void main() {
await tester.tap(find.text('Delete Message'));
await tester.pumpAndSettle();
expect(find.text('Delete message'), findsOneWidget);
expect(find.text('Delete Message'), findsOneWidget);
await tester.tap(find.text('DELETE'));
await tester.pumpAndSettle();
@@ -8,10 +8,33 @@ import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
import 'simple_frame.dart';
void expectTextStrings(Iterable<Widget> widgets, List<String> strings) {
var currentString = 0;
for (final widget in widgets) {
if (widget is RichText) {
final span = widget.text as TextSpan;
final text = _extractTextFromTextSpan(span);
expect(text, equals(strings[currentString]));
currentString += 1;
}
}
}
String _extractTextFromTextSpan(TextSpan span) {
var text = span.text ?? '';
if (span.children != null) {
for (final child in span.children! as Iterable<TextSpan>) {
text += _extractTextFromTextSpan(child);
}
}
return text;
}
void main() {
testWidgets(
'it should show correct message text',
(WidgetTester tester) async {
final currentUser = OwnUser(id: 'user-id');
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
@@ -21,7 +44,9 @@ void main() {
final streamTheme = StreamChatThemeData.fromTheme(themeData);
when(() => client.state).thenReturn(clientState);
when(() => clientState.currentUser).thenReturn(OwnUser(id: 'user-id'));
when(() => clientState.currentUser).thenReturn(currentUser);
when(() => clientState.currentUserStream)
.thenAnswer((_) => Stream.value(currentUser));
when(() => channel.lastMessageAt).thenReturn(lastMessageAt);
when(() => channel.state).thenReturn(channelState);
when(() => channel.client).thenReturn(client);
@@ -54,9 +79,107 @@ void main() {
},
);
group('Message with i18n field', () {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
const messageTheme = MessageThemeData();
final currentUser = OwnUser(
id: 'sahil',
language: 'hi',
);
setUp(() {
when(() => client.state).thenReturn(clientState);
when(() => clientState.currentUser).thenReturn(currentUser);
when(() => clientState.currentUserStream)
.thenAnswer((_) => Stream.value(currentUser));
when(() => channel.state).thenReturn(channelState);
when(() => channel.client).thenReturn(client);
when(() => channel.isMuted).thenReturn(false);
when(() => channel.isMutedStream).thenAnswer((_) => Stream.value(false));
});
testWidgets(
'should show correct translated message text as per user language',
(WidgetTester tester) async {
final message = Message(
text: 'Hello',
i18n: const {
'en_text': 'Hello',
'hi_text': 'नमस्ते',
'language': 'en',
},
);
await tester.pumpWidget(
MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: MessageText(
message: message,
messageTheme: messageTheme,
),
),
),
),
),
);
expect(find.byType(MarkdownBody), findsOneWidget);
final widgets = tester.allWidgets;
expectTextStrings(widgets, <String>['नमस्ते']);
},
);
testWidgets(
'''should show default text if i18n does not contain translations as per user language''',
(WidgetTester tester) async {
final message = Message(
text: 'Hello',
i18n: const {
'en_text': 'Hello',
'fr_text': 'Bonjour',
'language': 'en',
},
);
await tester.pumpWidget(
MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: MessageText(
message: message,
messageTheme: messageTheme,
),
),
),
),
),
);
expect(find.byType(MarkdownBody), findsOneWidget);
final widgets = tester.allWidgets;
expectTextStrings(widgets, <String>['Hello']);
},
);
});
testGoldens(
'control test',
(WidgetTester tester) async {
final currentUser = OwnUser(id: 'user-id');
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
@@ -66,7 +189,9 @@ void main() {
final streamTheme = StreamChatThemeData.fromTheme(themeData);
when(() => client.state).thenReturn(clientState);
when(() => clientState.currentUser).thenReturn(OwnUser(id: 'user-id'));
when(() => clientState.currentUser).thenReturn(currentUser);
when(() => clientState.currentUserStream)
.thenAnswer((_) => Stream.value(currentUser));
when(() => channel.lastMessageAt).thenReturn(lastMessageAt);
when(() => channel.state).thenReturn(channelState);
when(() => channel.client).thenReturn(client);
@@ -90,14 +215,18 @@ cool.''';
await tester.pumpWidgetBuilder(
materialAppWrapper()(SimpleFrame(
child: StreamChannel(
channel: channel,
child: Scaffold(
body: MessageText(
message: Message(
text: messageText,
child: StreamChat(
client: client,
connectivityStream: Stream.value(ConnectivityResult.wifi),
child: StreamChannel(
channel: channel,
child: Scaffold(
body: MessageText(
message: Message(
text: messageText,
),
messageTheme: streamTheme.otherMessageTheme,
),
messageTheme: streamTheme.otherMessageTheme,
),
),
),