Skip to content

Commit 0f435f5

Browse files
authored
Add snapshots for autocomplete (#2687)
* Add snapshots for autocomplete * update channellistheader snapshots * Add members snapshots * chore: Update Docs Snapshots --------- Co-authored-by: renefloor <15101411+renefloor@users.noreply.github.com>
1 parent 427609a commit 0f435f5

10 files changed

Lines changed: 278 additions & 1 deletion

docs/docs_screenshots/test/channel/channel_list_header_test.dart

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,38 @@ void main() {
5858
return _buildListHeaderScaffold(
5959
client: client,
6060
headerBuilder: (context) => StreamChannelListHeader(
61-
subtitle: const Text('12 channels'),
61+
subtitle: const Text('My Custom Subtitle'),
62+
trailing: StreamButton.icon(
63+
icon: Icon(context.streamIcons.plus),
64+
onPressed: () {},
65+
),
66+
),
67+
);
68+
},
69+
);
70+
71+
docsGoldenTest(
72+
'channel list header with custom title',
73+
fileName: 'channel_list_header_custom_title',
74+
constraints: const BoxConstraints.tightFor(width: 375, height: 72),
75+
builder: () {
76+
final client = MockClient();
77+
final clientState = MockClientState();
78+
when(() => client.state).thenReturn(clientState);
79+
when(() => clientState.currentUser).thenReturn(ownUser);
80+
81+
return _buildListHeaderScaffold(
82+
client: client,
83+
headerBuilder: (context) => StreamChannelListHeader(
84+
title: StreamConnectionStatusBuilder(
85+
statusBuilder: (context, status) {
86+
return switch (status) {
87+
ConnectionStatus.connected => const Text('My Chat App'),
88+
ConnectionStatus.connecting => const Text('Connecting...'),
89+
ConnectionStatus.disconnected => const Text('Offline'),
90+
};
91+
},
92+
),
6293
trailing: StreamButton.icon(
6394
icon: Icon(context.streamIcons.plus),
6495
onPressed: () {},
1.05 KB
Loading
7.09 KB
Loading
40.8 KB
Loading
47.9 KB
Loading
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
import 'package:flutter/material.dart';
2+
import 'package:flutter_test/flutter_test.dart';
3+
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
4+
5+
import '../src/golden_client_stubs.dart';
6+
import '../src/golden_theme.dart';
7+
import '../src/mocks.dart';
8+
import '../src/sample_users.dart';
9+
10+
List<Member> _sampleMembers() {
11+
final now = DateTime.now();
12+
return [
13+
Member(userId: charlotteAnderson.id, user: charlotteAnderson.copyWith(online: true)),
14+
Member(
15+
userId: noahSmith.id,
16+
user: noahSmith.copyWith(online: false, lastActive: now),
17+
),
18+
Member(userId: elenaBarros.id, user: elenaBarros.copyWith(online: true)),
19+
Member(
20+
userId: liamJohnson.id,
21+
user: liamJohnson.copyWith(online: false, lastActive: now.subtract(const Duration(hours: 2))),
22+
),
23+
Member(userId: mayaRoss.id, user: mayaRoss.copyWith(online: true)),
24+
Member(
25+
userId: ethanWilson.id,
26+
user: ethanWilson.copyWith(online: false, lastActive: now.subtract(const Duration(days: 3))),
27+
),
28+
];
29+
}
30+
31+
void main() {
32+
TestWidgetsFlutterBinding.ensureInitialized();
33+
34+
docsGoldenTest(
35+
'member list view',
36+
fileName: 'member_list_view',
37+
constraints: const BoxConstraints.tightFor(width: 375, height: 400),
38+
builder: () {
39+
final client = MockClient();
40+
stubMockClientCurrentUser(client, ownUser);
41+
final channel = MockChannel();
42+
final members = _sampleMembers();
43+
stubQueryMembersForGoldens(channel, members);
44+
final controller = StreamMemberListController.fromValue(
45+
PagedValue(items: members),
46+
channel: channel,
47+
);
48+
49+
return StreamChat(
50+
client: client,
51+
connectivityStream: Stream.value([ConnectivityResult.mobile]),
52+
child: Scaffold(
53+
body: StreamMemberListView(
54+
controller: controller,
55+
shrinkWrap: true,
56+
),
57+
),
58+
);
59+
},
60+
);
61+
62+
docsGoldenTest(
63+
'member grid view',
64+
fileName: 'member_grid_view',
65+
constraints: const BoxConstraints.tightFor(width: 375, height: 400),
66+
builder: () {
67+
final client = MockClient();
68+
stubMockClientCurrentUser(client, ownUser);
69+
final channel = MockChannel();
70+
final members = _sampleMembers();
71+
stubQueryMembersForGoldens(channel, members);
72+
final controller = StreamMemberListController.fromValue(
73+
PagedValue(items: members),
74+
channel: channel,
75+
);
76+
77+
return StreamChat(
78+
client: client,
79+
connectivityStream: Stream.value([ConnectivityResult.mobile]),
80+
child: Scaffold(
81+
body: StreamMemberGridView(
82+
controller: controller,
83+
shrinkWrap: true,
84+
),
85+
),
86+
);
87+
},
88+
);
89+
}
Lines changed: 144 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
1+
import 'package:alchemist/alchemist.dart';
2+
import 'package:flutter/material.dart';
3+
import 'package:flutter_test/flutter_test.dart';
4+
import 'package:mocktail/mocktail.dart';
5+
import 'package:record/record.dart';
6+
import 'package:stream_chat_flutter/stream_chat_flutter.dart';
7+
8+
import '../src/fakes.dart';
9+
import '../src/golden_theme.dart';
10+
import '../src/mocks.dart';
11+
import '../src/sample_users.dart';
12+
13+
void main() {
14+
TestWidgetsFlutterBinding.ensureInitialized();
15+
16+
final originalRecordPlatform = RecordPlatform.instance;
17+
setUp(() => RecordPlatform.instance = FakeRecordPlatform());
18+
tearDown(() => RecordPlatform.instance = originalRecordPlatform);
19+
20+
docsGoldenTest(
21+
'mention autocomplete trigger',
22+
fileName: 'autocomplete_trigger_mention',
23+
constraints: const BoxConstraints.tightFor(width: 375, height: 290),
24+
pumpBeforeTest: (tester) async {
25+
await tester.pump(); // let FutureBuilder resolve and show user list
26+
await precacheImages(tester); // now precache the avatar images in the tree
27+
},
28+
builder: () {
29+
final client = MockClient();
30+
final clientState = MockClientState();
31+
final channel = MockChannel();
32+
final channelState = MockChannelState();
33+
34+
final members = [
35+
noahSmith,
36+
liamJohnson,
37+
miaThompson,
38+
ethanWilson,
39+
].map((user) => Member(userId: user.id, user: user)).toList();
40+
41+
setupMockChannel(
42+
client: client,
43+
clientState: clientState,
44+
channel: channel,
45+
channelState: channelState,
46+
members: members,
47+
);
48+
49+
when(() => channelState.watchers).thenReturn([]);
50+
51+
final messageComposerController = StreamMessageComposerController()..message = Message(text: 'Hello @');
52+
53+
return StreamChat(
54+
client: client,
55+
connectivityStream: Stream.value([ConnectivityResult.mobile]),
56+
child: StreamChannel(
57+
showLoading: false,
58+
channel: channel,
59+
child: Scaffold(
60+
body: Column(
61+
mainAxisAlignment: MainAxisAlignment.end,
62+
children: [
63+
StreamMentionAutocompleteOptions(
64+
query: '',
65+
channel: channel,
66+
),
67+
StreamMessageComposer(messageComposerController: messageComposerController),
68+
],
69+
),
70+
),
71+
),
72+
);
73+
},
74+
);
75+
76+
docsGoldenTest(
77+
'commands autocomplete trigger',
78+
fileName: 'autocomplete_trigger_commands',
79+
constraints: const BoxConstraints.tightFor(width: 375, height: 340),
80+
builder: () {
81+
final client = MockClient();
82+
final clientState = MockClientState();
83+
final channel = MockChannel();
84+
final channelState = MockChannelState();
85+
86+
setupMockChannel(
87+
client: client,
88+
clientState: clientState,
89+
channel: channel,
90+
channelState: channelState,
91+
);
92+
93+
when(() => channel.config).thenReturn(
94+
ChannelConfig(
95+
commands: [
96+
Command(
97+
name: 'giphy',
98+
description: 'Post a random gif to the channel',
99+
args: '[text]',
100+
),
101+
Command(
102+
name: 'ban',
103+
description: 'Ban a user',
104+
args: '@username [text]',
105+
),
106+
Command(
107+
name: 'flag',
108+
description: 'Flag a message',
109+
args: '[messageId]',
110+
),
111+
Command(
112+
name: 'mute',
113+
description: 'Mute a user',
114+
args: '@username',
115+
),
116+
],
117+
),
118+
);
119+
120+
final messageComposerController = StreamMessageComposerController()..message = Message(text: '/');
121+
122+
return StreamChat(
123+
client: client,
124+
connectivityStream: Stream.value([ConnectivityResult.mobile]),
125+
child: StreamChannel(
126+
showLoading: false,
127+
channel: channel,
128+
child: Scaffold(
129+
body: Column(
130+
mainAxisAlignment: MainAxisAlignment.end,
131+
children: [
132+
StreamCommandAutocompleteOptions(
133+
query: '',
134+
channel: channel,
135+
),
136+
StreamMessageComposer(messageComposerController: messageComposerController),
137+
],
138+
),
139+
),
140+
),
141+
);
142+
},
143+
);
144+
}
19.4 KB
Loading
23.9 KB
Loading

docs/docs_screenshots/test/src/golden_client_stubs.dart

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ void _ensureGoldenMocktailFallbacks() {
1414
registerFallbackValue(<SortOption<Thread>>[]);
1515
registerFallbackValue(<SortOption<ChannelState>>[]);
1616
registerFallbackValue(<SortOption<Draft>>[]);
17+
registerFallbackValue(<SortOption<Member>>[]);
1718
_registeredFallbacks = true;
1819
}
1920

@@ -89,6 +90,18 @@ void stubQueryDraftsForGoldens(MockClient client, List<Draft> drafts) {
8990
);
9091
}
9192

93+
/// Stubs member queries for [StreamMemberListController] goldens using [StreamMemberListController.fromValue].
94+
void stubQueryMembersForGoldens(MockChannel channel, List<Member> members) {
95+
_ensureGoldenMocktailFallbacks();
96+
when(
97+
() => channel.queryMembers(
98+
filter: any(named: 'filter'),
99+
sort: any(named: 'sort'),
100+
pagination: any(named: 'pagination'),
101+
),
102+
).thenAnswer((_) async => QueryMembersResponse()..members = members);
103+
}
104+
92105
/// Stubs search for [StreamMessageSearchListController] goldens using [StreamMessageSearchListController.fromValue].
93106
void stubSearchMessagesForGoldens(MockClient client, List<GetMessageResponse> results) {
94107
_ensureGoldenMocktailFallbacks();

0 commit comments

Comments
 (0)