From 45870d7fab7ce5daeeffe2c21de227cbd072c171 Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Tue, 16 Mar 2021 20:45:11 +0530 Subject: [PATCH] test(persistence): add test for read dao Signed-off-by: Sahil Kumar --- packages/stream_chat/lib/src/models/read.dart | 12 +++ .../test/src/dao/read_dao_test.dart | 97 +++++++++++++++++++ 2 files changed, 109 insertions(+) create mode 100644 packages/stream_chat_persistence/test/src/dao/read_dao_test.dart diff --git a/packages/stream_chat/lib/src/models/read.dart b/packages/stream_chat/lib/src/models/read.dart index 2be639d5..fc8ef1bc 100644 --- a/packages/stream_chat/lib/src/models/read.dart +++ b/packages/stream_chat/lib/src/models/read.dart @@ -27,4 +27,16 @@ class Read { /// Serialize to json Map toJson() => _$ReadToJson(this); + + /// Creates a copy of [Read] with specified attributes overridden. + Read copyWith({ + DateTime lastRead, + User user, + int unreadMessages, + }) => + Read( + lastRead: lastRead ?? this.lastRead, + user: user ?? this.user, + unreadMessages: unreadMessages ?? this.unreadMessages, + ); } 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 new file mode 100644 index 00000000..52207f68 --- /dev/null +++ b/packages/stream_chat_persistence/test/src/dao/read_dao_test.dart @@ -0,0 +1,97 @@ +import 'package:stream_chat/stream_chat.dart'; +import 'package:stream_chat_persistence/src/dao/dao.dart'; +import 'package:stream_chat_persistence/src/db/moor_chat_database.dart'; +import 'package:test/test.dart'; + +import '../utils/date_matcher.dart'; + +void main() { + ReadDao readDao; + MoorChatDatabase database; + + setUp(() { + database = MoorChatDatabase.testable('testUserId'); + readDao = database.readDao; + }); + + Future> _prepareReadData(String cid, {int count = 3}) async { + final users = List.generate(count, (index) => User(id: 'testUserId$index')); + final reads = List.generate( + count, + (index) => Read( + lastRead: DateTime.now(), + user: users[index], + unreadMessages: index + 10, + ), + ); + + await database.userDao.updateUsers(users); + await readDao.updateReads(cid, reads); + return reads; + } + + test('getReadsByCid', () async { + const cid = 'testCid'; + + // Should be empty initially + final reads = await readDao.getReadsByCid(cid); + expect(reads, isEmpty); + + // Preparing test data + final insertedReads = await _prepareReadData(cid); + expect(insertedReads, isNotEmpty); + + // Fetched reads should be equal to inserted reads + final fetchedReads = await readDao.getReadsByCid(cid); + expect(fetchedReads.length, insertedReads.length); + for (var i = 0; i < fetchedReads.length; i++) { + final fetchedRead = fetchedReads[i]; + final insertedRead = insertedReads[i]; + expect(fetchedRead.user.id, insertedRead.user.id); + expect(fetchedRead.lastRead, isSameDateAs(insertedRead.lastRead)); + expect(fetchedRead.unreadMessages, insertedRead.unreadMessages); + } + }); + + test('updateReads', () async { + const cid = 'testCid'; + + // Preparing test data + final insertedReads = await _prepareReadData(cid); + + // Modifying one of the read and also adding one new + final copyRead = insertedReads.first.copyWith(unreadMessages: 33); + final newUser = User(id: 'testUserId3'); + final newRead = Read( + lastRead: DateTime.now(), + user: newUser, + unreadMessages: 30, + ); + await database.userDao.updateUsers([newUser]); + await readDao.updateReads(cid, [copyRead, newRead]); + + // Fetched reads length should be one more than inserted reads. + // copyRead `unreadMessages` modified field should be 33. + // Fetched reads should contain the newRead. + final fetchedReads = await readDao.getReadsByCid(cid); + expect(fetchedReads.length, insertedReads.length + 1); + expect( + fetchedReads + .firstWhere((it) => it.user.id == copyRead.user.id) + .unreadMessages, + 33, + ); + expect( + fetchedReads + .where((it) => + it.user.id == newRead.user.id && + it.unreadMessages == newRead.unreadMessages) + .isNotEmpty, + true, + ); + }); + + tearDown(() async { + await database.disconnect(); + }); +}