@@ -12,21 +12,50 @@ import '../api/fake_api.dart';
12
12
import '../api/model/model_checks.dart' ;
13
13
import '../example_data.dart' as eg;
14
14
15
- Future <MessageListView > messageListViewWithMessages (List <Message > messages, [Narrow narrow = const AllMessagesNarrow ()]) async {
16
- final store = eg.store ();
17
- final model = MessageListView .init (store: store, narrow: narrow);
18
-
19
- final connection = store.connection as FakeApiConnection ;
20
- connection.prepare (json:
21
- newestResult (foundOldest: true , messages: messages).toJson ());
22
- await model.fetch ();
23
-
24
- return model;
25
- }
26
-
27
15
void main () async {
16
+ // These variables are the common state operated on by each test.
17
+ // Each test case calls [prepare] to initialize them.
18
+ late PerAccountStore store;
19
+ late FakeApiConnection connection;
20
+ late MessageListView model;
21
+ late int notifiedCount;
22
+
23
+ void checkNotNotified () {
24
+ check (notifiedCount).equals (0 );
25
+ }
26
+
27
+ void checkNotifiedOnce () {
28
+ check (notifiedCount).equals (1 );
29
+ notifiedCount = 0 ;
30
+ }
31
+
32
+ /// Initialize [model] and the rest of the test state.
33
+ void prepare ({Narrow narrow = const AllMessagesNarrow ()}) {
34
+ store = eg.store ();
35
+ connection = store.connection as FakeApiConnection ;
36
+ notifiedCount = 0 ;
37
+ model = MessageListView .init (store: store, narrow: narrow)
38
+ ..addListener (() { notifiedCount++ ; });
39
+ check (model).fetched.isFalse ();
40
+ checkNotNotified ();
41
+ }
42
+
43
+ /// Perform the initial message fetch for [model] .
44
+ ///
45
+ /// The test case must have already called [prepare] to initialize the state.
46
+ Future <void > prepareMessages ({
47
+ required bool foundOldest,
48
+ required List <Message > messages,
49
+ }) async {
50
+ connection.prepare (json:
51
+ newestResult (foundOldest: foundOldest, messages: messages).toJson ());
52
+ await model.fetch ();
53
+ checkNotifiedOnce ();
54
+ }
55
+
28
56
test ('findMessageWithId' , () async {
29
- final model = await messageListViewWithMessages ([
57
+ prepare ();
58
+ await prepareMessages (foundOldest: true , messages: [
30
59
eg.streamMessage (id: 2 ),
31
60
eg.streamMessage (id: 4 ),
32
61
eg.streamMessage (id: 6 ),
@@ -57,10 +86,8 @@ void main() async {
57
86
userId: 1 ,
58
87
renderingOnly: false ,
59
88
);
60
-
61
- final model = await messageListViewWithMessages ([originalMessage]);
62
- bool listenersNotified = false ;
63
- model.addListener (() { listenersNotified = true ; });
89
+ prepare ();
90
+ await prepareMessages (foundOldest: true , messages: [originalMessage]);
64
91
65
92
final message = model.messages.single;
66
93
check (message)
@@ -70,7 +97,7 @@ void main() async {
70
97
..isMeMessage.not (it ()..equals (updateEvent.isMeMessage! ));
71
98
72
99
model.maybeUpdateMessage (updateEvent);
73
- check (listenersNotified). isTrue ();
100
+ checkNotifiedOnce ();
74
101
check (model).messages.single
75
102
..identicalTo (message)
76
103
..content.equals (updateEvent.renderedContent! )
@@ -92,13 +119,11 @@ void main() async {
92
119
userId: 1 ,
93
120
renderingOnly: false ,
94
121
);
95
-
96
- final model = await messageListViewWithMessages ([originalMessage]);
97
- bool listenersNotified = false ;
98
- model.addListener (() { listenersNotified = true ; });
122
+ prepare ();
123
+ await prepareMessages (foundOldest: true , messages: [originalMessage]);
99
124
100
125
model.maybeUpdateMessage (updateEvent);
101
- check (listenersNotified). isFalse ();
126
+ checkNotNotified ();
102
127
check (model).messages.single
103
128
..content.equals (originalMessage.content)
104
129
..content.not (it ()..equals (updateEvent.renderedContent! ));
@@ -119,14 +144,12 @@ void main() async {
119
144
renderingOnly: legacy ? null : true ,
120
145
userId: null ,
121
146
);
122
-
123
- final model = await messageListViewWithMessages ([originalMessage]);
124
- bool listenersNotified = false ;
125
- model.addListener (() { listenersNotified = true ; });
126
-
147
+ prepare ();
148
+ await prepareMessages (foundOldest: true , messages: [originalMessage]);
127
149
final message = model.messages.single;
150
+
128
151
model.maybeUpdateMessage (updateEvent);
129
- check (listenersNotified). isTrue ();
152
+ checkNotifiedOnce ();
130
153
check (model).messages.single
131
154
..identicalTo (message)
132
155
// Content is updated...
@@ -159,33 +182,25 @@ void main() async {
159
182
160
183
test ('add reaction' , () async {
161
184
final originalMessage = eg.streamMessage (reactions: []);
162
- final model = await messageListViewWithMessages ([originalMessage] );
163
-
185
+ prepare ( );
186
+ await prepareMessages (foundOldest : true , messages : [originalMessage]);
164
187
final message = model.messages.single;
165
188
166
- bool listenersNotified = false ;
167
- model.addListener (() { listenersNotified = true ; });
168
-
169
189
model.maybeUpdateMessageReactions (
170
190
mkEvent (eg.unicodeEmojiReaction, ReactionOp .add, originalMessage.id));
171
-
172
- check (listenersNotified).isTrue ();
191
+ checkNotifiedOnce ();
173
192
check (model).messages.single
174
193
..identicalTo (message)
175
194
..reactions.jsonEquals ([eg.unicodeEmojiReaction]);
176
195
});
177
196
178
197
test ('add reaction; message is not in list' , () async {
179
198
final someMessage = eg.streamMessage (id: 1 , reactions: []);
180
- final model = await messageListViewWithMessages ([someMessage]);
181
-
182
- bool listenersNotified = false ;
183
- model.addListener (() { listenersNotified = true ; });
184
-
199
+ prepare ();
200
+ await prepareMessages (foundOldest: true , messages: [someMessage]);
185
201
model.maybeUpdateMessageReactions (
186
202
mkEvent (eg.unicodeEmojiReaction, ReactionOp .add, 1000 ));
187
-
188
- check (listenersNotified).isFalse ();
203
+ checkNotNotified ();
189
204
check (model).messages.single.reactions.jsonEquals ([]);
190
205
});
191
206
@@ -211,33 +226,25 @@ void main() async {
211
226
212
227
final originalMessage = eg.streamMessage (
213
228
reactions: [reaction2, reaction3, reaction4]);
214
- final model = await messageListViewWithMessages ([originalMessage] );
215
-
229
+ prepare ( );
230
+ await prepareMessages (foundOldest : true , messages : [originalMessage]);
216
231
final message = model.messages.single;
217
232
218
- bool listenersNotified = false ;
219
- model.addListener (() { listenersNotified = true ; });
220
-
221
233
model.maybeUpdateMessageReactions (
222
234
mkEvent (eventReaction, ReactionOp .remove, originalMessage.id));
223
-
224
- check (listenersNotified).isTrue ();
235
+ checkNotifiedOnce ();
225
236
check (model).messages.single
226
237
..identicalTo (message)
227
238
..reactions.jsonEquals ([reaction2, reaction3]);
228
239
});
229
240
230
241
test ('remove reaction; message is not in list' , () async {
231
242
final someMessage = eg.streamMessage (id: 1 , reactions: [eg.unicodeEmojiReaction]);
232
- final model = await messageListViewWithMessages ([someMessage]);
233
-
234
- bool listenersNotified = false ;
235
- model.addListener (() { listenersNotified = true ; });
236
-
243
+ prepare ();
244
+ await prepareMessages (foundOldest: true , messages: [someMessage]);
237
245
model.maybeUpdateMessageReactions (
238
246
mkEvent (eg.unicodeEmojiReaction, ReactionOp .remove, 1000 ));
239
-
240
- check (listenersNotified).isFalse ();
247
+ checkNotNotified ();
241
248
check (model).messages.single.reactions.jsonEquals ([eg.unicodeEmojiReaction]);
242
249
});
243
250
});
0 commit comments