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]>
@@ -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));
|
||||
},
|
||||
);
|
||||
}
|
||||
|
After Width: | Height: | Size: 2.9 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 410 B |
|
After Width: | Height: | Size: 3.3 KiB |
|
After Width: | Height: | Size: 1.9 KiB |
|
After Width: | Height: | Size: 2.0 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
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);
|
||||
},
|
||||
);
|
||||
}
|
||||