@@ -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