From 5234e21241d4314d699544672a6852682134a5f0 Mon Sep 17 00:00:00 2001 From: shenlong <139912620+shenlong-tanwen@users.noreply.github.com> Date: Tue, 24 Feb 2026 03:22:34 +0530 Subject: [PATCH] fix: retain asset when either asset is a favorite (#26473) Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> --- .../repositories/local_asset.repository.dart | 3 +- .../local_asset_repository_test.dart | 33 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/mobile/lib/infrastructure/repositories/local_asset.repository.dart b/mobile/lib/infrastructure/repositories/local_asset.repository.dart index 9d7cbd831b..6f6ef20aeb 100644 --- a/mobile/lib/infrastructure/repositories/local_asset.repository.dart +++ b/mobile/lib/infrastructure/repositories/local_asset.repository.dart @@ -184,7 +184,8 @@ class DriftLocalAssetRepository extends DriftDatabaseRepository { } if (keepFavorites) { - whereClause = whereClause & _db.localAssetEntity.isFavorite.equals(false); + whereClause = + whereClause & _db.localAssetEntity.isFavorite.equals(false) & _db.remoteAssetEntity.isFavorite.equals(false); } query.where(whereClause); diff --git a/mobile/test/infrastructure/repositories/local_asset_repository_test.dart b/mobile/test/infrastructure/repositories/local_asset_repository_test.dart index b77161049a..dcfc01a55d 100644 --- a/mobile/test/infrastructure/repositories/local_asset_repository_test.dart +++ b/mobile/test/infrastructure/repositories/local_asset_repository_test.dart @@ -74,6 +74,39 @@ void main() { expect(result.assets.first.isFavorite, true); }); + test('excludes asset when both local and remote are favorites', () async { + final remoteAsset = await ctx.insertRemoteAsset(ownerId: user.id, isFavorite: true); + await ctx.insertLocalAsset(checksum: remoteAsset.checksum, createdAt: beforeCutoff, isFavorite: true); + + final result = await sut.getRemovalCandidates(user.id, cutoffDate, keepFavorites: true); + expect(result.assets, isEmpty); + }); + + test('excludes asset when only local is favorite', () async { + final remoteAsset = await ctx.insertRemoteAsset(ownerId: user.id); + await ctx.insertLocalAsset(checksum: remoteAsset.checksum, createdAt: beforeCutoff, isFavorite: true); + + final result = await sut.getRemovalCandidates(user.id, cutoffDate, keepFavorites: true); + expect(result.assets, isEmpty); + }); + + test('excludes asset when only remote is favorite', () async { + final remoteAsset = await ctx.insertRemoteAsset(ownerId: user.id, isFavorite: true); + await ctx.insertLocalAsset(checksum: remoteAsset.checksum, createdAt: beforeCutoff); + + final result = await sut.getRemovalCandidates(user.id, cutoffDate, keepFavorites: true); + expect(result.assets, isEmpty); + }); + + test('includes asset when neither local nor remote is favorite', () async { + final remoteAsset = await ctx.insertRemoteAsset(ownerId: user.id); + final localAsset = await ctx.insertLocalAsset(checksum: remoteAsset.checksum, createdAt: beforeCutoff); + + final result = await sut.getRemovalCandidates(user.id, cutoffDate, keepFavorites: true); + expect(result.assets.length, 1); + expect(result.assets.first.id, localAsset.id); + }); + test('keepMediaType photosOnly returns only videos for deletion', () async { final photoAsset = await ctx.insertRemoteAsset(ownerId: user.id); // Photo - should be kept