diff --git a/lib/features/caching/config/hive_cache_client.dart b/lib/features/caching/config/hive_cache_client.dart index 9fdac09d2..45575db70 100644 --- a/lib/features/caching/config/hive_cache_client.dart +++ b/lib/features/caching/config/hive_cache_client.dart @@ -5,7 +5,7 @@ abstract class HiveCacheClient { String get tableName; - Future> openTable(); + Future> openBox(); Future insertItem(String key, T newObject); @@ -26,4 +26,8 @@ abstract class HiveCacheClient { Future isExistItem(String key); Future isExistTable(); + + Future deleteBox() { + return Hive.deleteBoxFromDisk(tableName); + } } \ No newline at end of file diff --git a/lib/features/caching/config/hive_cache_config.dart b/lib/features/caching/config/hive_cache_config.dart index 35567968d..3d45d73e7 100644 --- a/lib/features/caching/config/hive_cache_config.dart +++ b/lib/features/caching/config/hive_cache_config.dart @@ -9,14 +9,19 @@ import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart'; class HiveCacheConfig { - Future setUp() async { - await initializeDatabase(); + Future setUp({String? cachePath}) async { + await initializeDatabase(databasePath: cachePath); registerAdapter(); } - Future initializeDatabase() async { - Directory directory = await pathProvider.getApplicationDocumentsDirectory(); - Hive.init(directory.path); + Future initializeDatabase({String? databasePath}) async { + if (databasePath != null) { + Hive.init(databasePath); + } else { + Directory directory = await pathProvider + .getApplicationDocumentsDirectory(); + Hive.init(directory.path); + } } void registerAdapter() { diff --git a/lib/features/caching/mailbox_cache_client.dart b/lib/features/caching/mailbox_cache_client.dart index 662e6a0dc..3301772d3 100644 --- a/lib/features/caching/mailbox_cache_client.dart +++ b/lib/features/caching/mailbox_cache_client.dart @@ -9,7 +9,7 @@ class MailboxCacheClient extends HiveCacheClient { String get tableName => 'MailboxCache'; @override - Future> openTable() { + Future> openBox() { return Future.sync(() async { if (Hive.isBoxOpen(tableName)) { return Hive.box(tableName); @@ -23,7 +23,7 @@ class MailboxCacheClient extends HiveCacheClient { @override Future isExistItem(String key) { return Future.sync(() async { - final boxMailbox = await openTable(); + final boxMailbox = await openBox(); return boxMailbox.containsKey(key); }).catchError((error) { throw error; @@ -33,7 +33,7 @@ class MailboxCacheClient extends HiveCacheClient { @override Future deleteItem(String key) { return Future.sync(() async { - final boxMailbox = await openTable(); + final boxMailbox = await openBox(); return boxMailbox.delete(key); }).catchError((error) { throw error; @@ -43,7 +43,7 @@ class MailboxCacheClient extends HiveCacheClient { @override Future getItem(String key) { return Future.sync(() async { - final boxMailbox = await openTable(); + final boxMailbox = await openBox(); return boxMailbox.get(key); }).catchError((error) { throw error; @@ -53,7 +53,7 @@ class MailboxCacheClient extends HiveCacheClient { @override Future> getAll() { return Future.sync(() async { - final boxMailbox = await openTable(); + final boxMailbox = await openBox(); return boxMailbox.values.toList(); }).catchError((error) { throw error; @@ -63,7 +63,7 @@ class MailboxCacheClient extends HiveCacheClient { @override Future insertItem(String key, MailboxCache newObject) { return Future.sync(() async { - final boxMailbox = await openTable(); + final boxMailbox = await openBox(); boxMailbox.put(key, newObject); }).catchError((error) { throw error; @@ -73,7 +73,7 @@ class MailboxCacheClient extends HiveCacheClient { @override Future insertMultipleItem(Map mapObject) { return Future.sync(() async { - final boxMailbox = await openTable(); + final boxMailbox = await openBox(); boxMailbox.putAll(mapObject); }).catchError((error) { throw error; @@ -83,7 +83,7 @@ class MailboxCacheClient extends HiveCacheClient { @override Future updateItem(String key, MailboxCache newObject) { return Future.sync(() async { - final boxMailbox = await openTable(); + final boxMailbox = await openBox(); boxMailbox.put(key, newObject); }).catchError((error) { throw error; @@ -102,7 +102,7 @@ class MailboxCacheClient extends HiveCacheClient { @override Future deleteMultipleItem(List listKey) { return Future.sync(() async { - final boxMailbox = await openTable(); + final boxMailbox = await openBox(); return boxMailbox.deleteAll(listKey); }).catchError((error) { throw error; @@ -112,7 +112,7 @@ class MailboxCacheClient extends HiveCacheClient { @override Future updateMultipleItem(Map mapObject) { return Future.sync(() async { - final boxMailbox = await openTable(); + final boxMailbox = await openBox(); boxMailbox.putAll(mapObject); }).catchError((error) { throw error; diff --git a/lib/features/caching/state_cache_client.dart b/lib/features/caching/state_cache_client.dart index 71ffefd64..cd54ea422 100644 --- a/lib/features/caching/state_cache_client.dart +++ b/lib/features/caching/state_cache_client.dart @@ -9,7 +9,7 @@ class StateCacheClient extends HiveCacheClient { String get tableName => 'StateCache'; @override - Future> openTable() { + Future> openBox() { return Future.sync(() async { if (Hive.isBoxOpen(tableName)) { return Hive.box(tableName); @@ -23,7 +23,7 @@ class StateCacheClient extends HiveCacheClient { @override Future isExistItem(String key) { return Future.sync(() async { - final boxState = await openTable(); + final boxState = await openBox(); return boxState.containsKey(key); }).catchError((error) { throw error; @@ -33,7 +33,7 @@ class StateCacheClient extends HiveCacheClient { @override Future deleteItem(String key) { return Future.sync(() async { - final boxState = await openTable(); + final boxState = await openBox(); return boxState.delete(key); }).catchError((error) { throw error; @@ -43,7 +43,7 @@ class StateCacheClient extends HiveCacheClient { @override Future getItem(String key) { return Future.sync(() async { - final boxState = await openTable(); + final boxState = await openBox(); return boxState.get(key); }).catchError((error) { throw error; @@ -53,7 +53,7 @@ class StateCacheClient extends HiveCacheClient { @override Future> getAll() { return Future.sync(() async { - final boxState = await openTable(); + final boxState = await openBox(); return boxState.values.toList(); }).catchError((error) { throw error; @@ -63,7 +63,7 @@ class StateCacheClient extends HiveCacheClient { @override Future insertItem(String key, StateCache newObject) { return Future.sync(() async { - final boxState = await openTable(); + final boxState = await openBox(); boxState.put(key, newObject); }).catchError((error) { throw error; @@ -73,7 +73,7 @@ class StateCacheClient extends HiveCacheClient { @override Future insertMultipleItem(Map mapObject) { return Future.sync(() async { - final boxState = await openTable(); + final boxState = await openBox(); boxState.putAll(mapObject); }).catchError((error) { throw error; @@ -83,7 +83,7 @@ class StateCacheClient extends HiveCacheClient { @override Future updateItem(String key, StateCache newObject) { return Future.sync(() async { - final boxState = await openTable(); + final boxState = await openBox(); boxState.put(key, newObject); }).catchError((error) { throw error; @@ -102,7 +102,7 @@ class StateCacheClient extends HiveCacheClient { @override Future deleteMultipleItem(List listKey) { return Future.sync(() async { - final boxState = await openTable(); + final boxState = await openBox(); boxState.deleteAll(listKey); }).catchError((error) { throw error; @@ -112,7 +112,7 @@ class StateCacheClient extends HiveCacheClient { @override Future updateMultipleItem(Map mapObject) { return Future.sync(() async { - final boxState = await openTable(); + final boxState = await openBox(); boxState.putAll(mapObject); }).catchError((error) { throw error; diff --git a/test/features/caching/mailbox_cache_client_test.dart b/test/features/caching/mailbox_cache_client_test.dart new file mode 100644 index 000000000..de1f281af --- /dev/null +++ b/test/features/caching/mailbox_cache_client_test.dart @@ -0,0 +1,181 @@ +import 'dart:io'; + +import 'package:flutter_test/flutter_test.dart'; +import 'package:tmail_ui_user/features/caching/config/hive_cache_config.dart'; +import 'package:tmail_ui_user/features/caching/mailbox_cache_client.dart'; +import 'package:tmail_ui_user/features/mailbox/data/extensions/mailbox_extension.dart'; + +import '../../fixtures/mailbox_fixtures.dart'; + +void main() { + + late MailboxCacheClient _mailboxCacheClient; + + setUpAll(() { + HiveCacheConfig().setUp(cachePath: Directory.current.path); + }); + + setUp(() { + _mailboxCacheClient = MailboxCacheClient(); + }); + + group('[delete]', () { + test('cache should delete item successfully when cache empty', () async { + await _mailboxCacheClient.deleteItem(MailboxFixtures.inboxMailbox.id.toString()); + + final remainingItems = await _mailboxCacheClient.getAll(); + + expect(remainingItems.length, equals(0)); + }); + + test('cache should not delete item which not in the list', () async { + await _mailboxCacheClient.insertItem( + MailboxFixtures.inboxMailbox.id.toString(), + MailboxFixtures.inboxMailbox.toMailboxCache()); + + await _mailboxCacheClient.insertItem( + MailboxFixtures.sentMailbox.id.toString(), + MailboxFixtures.sentMailbox.toMailboxCache()); + + await _mailboxCacheClient.deleteItem(MailboxFixtures.folder1.id.toString()); + + final remainingItems = await _mailboxCacheClient.getAll(); + + expect(remainingItems.length, equals(2)); + expect( + remainingItems, + containsAll({ + MailboxFixtures.inboxMailbox.toMailboxCache(), + MailboxFixtures.sentMailbox.toMailboxCache() + })); + }); + + test('cache should delete item successfully', () async { + await _mailboxCacheClient.insertItem( + MailboxFixtures.inboxMailbox.id.toString(), + MailboxFixtures.inboxMailbox.toMailboxCache()); + + await _mailboxCacheClient.insertItem( + MailboxFixtures.sentMailbox.id.toString(), + MailboxFixtures.sentMailbox.toMailboxCache()); + + await _mailboxCacheClient.deleteItem(MailboxFixtures.inboxMailbox.id.toString()); + + final remainingItems = await _mailboxCacheClient.getAll(); + + expect(remainingItems.length, equals(1)); + expect(remainingItems[0], equals(MailboxFixtures.sentMailbox.toMailboxCache())); + }); + + test('cache should not delete item twice', () async { + await _mailboxCacheClient.insertItem( + MailboxFixtures.inboxMailbox.id.toString(), + MailboxFixtures.inboxMailbox.toMailboxCache()); + + await _mailboxCacheClient.insertItem( + MailboxFixtures.sentMailbox.id.toString(), + MailboxFixtures.sentMailbox.toMailboxCache()); + + await _mailboxCacheClient.deleteItem(MailboxFixtures.inboxMailbox.id.toString()); + await _mailboxCacheClient.deleteItem(MailboxFixtures.inboxMailbox.id.toString()); + + final remainingItems = await _mailboxCacheClient.getAll(); + + expect(remainingItems.length, equals(1)); + expect(remainingItems[0], equals(MailboxFixtures.sentMailbox.toMailboxCache())); + }); + }); + + group('[add]', () { + test('cache should add item when cache empty', () async { + await _mailboxCacheClient.insertItem( + MailboxFixtures.inboxMailbox.id.toString(), + MailboxFixtures.inboxMailbox.toMailboxCache()); + + final remainingItems = await _mailboxCacheClient.getAll(); + + expect(remainingItems.length, equals(1)); + expect(remainingItems[0], equals(MailboxFixtures.inboxMailbox.toMailboxCache())); + }); + + test('cache should add item when cache not empty', () async { + await _mailboxCacheClient.insertItem( + MailboxFixtures.inboxMailbox.id.toString(), + MailboxFixtures.inboxMailbox.toMailboxCache()); + + await _mailboxCacheClient.insertItem( + MailboxFixtures.sentMailbox.id.toString(), + MailboxFixtures.sentMailbox.toMailboxCache()); + + final remainingItems = await _mailboxCacheClient.getAll(); + + expect(remainingItems.length, equals(2)); + expect( + remainingItems, + containsAll({ + MailboxFixtures.inboxMailbox.toMailboxCache(), + MailboxFixtures.sentMailbox.toMailboxCache() + })); + }); + + test('cache should not add item twice', () async { + await _mailboxCacheClient.insertItem( + MailboxFixtures.inboxMailbox.id.toString(), + MailboxFixtures.inboxMailbox.toMailboxCache()); + + await _mailboxCacheClient.insertItem( + MailboxFixtures.inboxMailbox.id.toString(), + MailboxFixtures.inboxMailbox.toMailboxCache()); + + final remainingItems = await _mailboxCacheClient.getAll(); + + expect(remainingItems.length, equals(1)); + expect( + remainingItems, + containsAll({ + MailboxFixtures.inboxMailbox.toMailboxCache(), + })); + }); + }); + + group('[update]', () { + test('cache should update item when update to iem which not in cache', () async { + await _mailboxCacheClient.updateItem( + MailboxFixtures.inboxMailbox.id.toString(), + MailboxFixtures.inboxMailbox.toMailboxCache()); + + final remainingItems = await _mailboxCacheClient.getAll(); + + expect(remainingItems.length, equals(1)); + expect(remainingItems[0], equals(MailboxFixtures.inboxMailbox.toMailboxCache())); + }); + + test('cache should update correctly item', () async { + await _mailboxCacheClient.insertItem( + MailboxFixtures.inboxMailbox.id.toString(), + MailboxFixtures.inboxMailbox.toMailboxCache()); + + await _mailboxCacheClient.insertItem( + MailboxFixtures.sentMailbox.id.toString(), + MailboxFixtures.sentMailbox.toMailboxCache()); + + await _mailboxCacheClient.updateItem( + MailboxFixtures.inboxMailbox.id.toString(), + MailboxFixtures.folder1.toMailboxCache()); + + final remainingItems = await _mailboxCacheClient.getAll(); + + expect(remainingItems.length, equals(2)); + expect( + remainingItems, + containsAll({ + MailboxFixtures.sentMailbox.toMailboxCache(), + MailboxFixtures.folder1.toMailboxCache() + })); + }); + }); + + tearDown(() async { + await _mailboxCacheClient.deleteBox(); + }); +} \ No newline at end of file diff --git a/test/fixtures/mailbox_fixtures.dart b/test/fixtures/mailbox_fixtures.dart index 42cc2723f..2476fa58a 100644 --- a/test/fixtures/mailbox_fixtures.dart +++ b/test/fixtures/mailbox_fixtures.dart @@ -95,4 +95,4 @@ class MailboxFixtures { true), IsSubscribed(true) ); -} +} \ No newline at end of file