test: add tests for stream chat flutter (#335)

* feat: Added tests

* feat: Added header test

* feat: Added new tests

* fix

* feat: Added test, fmt

* feat: Added delete test

* added system and unread ind tests

* fix: analysis

* added new tests

* fix: analysis

* added tests

* add attachment actions modal tests

* fix analysis

* fix analysis

* add backbutton tests

* fix analysis

* increase timeout

* add channelheader tests

* add infotile tests

* add reactions modal and channel unread indicator tests

* add golden test for reaction bubble

* add dark tests

* add system message golden

* add deletd message golden

* add message action modal tests

* update goldens

* update workflow runner

* update goldens

* remove channel unread indicator in favor of unread indicator

* move file and media screen to sample app

* add channel image tesst

* add channel_list_header test

* add thread_header test

* bump up test threashold

* fix review

Co-authored-by: Salvatore Giordano <[email protected]>
This commit is contained in:
Deven Joshi
2021-04-08 17:43:08 +02:00
committed by GitHub
co-authored by Salvatore Giordano
parent 4946664220
commit a42b3de6f4
58 changed files with 4140 additions and 968 deletions
@@ -0,0 +1,510 @@
import 'dart:async';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/src/attachment_actions_modal.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
class MockAttachmentDownloader extends Mock {
ProgressCallback progressCallback;
Completer<String> completer = Completer();
Future<String> call(
Attachment attachment, {
ProgressCallback progressCallback,
}) {
this.progressCallback = progressCallback;
return completer.future;
}
}
void main() {
testWidgets(
'it should show all the actions',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidget(
MaterialApp(
theme: themeData,
home: StreamChat(
streamChatThemeData: streamTheme,
client: client,
child: AttachmentActionsModal(
message: Message(
text: 'test',
user: User(
id: 'user-id',
),
attachments: [
Attachment(
type: 'image',
title: 'text.jpg',
),
],
),
currentIndex: 0,
),
),
),
);
expect(find.text('Reply'), findsOneWidget);
expect(find.text('Show in Chat'), findsOneWidget);
expect(find.text('Save Image'), findsOneWidget);
expect(find.text('Delete'), findsOneWidget);
},
);
testWidgets(
'it should hide delete if it\'s not my message',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id2'));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidget(
MaterialApp(
theme: themeData,
home: StreamChat(
streamChatThemeData: streamTheme,
client: client,
child: AttachmentActionsModal(
message: Message(
text: 'test',
user: User(
id: 'user-id',
),
attachments: [
Attachment(
type: 'image',
title: 'text.jpg',
),
],
),
currentIndex: 0,
),
),
),
);
expect(find.text('Reply'), findsOneWidget);
expect(find.text('Show in Chat'), findsOneWidget);
expect(find.text('Save Image'), findsOneWidget);
expect(find.text('Delete'), findsNothing);
},
);
testWidgets(
'it should show save video for videos',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidget(
MaterialApp(
theme: themeData,
home: StreamChat(
streamChatThemeData: streamTheme,
client: client,
child: Container(
child: AttachmentActionsModal(
message: Message(
text: 'test',
user: User(
id: 'user-id',
),
attachments: [
Attachment(
type: 'video',
title: 'video.mp4',
),
],
),
currentIndex: 0,
),
),
),
),
);
expect(find.text('Save Video'), findsOneWidget);
},
);
testWidgets(
'tapping on reply should pop',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
final mockObserver = MockNavigatorObserver();
final message = Message(
text: 'test',
user: User(
id: 'user-id',
),
attachments: [
Attachment(
type: 'image',
title: 'image.jpg',
),
],
);
await tester.pumpWidget(
MaterialApp(
theme: themeData,
navigatorObservers: [mockObserver],
home: StreamChat(
streamChatThemeData: streamTheme,
client: client,
child: Container(
child: AttachmentActionsModal(
message: message,
currentIndex: 0,
),
),
),
),
);
await tester.tap(find.text('Reply'));
verify(mockObserver.didPop(any, any));
},
);
testWidgets(
'tapping on show in chat should call onShowMessage',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
final onShowMessage = MockVoidCallback();
await tester.pumpWidget(
MaterialApp(
theme: themeData,
home: StreamChat(
streamChatThemeData: streamTheme,
client: client,
child: Container(
child: AttachmentActionsModal(
onShowMessage: onShowMessage,
message: Message(
text: 'test',
user: User(
id: 'user-id',
),
attachments: [
Attachment(
type: 'image',
title: 'image.jpg',
),
]),
currentIndex: 0,
),
),
),
),
);
await tester.tap(find.text('Show in Chat'));
verify(onShowMessage.call()).called(1);
},
);
testWidgets(
'tapping on delete in chat should remove the attachment',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final mockChannel = MockChannel();
when(mockChannel.updateMessage(any)).thenAnswer((_) {
return;
});
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final message = Message(
text: 'test',
user: User(
id: 'user-id',
),
attachments: [
Attachment(
type: 'image',
title: 'image.jpg',
),
Attachment(
type: 'image',
title: 'image.jpg',
),
],
);
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
child: child,
);
},
home: StreamChannel(
showLoading: false,
channel: mockChannel,
child: AttachmentActionsModal(
message: message,
currentIndex: 0,
),
),
),
);
await tester.tap(find.text('Delete'));
verify(mockChannel.updateMessage(message.copyWith(
attachments: [
message.attachments[1],
],
))).called(1);
},
);
testWidgets(
'tapping on delete in chat should remove the attachment if there is text',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final mockChannel = MockChannel();
when(mockChannel.updateMessage(any)).thenAnswer((_) {
return;
});
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final message = Message(
text: 'test',
user: User(
id: 'user-id',
),
attachments: [
Attachment(
type: 'image',
title: 'image.jpg',
),
],
);
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
child: child,
);
},
home: StreamChannel(
showLoading: false,
channel: mockChannel,
child: AttachmentActionsModal(
message: message,
currentIndex: 0,
),
),
),
);
await tester.tap(find.text('Delete'));
verify(mockChannel.updateMessage(message.copyWith(
attachments: [],
))).called(1);
},
);
testWidgets(
'tapping on delete in chat should remove the message if that\'s the only attachment and there is no text',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final mockChannel = MockChannel();
when(mockChannel.deleteMessage(any)).thenAnswer((_) {
return;
});
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final message = Message(
user: User(
id: 'user-id',
),
attachments: [
Attachment(
type: 'image',
title: 'image.jpg',
),
],
);
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
child: child,
);
},
home: StreamChannel(
showLoading: false,
channel: mockChannel,
child: AttachmentActionsModal(
message: message,
currentIndex: 0,
),
),
),
);
await tester.tap(find.text('Delete'));
verify(mockChannel.deleteMessage(message)).called(1);
},
);
testWidgets(
'tapping on save in chat should call image downloader',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final imageDownloader = MockAttachmentDownloader();
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
child: child,
);
},
home: Container(
child: AttachmentActionsModal(
imageDownloader: imageDownloader,
message: Message(
text: 'test',
user: User(
id: 'user-id',
),
attachments: [
Attachment(
type: 'image',
title: 'image.jpg',
),
]),
currentIndex: 0,
),
),
),
);
await tester.tap(find.text('Save Image'));
imageDownloader.progressCallback(0, 100);
await tester.pump();
expect(find.text('0%'), findsOneWidget);
imageDownloader.progressCallback(50, 100);
await tester.pump();
expect(find.text('50%'), findsOneWidget);
imageDownloader.progressCallback(100, 100);
imageDownloader.completer.complete('path');
await tester.pump();
expect(find.byKey(Key('completedIcon')), findsOneWidget);
await tester.pumpAndSettle(Duration(milliseconds: 500));
},
);
testWidgets(
'tapping on save in chat should call file downloader',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final fileDownloader = MockAttachmentDownloader();
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
child: child,
);
},
home: Container(
child: AttachmentActionsModal(
fileDownloader: fileDownloader,
message: Message(
text: 'test',
user: User(
id: 'user-id',
),
attachments: [
Attachment(
type: 'video',
title: 'video.mp4',
),
]),
currentIndex: 0,
),
),
),
);
await tester.tap(find.text('Save Video'));
fileDownloader.progressCallback(0, 100);
await tester.pump();
expect(find.text('0%'), findsOneWidget);
fileDownloader.progressCallback(50, 100);
await tester.pump();
expect(find.text('50%'), findsOneWidget);
fileDownloader.progressCallback(100, 100);
fileDownloader.completer.complete('path');
await tester.pump();
expect(find.byKey(Key('completedIcon')), findsOneWidget);
await tester.pumpAndSettle(Duration(milliseconds: 500));
},
);
}
@@ -0,0 +1,50 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'it should show file details',
(WidgetTester tester) async {
final channel = MockChannel();
final channelState = MockChannelState();
when(channel.state).thenReturn(channelState);
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidget(
MaterialApp(
home: StreamChatTheme(
data: streamTheme,
child: StreamChannel(
channel: channel,
child: Container(
child: FileAttachment(
size: Size(
300.0,
300.0,
),
message: Message(),
attachment: Attachment(
type: 'file',
title: 'example.pdf',
extraData: {
'mime_type': 'pdf',
},
),
),
),
),
),
),
);
expect(find.text('example.pdf'), findsOneWidget);
},
);
}
@@ -0,0 +1,144 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/src/back_button.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'BackButton control test',
(WidgetTester tester) async {
final theme = ThemeData();
await tester.pumpWidget(
MaterialApp(
home: const Material(child: Text('Home')),
routes: <String, WidgetBuilder>{
'/next': (BuildContext context) {
return Material(
child: Center(
child: StreamChatTheme(
data: StreamChatThemeData.getDefaultTheme(theme),
child: StreamBackButton(),
),
),
);
},
},
),
);
// ignore: unawaited_futures
tester.state<NavigatorState>(find.byType(Navigator)).pushNamed('/next');
await tester.pumpAndSettle();
await tester.tap(find.byType(StreamBackButton));
await tester.pumpAndSettle();
expect(find.text('Home'), findsOneWidget);
},
);
testWidgets(
'it should not throw errors if cannot pop',
(WidgetTester tester) async {
final theme = ThemeData();
await tester.pumpWidget(
MaterialApp(
home: Material(
child: Center(
child: StreamChatTheme(
data: StreamChatThemeData.getDefaultTheme(theme),
child: StreamBackButton(),
),
),
),
),
);
await tester.pumpAndSettle();
await tester.tap(find.byType(StreamBackButton));
await tester.pumpAndSettle();
expect(find.byType(StreamBackButton), findsOneWidget);
},
);
testWidgets(
'BackButton onPressed overrides default pop behavior',
(WidgetTester tester) async {
final theme = ThemeData();
var customCallbackWasCalled = false;
await tester.pumpWidget(
MaterialApp(
home: const Material(child: Text('Home')),
routes: <String, WidgetBuilder>{
'/next': (BuildContext context) {
return Material(
child: Center(
child: StreamChatTheme(
data: StreamChatThemeData.getDefaultTheme(theme),
child: StreamBackButton(
onPressed: () => customCallbackWasCalled = true,
),
),
),
);
},
},
),
);
// ignore: unawaited_futures
tester.state<NavigatorState>(find.byType(Navigator)).pushNamed('/next');
await tester.pumpAndSettle();
expect(find.text('Home'), findsNothing); // Start off on the second page.
expect(
customCallbackWasCalled,
false,
); // customCallbackWasCalled should still be false.
await tester.tap(find.byType(StreamBackButton));
await tester.pumpAndSettle();
// We're still on the second page.
expect(find.text('Home'), findsNothing);
// But the custom callback is called.
expect(customCallbackWasCalled, true);
},
);
testWidgets(
'it should show unread count',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
await tester.pumpWidget(
MaterialApp(
home: Material(
child: Center(
child: StreamChat(
client: client,
child: StreamBackButton(
showUnreads: true,
),
),
),
),
),
);
expect(find.byType(UnreadIndicator), findsOneWidget);
},
);
}
@@ -0,0 +1,388 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/src/channel_info.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'it should show basic channel information',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.isMuted).thenReturn(false);
when(channel.isMutedStream).thenAnswer((i) => Stream.value(false));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(channelState.unreadCount).thenReturn(1);
when(channelState.unreadCountStream).thenAnswer((i) => Stream.value(1));
when(channelState.membersStream).thenAnswer((i) => Stream.value([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
)
]));
when(channelState.members).thenReturn([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
),
]);
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: ChannelHeader(),
),
),
),
));
expect(find.text('test'), findsOneWidget);
expect(find.byType(ChannelImage), findsOneWidget);
expect(find.byType(StreamBackButton), findsOneWidget);
expect(find.byType(ChannelInfo), findsOneWidget);
},
);
testWidgets(
'it should show the InfoTile message if disconnected',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.isMuted).thenReturn(false);
when(channel.isMutedStream).thenAnswer((i) => Stream.value(false));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(channelState.unreadCount).thenReturn(1);
when(channelState.unreadCountStream).thenAnswer((i) => Stream.value(1));
when(channelState.membersStream).thenAnswer((i) => Stream.value([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
)
]));
when(channelState.members).thenReturn([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
),
]);
when(client.wsConnectionStatusStream)
.thenAnswer((_) => Stream.value(ConnectionStatus.disconnected));
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: ChannelHeader(
showConnectionStateTile: true,
),
),
),
),
));
expect(tester.widget<InfoTile>(find.byType(InfoTile)).showMessage, true);
expect(tester.widget<InfoTile>(find.byType(InfoTile)).message,
'Disconnected');
},
);
testWidgets(
'it should show the InfoTile message if connecting',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.isMuted).thenReturn(false);
when(channel.isMutedStream).thenAnswer((i) => Stream.value(false));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(channelState.unreadCount).thenReturn(1);
when(channelState.unreadCountStream).thenAnswer((i) => Stream.value(1));
when(channelState.membersStream).thenAnswer((i) => Stream.value([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
)
]));
when(channelState.members).thenReturn([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
),
]);
when(client.wsConnectionStatusStream)
.thenAnswer((_) => Stream.value(ConnectionStatus.connecting));
when(channel.initialized).thenAnswer((_) => Future.value(true));
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
showLoading: false,
child: Scaffold(
body: ChannelHeader(
showConnectionStateTile: true,
),
),
),
),
));
await tester.pump();
expect(tester.widget<InfoTile>(find.byType(InfoTile)).showMessage, true);
expect(tester.widget<InfoTile>(find.byType(InfoTile)).message,
'Reconnecting...');
},
);
testWidgets(
'it should apply passed properties',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.isMuted).thenReturn(false);
when(channel.isMutedStream).thenAnswer((i) => Stream.value(false));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(channelState.unreadCount).thenReturn(1);
when(channelState.unreadCountStream).thenAnswer((i) => Stream.value(1));
when(channelState.membersStream).thenAnswer((i) => Stream.value([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
)
]));
when(channelState.members).thenReturn([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
),
]);
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: ChannelHeader(
leading: Text('leading'),
subtitle: Text('subtitle'),
actions: [
Text('action'),
],
title: Text('title'),
),
),
),
),
));
expect(find.text('test'), findsNothing);
expect(find.byType(StreamBackButton), findsNothing);
expect(find.byType(ChannelImage), findsNothing);
expect(find.byType(ChannelInfo), findsNothing);
expect(find.text('leading'), findsOneWidget);
expect(find.text('title'), findsOneWidget);
expect(find.text('subtitle'), findsOneWidget);
expect(find.text('action'), findsOneWidget);
},
);
testWidgets(
'showBackButton: false should hide the StreamBackButton and '
'showTypingIndicator: false should hide the typing indicator and '
'showConnectionStateTile: false should be passed to the infotile',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.isMuted).thenReturn(false);
when(channel.isMutedStream).thenAnswer((i) => Stream.value(false));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(channelState.unreadCount).thenReturn(1);
when(channelState.unreadCountStream).thenAnswer((i) => Stream.value(1));
when(channelState.membersStream).thenAnswer((i) => Stream.value([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
)
]));
when(channelState.members).thenReturn([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
),
]);
when(client.wsConnectionStatusStream)
.thenAnswer((_) => Stream.value(ConnectionStatus.disconnected));
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: ChannelHeader(
showTypingIndicator: false,
showBackButton: false,
showConnectionStateTile: false,
),
),
),
),
));
expect(find.byType(StreamBackButton), findsNothing);
expect(
tester
.widget<ChannelInfo>(find.byType(ChannelInfo))
.showTypingIndicator,
false);
expect(tester.widget<InfoTile>(find.byType(InfoTile)).showMessage, false);
},
);
testWidgets(
'should apply passed callbacks',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.isMuted).thenReturn(false);
when(channel.isMutedStream).thenAnswer((i) => Stream.value(false));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(channelState.unreadCount).thenReturn(1);
when(channelState.unreadCountStream).thenAnswer((i) => Stream.value(1));
when(channelState.membersStream).thenAnswer((i) => Stream.value([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
)
]));
when(channelState.members).thenReturn([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
),
]);
var backPressed = false;
var imageTapped = false;
var titleTapped = false;
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: ChannelHeader(
onBackPressed: () => backPressed = true,
onImageTap: () => imageTapped = true,
onTitleTap: () => titleTapped = true,
),
),
),
),
));
await tester.tap(find.byType(StreamBackButton));
await tester.tap(find.byType(ChannelImage));
await tester.tap(find.byType(ChannelName));
expect(backPressed, true);
expect(imageTapped, true);
expect(titleTapped, true);
},
);
}
@@ -0,0 +1,263 @@
import 'package:cached_network_image/cached_network_image.dart';
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/src/group_image.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'it should show the image in channel.extraData',
(tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
'image': 'imagetest',
}));
when(channel.extraData).thenReturn({
'name': 'test',
'image': 'imagetest',
});
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: ChannelImage(),
),
),
),
));
final image =
tester.widget<CachedNetworkImage>(find.byType(CachedNetworkImage));
expect(image.imageUrl, 'imagetest');
},
);
testWidgets(
'it should show the the other member image',
(tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(channelState.membersStream).thenAnswer((i) => Stream.value([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
),
Member(
userId: 'user-id2',
user: User(
id: 'user-id2',
extraData: {
'image': 'testimage',
},
),
)
]));
when(channelState.members).thenReturn([
Member(
userId: 'user-id2',
user: User(
id: 'user-id2',
extraData: {
'image': 'testimage',
},
),
),
Member(
userId: 'user-id',
user: User(id: 'user-id'),
)
]);
when(clientState.usersStream).thenAnswer((i) => Stream.value({
'user-id2': User(
id: 'user-id2',
extraData: {
'image': 'testimage',
},
),
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: ChannelImage(),
),
),
),
));
final image =
tester.widget<CachedNetworkImage>(find.byType(CachedNetworkImage));
expect(image.imageUrl, 'testimage');
},
);
testWidgets(
'it should use a groupimage if more than 2 members',
(tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(channelState.membersStream).thenAnswer((i) => Stream.value([
Member(
userId: 'user-id',
user: User(
id: 'user-id',
extraData: {
'image': 'testimage1',
},
),
),
Member(
userId: 'user-id2',
user: User(
id: 'user-id2',
extraData: {
'image': 'testimage2',
},
),
),
Member(
userId: 'user-id3',
user: User(
id: 'user-id3',
extraData: {
'image': 'testimage3',
},
),
),
]));
when(channelState.members).thenReturn([
Member(
userId: 'user-id',
user: User(
id: 'user-id',
extraData: {
'image': 'testimage1',
},
),
),
Member(
userId: 'user-id2',
user: User(
id: 'user-id2',
extraData: {
'image': 'testimage2',
},
),
),
Member(
userId: 'user-id3',
user: User(
id: 'user-id3',
extraData: {
'image': 'testimage3',
},
),
),
]);
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: ChannelImage(),
),
),
),
));
final image = tester.widget<GroupImage>(find.byType(GroupImage));
expect(image.images, [
'testimage2',
'testimage3',
]);
},
);
testWidgets(
'using select: true should show a selection border',
(tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
'image': 'imagetest',
}));
when(channel.extraData).thenReturn({
'name': 'test',
'image': 'imagetest',
});
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: ChannelImage(
selected: true,
),
),
),
),
));
expect(find.byKey(Key('selectedImage')), findsOneWidget);
},
);
}
@@ -0,0 +1,207 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'control test',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(client.wsConnectionStatusStream)
.thenAnswer((_) => Stream.value(ConnectionStatus.connected));
await tester.pumpWidget(
MaterialApp(
home: StreamChat(
client: client,
child: Scaffold(
body: ChannelListHeader(),
),
),
),
);
await tester.pumpAndSettle();
final userAvatar = tester.widget<UserAvatar>(find.byType(UserAvatar));
expect(userAvatar.user, clientState.user);
expect(find.byType(StreamNeumorphicButton), findsOneWidget);
expect(find.text('Stream Chat'), findsOneWidget);
},
);
testWidgets(
'it should show the InfoTile message if disconnected',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(client.wsConnectionStatusStream)
.thenAnswer((_) => Stream.value(ConnectionStatus.disconnected));
await tester.pumpWidget(
MaterialApp(
home: StreamChat(
client: client,
child: Scaffold(
body: ChannelListHeader(
showConnectionStateTile: true,
),
),
),
),
);
await tester.pumpAndSettle();
expect(find.text('Disconnected'), findsOneWidget);
},
);
testWidgets(
'it should show the InfoTile message if connecting',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(client.wsConnectionStatusStream)
.thenAnswer((_) => Stream.value(ConnectionStatus.connecting));
await tester.pumpWidget(
MaterialApp(
home: StreamChat(
client: client,
child: Scaffold(
body: ChannelListHeader(
showConnectionStateTile: true,
),
),
),
),
);
await tester.pump();
expect(find.text('Reconnecting...'), findsOneWidget);
},
);
testWidgets(
'it should apply passed properties',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(client.wsConnectionStatusStream)
.thenAnswer((_) => Stream.value(ConnectionStatus.connecting));
await tester.pumpWidget(
MaterialApp(
home: StreamChat(
client: client,
child: Scaffold(
body: ChannelListHeader(
titleBuilder: (context, status, client) {
return Text('TITLE');
},
subtitle: Text('SUBTITLE'),
leading: Text('LEADING'),
actions: [
Text('ACTION'),
],
client: client,
),
),
),
),
);
await tester.pump();
expect(find.text('TITLE'), findsOneWidget);
expect(find.text('SUBTITLE'), findsOneWidget);
expect(find.text('LEADING'), findsOneWidget);
expect(find.text('ACTION'), findsOneWidget);
},
);
testWidgets(
'it should apply prenavigationcallback',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(client.wsConnectionStatusStream)
.thenAnswer((_) => Stream.value(ConnectionStatus.connecting));
var tapped = false;
await tester.pumpWidget(
MaterialApp(
home: StreamChat(
client: client,
child: Scaffold(
body: ChannelListHeader(
preNavigationCallback: () {
tapped = true;
},
),
),
),
),
);
await tester.pump();
await tester.tap(find.byType(UserAvatar));
expect(tapped, true);
},
);
testWidgets(
'it should apply passed callbacks',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(client.wsConnectionStatusStream)
.thenAnswer((_) => Stream.value(ConnectionStatus.connecting));
var tapped = 0;
await tester.pumpWidget(
MaterialApp(
home: StreamChat(
client: client,
child: Scaffold(
body: ChannelListHeader(
onUserAvatarTap: (u) {
tapped++;
},
onNewChatButtonTap: () {
tapped++;
},
),
),
),
),
);
await tester.pump();
await tester.tap(find.byType(UserAvatar));
await tester.tap(find.byType(StreamNeumorphicButton));
expect(tapped, 2);
},
);
}
@@ -0,0 +1,73 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'it should show channel name',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.isMuted).thenReturn(false);
when(channel.isMutedStream).thenAnswer((i) => Stream.value(false));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(channelState.unreadCount).thenReturn(1);
when(channelState.unreadCountStream).thenAnswer((i) => Stream.value(1));
when(channelState.membersStream).thenAnswer((i) => Stream.value([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
)
]));
when(channelState.members).thenReturn([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
),
]);
when(channelState.messages).thenReturn([
Message(
text: 'hello',
user: User(id: 'other-user'),
)
]);
when(channelState.messagesStream).thenAnswer((i) => Stream.value([
Message(
text: 'hello',
user: User(id: 'other-user'),
)
]));
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: ChannelName(),
),
),
),
));
expect(find.text('test'), findsOneWidget);
},
);
}
@@ -15,6 +15,7 @@ void main() {
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(channel.cid).thenReturn('cid');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
@@ -28,6 +29,9 @@ void main() {
when(channel.extraData).thenReturn({
'name': 'test name',
});
when(clientState.channels).thenReturn({
channel.cid: channel,
});
when(channelState.unreadCount).thenReturn(1);
when(channelState.unreadCountStream).thenAnswer((i) => Stream.value(1));
when(channelState.membersStream).thenAnswer((i) => Stream.value([
@@ -0,0 +1,32 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'it should show basic channel information',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: Scaffold(
body: DateDivider(
dateTime: DateTime.now(),
),
),
),
));
expect(find.text('Today'), findsOneWidget);
},
);
}
@@ -0,0 +1,201 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:golden_toolkit/golden_toolkit.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'control test',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: Scaffold(
body: DeletedMessage(
messageTheme: MessageTheme(
createdAt: TextStyle(
color: Colors.black,
),
messageText: TextStyle(),
),
),
),
),
));
expect(find.text('Message deleted'), findsOneWidget);
},
);
testGoldens(
'control golden light',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.initialized).thenAnswer((_) => Future.value(true));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(clientState.totalUnreadCount).thenReturn(10);
when(clientState.totalUnreadCountStream)
.thenAnswer((i) => Stream.value(10));
final materialTheme = ThemeData.light();
final theme = StreamChatThemeData.fromTheme(materialTheme);
await tester.pumpWidgetBuilder(
materialAppWrapper(
theme: materialTheme,
)(
StreamChat(
streamChatThemeData: theme,
client: client,
child: StreamChannel(
showLoading: false,
channel: channel,
child: Center(
child: DeletedMessage(
messageTheme: theme.ownMessageTheme,
),
),
),
),
),
surfaceSize: Size.square(200),
);
await screenMatchesGolden(tester, 'deleted_message_light');
},
);
testGoldens(
'control golden dark',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.initialized).thenAnswer((_) => Future.value(true));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(clientState.totalUnreadCount).thenReturn(10);
when(clientState.totalUnreadCountStream)
.thenAnswer((i) => Stream.value(10));
final materialTheme = ThemeData.dark();
final theme = StreamChatThemeData.fromTheme(materialTheme);
await tester.pumpWidgetBuilder(
materialAppWrapper(
theme: materialTheme,
)(
StreamChat(
streamChatThemeData: theme,
client: client,
child: StreamChannel(
showLoading: false,
channel: channel,
child: Center(
child: DeletedMessage(
messageTheme: theme.ownMessageTheme,
),
),
),
),
),
surfaceSize: Size.square(200),
);
await screenMatchesGolden(tester, 'deleted_message_dark');
},
);
testGoldens(
'golden customization test',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.initialized).thenAnswer((_) => Future.value(true));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(clientState.totalUnreadCount).thenReturn(10);
when(clientState.totalUnreadCountStream)
.thenAnswer((i) => Stream.value(10));
final materialTheme = ThemeData.light();
final theme = StreamChatThemeData.fromTheme(materialTheme);
await tester.pumpWidgetBuilder(
materialAppWrapper(
theme: materialTheme,
)(
StreamChat(
streamChatThemeData: theme,
client: client,
child: StreamChannel(
showLoading: false,
channel: channel,
child: Center(
child: DeletedMessage(
messageTheme: theme.ownMessageTheme,
reverse: true,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(8),
),
),
),
),
),
),
surfaceSize: Size.square(200),
);
await screenMatchesGolden(tester, 'deleted_message_custom');
},
);
}
@@ -0,0 +1,91 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:photo_view/photo_view.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'it should show channel typing',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.isMuted).thenReturn(false);
when(channel.isMutedStream).thenAnswer((i) => Stream.value(false));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(channelState.membersStream).thenAnswer((i) => Stream.value([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
)
]));
when(channelState.members).thenReturn([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
),
]);
when(channelState.messages).thenReturn([
Message(
text: 'hello',
user: User(id: 'other-user'),
)
]);
when(channelState.messagesStream).thenAnswer((i) => Stream.value([
Message(
text: 'hello',
user: User(id: 'other-user'),
)
]));
when(channelState.typingEvents).thenAnswer((i) => [
User(id: 'other-user', extraData: {'name': 'demo'})
]);
when(channelState.typingEventsStream).thenAnswer((i) => Stream.value([
User(id: 'other-user', extraData: {'name': 'demo'}),
User(id: 'other-user', extraData: {'name': 'demo'}),
]));
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: FullScreenMedia(
mediaAttachments: [
Attachment(
type: 'image',
title: 'demo image',
imageUrl: '',
),
],
message: Message(
createdAt: DateTime.now(),
),
sentAt: DateTime.now(),
),
),
),
));
expect(find.byType(PhotoView), findsOneWidget);
expect(find.byType(StreamSvgIcon), findsNWidgets(4));
},
);
}
Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 410 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

@@ -0,0 +1,50 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'it should show channel typing',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.isMuted).thenReturn(false);
when(channel.isMutedStream).thenAnswer((i) => Stream.value(false));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: WillPopScope(
onWillPop: () async => false,
child: Scaffold(
body: ImageFooter(),
),
),
),
),
));
expect(find.byType(StreamSvgIcon), findsNWidgets(2));
},
);
}
@@ -0,0 +1,69 @@
import 'package:flutter/material.dart';
import 'package:flutter_portal/flutter_portal.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'control test',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: Scaffold(
body: Portal(
child: Container(
child: InfoTile(
showMessage: true,
message: 'message',
child: Text('test'),
),
),
),
),
),
));
expect(find.text('message'), findsOneWidget);
},
);
testWidgets(
'it should hide when passing showMessage: false',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: Scaffold(
body: Portal(
child: Container(
child: InfoTile(
showMessage: false,
message: 'message',
child: Text('test'),
),
),
),
),
),
));
expect(find.text('message'), findsNothing);
},
);
}
@@ -38,16 +38,17 @@ void main() {
),
),
);
await tester.pump();
await tester.pumpAndSettle();
await tester.pump(Duration(milliseconds: 1000));
expect(find.byKey(Key('MessageWidget')), findsOneWidget);
expect(find.text('Thread Reply'), findsOneWidget);
expect(find.text('Reply'), findsOneWidget);
expect(find.text('Edit Message'), findsOneWidget);
expect(find.text('Delete Message'), findsOneWidget);
expect(find.text('Copy Message'), findsOneWidget);
},
);
testWidgets(
'it should show some actions',
(WidgetTester tester) async {
@@ -84,9 +85,8 @@ void main() {
),
),
);
await tester.pump();
await tester.pumpAndSettle();
await tester.pump(Duration(milliseconds: 1000));
expect(find.byKey(Key('MessageWidget')), findsOneWidget);
expect(find.text('Reply'), findsNothing);
expect(find.text('Thread reply'), findsNothing);
@@ -95,4 +95,697 @@ void main() {
expect(find.text('Copy message'), findsNothing);
},
);
testWidgets(
'it should show custom actions',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
var tapped = false;
await tester.pumpWidget(
MaterialApp(
theme: themeData,
home: StreamChat(
streamChatThemeData: streamTheme,
client: client,
child: Container(
child: MessageActionsModal(
message: Message(
text: 'test',
user: User(
id: 'user-id',
),
),
messageTheme: streamTheme.ownMessageTheme,
customActions: [
MessageAction(
leading: Icon(Icons.check),
title: Text('title'),
onTap: (m) {
tapped = true;
},
),
],
),
),
),
),
);
await tester.pumpAndSettle();
expect(find.byIcon(Icons.check), findsOneWidget);
expect(find.text('title'), findsOneWidget);
await tester.tap(find.text('title'));
expect(tapped, true);
},
);
testWidgets(
'tapping on reply should call the callback',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
var tapped = false;
await tester.pumpWidget(
MaterialApp(
theme: themeData,
home: StreamChat(
streamChatThemeData: streamTheme,
client: client,
child: Container(
child: MessageActionsModal(
onReplyTap: (m) {
return tapped = true;
},
message: Message(
text: 'test',
user: User(
id: 'user-id',
),
),
messageTheme: streamTheme.ownMessageTheme,
),
),
),
),
);
await tester.pumpAndSettle();
await tester.tap(find.text('Reply'));
expect(tapped, true);
},
);
testWidgets(
'tapping on thread reply should call the callback',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
var tapped = false;
await tester.pumpWidget(
MaterialApp(
theme: themeData,
home: StreamChat(
streamChatThemeData: streamTheme,
client: client,
child: Container(
child: MessageActionsModal(
onThreadReplyTap: (m) {
return tapped = true;
},
message: Message(
text: 'test',
user: User(
id: 'user-id',
),
),
messageTheme: streamTheme.ownMessageTheme,
),
),
),
),
);
await tester.pumpAndSettle();
await tester.tap(find.text('Thread Reply'));
expect(tapped, true);
},
);
testWidgets(
'tapping on edit should show the edit bottom sheet',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.initialized).thenAnswer((_) => Future.value(true));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
streamChatThemeData: streamTheme,
child: child,
);
},
theme: themeData,
home: StreamChannel(
showLoading: false,
channel: channel,
child: Container(
child: MessageActionsModal(
message: Message(
text: 'test',
user: User(
id: 'user-id',
),
),
messageTheme: streamTheme.ownMessageTheme,
),
),
),
),
);
await tester.pumpAndSettle();
await tester.tap(find.text('Edit Message'));
await tester.pumpAndSettle();
expect(find.byType(MessageInput), findsOneWidget);
},
);
testWidgets(
'tapping on edit should show use the custom builder',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.initialized).thenAnswer((_) => Future.value(true));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
streamChatThemeData: streamTheme,
child: child,
);
},
theme: themeData,
home: StreamChannel(
showLoading: false,
channel: channel,
child: Container(
child: MessageActionsModal(
editMessageInputBuilder: (context, m) {
return Text('test');
},
message: Message(
text: 'test',
user: User(
id: 'user-id',
),
),
messageTheme: streamTheme.ownMessageTheme,
),
),
),
),
);
await tester.pumpAndSettle();
await tester.tap(find.text('Edit Message'));
await tester.pumpAndSettle();
expect(find.text('test'), findsOneWidget);
},
);
testWidgets(
'tapping on copy should use the callback',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.initialized).thenAnswer((_) => Future.value(true));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
var tapped = false;
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
streamChatThemeData: streamTheme,
child: child,
);
},
theme: themeData,
home: StreamChannel(
showLoading: false,
channel: channel,
child: Container(
child: MessageActionsModal(
onCopyTap: (m) => tapped = true,
message: Message(
text: 'test',
user: User(
id: 'user-id',
),
),
messageTheme: streamTheme.ownMessageTheme,
),
),
),
),
);
await tester.pumpAndSettle();
await tester.tap(find.text('Copy Message'));
expect(tapped, true);
},
);
testWidgets(
'tapping on resend should call send message',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.initialized).thenAnswer((_) => Future.value(true));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
streamChatThemeData: streamTheme,
child: child,
);
},
theme: themeData,
home: StreamChannel(
showLoading: false,
channel: channel,
child: Container(
child: MessageActionsModal(
message: Message(
status: MessageSendingStatus.failed,
text: 'test',
user: User(
id: 'user-id',
),
),
messageTheme: streamTheme.ownMessageTheme,
),
),
),
),
);
await tester.pumpAndSettle();
await tester.tap(find.text('Resend'));
verify(channel.sendMessage(any)).called(1);
},
);
testWidgets(
'tapping on resend should call update message if editing the message',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.initialized).thenAnswer((_) => Future.value(true));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
streamChatThemeData: streamTheme,
child: child,
);
},
theme: themeData,
home: StreamChannel(
showLoading: false,
channel: channel,
child: Container(
child: MessageActionsModal(
message: Message(
status: MessageSendingStatus.failed_update,
text: 'test',
user: User(
id: 'user-id',
),
),
messageTheme: streamTheme.ownMessageTheme,
),
),
),
),
);
await tester.pumpAndSettle();
await tester.tap(find.text('Resend Edited Message'));
verify(channel.updateMessage(any)).called(1);
},
);
testWidgets(
'tapping on flag message should show the dialog',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.initialized).thenAnswer((_) => Future.value(true));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
streamChatThemeData: streamTheme,
child: child,
);
},
theme: themeData,
home: StreamChannel(
showLoading: false,
channel: channel,
child: Container(
child: MessageActionsModal(
message: Message(
id: 'testid',
text: 'test',
user: User(
id: 'user-id',
),
),
messageTheme: streamTheme.ownMessageTheme,
),
),
),
),
);
await tester.pumpAndSettle();
await tester.tap(find.text('Flag Message'));
await tester.pumpAndSettle();
expect(find.text('Flag Message'), findsNWidgets(2));
await tester.tap(find.text('FLAG'));
await tester.pumpAndSettle();
verify(client.flagMessage('testid')).called(1);
},
);
testWidgets(
'if flagging a message throws an error the error dialog should appear',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.initialized).thenAnswer((_) => Future.value(true));
when(client.flagMessage(any)).thenThrow(ApiError(
'{}',
500,
));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
streamChatThemeData: streamTheme,
child: child,
);
},
theme: themeData,
home: StreamChannel(
showLoading: false,
channel: channel,
child: Container(
child: MessageActionsModal(
message: Message(
id: 'testid',
text: 'test',
user: User(
id: 'user-id',
),
),
messageTheme: streamTheme.ownMessageTheme,
),
),
),
),
);
await tester.pumpAndSettle();
await tester.tap(find.text('Flag Message'));
await tester.pumpAndSettle();
expect(find.text('Flag Message'), findsNWidgets(2));
await tester.tap(find.text('FLAG'));
await tester.pumpAndSettle();
expect(find.text('Something went wrong'), findsOneWidget);
},
);
testWidgets(
'if flagging an already flagged message no error should appear',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.initialized).thenAnswer((_) => Future.value(true));
when(client.flagMessage(any)).thenThrow(ApiError(
'{"code":4}',
400,
));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
streamChatThemeData: streamTheme,
child: child,
);
},
theme: themeData,
home: StreamChannel(
showLoading: false,
channel: channel,
child: Container(
child: MessageActionsModal(
message: Message(
id: 'testid',
text: 'test',
user: User(
id: 'user-id',
),
),
messageTheme: streamTheme.ownMessageTheme,
),
),
),
),
);
await tester.pumpAndSettle();
await tester.tap(find.text('Flag Message'));
await tester.pumpAndSettle();
expect(find.text('Flag Message'), findsNWidgets(2));
await tester.tap(find.text('FLAG'));
await tester.pumpAndSettle();
expect(find.text('Message flagged'), findsOneWidget);
},
);
testWidgets(
'tapping on delete message should call client.delete',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.initialized).thenAnswer((_) => Future.value(true));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
streamChatThemeData: streamTheme,
child: child,
);
},
theme: themeData,
home: StreamChannel(
showLoading: false,
channel: channel,
child: Container(
child: MessageActionsModal(
message: Message(
id: 'testid',
text: 'test',
user: User(
id: 'user-id',
),
),
messageTheme: streamTheme.ownMessageTheme,
),
),
),
),
);
await tester.pumpAndSettle();
await tester.tap(find.text('Delete Message'));
await tester.pumpAndSettle();
expect(find.text('Delete message'), findsOneWidget);
await tester.tap(find.text('DELETE'));
await tester.pumpAndSettle();
verify(channel.deleteMessage(any)).called(1);
},
);
testWidgets(
'tapping on delete message should call client.delete',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.initialized).thenAnswer((_) => Future.value(true));
when(channel.deleteMessage(any)).thenThrow(ApiError(
'{}',
500,
));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidget(
MaterialApp(
builder: (context, child) {
return StreamChat(
client: client,
streamChatThemeData: streamTheme,
child: child,
);
},
theme: themeData,
home: StreamChannel(
showLoading: false,
channel: channel,
child: Container(
child: MessageActionsModal(
message: Message(
id: 'testid',
text: 'test',
user: User(
id: 'user-id',
),
),
messageTheme: streamTheme.ownMessageTheme,
),
),
),
),
);
await tester.pumpAndSettle();
await tester.tap(find.text('Delete Message'));
await tester.pumpAndSettle();
expect(find.text('Delete message'), findsOneWidget);
await tester.tap(find.text('DELETE'));
await tester.pumpAndSettle();
expect(find.text('Something went wrong'), findsOneWidget);
},
);
}
@@ -0,0 +1,81 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'checks message input features',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.isMuted).thenReturn(false);
when(channel.isMutedStream).thenAnswer((i) => Stream.value(false));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(channelState.membersStream).thenAnswer((i) => Stream.value([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
)
]));
when(channelState.members).thenReturn([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
),
]);
when(channelState.messages).thenReturn([
Message(
text: 'hello',
user: User(id: 'other-user'),
)
]);
when(channelState.messagesStream).thenAnswer((i) => Stream.value([
Message(
text: 'hello',
user: User(id: 'other-user'),
)
]));
when(channelState.typingEvents).thenAnswer((i) => [
User(id: 'other-user', extraData: {'name': 'demo'})
]);
when(channelState.typingEventsStream).thenAnswer((i) => Stream.value([
User(id: 'other-user', extraData: {'name': 'demo'}),
User(id: 'other-user', extraData: {'name': 'demo'}),
]));
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: MessageInput(),
),
),
),
));
expect(find.byType(TextField), findsOneWidget);
expect(find.byType(StreamSvgIcon), findsNWidgets(8));
expect(find.byKey(Key('messageInputText')), findsOneWidget);
},
);
}
@@ -1,102 +0,0 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/src/message_reactions_modal.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'it should show one thumbs from the picker',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final themeData = ThemeData();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidget(
MaterialApp(
theme: themeData,
home: StreamChat(
client: client,
streamChatThemeData: streamTheme,
child: MessageReactionsModal(
message: Message(
id: 'test',
text: 'test message',
user: User(
id: 'test-user',
),
),
messageTheme: streamTheme.ownMessageTheme,
),
),
),
);
await tester.pump(Duration(milliseconds: 1000));
expect(find.byKey(Key('MessageWidget')), findsOneWidget);
expect(find.byKey(Key('StreamSvgIcon-Icon_thumbs_up_reaction.svg')),
findsOneWidget);
},
);
testWidgets(
'it should show two reactions',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
final testUserId = 'test user';
await tester.pumpWidget(
MaterialApp(
theme: themeData,
home: StreamChat(
streamChatThemeData: streamTheme,
client: client,
child: MessageReactionsModal(
message: Message(
text: 'test message',
user: User(
id: 'test-user',
),
latestReactions: [
Reaction(
type: 'like',
user: User(id: testUserId),
),
Reaction(
type: 'love',
user: User(id: testUserId),
),
],
),
messageTheme: streamTheme.ownMessageTheme,
),
),
),
);
await tester.pump();
await tester.pump(Duration(milliseconds: 1000));
expect(find.byKey(Key('MessageWidget')), findsOneWidget);
expect(find.byKey(Key('StreamSvgIcon-Icon_thumbs_up_reaction.svg')),
findsNWidgets(2));
expect(find.byKey(Key('StreamSvgIcon-Icon_love_reaction.svg')),
findsNWidgets(2));
expect(find.text(testUserId.split(' ')[0]), findsNWidgets(2));
},
);
}
@@ -0,0 +1,148 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/src/message_reactions_modal.dart';
import 'package:stream_chat_flutter/src/reaction_bubble.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'control test',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final themeData = ThemeData();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
final message = Message(
id: 'test',
text: 'test message',
user: User(
id: 'test-user',
),
);
await tester.pumpWidget(
MaterialApp(
theme: themeData,
home: StreamChat(
client: client,
streamChatThemeData: streamTheme,
child: MessageReactionsModal(
message: message,
messageTheme: streamTheme.ownMessageTheme,
),
),
),
);
await tester.pump(Duration(milliseconds: 1000));
expect(find.byType(MessageWidget), findsOneWidget);
final messageWidget =
tester.widget<MessageWidget>(find.byType(MessageWidget));
expect(messageWidget.message, message);
expect(messageWidget.messageTheme, streamTheme.ownMessageTheme);
expect(messageWidget.attachmentBorderRadiusGeometry, null);
expect(messageWidget.showUserAvatar, DisplayWidget.show);
expect(messageWidget.reverse, false);
expect(messageWidget.attachmentShape, null);
expect(messageWidget.shape, null);
expect(messageWidget.onUserAvatarTap, null);
expect(messageWidget.showReactions, false);
expect(messageWidget.showUsername, false);
expect(messageWidget.showThreadReplyIndicator, false);
expect(messageWidget.showTimestamp, false);
expect(messageWidget.translateUserAvatar, false);
expect(messageWidget.showSendingIndicator, false);
expect(find.byType(ReactionBubble), findsNothing);
//only one avatar (the message one)
expect(find.byType(UserAvatar), findsOneWidget);
},
);
testWidgets(
'it should apply passed parameters',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final themeData = ThemeData();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
final message = Message(
id: 'test',
text: 'test message',
user: User(
id: 'test-user',
),
latestReactions: [
Reaction(
messageId: 'test',
user: User(id: 'testid'),
),
],
);
final onUserAvatarTap = (u) => print('ok');
await tester.pumpWidget(
MaterialApp(
theme: themeData,
home: StreamChat(
client: client,
streamChatThemeData: streamTheme,
child: MessageReactionsModal(
message: message,
messageTheme: streamTheme.ownMessageTheme,
showUserAvatar: DisplayWidget.gone,
reverse: true,
attachmentBorderRadiusGeometry: BorderRadius.circular(1),
attachmentShape: RoundedRectangleBorder(),
showReactions: false,
messageShape: RoundedRectangleBorder(),
onUserAvatarTap: onUserAvatarTap,
),
),
),
);
await tester.pump(Duration(milliseconds: 1000));
expect(find.byType(MessageWidget), findsOneWidget);
final messageWidget =
tester.widget<MessageWidget>(find.byType(MessageWidget));
expect(messageWidget.message, message);
expect(messageWidget.messageTheme, streamTheme.ownMessageTheme);
expect(messageWidget.attachmentBorderRadiusGeometry,
BorderRadius.circular(1));
expect(messageWidget.showUserAvatar, DisplayWidget.gone);
expect(messageWidget.reverse, true);
expect(messageWidget.showReactions, false);
expect(messageWidget.attachmentShape, RoundedRectangleBorder());
expect(messageWidget.shape, RoundedRectangleBorder());
expect(messageWidget.showReactions, false);
expect(messageWidget.showUsername, false);
expect(messageWidget.showThreadReplyIndicator, false);
expect(messageWidget.showTimestamp, false);
expect(messageWidget.translateUserAvatar, false);
expect(messageWidget.showSendingIndicator, false);
final userAvatar = tester.widget<UserAvatar>(find.byType(UserAvatar));
expect(userAvatar.onTap, onUserAvatarTap);
expect(find.byType(ReactionBubble), findsOneWidget);
expect(find.byType(UserAvatar), findsOneWidget);
},
);
}
@@ -0,0 +1,54 @@
import 'package:flutter/material.dart';
import 'package:flutter_markdown/flutter_markdown.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'it should show correct message text',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
final themeData = ThemeData();
final streamTheme = StreamChatThemeData.getDefaultTheme(themeData);
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.isMuted).thenReturn(false);
when(channel.isMutedStream).thenAnswer((i) => Stream.value(false));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: MessageText(
message: Message(
text: 'demo',
),
messageTheme: streamTheme.otherMessageTheme),
),
),
),
));
expect(find.byType(MarkdownBody), findsOneWidget);
},
);
}
@@ -1,3 +1,4 @@
import 'package:flutter/material.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter_core/stream_chat_flutter_core.dart';
@@ -8,3 +9,9 @@ class MockClientState extends Mock implements ClientState {}
class MockChannel extends Mock implements Channel {}
class MockChannelState extends Mock implements ChannelClientState {}
class MockNavigatorObserver extends Mock implements NavigatorObserver {}
class MockVoidCallback extends Mock {
void call();
}
@@ -1,18 +1,20 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:golden_toolkit/golden_toolkit.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/src/reaction_bubble.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
import 'simple_frame.dart';
void main() {
testWidgets(
testGoldens(
'it should show no reactions',
(WidgetTester tester) async {
await tester.pumpWidget(
MaterialApp(
home: StreamChatTheme(
await tester.pumpWidgetBuilder(
SimpleFrame(
child: StreamChatTheme(
data: StreamChatThemeData(),
child: Container(
child: ReactionBubble(
@@ -24,15 +26,173 @@ void main() {
),
),
),
surfaceSize: Size(100, 100),
);
expect(find.byKey(Key('StreamSvgIcon-Icon_thumbs_up_reaction.svg')),
findsNothing);
await screenMatchesGolden(tester, 'reaction_bubble_0');
},
);
testWidgets(
'it should show a like',
testGoldens(
'it should show a like - light theme',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final themeData = ThemeData.light();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
final theme = StreamChatThemeData.getDefaultTheme(themeData);
await tester.pumpWidgetBuilder(
StreamChat(
client: client,
streamChatThemeData: theme,
child: Container(
child: ReactionBubble(
reactions: [
Reaction(
type: 'like',
user: User(id: 'test'),
),
],
borderColor: theme.ownMessageTheme.reactionsBorderColor,
backgroundColor: theme.ownMessageTheme.reactionsBackgroundColor,
maskColor: theme.ownMessageTheme.reactionsMaskColor,
),
),
),
surfaceSize: Size(100, 100),
);
await screenMatchesGolden(tester, 'reaction_bubble_like_light');
},
);
testGoldens(
'it should show a like - dark theme',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final themeData = ThemeData.dark();
final theme = StreamChatThemeData.getDefaultTheme(themeData);
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
await tester.pumpWidgetBuilder(
StreamChat(
client: client,
streamChatThemeData: StreamChatThemeData.getDefaultTheme(themeData),
child: Container(
color: Colors.black,
child: ReactionBubble(
reactions: [
Reaction(
type: 'like',
user: User(id: 'test'),
),
],
borderColor: theme.ownMessageTheme.reactionsBorderColor,
backgroundColor: theme.ownMessageTheme.reactionsBackgroundColor,
maskColor: theme.ownMessageTheme.reactionsMaskColor,
),
),
),
surfaceSize: Size(100, 100),
);
await screenMatchesGolden(tester, 'reaction_bubble_like_dark');
},
);
testGoldens(
'it should show three reactions - light theme',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final themeData = ThemeData.light();
final theme = StreamChatThemeData.getDefaultTheme(themeData);
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
await tester.pumpWidgetBuilder(
StreamChat(
client: client,
streamChatThemeData: StreamChatThemeData.getDefaultTheme(themeData),
child: Container(
color: Colors.black,
child: ReactionBubble(
reactions: [
Reaction(
type: 'like',
user: User(id: 'test'),
),
Reaction(
type: 'like',
user: User(id: 'user-id'),
),
Reaction(
type: 'like',
user: User(id: 'test'),
),
],
borderColor: theme.ownMessageTheme.reactionsBorderColor,
backgroundColor: theme.ownMessageTheme.reactionsBackgroundColor,
maskColor: theme.ownMessageTheme.reactionsMaskColor,
),
),
),
surfaceSize: Size(140, 140),
);
await screenMatchesGolden(tester, 'reaction_bubble_3_light');
},
);
testGoldens(
'it should show three reactions - dark theme',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final themeData = ThemeData.dark();
final theme = StreamChatThemeData.getDefaultTheme(themeData);
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
await tester.pumpWidgetBuilder(
StreamChat(
client: client,
streamChatThemeData: StreamChatThemeData.getDefaultTheme(themeData),
child: Container(
color: Colors.black,
child: ReactionBubble(
reactions: [
Reaction(
type: 'like',
user: User(id: 'test'),
),
Reaction(
type: 'like',
user: User(id: 'user-id'),
),
Reaction(
type: 'like',
user: User(id: 'test'),
),
],
borderColor: theme.ownMessageTheme.reactionsBorderColor,
backgroundColor: theme.ownMessageTheme.reactionsBackgroundColor,
maskColor: theme.ownMessageTheme.reactionsMaskColor,
),
),
),
surfaceSize: Size(140, 140),
);
await screenMatchesGolden(tester, 'reaction_bubble_3_dark');
},
);
testGoldens(
'it should show two reactions with customized ui',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
@@ -41,74 +201,40 @@ void main() {
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
await tester.pumpWidget(
MaterialApp(
theme: themeData,
home: StreamChat(
client: client,
streamChatThemeData: StreamChatThemeData.getDefaultTheme(themeData),
child: Container(
child: ReactionBubble(
reactions: [
Reaction(
type: 'like',
user: User(id: 'test'),
),
],
borderColor: Colors.black,
backgroundColor: Colors.white,
maskColor: Colors.white,
),
await tester.pumpWidgetBuilder(
StreamChat(
client: client,
streamChatThemeData: StreamChatThemeData.getDefaultTheme(themeData),
child: Container(
child: ReactionBubble(
reactions: [
Reaction(
type: 'like',
user: User(id: 'test'),
),
Reaction(
type: 'love',
user: User(id: 'user-id'),
),
Reaction(
type: 'unknown',
user: User(id: 'test'),
),
],
borderColor: Colors.red,
backgroundColor: Colors.blue,
maskColor: Colors.green,
highlightOwnReactions: true,
reverse: true,
flipTail: true,
tailCirclesSpacing: 4,
),
),
),
surfaceSize: Size(200, 200),
);
expect(find.byKey(Key('StreamSvgIcon-Icon_thumbs_up_reaction.svg')),
findsOneWidget);
},
);
testWidgets(
'it should show two reactions',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final themeData = ThemeData();
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
await tester.pumpWidget(
MaterialApp(
theme: themeData,
home: StreamChat(
client: client,
streamChatThemeData: StreamChatThemeData.getDefaultTheme(themeData),
child: Container(
child: ReactionBubble(
reactions: [
Reaction(
type: 'like',
user: User(id: 'test'),
),
Reaction(
type: 'love',
user: User(id: 'test'),
),
],
borderColor: Colors.black,
backgroundColor: Colors.white,
maskColor: Colors.white,
),
),
),
),
);
expect(find.byKey(Key('StreamSvgIcon-Icon_thumbs_up_reaction.svg')),
findsOneWidget);
expect(find.byKey(Key('StreamSvgIcon-Icon_love_reaction.svg')),
findsOneWidget);
await screenMatchesGolden(tester, 'reaction_bubble_2');
},
);
}
@@ -0,0 +1,19 @@
import 'package:flutter/material.dart';
class SimpleFrame extends StatelessWidget {
final Widget child;
const SimpleFrame({Key key, @required this.child}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
padding: const EdgeInsets.all(4),
decoration: BoxDecoration(
color: const Color(0xFFFFFFFF),
border: Border.all(color: const Color(0xFF9E9E9E)),
),
child: child,
);
}
}
@@ -0,0 +1,164 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:golden_toolkit/golden_toolkit.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'it should show total unread count',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(clientState.totalUnreadCount).thenReturn(10);
when(clientState.totalUnreadCountStream)
.thenAnswer((i) => Stream.value(10));
var tapped = false;
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: SystemMessage(
onMessageTap: (m) => tapped = true,
message: Message(
text: 'demo message',
),
),
),
),
),
));
await tester.tap(find.byType(SystemMessage));
expect(find.text('demo message'), findsOneWidget);
expect(tapped, true);
},
);
testGoldens(
'control golden light',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.initialized).thenAnswer((_) => Future.value(true));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(clientState.totalUnreadCount).thenReturn(10);
when(clientState.totalUnreadCountStream)
.thenAnswer((i) => Stream.value(10));
await tester.pumpWidgetBuilder(
materialAppWrapper(
theme: ThemeData.light(),
)(
StreamChat(
client: client,
child: StreamChannel(
showLoading: false,
channel: channel,
child: Center(
child: SystemMessage(
message: Message(
text: 'demo message',
),
),
),
),
),
),
surfaceSize: Size.square(200),
);
await screenMatchesGolden(tester, 'system_message_light');
},
);
testGoldens(
'control golden dark',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.initialized).thenAnswer((_) => Future.value(true));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(clientState.totalUnreadCount).thenReturn(10);
when(clientState.totalUnreadCountStream)
.thenAnswer((i) => Stream.value(10));
await tester.pumpWidgetBuilder(
materialAppWrapper(
theme: ThemeData.dark(),
)(
StreamChat(
client: client,
child: StreamChannel(
showLoading: false,
channel: channel,
child: Center(
child: SystemMessage(
message: Message(
text: 'demo message',
),
),
),
),
),
),
surfaceSize: Size.square(200),
);
await screenMatchesGolden(tester, 'system_message_dark');
},
);
}
@@ -0,0 +1,140 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'control test',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.initialized).thenAnswer((_) => Future.value(true));
when(channel.isMuted).thenReturn(false);
when(channel.isMutedStream).thenAnswer((i) => Stream.value(false));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(channelState.unreadCount).thenReturn(1);
when(channelState.unreadCountStream).thenAnswer((i) => Stream.value(1));
when(channelState.membersStream).thenAnswer((i) => Stream.value([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
)
]));
when(channelState.members).thenReturn([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
),
]);
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: ThreadHeader(
parent: Message(),
),
),
),
),
));
await tester.pumpAndSettle();
expect(find.text('with '), findsOneWidget);
expect(find.byType(ChannelName), findsOneWidget);
expect(find.byType(StreamBackButton), findsOneWidget);
expect(find.text('Thread Reply'), findsOneWidget);
},
);
testWidgets(
'it should apply passed props',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.initialized).thenAnswer((_) => Future.value(true));
when(channel.isMuted).thenReturn(false);
when(channel.isMutedStream).thenAnswer((i) => Stream.value(false));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(channelState.unreadCount).thenReturn(1);
when(channelState.unreadCountStream).thenAnswer((i) => Stream.value(1));
when(channelState.membersStream).thenAnswer((i) => Stream.value([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
)
]));
when(channelState.members).thenReturn([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
),
]);
var tapped = false;
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: ThreadHeader(
parent: Message(),
subtitle: Text('subtitle'),
leading: Text('leading'),
title: Text('title'),
onTitleTap: () {
tapped = true;
},
actions: [
Text('action'),
],
),
),
),
),
));
await tester.pumpAndSettle();
expect(find.text('title'), findsOneWidget);
await tester.tap(find.text('title'));
expect(tapped, true);
expect(find.text('subtitle'), findsOneWidget);
expect(find.text('action'), findsOneWidget);
expect(find.text('leading'), findsOneWidget);
},
);
}
@@ -0,0 +1,79 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'it should show channel typing',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.isMuted).thenReturn(false);
when(channel.isMutedStream).thenAnswer((i) => Stream.value(false));
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(channelState.membersStream).thenAnswer((i) => Stream.value([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
)
]));
when(channelState.members).thenReturn([
Member(
userId: 'user-id',
user: User(id: 'user-id'),
),
]);
when(channelState.messages).thenReturn([
Message(
text: 'hello',
user: User(id: 'other-user'),
)
]);
when(channelState.messagesStream).thenAnswer((i) => Stream.value([
Message(
text: 'hello',
user: User(id: 'other-user'),
)
]));
when(channelState.typingEvents).thenAnswer((i) => [
User(id: 'other-user', extraData: {'name': 'demo'})
]);
when(channelState.typingEventsStream).thenAnswer((i) => Stream.value([
User(id: 'other-user', extraData: {'name': 'demo'}),
User(id: 'other-user', extraData: {'name': 'demo'}),
]));
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: TypingIndicator(),
),
),
),
));
expect(find.byKey(Key('typings')), findsOneWidget);
},
);
}
@@ -0,0 +1,127 @@
import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:mockito/mockito.dart';
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
import 'mocks.dart';
void main() {
testWidgets(
'it should show total unread count',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channel.extraDataStream).thenAnswer((i) => Stream.value({
'name': 'test',
}));
when(channel.extraData).thenReturn({
'name': 'test',
});
when(clientState.totalUnreadCount).thenReturn(10);
when(clientState.totalUnreadCountStream)
.thenAnswer((i) => Stream.value(10));
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: UnreadIndicator(),
),
),
),
));
expect(find.text('10'), findsOneWidget);
},
);
testWidgets(
'it should show nothing if no unread messages',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
final channelState = MockChannelState();
when(channel.cid).thenReturn('cid');
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(clientState.channels).thenReturn({
channel.cid: channel,
});
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channelState.unreadCount).thenReturn(0);
when(channelState.unreadCountStream).thenAnswer((i) => Stream.value(0));
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: UnreadIndicator(
cid: channel.cid,
),
),
),
),
));
expect(find.byType(SizedBox), findsOneWidget);
},
);
testWidgets(
'it should show 99+ if more than 99 unreads',
(WidgetTester tester) async {
final client = MockClient();
final clientState = MockClientState();
final channel = MockChannel();
when(channel.cid).thenReturn('cid');
final channelState = MockChannelState();
final lastMessageAt = DateTime.parse('2020-06-22 12:00:00');
when(client.state).thenReturn(clientState);
when(clientState.user).thenReturn(OwnUser(id: 'user-id'));
when(clientState.channels).thenReturn({
channel.cid: channel,
});
when(channel.lastMessageAt).thenReturn(lastMessageAt);
when(channel.state).thenReturn(channelState);
when(channel.client).thenReturn(client);
when(channelState.unreadCount).thenReturn(100);
when(channelState.unreadCountStream).thenAnswer((i) => Stream.value(100));
await tester.pumpWidget(MaterialApp(
home: StreamChat(
client: client,
child: StreamChannel(
channel: channel,
child: Scaffold(
body: UnreadIndicator(
cid: channel.cid,
),
),
),
),
));
expect(find.text('99+'), findsOneWidget);
},
);
}