From 8e6e79a96d17ddd1cd18dc63c55b5473996cd747 Mon Sep 17 00:00:00 2001 From: VelikovPetar Date: Mon, 15 Jun 2026 09:53:09 +0200 Subject: [PATCH] chore(persistence): Remove unused DAO methods --- packages/stream_chat_persistence/CHANGELOG.md | 4 + .../lib/src/dao/member_dao.dart | 3 - .../lib/src/dao/message_dao.dart | 4 - .../lib/src/dao/pinned_message_dao.dart | 68 ---- .../src/dao/pinned_message_reaction_dao.dart | 26 -- .../lib/src/dao/poll_dao.dart | 8 - .../lib/src/dao/reaction_dao.dart | 26 -- .../lib/src/dao/read_dao.dart | 4 - .../lib/src/dao/user_dao.dart | 4 - .../test/src/dao/channel_dao_test.dart | 18 +- .../test/src/dao/draft_message_dao_test.dart | 60 ++-- .../test/src/dao/location_dao_test.dart | 6 +- .../test/src/dao/member_dao_test.dart | 18 +- .../test/src/dao/message_dao_test.dart | 292 ++++++++++-------- .../test/src/dao/pinned_message_dao_test.dart | 283 ++++++++--------- .../dao/pinned_message_reaction_dao_test.dart | 119 +++---- .../test/src/dao/poll_dao_test.dart | 42 ++- .../test/src/dao/reaction_dao_test.dart | 151 +++------ .../test/src/dao/read_dao_test.dart | 6 +- .../test/src/dao/user_dao_test.dart | 25 +- 20 files changed, 474 insertions(+), 693 deletions(-) diff --git a/packages/stream_chat_persistence/CHANGELOG.md b/packages/stream_chat_persistence/CHANGELOG.md index b54e56eb18..23845dada7 100644 --- a/packages/stream_chat_persistence/CHANGELOG.md +++ b/packages/stream_chat_persistence/CHANGELOG.md @@ -12,6 +12,10 @@ - `PinnedMessageDao.getMessagesByCid` now honours `PaginationParams.lessThanOrEqual` and `PaginationParams.greaterThanOrEqual` (inclusive of the cursor message), in addition to the existing strict `lessThan`/`greaterThan`. - `PinnedMessageDao.getMessagesByCid` with a forward cursor (`greaterThan`/`greaterThanOrEqual`) and a `limit` now returns the messages immediately AFTER the pivot, instead of the channel tail. +🔄 Internal / Non-breaking + +- Removed unused / test-only methods from internal DAO classes. + ## 10.0.1 🔄 Changed diff --git a/packages/stream_chat_persistence/lib/src/dao/member_dao.dart b/packages/stream_chat_persistence/lib/src/dao/member_dao.dart index 1adf8ef6bd..dc8066d6f5 100644 --- a/packages/stream_chat_persistence/lib/src/dao/member_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/member_dao.dart @@ -57,9 +57,6 @@ class MemberDao extends DatabaseAccessor with _$MemberDaoMixi }; } - /// Updates all the members using the new [memberList] data - Future updateMembers(String cid, List memberList) => bulkUpdateMembers({cid: memberList}); - /// Bulk updates the members data of multiple channels Future bulkUpdateMembers( Map?> channelWithMembers, diff --git a/packages/stream_chat_persistence/lib/src/dao/message_dao.dart b/packages/stream_chat_persistence/lib/src/dao/message_dao.dart index dbd81aef8a..900e0e6061 100644 --- a/packages/stream_chat_persistence/lib/src/dao/message_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/message_dao.dart @@ -433,10 +433,6 @@ class MessageDao extends DatabaseAccessor with _$MessageDaoMi ); } - /// Updates the message data of a particular channel with - /// the new [messageList] data - Future updateMessages(String cid, List messageList) => bulkUpdateMessages({cid: messageList}); - /// Bulk updates the message data of multiple channels Future bulkUpdateMessages( Map?> channelWithMessages, diff --git a/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart b/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart index b0cc649808..858dd5f5b4 100644 --- a/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/pinned_message_dao.dart @@ -181,70 +181,6 @@ class PinnedMessageDao extends DatabaseAccessor with _$Pinned return hydrated.firstOrNull; } - /// Returns all the messages of a particular thread by matching - /// [PinnedMessages.channelCid] with [cid] - Future> getThreadMessages(String cid) async { - final rows = - await (select(pinnedMessages).join([ - leftOuterJoin(_users, pinnedMessages.userId.equalsExp(_users.id)), - leftOuterJoin( - _pinnedByUsers, - pinnedMessages.pinnedByUserId.equalsExp(_pinnedByUsers.id), - ), - ]) - ..where(pinnedMessages.channelCid.equals(cid)) - ..where(pinnedMessages.parentId.isNotNull()) - ..orderBy([OrderingTerm.asc(pinnedMessages.createdAt)])) - .get(); - return _messagesFromJoinRows(rows); - } - - /// Returns all the messages of a particular thread by matching - /// [PinnedMessages.parentId] with [parentId] - Future> getThreadMessagesByParentId( - String parentId, { - PaginationParams? options, - }) async { - final rows = - await (select(pinnedMessages).join([ - leftOuterJoin(_users, pinnedMessages.userId.equalsExp(_users.id)), - leftOuterJoin( - _pinnedByUsers, - pinnedMessages.pinnedByUserId.equalsExp(_pinnedByUsers.id), - ), - ]) - ..where(pinnedMessages.parentId.isNotNull()) - ..where(pinnedMessages.parentId.equals(parentId)) - ..orderBy([OrderingTerm.asc(pinnedMessages.createdAt)])) - .get(); - final msgList = await _messagesFromJoinRows(rows); - - if (msgList.isNotEmpty) { - final mutable = msgList.toList(); - if (options?.lessThan != null) { - final lessThanIndex = mutable.indexWhere( - (m) => m.id == options!.lessThan, - ); - if (lessThanIndex != -1) { - mutable.removeRange(lessThanIndex, mutable.length); - } - } - if (options?.greaterThan != null) { - final greaterThanIndex = mutable.indexWhere( - (m) => m.id == options!.greaterThan, - ); - if (greaterThanIndex != -1) { - mutable.removeRange(0, greaterThanIndex); - } - } - if (options?.limit != null) { - return mutable.take(options!.limit).toList(); - } - return mutable; - } - return msgList; - } - /// Returns all the messages of a channel by matching /// [PinnedMessages.channelCid] with [parentId] Future> getMessagesByCid( @@ -385,10 +321,6 @@ class PinnedMessageDao extends DatabaseAccessor with _$Pinned ); } - /// Updates the message data of a particular channel with - /// the new [messageList] data - Future updateMessages(String cid, List messageList) => bulkUpdateMessages({cid: messageList}); - /// Bulk updates the message data of multiple channels Future bulkUpdateMessages( Map?> channelWithMessages, diff --git a/packages/stream_chat_persistence/lib/src/dao/pinned_message_reaction_dao.dart b/packages/stream_chat_persistence/lib/src/dao/pinned_message_reaction_dao.dart index 873e51a43a..f7b639d36f 100644 --- a/packages/stream_chat_persistence/lib/src/dao/pinned_message_reaction_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/pinned_message_reaction_dao.dart @@ -14,32 +14,6 @@ class PinnedMessageReactionDao extends DatabaseAccessor with /// Creates a new reaction dao instance PinnedMessageReactionDao(super.db); - /// Returns all the reactions of a particular message by matching - /// [Reactions.messageId] with [messageId]. - /// - /// Not used in production — `PinnedMessageDao` hydrates via the batched - /// [getReactionsForMessages]. Kept for convenience (tests + ad-hoc - /// single-id lookups). - Future> getReactions(String messageId) { - final where = pinnedMessageReactions.messageId.equals(messageId); - return _selectReactions(where); - } - - /// Returns all the reactions of a particular message - /// added by a particular user by matching - /// [Reactions.messageId] with [messageId] and - /// [Reactions.userId] with [userId]. - /// - /// Not used in production — `PinnedMessageDao` hydrates via the batched - /// [getReactionsForMessagesByUserId]. Kept for convenience. - Future> getReactionsByUserId( - String messageId, - String userId, - ) { - final where = pinnedMessageReactions.messageId.equals(messageId) & pinnedMessageReactions.userId.equals(userId); - return _selectReactions(where); - } - /// Returns pinned-message reactions for every id in [messageIds], grouped /// by message id. Future>> getReactionsForMessages( diff --git a/packages/stream_chat_persistence/lib/src/dao/poll_dao.dart b/packages/stream_chat_persistence/lib/src/dao/poll_dao.dart index 7b4b62699b..b3a070bcdf 100644 --- a/packages/stream_chat_persistence/lib/src/dao/poll_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/poll_dao.dart @@ -84,14 +84,6 @@ class PollDao extends DatabaseAccessor with _$PollDaoMixin { ), ); - /// Returns the list of all the polls stored in db - Future> getPolls() async => Future.wait( - await (select(polls)..orderBy([(it) => OrderingTerm.desc(it.createdAt)])) - .join([leftOuterJoin(users, polls.createdById.equalsExp(users.id))]) - .map(_pollFromJoinRow) - .get(), - ); - /// Deletes all the polls whose [Polls.id] is present in [pollIds] Future deletePollsByIds(List pollIds) => (delete(polls)..where((tbl) => tbl.id.isIn(pollIds))).go(); diff --git a/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart b/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart index 8fa9b6b9ac..075bbe3d35 100644 --- a/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart @@ -14,32 +14,6 @@ class ReactionDao extends DatabaseAccessor with _$ReactionDao /// Creates a new reaction dao instance ReactionDao(super.db); - /// Returns all the reactions of a particular message by matching - /// [Reactions.messageId] with [messageId]. - /// - /// Not used in production — `MessageDao` hydrates via the batched - /// [getReactionsForMessages]. Kept for convenience (tests + ad-hoc - /// single-id lookups). - Future> getReactions(String messageId) { - final where = reactions.messageId.equals(messageId); - return _selectReactions(where); - } - - /// Returns all the reactions of a particular message - /// added by a particular user by matching - /// [Reactions.messageId] with [messageId] and - /// [Reactions.userId] with [userId]. - /// - /// Not used in production — `MessageDao` hydrates via the batched - /// [getReactionsForMessagesByUserId]. Kept for convenience. - Future> getReactionsByUserId( - String messageId, - String userId, - ) { - final where = reactions.messageId.equals(messageId) & reactions.userId.equals(userId); - return _selectReactions(where); - } - /// Returns reactions for every id in [messageIds], grouped by message id. Future>> getReactionsForMessages( List messageIds, diff --git a/packages/stream_chat_persistence/lib/src/dao/read_dao.dart b/packages/stream_chat_persistence/lib/src/dao/read_dao.dart index c6beec0f9f..afe6a93d24 100644 --- a/packages/stream_chat_persistence/lib/src/dao/read_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/read_dao.dart @@ -29,10 +29,6 @@ class ReadDao extends DatabaseAccessor with _$ReadDaoMixin { }) .get(); - /// Updates the read data of a particular channel with - /// the new [readList] data - Future updateReads(String cid, List readList) => bulkUpdateReads({cid: readList}); - /// Bulk updates the reads data of multiple channels Future bulkUpdateReads(Map?> channelWithReads) { final entities = channelWithReads.entries diff --git a/packages/stream_chat_persistence/lib/src/dao/user_dao.dart b/packages/stream_chat_persistence/lib/src/dao/user_dao.dart index 214425d882..dce63aaf15 100644 --- a/packages/stream_chat_persistence/lib/src/dao/user_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/user_dao.dart @@ -19,8 +19,4 @@ class UserDao extends DatabaseAccessor with _$UserDaoMixin { userList.map((u) => u.toEntity()).toList(), ), ); - - /// Returns the list of all the users stored in db - Future> getUsers() => - (select(users)..orderBy([(u) => OrderingTerm.desc(u.createdAt)])).map((it) => it.toUser()).get(); } diff --git a/packages/stream_chat_persistence/test/src/dao/channel_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/channel_dao_test.dart index 44dde6b1f6..2319667376 100644 --- a/packages/stream_chat_persistence/test/src/dao/channel_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/channel_dao_test.dart @@ -68,7 +68,9 @@ void main() { // Saving a dummy member final dummyMember = Member(userId: userId, user: dummyUser); - await database.memberDao.updateMembers(cid, [dummyMember]); + await database.memberDao.bulkUpdateMembers({ + cid: [dummyMember], + }); // Should match the dummy member final updatedMembers = await database.memberDao.getMembersByCid(cid); @@ -78,7 +80,9 @@ void main() { // Saving a dummy message const messageId = 'messageId'; final dummyMessage = Message(id: messageId, user: dummyUser); - await database.messageDao.updateMessages(cid, [dummyMessage]); + await database.messageDao.bulkUpdateMessages({ + cid: [dummyMessage], + }); // Should match the dummy message final updatedMessages = await database.messageDao.getMessagesByCid(cid); @@ -91,7 +95,9 @@ void main() { user: dummyUser, lastReadMessageId: messageId, ); - await database.readDao.updateReads(cid, [dummyRead]); + await database.readDao.bulkUpdateReads({ + cid: [dummyRead], + }); // Should match the dummy read final updatedReads = await database.readDao.getReadsByCid(cid); @@ -103,7 +109,9 @@ void main() { await database.reactionDao.updateReactions([dummyReaction]); // Should match the dummy reaction - final updatedReactions = await database.reactionDao.getReactionsByUserId(messageId, userId); + final updatedReactions = (await database.reactionDao.getReactionsForMessagesByUserId([ + messageId, + ], userId))[messageId]!; expect(updatedReactions.length, 1); expect(updatedReactions.first.messageId, messageId); @@ -127,7 +135,7 @@ void main() { expect(reads, isEmpty); // Fetched readtions for passed message id and user id should be empty - final reactions = await database.reactionDao.getReactionsByUserId(messageId, userId); + final reactions = (await database.reactionDao.getReactionsForMessagesByUserId([messageId], userId))[messageId]!; expect(reactions, isEmpty); }); diff --git a/packages/stream_chat_persistence/test/src/dao/draft_message_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/draft_message_dao_test.dart index db2e0e0918..b912eb3941 100644 --- a/packages/stream_chat_persistence/test/src/dao/draft_message_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/draft_message_dao_test.dart @@ -101,7 +101,7 @@ void main() { await database.channelDao.updateChannels(allChannels); if (withParentMessage || withQuotedMessage) { - await database.messageDao.updateMessages(cid, messages); + await database.messageDao.bulkUpdateMessages({cid: messages}); } if (withPoll && polls != null) { @@ -282,7 +282,9 @@ void main() { await database.userDao.updateUsers([user]); await database.channelDao.updateChannels([ChannelModel(cid: cid)]); - await database.messageDao.updateMessages(cid, [parentMessage]); + await database.messageDao.bulkUpdateMessages({ + cid: [parentMessage], + }); // Create first thread draft final firstDraft = Draft( @@ -383,7 +385,9 @@ void main() { await database.userDao.updateUsers([user]); await database.channelDao.updateChannels([ChannelModel(cid: cid)]); - await database.messageDao.updateMessages(cid, [parentMessage]); + await database.messageDao.bulkUpdateMessages({ + cid: [parentMessage], + }); await draftMessageDao.updateDraftMessages([ Draft( @@ -451,7 +455,7 @@ void main() { await database.userDao.updateUsers([user]); await database.channelDao.updateChannels([ChannelModel(cid: cid)]); - await database.messageDao.updateMessages(cid, messages); + await database.messageDao.bulkUpdateMessages({cid: messages}); // Create a channel draft (no parent message) final channelDraft = Draft( @@ -551,28 +555,32 @@ void main() { ChannelModel(cid: cidA), ChannelModel(cid: cidB), ]); - await database.messageDao.updateMessages(cidA, [ - Message( - id: parentWithDraft, - user: user, - createdAt: DateTime.now(), - text: 'A', - ), - Message( - id: parentWithoutDraft, - user: user, - createdAt: DateTime.now(), - text: 'B', - ), - ]); - await database.messageDao.updateMessages(cidB, [ - Message( - id: parentInOtherChannel, - user: user, - createdAt: DateTime.now(), - text: 'C', - ), - ]); + await database.messageDao.bulkUpdateMessages({ + cidA: [ + Message( + id: parentWithDraft, + user: user, + createdAt: DateTime.now(), + text: 'A', + ), + Message( + id: parentWithoutDraft, + user: user, + createdAt: DateTime.now(), + text: 'B', + ), + ], + }); + await database.messageDao.bulkUpdateMessages({ + cidB: [ + Message( + id: parentInOtherChannel, + user: user, + createdAt: DateTime.now(), + text: 'C', + ), + ], + }); // One draft in cidA on parentWithDraft, and one draft in cidB to // confirm the cid filter excludes it from the cidA lookup. await draftMessageDao.updateDraftMessages([ diff --git a/packages/stream_chat_persistence/test/src/dao/location_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/location_dao_test.dart index 1ff810d5d5..a4bc142b20 100644 --- a/packages/stream_chat_persistence/test/src/dao/location_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/location_dao_test.dart @@ -50,7 +50,7 @@ void main() { await database.userDao.updateUsers(users); await database.channelDao.updateChannels(channels); - await database.messageDao.updateMessages(cid, messages); + await database.messageDao.bulkUpdateMessages({cid: messages}); await locationDao.updateLocations(locations); return locations; @@ -102,7 +102,9 @@ void main() { ); await database.userDao.updateUsers([newUser]); - await database.messageDao.updateMessages(cid, [newMessage]); + await database.messageDao.bulkUpdateMessages({ + cid: [newMessage], + }); await locationDao.updateLocations([newLocation]); // Fetched locations length should be one more than inserted locations diff --git a/packages/stream_chat_persistence/test/src/dao/member_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/member_dao_test.dart index 397e90124b..f6353f52d3 100644 --- a/packages/stream_chat_persistence/test/src/dao/member_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/member_dao_test.dart @@ -39,7 +39,7 @@ void main() { ); await database.userDao.updateUsers(users); await database.channelDao.updateChannels(channels); - await memberDao.updateMembers(cid, memberList); + await memberDao.bulkUpdateMembers({cid: memberList}); return memberList; } @@ -112,9 +112,15 @@ void main() { ChannelModel(cid: cid2), ChannelModel(cid: cid3), ]); - await memberDao.updateMembers(cid1, [memberFor(targetUser)]); - await memberDao.updateMembers(cid2, [memberFor(targetUser)]); - await memberDao.updateMembers(cid3, [memberFor(otherUser)]); + await memberDao.bulkUpdateMembers({ + cid1: [memberFor(targetUser)], + }); + await memberDao.bulkUpdateMembers({ + cid2: [memberFor(targetUser)], + }); + await memberDao.bulkUpdateMembers({ + cid3: [memberFor(otherUser)], + }); // Should return memberships only for channels where target user // is a member, keyed by channelCid. @@ -174,7 +180,9 @@ void main() { updatedAt: DateTime.now(), ); await database.userDao.updateUsers([newUser]); - await memberDao.updateMembers(cid, [copyMember, newMember]); + await memberDao.bulkUpdateMembers({ + cid: [copyMember, newMember], + }); // Fetched member length should be one more than inserted members. // copyMember `banned` modified field should be true. diff --git a/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart index bafbac2f80..fc76f3d9e6 100644 --- a/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/message_dao_test.dart @@ -116,7 +116,7 @@ void main() { ); await database.userDao.updateUsers(users); await database.channelDao.updateChannels(channels); - await messageDao.updateMessages(cid, allMessages); + await messageDao.bulkUpdateMessages({cid: allMessages}); await database.reactionDao.updateReactions([reaction]); return allMessages; } @@ -134,7 +134,7 @@ void main() { final firstMessageId = messages.first.id; // Fetched reactions list should have one reaction for given message id - final reactions = await database.reactionDao.getReactions(firstMessageId); + final reactions = (await database.reactionDao.getReactionsForMessages([firstMessageId]))[firstMessageId]!; expect(reactions.length, 1); // Deleting 2 messages from DB @@ -148,7 +148,7 @@ void main() { expect(newMessages.length, messages.length - 2); // Reaction for the first message should be deleted too - final newReactions = await database.reactionDao.getReactions(firstMessageId); + final newReactions = (await database.reactionDao.getReactionsForMessages([firstMessageId]))[firstMessageId]!; expect(newReactions, isEmpty); }); @@ -171,7 +171,9 @@ void main() { // Fetched reactions list should have one reaction for given message id final cid1firstMessageId = cid1Messages.first.id; - final cid1Reactions = await database.reactionDao.getReactions(cid1firstMessageId); + final cid1Reactions = (await database.reactionDao.getReactionsForMessages([ + cid1firstMessageId, + ]))[cid1firstMessageId]!; expect(cid1Reactions.length, 1); // Deleting all the messages of cid1 @@ -184,7 +186,9 @@ void main() { expect(cid2FetchedMessages, isNotEmpty); // Reaction for the first message should be deleted too - final cid1FetchedReactions = await database.reactionDao.getReactions(cid1firstMessageId); + final cid1FetchedReactions = (await database.reactionDao.getReactionsForMessages([ + cid1firstMessageId, + ]))[cid1firstMessageId]!; expect(cid1FetchedReactions, isEmpty); }, ); @@ -204,10 +208,14 @@ void main() { // Fetched reactions list should have one reaction for given message id final cid1FirstMessageId = cid1Messages.first.id; - final cid1Reactions = await database.reactionDao.getReactions(cid1FirstMessageId); + final cid1Reactions = (await database.reactionDao.getReactionsForMessages([ + cid1FirstMessageId, + ]))[cid1FirstMessageId]!; expect(cid1Reactions.length, 1); final cid2FirstMessageId = cid2Messages.first.id; - final cid2Reactions = await database.reactionDao.getReactions(cid2FirstMessageId); + final cid2Reactions = (await database.reactionDao.getReactionsForMessages([ + cid2FirstMessageId, + ]))[cid2FirstMessageId]!; expect(cid2Reactions.length, 1); // Deleting all the messages of cid1 @@ -220,9 +228,13 @@ void main() { expect(cid2FetchedMessages, isEmpty); // Reaction for the first message should be deleted too - final cid1FetchedReactions = await database.reactionDao.getReactions(cid1FirstMessageId); + final cid1FetchedReactions = (await database.reactionDao.getReactionsForMessages([ + cid1FirstMessageId, + ]))[cid1FirstMessageId]!; expect(cid1FetchedReactions, isEmpty); - final cid2FetchedReactions = await database.reactionDao.getReactions(cid2FirstMessageId); + final cid2FetchedReactions = (await database.reactionDao.getReactionsForMessages([ + cid2FirstMessageId, + ]))[cid2FirstMessageId]!; expect(cid2FetchedReactions, isEmpty); }, ); @@ -611,14 +623,16 @@ void main() { text: id, ); - await messageDao.updateMessages(cid, [ - parent(), - reply('reply_pre', earlier), - reply('reply_tieA', tie), - reply('reply_tieB', tie), - reply('reply_tieC', tie), - reply('reply_post', later), - ]); + await messageDao.bulkUpdateMessages({ + cid: [ + parent(), + reply('reply_pre', earlier), + reply('reply_tieA', tie), + reply('reply_tieB', tie), + reply('reply_tieC', tie), + reply('reply_post', later), + ], + }); final before = await messageDao.getThreadMessagesByParentId( parentId, @@ -957,13 +971,15 @@ void main() { text: id, ); - await messageDao.updateMessages(cid, [ - m('msg_pre', earlier), - m('msg_tieA', tie), - m('msg_tieB', tie), - m('msg_tieC', tie), - m('msg_post', later), - ]); + await messageDao.bulkUpdateMessages({ + cid: [ + m('msg_pre', earlier), + m('msg_tieA', tie), + m('msg_tieB', tie), + m('msg_tieC', tie), + m('msg_post', later), + ], + }); final before = await messageDao.getMessagesByCid( cid, @@ -1034,7 +1050,9 @@ void main() { pinnedBy: User(id: 'testUserId4'), ); - await messageDao.updateMessages(cid, [copyMessage, newMessage]); + await messageDao.bulkUpdateMessages({ + cid: [copyMessage, newMessage], + }); // Fetched messages length should be one more than inserted message. // copyMessage `showInChannel` modified field should be false. @@ -1067,14 +1085,16 @@ void main() { final otherUser = User(id: 'otherUser'); await database.userDao.updateUsers([dbUser, otherUser]); - await messageDao.updateMessages(cid, [ - Message( - id: messageId, - user: dbUser, - text: 'Hello', - createdAt: DateTime.now(), - ), - ]); + await messageDao.bulkUpdateMessages({ + cid: [ + Message( + id: messageId, + user: dbUser, + text: 'Hello', + createdAt: DateTime.now(), + ), + ], + }); // 2 reactions by the DB user, 1 by another user. await database.reactionDao.updateReactions([ @@ -1128,7 +1148,7 @@ void main() { createdAt: baseTime.add(Duration(seconds: i)), ), ); - await messageDao.updateMessages(cid, messages); + await messageDao.bulkUpdateMessages({cid: messages}); // 2 reactions per message, distinct types per-row. final reactions = [ @@ -1183,15 +1203,17 @@ void main() { ); await database.pollDao.updatePolls([poll]); - await messageDao.updateMessages(cid, [ - Message( - id: messageId, - user: dbUser, - text: 'Vote please', - createdAt: DateTime.now(), - pollId: pollId, - ), - ]); + await messageDao.bulkUpdateMessages({ + cid: [ + Message( + id: messageId, + user: dbUser, + text: 'Vote please', + createdAt: DateTime.now(), + pollId: pollId, + ), + ], + }); // 2 own votes (one per option), 2 other-user votes, 1 own answer. await database.pollVoteDao.updatePollVotes([ @@ -1263,14 +1285,16 @@ void main() { await database.userDao.updateUsers([dbUser]); const parentId = 'msg-with-draft'; - await messageDao.updateMessages(cid, [ - Message( - id: parentId, - user: dbUser, - text: 'msg', - createdAt: DateTime.now(), - ), - ]); + await messageDao.bulkUpdateMessages({ + cid: [ + Message( + id: parentId, + user: dbUser, + text: 'msg', + createdAt: DateTime.now(), + ), + ], + }); await database.draftMessageDao.updateDraftMessages([ Draft( @@ -1318,22 +1342,24 @@ void main() { await database.pollDao.updatePolls([poll]); final baseTime = DateTime.now(); - await messageDao.updateMessages(cid, [ - Message( - id: quotedMessageId, - user: dbUser, - text: 'first', - createdAt: baseTime, - pollId: pollId, - ), - Message( - id: quotingMessageId, - user: dbUser, - text: 'second', - createdAt: baseTime.add(const Duration(seconds: 1)), - quotedMessageId: quotedMessageId, - ), - ]); + await messageDao.bulkUpdateMessages({ + cid: [ + Message( + id: quotedMessageId, + user: dbUser, + text: 'first', + createdAt: baseTime, + pollId: pollId, + ), + Message( + id: quotingMessageId, + user: dbUser, + text: 'second', + createdAt: baseTime.add(const Duration(seconds: 1)), + quotedMessageId: quotedMessageId, + ), + ], + }); await database.reactionDao.updateReactions([ Reaction( @@ -1360,28 +1386,30 @@ void main() { await database.userDao.updateUsers([dbUser]); final baseTime = DateTime.now(); - await messageDao.updateMessages(cid, [ - Message( - id: 'C', - user: dbUser, - text: 'root', - createdAt: baseTime, - ), - Message( - id: 'B', - user: dbUser, - text: 'mid', - createdAt: baseTime.add(const Duration(seconds: 1)), - quotedMessageId: 'C', - ), - Message( - id: 'A', - user: dbUser, - text: 'top', - createdAt: baseTime.add(const Duration(seconds: 2)), - quotedMessageId: 'B', - ), - ]); + await messageDao.bulkUpdateMessages({ + cid: [ + Message( + id: 'C', + user: dbUser, + text: 'root', + createdAt: baseTime, + ), + Message( + id: 'B', + user: dbUser, + text: 'mid', + createdAt: baseTime.add(const Duration(seconds: 1)), + quotedMessageId: 'C', + ), + Message( + id: 'A', + user: dbUser, + text: 'top', + createdAt: baseTime.add(const Duration(seconds: 2)), + quotedMessageId: 'B', + ), + ], + }); final fetched = await messageDao.getMessagesByCid(cid); final top = fetched.firstWhere((m) => m.id == 'A'); @@ -1399,21 +1427,23 @@ void main() { const quotingId = 'msg-quoting-no-draft'; final baseTime = DateTime.now(); - await messageDao.updateMessages(cid, [ - Message( - id: quotedId, - user: dbUser, - text: 'quoted', - createdAt: baseTime, - ), - Message( - id: quotingId, - user: dbUser, - text: 'quoting', - createdAt: baseTime.add(const Duration(seconds: 1)), - quotedMessageId: quotedId, - ), - ]); + await messageDao.bulkUpdateMessages({ + cid: [ + Message( + id: quotedId, + user: dbUser, + text: 'quoted', + createdAt: baseTime, + ), + Message( + id: quotingId, + user: dbUser, + text: 'quoting', + createdAt: baseTime.add(const Duration(seconds: 1)), + quotedMessageId: quotedId, + ), + ], + }); await database.draftMessageDao.updateDraftMessages([ Draft( @@ -1450,7 +1480,7 @@ void main() { createdAt: baseTime.add(Duration(seconds: i)), ), ); - await messageDao.updateMessages(cid, messages); + await messageDao.bulkUpdateMessages({cid: messages}); // 2 reactions per message; surviving rows after pagination must still // carry their full reaction set. @@ -1493,14 +1523,16 @@ void main() { await database.userDao.updateUsers([dbUser]); const messageId = 'msg-with-location'; - await messageDao.updateMessages(cid, [ - Message( - id: messageId, - user: dbUser, - text: 'pin drop', - createdAt: DateTime.now(), - ), - ]); + await messageDao.bulkUpdateMessages({ + cid: [ + Message( + id: messageId, + user: dbUser, + text: 'pin drop', + createdAt: DateTime.now(), + ), + ], + }); await database.locationDao.updateLocations([ Location( @@ -1547,7 +1579,7 @@ void main() { createdAt: baseTime.add(Duration(seconds: i)), ), ); - await messageDao.updateMessages(cid, messages); + await messageDao.bulkUpdateMessages({cid: messages}); // Locations only on messages 1 and 3; messages 0 and 2 have none. await database.locationDao.updateLocations([ @@ -1605,21 +1637,23 @@ void main() { const quotedId = 'msg-quoted-loc'; const quotingId = 'msg-quoting-no-loc'; final baseTime = DateTime.now(); - await messageDao.updateMessages(cid, [ - Message( - id: quotedId, - user: dbUser, - text: 'here I am', - createdAt: baseTime, - ), - Message( - id: quotingId, - user: dbUser, - text: 'see above', - createdAt: baseTime.add(const Duration(seconds: 1)), - quotedMessageId: quotedId, - ), - ]); + await messageDao.bulkUpdateMessages({ + cid: [ + Message( + id: quotedId, + user: dbUser, + text: 'here I am', + createdAt: baseTime, + ), + Message( + id: quotingId, + user: dbUser, + text: 'see above', + createdAt: baseTime.add(const Duration(seconds: 1)), + quotedMessageId: quotedId, + ), + ], + }); await database.locationDao.updateLocations([ Location( diff --git a/packages/stream_chat_persistence/test/src/dao/pinned_message_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/pinned_message_dao_test.dart index 7812bc5435..2405eaf2e3 100644 --- a/packages/stream_chat_persistence/test/src/dao/pinned_message_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/pinned_message_dao_test.dart @@ -101,7 +101,7 @@ void main() { ); await database.userDao.updateUsers(users); await database.channelDao.updateChannels(channels); - await pinnedMessageDao.updateMessages(cid, allMessages); + await pinnedMessageDao.bulkUpdateMessages({cid: allMessages}); await database.pinnedMessageReactionDao.updateReactions([reaction]); return allMessages; } @@ -119,7 +119,9 @@ void main() { final firstMessageId = messages.first.id; // Fetched reactions list should have one reaction for given message id - final reactions = await database.pinnedMessageReactionDao.getReactions(firstMessageId); + final reactions = (await database.pinnedMessageReactionDao.getReactionsForMessages([ + firstMessageId, + ]))[firstMessageId]!; expect(reactions.length, 1); // Deleting 2 messages from DB @@ -133,7 +135,9 @@ void main() { expect(newMessages.length, messages.length - 2); // Reaction for the first message should be deleted too - final newReactions = await database.pinnedMessageReactionDao.getReactions(firstMessageId); + final newReactions = (await database.pinnedMessageReactionDao.getReactionsForMessages([ + firstMessageId, + ]))[firstMessageId]!; expect(newReactions, isEmpty); }); @@ -156,7 +160,9 @@ void main() { // Fetched reactions list should have one reaction for given message id final cid1firstMessageId = cid1Messages.first.id; - final cid1Reactions = await database.pinnedMessageReactionDao.getReactions(cid1firstMessageId); + final cid1Reactions = (await database.pinnedMessageReactionDao.getReactionsForMessages([ + cid1firstMessageId, + ]))[cid1firstMessageId]!; expect(cid1Reactions.length, 1); // Deleting all the messages of cid1 @@ -169,7 +175,9 @@ void main() { expect(cid2FetchedMessages, isNotEmpty); // Reaction for the first message should be deleted too - final cid1FetchedReactions = await database.pinnedMessageReactionDao.getReactions(cid1firstMessageId); + final cid1FetchedReactions = (await database.pinnedMessageReactionDao.getReactionsForMessages([ + cid1firstMessageId, + ]))[cid1firstMessageId]!; expect(cid1FetchedReactions, isEmpty); }, ); @@ -189,10 +197,14 @@ void main() { // Fetched reactions list should have one reaction for given message id final cid1FirstMessageId = cid1Messages.first.id; - final cid1Reactions = await database.pinnedMessageReactionDao.getReactions(cid1FirstMessageId); + final cid1Reactions = (await database.pinnedMessageReactionDao.getReactionsForMessages([ + cid1FirstMessageId, + ]))[cid1FirstMessageId]!; expect(cid1Reactions.length, 1); final cid2FirstMessageId = cid2Messages.first.id; - final cid2Reactions = await database.pinnedMessageReactionDao.getReactions(cid2FirstMessageId); + final cid2Reactions = (await database.pinnedMessageReactionDao.getReactionsForMessages([ + cid2FirstMessageId, + ]))[cid2FirstMessageId]!; expect(cid2Reactions.length, 1); // Deleting all the messages of cid1 @@ -205,9 +217,13 @@ void main() { expect(cid2FetchedMessages, isEmpty); // Reaction for the first message should be deleted too - final cid1FetchedReactions = await database.pinnedMessageReactionDao.getReactions(cid1FirstMessageId); + final cid1FetchedReactions = (await database.pinnedMessageReactionDao.getReactionsForMessages([ + cid1FirstMessageId, + ]))[cid1FirstMessageId]!; expect(cid1FetchedReactions, isEmpty); - final cid2FetchedReactions = await database.pinnedMessageReactionDao.getReactions(cid2FirstMessageId); + final cid2FetchedReactions = (await database.pinnedMessageReactionDao.getReactionsForMessages([ + cid2FirstMessageId, + ]))[cid2FirstMessageId]!; expect(cid2FetchedReactions, isEmpty); }, ); @@ -231,77 +247,6 @@ void main() { expect(fetchedMessage!.id, insertedMessages.first.id); }); - test('getThreadMessages', () async { - const cid = 'test:Cid'; - - // Messages should be empty initially - final messages = await pinnedMessageDao.getThreadMessages(cid); - expect(messages, isEmpty); - - // Preparing test data - final insertedMessages = await _prepareTestData(cid, threads: true); - expect(insertedMessages, isNotEmpty); - - // Should fetch all the thread messages of cid - final threadMessages = await pinnedMessageDao.getThreadMessages(cid); - expect(threadMessages, isNotEmpty); - for (final message in threadMessages) { - expect(message.parentId, isNotNull); - } - }); - - test('getThreadMessagesByParentId', () async { - const cid = 'test:Cid'; - const parentId = 'testMessageId${cid}0'; - - // Messages should be empty initially - final messages = await pinnedMessageDao.getThreadMessagesByParentId(parentId); - expect(messages, isEmpty); - - // Preparing test data - final insertedMessages = await _prepareTestData(cid, threads: true); - expect(insertedMessages, isNotEmpty); - - // Should fetch all the thread messages of parentId - final threadMessages = await pinnedMessageDao.getThreadMessagesByParentId(parentId); - expect(threadMessages.length, 1); - expect(threadMessages.first.parentId, parentId); - }); - - test('getThreadMessagesByParentId along with pagination', () async { - const cid = 'test:Cid'; - const parentId = 'testMessageId${cid}0'; - const options = PaginationParams( - limit: 15, - lessThan: 'testThreadMessageId${cid}25', - greaterThanOrEqual: 'testThreadMessageId${cid}5', - ); - - // Messages should be empty initially - final messages = await pinnedMessageDao.getThreadMessagesByParentId( - parentId, - options: options, - ); - expect(messages, isEmpty); - - // Preparing test data - final insertedMessages = await _prepareTestData( - cid, - threads: true, - mapAllThreadToFirstMessage: true, - count: 30, - ); - expect(insertedMessages, isNotEmpty); - - // Should fetch all the thread messages of parentId and apply the pagination - final threadMessages = await pinnedMessageDao.getThreadMessagesByParentId( - parentId, - options: options, - ); - expect(threadMessages.length, 15); - expect(threadMessages.first.parentId, parentId); - }); - test('getMessagesByCid', () async { const cid = 'test:Cid'; @@ -601,13 +546,15 @@ void main() { text: id, ); - await pinnedMessageDao.updateMessages(cid, [ - m('msg_pre', earlier), - m('msg_tieA', tie), - m('msg_tieB', tie), - m('msg_tieC', tie), - m('msg_post', later), - ]); + await pinnedMessageDao.bulkUpdateMessages({ + cid: [ + m('msg_pre', earlier), + m('msg_tieA', tie), + m('msg_tieB', tie), + m('msg_tieC', tie), + m('msg_post', later), + ], + }); final before = await pinnedMessageDao.getMessagesByCid( cid, @@ -678,7 +625,9 @@ void main() { pinnedBy: User(id: 'testUserId4'), ); - await pinnedMessageDao.updateMessages(cid, [copyMessage, newMessage]); + await pinnedMessageDao.bulkUpdateMessages({ + cid: [copyMessage, newMessage], + }); // Fetched messages length should be one more than inserted message. // copyMessage `showInChannel` modified field should be false. @@ -713,14 +662,16 @@ void main() { final otherUser = User(id: 'otherUser'); await database.userDao.updateUsers([dbUser, otherUser]); - await pinnedMessageDao.updateMessages(cid, [ - Message( - id: messageId, - user: dbUser, - text: 'Hello', - createdAt: DateTime.now(), - ), - ]); + await pinnedMessageDao.bulkUpdateMessages({ + cid: [ + Message( + id: messageId, + user: dbUser, + text: 'Hello', + createdAt: DateTime.now(), + ), + ], + }); await database.pinnedMessageReactionDao.updateReactions([ Reaction( @@ -768,7 +719,7 @@ void main() { createdAt: baseTime.add(Duration(seconds: i)), ), ); - await pinnedMessageDao.updateMessages(cid, messages); + await pinnedMessageDao.bulkUpdateMessages({cid: messages}); final reactions = [ for (var i = 0; i < messages.length; i++) ...[ @@ -824,15 +775,17 @@ void main() { ), ]); - await pinnedMessageDao.updateMessages(cid, [ - Message( - id: messageId, - user: dbUser, - text: 'Vote please', - createdAt: DateTime.now(), - pollId: pollId, - ), - ]); + await pinnedMessageDao.bulkUpdateMessages({ + cid: [ + Message( + id: messageId, + user: dbUser, + text: 'Vote please', + createdAt: DateTime.now(), + pollId: pollId, + ), + ], + }); await database.pollVoteDao.updatePollVotes([ PollVote( @@ -887,8 +840,12 @@ void main() { // Pin the message and ALSO insert it into the main `messages` table: // `DraftMessages.parentId` is FK-referenced against `Messages.id`, not // `PinnedMessages.id`, so a thread draft needs the row in both places. - await pinnedMessageDao.updateMessages(cid, [parentMessage]); - await database.messageDao.updateMessages(cid, [parentMessage]); + await pinnedMessageDao.bulkUpdateMessages({ + cid: [parentMessage], + }); + await database.messageDao.bulkUpdateMessages({ + cid: [parentMessage], + }); await database.draftMessageDao.updateDraftMessages([ Draft( @@ -935,22 +892,24 @@ void main() { ]); final baseTime = DateTime.now(); - await pinnedMessageDao.updateMessages(cid, [ - Message( - id: quotedMessageId, - user: dbUser, - text: 'first', - createdAt: baseTime, - pollId: pollId, - ), - Message( - id: quotingMessageId, - user: dbUser, - text: 'second', - createdAt: baseTime.add(const Duration(seconds: 1)), - quotedMessageId: quotedMessageId, - ), - ]); + await pinnedMessageDao.bulkUpdateMessages({ + cid: [ + Message( + id: quotedMessageId, + user: dbUser, + text: 'first', + createdAt: baseTime, + pollId: pollId, + ), + Message( + id: quotingMessageId, + user: dbUser, + text: 'second', + createdAt: baseTime.add(const Duration(seconds: 1)), + quotedMessageId: quotedMessageId, + ), + ], + }); await database.pinnedMessageReactionDao.updateReactions([ Reaction( @@ -977,28 +936,30 @@ void main() { await database.userDao.updateUsers([dbUser]); final baseTime = DateTime.now(); - await pinnedMessageDao.updateMessages(cid, [ - Message( - id: 'pC', - user: dbUser, - text: 'root', - createdAt: baseTime, - ), - Message( - id: 'pB', - user: dbUser, - text: 'mid', - createdAt: baseTime.add(const Duration(seconds: 1)), - quotedMessageId: 'pC', - ), - Message( - id: 'pA', - user: dbUser, - text: 'top', - createdAt: baseTime.add(const Duration(seconds: 2)), - quotedMessageId: 'pB', - ), - ]); + await pinnedMessageDao.bulkUpdateMessages({ + cid: [ + Message( + id: 'pC', + user: dbUser, + text: 'root', + createdAt: baseTime, + ), + Message( + id: 'pB', + user: dbUser, + text: 'mid', + createdAt: baseTime.add(const Duration(seconds: 1)), + quotedMessageId: 'pC', + ), + Message( + id: 'pA', + user: dbUser, + text: 'top', + createdAt: baseTime.add(const Duration(seconds: 2)), + quotedMessageId: 'pB', + ), + ], + }); final fetched = await pinnedMessageDao.getMessagesByCid(cid); final top = fetched.firstWhere((m) => m.id == 'pA'); @@ -1030,10 +991,14 @@ void main() { quotedMessageId: quotedId, ); - await pinnedMessageDao.updateMessages(cid, [quotedMessage, quotingMessage]); + await pinnedMessageDao.bulkUpdateMessages({ + cid: [quotedMessage, quotingMessage], + }); // `DraftMessages.parentId` is FK-referenced against `Messages.id`, not // `PinnedMessages.id`, so the parent of the draft needs a row in both. - await database.messageDao.updateMessages(cid, [quotedMessage]); + await database.messageDao.bulkUpdateMessages({ + cid: [quotedMessage], + }); await database.draftMessageDao.updateDraftMessages([ Draft( @@ -1071,8 +1036,12 @@ void main() { // `Locations.messageId` is FK-referenced against `Messages.id`, so the // pinned row alone isn't enough — insert into the main `messages` table // too. - await pinnedMessageDao.updateMessages(cid, [pinnedMessage]); - await database.messageDao.updateMessages(cid, [pinnedMessage]); + await pinnedMessageDao.bulkUpdateMessages({ + cid: [pinnedMessage], + }); + await database.messageDao.bulkUpdateMessages({ + cid: [pinnedMessage], + }); await database.locationDao.updateLocations([ Location( @@ -1119,9 +1088,9 @@ void main() { createdAt: baseTime.add(Duration(seconds: i)), ), ); - await pinnedMessageDao.updateMessages(cid, messages); + await pinnedMessageDao.bulkUpdateMessages({cid: messages}); // Locations FK against `Messages.id`, so mirror the rows there. - await database.messageDao.updateMessages(cid, messages); + await database.messageDao.bulkUpdateMessages({cid: messages}); // Locations only on messages 1 and 3; messages 0 and 2 have none. await database.locationDao.updateLocations([ @@ -1192,9 +1161,13 @@ void main() { createdAt: baseTime.add(const Duration(seconds: 1)), quotedMessageId: quotedId, ); - await pinnedMessageDao.updateMessages(cid, [quotedMessage, quotingMessage]); + await pinnedMessageDao.bulkUpdateMessages({ + cid: [quotedMessage, quotingMessage], + }); // Locations FK against `Messages.id`. - await database.messageDao.updateMessages(cid, [quotedMessage]); + await database.messageDao.bulkUpdateMessages({ + cid: [quotedMessage], + }); await database.locationDao.updateLocations([ Location( @@ -1237,7 +1210,7 @@ void main() { createdAt: baseTime.add(Duration(seconds: i)), ), ); - await pinnedMessageDao.updateMessages(cid, messages); + await pinnedMessageDao.bulkUpdateMessages({cid: messages}); // 2 reactions per message; surviving rows after pagination must still // carry their full reaction set. diff --git a/packages/stream_chat_persistence/test/src/dao/pinned_message_reaction_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/pinned_message_reaction_dao_test.dart index 7fd7819ba6..5de47893cf 100644 --- a/packages/stream_chat_persistence/test/src/dao/pinned_message_reaction_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/pinned_message_reaction_dao_test.dart @@ -61,73 +61,14 @@ void main() { await database.userDao.updateUsers(users); await database.channelDao.updateChannels(channels); - await database.pinnedMessageDao.updateMessages(cid, [message]); + await database.pinnedMessageDao.bulkUpdateMessages({ + cid: [message], + }); await pinnedMessageReactionDao.updateReactions(reactions); return reactions; } - test('getReactions', () async { - const messageId = 'testMessageId'; - - // Should be empty initially - final reactions = await pinnedMessageReactionDao.getReactions(messageId); - expect(reactions, isEmpty); - - // Adding sample reactions - final insertedReactions = await _prepareReactionData(messageId); - expect(insertedReactions, isNotEmpty); - - // Fetched reaction length should match inserted reactions length. - // Every reaction messageId should match the provided messageId. - final fetchedReactions = await pinnedMessageReactionDao.getReactions(messageId); - expect(fetchedReactions.length, insertedReactions.length); - expect(fetchedReactions.every((it) => it.messageId == messageId), true); - - // Verify score and emojiCode are preserved - for (var i = 0; i < fetchedReactions.length; i++) { - final inserted = insertedReactions[i]; - final fetched = fetchedReactions[i]; - expect(fetched.score, inserted.score); - expect(fetched.emojiCode, inserted.emojiCode); - } - }); - - test('getReactionsByUserId', () async { - const messageId = 'testMessageId'; - const userId = 'testUserId'; - const otherUserId = 'otherUserid'; - - // Should be empty initially - final reactions = await pinnedMessageReactionDao.getReactionsByUserId(messageId, userId); - expect(reactions, isEmpty); - - // Adding sample reactions from the target user. - final insertedReactions = await _prepareReactionData(messageId, userId: userId); - expect(insertedReactions, isNotEmpty); - - // Adding sample reactions from other users on the same message. - final otherInsertedReactions = await _prepareReactionData(messageId, userId: otherUserId); - expect(otherInsertedReactions, isNotEmpty); - - // Fetched reaction length should match the target user's reactions only. - // Every reaction messageId should match the provided messageId. - // Every reaction userId should match the provided userId — i.e. reactions - // from other users on the same message must be filtered out. - final fetchedReactions = await pinnedMessageReactionDao.getReactionsByUserId(messageId, userId); - expect(fetchedReactions.length, insertedReactions.length); - expect(fetchedReactions.every((it) => it.messageId == messageId), true); - expect(fetchedReactions.every((it) => it.userId == userId), true); - - // Verify score and emojiCode are preserved - for (var i = 0; i < fetchedReactions.length; i++) { - final inserted = insertedReactions[i]; - final fetched = fetchedReactions[i]; - expect(fetched.score, inserted.score); - expect(fetched.emojiCode, inserted.emojiCode); - } - }); - test('updateReactions', () async { const messageId = 'testMessageId'; @@ -157,7 +98,9 @@ void main() { // Fetched reaction length should be one more than inserted reactions. // copyReaction modified fields should match // Fetched reactions should contain the newReaction. - final fetchedReactions = await pinnedMessageReactionDao.getReactions(messageId); + final fetchedReactions = (await pinnedMessageReactionDao.getReactionsForMessages( + [messageId], + ))[messageId]!; expect(fetchedReactions.length, reactions.length + 1); final fetchedCopyReaction = fetchedReactions.firstWhere( @@ -177,15 +120,17 @@ void main() { ); }); - test('getReactions returns empty for a message id with no reactions, ' - 'even when reactions exist for other messages', () async { + test('getReactionsForMessages returns empty list for a message id with no ' + 'reactions, even when reactions exist for other messages', () async { const messageWithReactions = 'pmsg-A'; const messageWithoutReactions = 'pmsg-B'; await _prepareReactionData(messageWithReactions); - final fetched = await pinnedMessageReactionDao.getReactions(messageWithoutReactions); - expect(fetched, isEmpty); + final fetched = await pinnedMessageReactionDao.getReactionsForMessages( + const [messageWithoutReactions], + ); + expect(fetched[messageWithoutReactions], isEmpty); }); group('deleteReactionsByMessageIds', () { @@ -198,19 +143,21 @@ void main() { // Fetched reaction list length should match // the inserted reactions list length - final reactions1 = await pinnedMessageReactionDao.getReactions(messageId1); - final reactions2 = await pinnedMessageReactionDao.getReactions(messageId2); - expect(reactions1.length, insertedReactions1.length); - expect(reactions2.length, insertedReactions2.length); + final reactions = await pinnedMessageReactionDao.getReactionsForMessages( + [messageId1, messageId2], + ); + expect(reactions[messageId1]!.length, insertedReactions1.length); + expect(reactions[messageId2]!.length, insertedReactions2.length); // Deleting all the reactions of messageId1 await pinnedMessageReactionDao.deleteReactionsByMessageIds([messageId1]); // Fetched reactions length of only messageId1 should be empty - final fetchedReactions1 = await pinnedMessageReactionDao.getReactions(messageId1); - final fetchedReactions2 = await pinnedMessageReactionDao.getReactions(messageId2); - expect(fetchedReactions1, isEmpty); - expect(fetchedReactions2, isNotEmpty); + final fetched = await pinnedMessageReactionDao.getReactionsForMessages( + [messageId1, messageId2], + ); + expect(fetched[messageId1], isEmpty); + expect(fetched[messageId2], isNotEmpty); }); test('should delete all the reactions of both message', () async { @@ -220,19 +167,23 @@ void main() { // Fetched reaction list length should match // the inserted reactions list length - final reactions1 = await pinnedMessageReactionDao.getReactions(messageId1); - final reactions2 = await pinnedMessageReactionDao.getReactions(messageId2); - expect(reactions1.length, insertedReactions1.length); - expect(reactions2.length, insertedReactions2.length); + final reactions = await pinnedMessageReactionDao.getReactionsForMessages( + [messageId1, messageId2], + ); + expect(reactions[messageId1]!.length, insertedReactions1.length); + expect(reactions[messageId2]!.length, insertedReactions2.length); // Deleting all the reactions of messageId1 and messageId2 - await pinnedMessageReactionDao.deleteReactionsByMessageIds([messageId1, messageId2]); + await pinnedMessageReactionDao.deleteReactionsByMessageIds( + [messageId1, messageId2], + ); // Fetched reactions length of both messages should be empty - final fetchedReactions1 = await pinnedMessageReactionDao.getReactions(messageId1); - final fetchedReactions2 = await pinnedMessageReactionDao.getReactions(messageId2); - expect(fetchedReactions1, isEmpty); - expect(fetchedReactions2, isEmpty); + final fetched = await pinnedMessageReactionDao.getReactionsForMessages( + [messageId1, messageId2], + ); + expect(fetched[messageId1], isEmpty); + expect(fetched[messageId2], isEmpty); }); }); diff --git a/packages/stream_chat_persistence/test/src/dao/poll_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/poll_dao_test.dart index 8d22fe38e6..9a6ebfa5c5 100644 --- a/packages/stream_chat_persistence/test/src/dao/poll_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/poll_dao_test.dart @@ -86,20 +86,6 @@ void main() { return polls; } - test('getPolls', () async { - // Should be empty initially - final polls = await pollDao.getPolls(); - expect(polls, isEmpty); - - // Adding sample polls - final insertedPolls = await _preparePollData(); - expect(insertedPolls, isNotEmpty); - - // Fetched polls length should match inserted polls length. - final fetchedPollVotes = await pollDao.getPolls(); - expect(fetchedPollVotes.length, insertedPolls.length); - }); - test('updatePolls', () async { // Preparing test data final insertedPolls = await _preparePollData(); @@ -109,11 +95,11 @@ void main() { await pollDao.updatePolls([newPoll]); - // Fetched users length should be one more than inserted users. // Fetched users should contain the newUser. - final fetchedPolls = await pollDao.getPolls(); - expect(fetchedPolls.length, insertedPolls.length + 1); - expect(fetchedPolls.any((it) => it.id == newPoll.id), isTrue); + final ids = [...insertedPolls.map((it) => it.id), newPoll.id]; + final fetchedPolls = await pollDao.getPollsByIds(ids); + expect(fetchedPolls.values.whereType(), hasLength(ids.length)); + expect(fetchedPolls[newPoll.id], isNotNull); }); test('getPollById', () async { @@ -210,9 +196,13 @@ void main() { await pollDao.deletePollsByIds([pollToDelete.id]); // Fetched poll list should be one less than inserted polls. - final fetchedPolls = await pollDao.getPolls(); - expect(fetchedPolls.length, insertedPolls.length - 1); - expect(fetchedPolls.any((it) => it.id == pollToDelete.id), isFalse); + final ids = insertedPolls.map((it) => it.id).toList(); + final fetchedPolls = await pollDao.getPollsByIds(ids); + expect(fetchedPolls[pollToDelete.id], isNull); + expect( + fetchedPolls.values.whereType(), + hasLength(insertedPolls.length - 1), + ); }); test('deleting a poll should also delete its votes', () async { @@ -228,9 +218,13 @@ void main() { await pollDao.deletePollsByIds([pollToDelete.id]); // Fetched poll list should be one less than inserted polls. - final fetchedPolls = await pollDao.getPolls(); - expect(fetchedPolls.length, insertedPolls.length - 1); - expect(fetchedPolls.any((it) => it.id == pollToDelete.id), isFalse); + final ids = insertedPolls.map((it) => it.id).toList(); + final fetchedPolls = await pollDao.getPollsByIds(ids); + expect(fetchedPolls[pollToDelete.id], isNull); + expect( + fetchedPolls.values.whereType(), + hasLength(insertedPolls.length - 1), + ); // Fetched poll votes should be empty final fetchedPollVotes = await database.pollVoteDao.getPollVotes( diff --git a/packages/stream_chat_persistence/test/src/dao/reaction_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/reaction_dao_test.dart index 6689110853..bd2205777f 100644 --- a/packages/stream_chat_persistence/test/src/dao/reaction_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/reaction_dao_test.dart @@ -61,73 +61,14 @@ void main() { await database.userDao.updateUsers(users); await database.channelDao.updateChannels(channels); - await database.messageDao.updateMessages(cid, [message]); + await database.messageDao.bulkUpdateMessages({ + cid: [message], + }); await reactionDao.updateReactions(reactions); return reactions; } - test('getReactions', () async { - const messageId = 'testMessageId'; - - // Should be empty initially - final reactions = await reactionDao.getReactions(messageId); - expect(reactions, isEmpty); - - // Adding sample reactions - final insertedReactions = await _prepareReactionData(messageId); - expect(insertedReactions, isNotEmpty); - - // Fetched reaction length should match inserted reactions length. - // Every reaction messageId should match the provided messageId. - final fetchedReactions = await reactionDao.getReactions(messageId); - expect(fetchedReactions.length, insertedReactions.length); - expect(fetchedReactions.every((it) => it.messageId == messageId), true); - - // Verify score and emojiCode are preserved - for (var i = 0; i < fetchedReactions.length; i++) { - final inserted = insertedReactions[i]; - final fetched = fetchedReactions[i]; - expect(fetched.score, inserted.score); - expect(fetched.emojiCode, inserted.emojiCode); - } - }); - - test('getReactionsByUserId', () async { - const messageId = 'testMessageId'; - const userId = 'testUserId'; - const otherUserId = 'otherUserid'; - - // Should be empty initially - final reactions = await reactionDao.getReactionsByUserId(messageId, userId); - expect(reactions, isEmpty); - - // Adding sample reactions from the target user. - final insertedReactions = await _prepareReactionData(messageId, userId: userId); - expect(insertedReactions, isNotEmpty); - - // Adding sample reactions from other users on the same message. - final otherInsertedReactions = await _prepareReactionData(messageId, userId: otherUserId); - expect(otherInsertedReactions, isNotEmpty); - - // Fetched reaction length should match the target user's reactions only. - // Every reaction messageId should match the provided messageId. - // Every reaction userId should match the provided userId — i.e. reactions - // from other users on the same message must be filtered out. - final fetchedReactions = await reactionDao.getReactionsByUserId(messageId, userId); - expect(fetchedReactions.length, insertedReactions.length); - expect(fetchedReactions.every((it) => it.messageId == messageId), true); - expect(fetchedReactions.every((it) => it.userId == userId), true); - - // Verify score and emojiCode are preserved - for (var i = 0; i < fetchedReactions.length; i++) { - final inserted = insertedReactions[i]; - final fetched = fetchedReactions[i]; - expect(fetched.score, inserted.score); - expect(fetched.emojiCode, inserted.emojiCode); - } - }); - test('updateReactions', () async { const messageId = 'testMessageId'; @@ -157,7 +98,9 @@ void main() { // Fetched reaction length should be one more than inserted reactions. // copyReaction modified fields should match // Fetched reactions should contain the newReaction. - final fetchedReactions = await reactionDao.getReactions(messageId); + final fetchedReactions = (await reactionDao.getReactionsForMessages( + [messageId], + ))[messageId]!; expect(fetchedReactions.length, reactions.length + 1); final fetchedCopyReaction = fetchedReactions.firstWhere( @@ -198,7 +141,7 @@ void main() { createdAt: baseTime.add(Duration(seconds: i)), ), ); - await database.messageDao.updateMessages(cid, messages); + await database.messageDao.bulkUpdateMessages({cid: messages}); // Seed 1 reaction on every odd-indexed message (600 total) so we can // verify both that the chunked query returns rows AND that ids without @@ -237,17 +180,19 @@ void main() { expect(empty, total ~/ 2); }); - test('getReactions returns empty for a message id with no reactions, ' - 'even when reactions exist for other messages', () async { - // Locks per-id isolation: the upcoming batched `WHERE messageId IN (...)` - // path must not leak rows across ids when only one is queried. + test('getReactionsForMessages returns empty list for a message id with no ' + 'reactions, even when reactions exist for other messages', () async { + // Locks per-id isolation: the batched `WHERE messageId IN (...)` + // path must not leak rows across ids. const messageWithReactions = 'msg-A'; const messageWithoutReactions = 'msg-B'; await _prepareReactionData(messageWithReactions); - final fetched = await reactionDao.getReactions(messageWithoutReactions); - expect(fetched, isEmpty); + final fetched = await reactionDao.getReactionsForMessages( + const [messageWithoutReactions], + ); + expect(fetched[messageWithoutReactions], isEmpty); }); group('getReactionsForMessagesByUserId', () { @@ -268,20 +213,22 @@ void main() { final users = [User(id: targetUser), User(id: otherUser)]; await database.userDao.updateUsers(users); await database.channelDao.updateChannels([ChannelModel(cid: cid)]); - await database.messageDao.updateMessages(cid, [ - Message( - id: msgWithOwn, - user: users.first, - createdAt: DateTime.now(), - text: 'a', - ), - Message( - id: msgWithoutOwn, - user: users.first, - createdAt: DateTime.now(), - text: 'b', - ), - ]); + await database.messageDao.bulkUpdateMessages({ + cid: [ + Message( + id: msgWithOwn, + user: users.first, + createdAt: DateTime.now(), + text: 'a', + ), + Message( + id: msgWithoutOwn, + user: users.first, + createdAt: DateTime.now(), + text: 'b', + ), + ], + }); // msgWithOwn: 1 own + 1 other; msgWithoutOwn: only other-user reaction. await reactionDao.updateReactions([ Reaction( @@ -328,19 +275,21 @@ void main() { // Fetched reaction list length should match // the inserted reactions list length - final reactions1 = await reactionDao.getReactions(messageId1); - final reactions2 = await reactionDao.getReactions(messageId2); - expect(reactions1.length, insertedReactions1.length); - expect(reactions2.length, insertedReactions2.length); + final reactions = await reactionDao.getReactionsForMessages( + [messageId1, messageId2], + ); + expect(reactions[messageId1]!.length, insertedReactions1.length); + expect(reactions[messageId2]!.length, insertedReactions2.length); // Deleting all the reactions of messageId1 await reactionDao.deleteReactionsByMessageIds([messageId1]); // Fetched reactions length of only messageId1 should be empty - final fetchedReactions1 = await reactionDao.getReactions(messageId1); - final fetchedReactions2 = await reactionDao.getReactions(messageId2); - expect(fetchedReactions1, isEmpty); - expect(fetchedReactions2, isNotEmpty); + final fetched = await reactionDao.getReactionsForMessages( + [messageId1, messageId2], + ); + expect(fetched[messageId1], isEmpty); + expect(fetched[messageId2], isNotEmpty); }); test('should delete all the reactions of both message', () async { @@ -350,19 +299,21 @@ void main() { // Fetched reaction list length should match // the inserted reactions list length - final reactions1 = await reactionDao.getReactions(messageId1); - final reactions2 = await reactionDao.getReactions(messageId2); - expect(reactions1.length, insertedReactions1.length); - expect(reactions2.length, insertedReactions2.length); + final reactions = await reactionDao.getReactionsForMessages( + [messageId1, messageId2], + ); + expect(reactions[messageId1]!.length, insertedReactions1.length); + expect(reactions[messageId2]!.length, insertedReactions2.length); // Deleting all the reactions of messageId1 and messageId2 await reactionDao.deleteReactionsByMessageIds([messageId1, messageId2]); // Fetched reactions length of both messages should be empty - final fetchedReactions1 = await reactionDao.getReactions(messageId1); - final fetchedReactions2 = await reactionDao.getReactions(messageId2); - expect(fetchedReactions1, isEmpty); - expect(fetchedReactions2, isEmpty); + final fetched = await reactionDao.getReactionsForMessages( + [messageId1, messageId2], + ); + expect(fetched[messageId1], isEmpty); + expect(fetched[messageId2], isEmpty); }); }); diff --git a/packages/stream_chat_persistence/test/src/dao/read_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/read_dao_test.dart index 473e2de82f..2f98e6a024 100644 --- a/packages/stream_chat_persistence/test/src/dao/read_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/read_dao_test.dart @@ -32,7 +32,7 @@ void main() { await database.userDao.updateUsers(users); await database.channelDao.updateChannels(channels); - await readDao.updateReads(cid, reads); + await readDao.bulkUpdateReads({cid: reads}); return reads; } @@ -79,7 +79,9 @@ void main() { lastDeliveredMessageId: 'lastDeliveredMessageId3', ); await database.userDao.updateUsers([newUser]); - await readDao.updateReads(cid, [copyRead, newRead]); + await readDao.bulkUpdateReads({ + cid: [copyRead, newRead], + }); // Fetched reads length should be one more than inserted reads. // copyRead `unreadMessages` modified field should be 33. diff --git a/packages/stream_chat_persistence/test/src/dao/user_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/user_dao_test.dart index ce7f4a4777..e863be8ed5 100644 --- a/packages/stream_chat_persistence/test/src/dao/user_dao_test.dart +++ b/packages/stream_chat_persistence/test/src/dao/user_dao_test.dart @@ -55,24 +55,13 @@ void main() { // Fetched users length should be one more than inserted users. // copyUser `online` modified field should be `false`. // Fetched users should contain the newUser. - final fetchedUsers = await userDao.getUsers(); - expect(fetchedUsers.length, insertedUsers.length + 1); - expect(fetchedUsers.firstWhere((it) => it.id == copyUser.id).online, false); - expect(fetchedUsers.contains(newUser), true); - }); - - test('getUsers', () async { - // Should be empty initially - final users = await userDao.getUsers(); - expect(users, isEmpty); - - // Preparing test data - final insertedUsers = await _prepareUserData(); - expect(insertedUsers, isNotEmpty); - - // Fetched user list should match inserted user list length - final fetchedUsers = await userDao.getUsers(); - expect(fetchedUsers.length, insertedUsers.length); + final fetchedEntities = await database.select(database.users).get(); + expect(fetchedEntities.length, insertedUsers.length + 1); + expect( + fetchedEntities.firstWhere((it) => it.id == copyUser.id).online, + false, + ); + expect(fetchedEntities.any((it) => it.id == newUser.id), isTrue); }); tearDown(() async {