diff --git a/packages/stream_chat_persistence/CHANGELOG.md b/packages/stream_chat_persistence/CHANGELOG.md index 73a120207..6066b5be3 100644 --- a/packages/stream_chat_persistence/CHANGELOG.md +++ b/packages/stream_chat_persistence/CHANGELOG.md @@ -1,3 +1,9 @@ +## Upcoming changes + +🔄 Internal / Non-breaking + +- Removed unused / test-only methods from internal DAO classes. + ## 9.25.0 🚀 Performance 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 bc1377419..76ca9ee9b 100644 --- a/packages/stream_chat_persistence/lib/src/dao/member_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/member_dao.dart @@ -55,10 +55,6 @@ class MemberDao extends DatabaseAccessor }; } - /// 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 07bca8e12..3ef7232aa 100644 --- a/packages/stream_chat_persistence/lib/src/dao/message_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/message_dao.dart @@ -334,11 +334,6 @@ class MessageDao extends DatabaseAccessor return _messagesFromJoinRows(orderedRows, fetchDraft: fetchDraft); } - /// 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 75b0f2054..e90bd49a0 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 @@ -174,68 +174,6 @@ class PinnedMessageDao extends DatabaseAccessor 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( @@ -284,11 +222,6 @@ class PinnedMessageDao extends DatabaseAccessor return msgList; } - /// 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 27f5f4439..16c82444c 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 @@ -15,33 +15,6 @@ class PinnedMessageReactionDao extends DatabaseAccessor /// 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 8d974e15c..d24dce7f7 100644 --- a/packages/stream_chat_persistence/lib/src/dao/poll_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/poll_dao.dart @@ -86,13 +86,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 43c41a8be..bcc49160e 100644 --- a/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/reaction_dao.dart @@ -15,33 +15,6 @@ class ReactionDao extends DatabaseAccessor /// 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 4e2024f1f..81ab9d958 100644 --- a/packages/stream_chat_persistence/lib/src/dao/read_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/read_dao.dart @@ -27,11 +27,6 @@ class ReadDao extends DatabaseAccessor with _$ReadDaoMixin { return readEntity.toRead(user: userEntity.toUser()); }).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 1366dd254..33832ecdd 100644 --- a/packages/stream_chat_persistence/lib/src/dao/user_dao.dart +++ b/packages/stream_chat_persistence/lib/src/dao/user_dao.dart @@ -19,10 +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 da974fa31..fe26b8312 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); @@ -104,8 +110,8 @@ 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); @@ -129,8 +135,8 @@ 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 871521472..a58627f0e 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 @@ -102,7 +102,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) { @@ -287,7 +287,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( @@ -394,7 +396,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( @@ -465,7 +469,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( @@ -574,28 +578,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/member_dao_test.dart b/packages/stream_chat_persistence/test/src/dao/member_dao_test.dart index c77dfff82..e9cfb084c 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 b870ebd2c..96c117f30 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 @@ -119,7 +119,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; } @@ -137,7 +137,8 @@ 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 @@ -151,8 +152,8 @@ 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); }); @@ -175,8 +176,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 @@ -189,8 +191,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); }, ); @@ -210,12 +213,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 @@ -228,11 +233,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); }, ); @@ -635,13 +642,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, @@ -712,7 +721,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. @@ -745,14 +756,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([ @@ -806,7 +819,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 = [ @@ -863,15 +876,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([ @@ -944,14 +959,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( @@ -1001,22 +1018,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( @@ -1043,28 +1062,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'); @@ -1083,21 +1104,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( @@ -1134,7 +1157,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. 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 e86808d08..977c6d65d 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 @@ -98,7 +98,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; } @@ -116,8 +116,8 @@ 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 @@ -131,8 +131,8 @@ 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); }); @@ -155,8 +155,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 @@ -171,8 +172,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); }, ); @@ -192,12 +194,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 @@ -212,11 +216,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); }, ); @@ -240,79 +246,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'; @@ -409,7 +342,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. @@ -444,14 +379,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( @@ -499,7 +436,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++) ...[ @@ -556,15 +493,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( @@ -620,8 +559,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( @@ -670,22 +613,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( @@ -712,28 +657,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'); @@ -766,11 +713,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( 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 80fe9a655..1e12588f7 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 @@ -53,62 +53,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); - }); - - 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); - }); - test('updateReactions', () async { const messageId = 'testMessageId'; @@ -131,8 +83,8 @@ void main() { // Fetched reaction length should be one more than inserted reactions. // copyReaction `score` modified field should be 33. // 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); expect( fetchedReactions @@ -151,16 +103,16 @@ void main() { }); test( - 'getReactions returns empty for a message id with no reactions, ' - 'even when reactions exist for other messages', () async { + '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', () { @@ -173,23 +125,19 @@ 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 messages of both message', () async { // Preparing test data @@ -198,24 +146,20 @@ 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]); // 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 37fe19f90..c16a513fc 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 { @@ -211,9 +197,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 { @@ -229,9 +219,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 7ec4a772c..7ad9b57c9 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 @@ -53,60 +53,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); - }); - - 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); - }); - test('updateReactions', () async { const messageId = 'testMessageId'; @@ -129,7 +83,8 @@ void main() { // Fetched reaction length should be one more than inserted reactions. // copyReaction `score` modified field should be 33. // 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); expect( fetchedReactions @@ -169,7 +124,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 @@ -210,17 +165,18 @@ void main() { }); 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. + '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', () { @@ -243,20 +199,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( @@ -304,19 +262,19 @@ 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 { // Preparing test data @@ -325,19 +283,19 @@ 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 142daf415..475176b5b 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; } @@ -81,7 +81,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 ce7f4a477..e863be8ed 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 {