diff --git a/flutter_cache_manager/lib/src/cache_store.dart b/flutter_cache_manager/lib/src/cache_store.dart index bfb514b5..978c346c 100644 --- a/flutter_cache_manager/lib/src/cache_store.dart +++ b/flutter_cache_manager/lib/src/cache_store.dart @@ -171,14 +171,14 @@ class CacheStore { Future _removeCachedFile( CacheObject cacheObject, List toRemove) async { - if (!toRemove.contains(cacheObject.id)) { - toRemove.add(cacheObject.id); - if (_memCache.containsKey(cacheObject.url)) { - _memCache.remove(cacheObject.url); - } - if (_futureCache.containsKey(cacheObject.url)) { - unawaited(_futureCache.remove(cacheObject.url)); - } + if (toRemove.contains(cacheObject.id)) return; + + toRemove.add(cacheObject.id); + if (_memCache.containsKey(cacheObject.url)) { + _memCache.remove(cacheObject.url); + } + if (_futureCache.containsKey(cacheObject.url)) { + unawaited(_futureCache.remove(cacheObject.url)); } final file = (await fileDir).childFile(cacheObject.relativePath); if (await file.exists()) { diff --git a/flutter_cache_manager/test/cache_store_test.dart b/flutter_cache_manager/test/cache_store_test.dart index 2d28f425..91e1a63e 100644 --- a/flutter_cache_manager/test/cache_store_test.dart +++ b/flutter_cache_manager/test/cache_store_test.dart @@ -197,6 +197,37 @@ void main() { verify(repo.deleteAll(argThat(contains(cacheObject.id)))).called(1); }); + + + test('Store should remove file old and over capacity', () async { + var repo = MockRepo(); + var directory = createDir(); + + var store = CacheStore(directory, 'test', 2, const Duration(days: 7), + cacheRepoProvider: Future.value(repo), + cleanupRunMinInterval: const Duration()); + + var cacheObject = CacheObject('baseflow.com/test.png', + relativePath: 'testimage.png', id: 1); + var file = await (await directory).childFile('testimage.png').create(); + + when(repo.getObjectsOverCapacity(any)) + .thenAnswer((_) => Future.value([cacheObject])); + when(repo.getOldObjects(any)) + .thenAnswer((_) => Future.value([cacheObject])); + when(repo.get('baseflow.com/test.png')) + .thenAnswer((_) => Future.value(cacheObject)); + + expect(await store.getFile('baseflow.com/test.png'), isNotNull); + + await untilCalled(repo.deleteAll(any)); + await Future.delayed(const Duration(milliseconds: 5)); + + verify(repo.getObjectsOverCapacity(any)).called(1); + verify(repo.getOldObjects(any)).called(1); + verify(repo.deleteAll(argThat(contains(cacheObject.id)))).called(1); + }); + test('Store should not remove files that are not old or over capacity', () async { var repo = MockRepo();