Skip to content

Commit d95a278

Browse files
committed
Added more poll event tests
1 parent a42f92e commit d95a278

File tree

1 file changed

+246
-6
lines changed

1 file changed

+246
-6
lines changed

packages/stream_feeds/test/state/activity_test.dart

Lines changed: 246 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,238 @@ void main() {
151151
),
152152
);
153153
});
154+
155+
test('poll answer casted', () async {
156+
final poll = createDefaultPollResponseData();
157+
setupMockActivity(
158+
activity: createDefaultActivityResponse(poll: poll),
159+
);
160+
161+
final activity = client.activity(
162+
activityId: 'id',
163+
fid: const FeedId(group: 'group', id: 'id'),
164+
);
165+
await activity.get();
166+
167+
activity.notifier.stream.listen(
168+
expectAsync1(
169+
(event) {
170+
expect(event, isA<ActivityState>());
171+
expect(event.poll?.id, 'id');
172+
expect(event.poll?.answersCount, 1);
173+
expect(event.poll?.latestAnswers.length, 1);
174+
},
175+
),
176+
);
177+
178+
wsStreamController.add(
179+
jsonEncode(
180+
PollVoteCastedFeedEvent(
181+
createdAt: DateTime.now(),
182+
custom: const {},
183+
fid: 'fid',
184+
poll: poll.copyWith(answersCount: 1),
185+
pollVote: PollVoteResponseData(
186+
createdAt: DateTime.now(),
187+
updatedAt: DateTime.now(),
188+
id: 'voteId1',
189+
answerText: 'answerText1',
190+
isAnswer: true,
191+
optionId: 'optionId1',
192+
pollId: 'pollId1',
193+
),
194+
type: 'feeds.poll.vote_casted',
195+
),
196+
),
197+
);
198+
});
199+
200+
test('poll answer removed', () async {
201+
final poll = createDefaultPollResponseData(
202+
latestAnswers: [
203+
PollVoteResponseData(
204+
createdAt: DateTime.now(),
205+
updatedAt: DateTime.now(),
206+
id: 'voteId1',
207+
answerText: 'answerText1',
208+
isAnswer: true,
209+
optionId: 'optionId1',
210+
pollId: 'pollId1',
211+
),
212+
],
213+
);
214+
setupMockActivity(
215+
activity: createDefaultActivityResponse(poll: poll),
216+
);
217+
218+
final activity = client.activity(
219+
activityId: 'id',
220+
fid: const FeedId(group: 'group', id: 'id'),
221+
);
222+
await activity.get();
223+
224+
expect(poll.answersCount, 1);
225+
expect(poll.latestAnswers.length, 1);
226+
227+
activity.notifier.stream.listen(
228+
expectAsync1(
229+
(event) {
230+
expect(event, isA<ActivityState>());
231+
expect(event.poll?.id, 'id');
232+
expect(event.poll?.answersCount, 0);
233+
expect(event.poll?.latestAnswers.length, 0);
234+
},
235+
),
236+
);
237+
238+
wsStreamController.add(
239+
jsonEncode(
240+
PollVoteRemovedFeedEvent(
241+
createdAt: DateTime.now(),
242+
custom: const {},
243+
fid: 'fid',
244+
poll: poll.copyWith(answersCount: 0),
245+
pollVote: PollVoteResponseData(
246+
createdAt: DateTime.now(),
247+
updatedAt: DateTime.now(),
248+
id: 'voteId1',
249+
answerText: 'answerText1',
250+
isAnswer: true,
251+
optionId: 'optionId1',
252+
pollId: 'pollId1',
253+
),
254+
type: 'feeds.poll.vote_removed',
255+
),
256+
),
257+
);
258+
});
259+
260+
test('poll vote removed', () async {
261+
final poll = createDefaultPollResponseData(
262+
latestVotesByOption: {
263+
'optionId1': [
264+
PollVoteResponseData(
265+
createdAt: DateTime.now(),
266+
updatedAt: DateTime.now(),
267+
id: 'voteId1',
268+
optionId: 'optionId1',
269+
pollId: 'pollId1',
270+
),
271+
],
272+
},
273+
);
274+
final pollId = poll.id;
275+
setupMockActivity(
276+
activity: createDefaultActivityResponse(poll: poll),
277+
);
278+
279+
final activity = client.activity(
280+
activityId: 'id',
281+
fid: const FeedId(group: 'group', id: 'id'),
282+
);
283+
await activity.get();
284+
285+
expect(poll.voteCount, 1);
286+
expect(poll.latestVotesByOption.length, 1);
287+
288+
activity.notifier.stream.listen(
289+
expectAsync1(
290+
(event) {
291+
expect(event, isA<ActivityState>());
292+
expect(event.poll?.id, 'id');
293+
expect(event.poll?.voteCount, 0);
294+
expect(event.poll?.latestVotesByOption.length, 0);
295+
},
296+
),
297+
);
298+
wsStreamController.add(
299+
jsonEncode(
300+
PollVoteRemovedFeedEvent(
301+
createdAt: DateTime.now(),
302+
custom: const {},
303+
fid: 'fid',
304+
poll: poll.copyWith(voteCount: 0, latestVotesByOption: {}),
305+
pollVote: PollVoteResponseData(
306+
createdAt: DateTime.now(),
307+
updatedAt: DateTime.now(),
308+
id: 'voteId1',
309+
optionId: 'optionId1',
310+
pollId: pollId,
311+
),
312+
type: 'feeds.poll.vote_removed',
313+
),
314+
),
315+
);
316+
});
317+
318+
test('poll closed', () async {
319+
final poll = createDefaultPollResponseData();
320+
setupMockActivity(
321+
activity: createDefaultActivityResponse(poll: poll),
322+
);
323+
324+
final activity = client.activity(
325+
activityId: 'id',
326+
fid: const FeedId(group: 'group', id: 'id'),
327+
);
328+
await activity.get();
329+
330+
activity.notifier.stream.listen(
331+
expectAsync1(
332+
(event) {
333+
expect(event, isA<ActivityState>());
334+
expect(event.poll?.id, 'id');
335+
expect(event.poll?.isClosed, true);
336+
},
337+
),
338+
);
339+
340+
wsStreamController.add(
341+
jsonEncode(
342+
PollClosedFeedEvent(
343+
createdAt: DateTime.now(),
344+
custom: const {},
345+
fid: 'fid',
346+
poll: poll.copyWith(isClosed: true),
347+
type: 'feeds.poll.closed',
348+
),
349+
),
350+
);
351+
});
352+
353+
test('poll deleted', () async {
354+
final poll = createDefaultPollResponseData();
355+
setupMockActivity(
356+
activity: createDefaultActivityResponse(poll: poll),
357+
);
358+
359+
final activity = client.activity(
360+
activityId: 'id',
361+
fid: const FeedId(group: 'group', id: 'id'),
362+
);
363+
await activity.get();
364+
365+
activity.notifier.stream.listen(
366+
expectAsync1(
367+
(event) {
368+
expect(event, isA<ActivityState>());
369+
expect(event.poll, null);
370+
},
371+
),
372+
);
373+
374+
wsStreamController.add(
375+
jsonEncode(
376+
PollDeletedFeedEvent(
377+
createdAt: DateTime.now(),
378+
custom: const {},
379+
fid: 'fid',
380+
poll: poll,
381+
type: 'feeds.poll.deleted',
382+
),
383+
),
384+
);
385+
});
154386
});
155387
}
156388

@@ -210,23 +442,31 @@ GetActivityResponse createDefaultActivityResponse({PollResponseData? poll}) =>
210442
duration: 'duration',
211443
);
212444

213-
PollResponseData createDefaultPollResponseData() => PollResponseData(
445+
PollResponseData createDefaultPollResponseData({
446+
List<PollVoteResponseData> latestAnswers = const [],
447+
Map<String, List<PollVoteResponseData>> latestVotesByOption = const {},
448+
}) =>
449+
PollResponseData(
214450
id: 'id',
215451
name: 'name',
216452
allowAnswers: true,
217453
allowUserSuggestedOptions: true,
218-
answersCount: 0,
454+
answersCount: latestAnswers.length,
219455
createdAt: DateTime.now(),
220456
createdById: 'id',
221457
custom: const {},
222458
description: 'description',
223459
enforceUniqueVote: true,
224-
latestAnswers: const [],
225-
latestVotesByOption: const {},
460+
latestAnswers: latestAnswers,
461+
latestVotesByOption: latestVotesByOption,
226462
ownVotes: const [],
227463
updatedAt: DateTime.now(),
228-
voteCount: 0,
229-
voteCountsByOption: const {},
464+
voteCount: latestVotesByOption.values
465+
.map((e) => e.length)
466+
.reduce((v, e) => v + e),
467+
voteCountsByOption: latestVotesByOption.map(
468+
(k, e) => MapEntry(k, e.length),
469+
),
230470
votingVisibility: 'visibility',
231471
options: const [
232472
PollOptionResponseData(

0 commit comments

Comments
 (0)