fix: retain asset when either asset is a favorite (#26473)

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
This commit is contained in:
shenlong
2026-02-24 03:22:34 +05:30
committed by GitHub
parent 17b327bfcd
commit 5234e21241
2 changed files with 35 additions and 1 deletions

View File

@@ -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);

View File

@@ -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