2026-07-09 02:22:35 +06:00
|
|
|
import 'package:flutter_test/flutter_test.dart';
|
|
|
|
|
|
|
|
|
|
import '../../unit/factories/local_asset_factory.dart';
|
|
|
|
|
import '../../unit/factories/remote_asset_factory.dart';
|
|
|
|
|
|
|
|
|
|
void main() {
|
|
|
|
|
group('BaseAsset.refersToSameAsset', () {
|
|
|
|
|
test('search/folder copy (localId null) matches the merged DB copy (localId set)', () {
|
|
|
|
|
// #29472: search and folder assets arrive with localId null, then the viewer
|
|
|
|
|
// watches the DB copy which fills localId. heroTag embeds localId, so it
|
|
|
|
|
// diverges for the same asset and isCurrent used to go false.
|
|
|
|
|
final searchCopy = RemoteAssetFactory.create(id: 'asset-1');
|
|
|
|
|
final mergedCopy = searchCopy.copyWith(localId: 'local-1');
|
|
|
|
|
|
|
|
|
|
expect(searchCopy.localId, isNull);
|
|
|
|
|
expect(mergedCopy.localId, 'local-1');
|
|
|
|
|
expect(searchCopy.heroTag, isNot(mergedCopy.heroTag));
|
|
|
|
|
|
|
|
|
|
expect(searchCopy.refersToSameAsset(mergedCopy), isTrue);
|
|
|
|
|
expect(mergedCopy.refersToSameAsset(searchCopy), isTrue);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('different remote assets are not the same', () {
|
|
|
|
|
final a = RemoteAssetFactory.create(id: 'asset-1');
|
|
|
|
|
final b = RemoteAssetFactory.create(id: 'asset-2');
|
|
|
|
|
|
|
|
|
|
expect(a.refersToSameAsset(b), isFalse);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('same checksum but different remote ids are not the same (duplicate files)', () {
|
|
|
|
|
final a = RemoteAssetFactory.create(id: 'asset-1');
|
|
|
|
|
final b = RemoteAssetFactory.create(id: 'asset-2').copyWith(checksum: a.checksum);
|
|
|
|
|
|
|
|
|
|
expect(a.checksum, b.checksum);
|
|
|
|
|
expect(a.refersToSameAsset(b), isFalse);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('falls back to checksum when only one side has an id (local-only vs remote-only)', () {
|
|
|
|
|
final remoteOnly = RemoteAssetFactory.create(id: 'asset-1');
|
|
|
|
|
final localOnly = LocalAssetFactory.create(id: 'local-1').copyWith(checksum: remoteOnly.checksum);
|
|
|
|
|
|
|
|
|
|
expect(remoteOnly.refersToSameAsset(localOnly), isTrue);
|
|
|
|
|
expect(localOnly.refersToSameAsset(remoteOnly), isTrue);
|
|
|
|
|
});
|
|
|
|
|
});
|
2026-08-09 23:54:55 +06:00
|
|
|
|
|
|
|
|
group('BaseAsset.id', () {
|
|
|
|
|
test('survives the DB copy filling localId', () {
|
|
|
|
|
final searchCopy = RemoteAssetFactory.create(id: 'asset-1');
|
|
|
|
|
final mergedCopy = searchCopy.copyWith(localId: 'local-1');
|
|
|
|
|
|
|
|
|
|
expect(searchCopy.heroTag, isNot(mergedCopy.heroTag));
|
|
|
|
|
expect(mergedCopy.id, searchCopy.id);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('survives a local asset gaining a remote id', () {
|
|
|
|
|
final localOnly = LocalAssetFactory.create(id: 'local-1');
|
|
|
|
|
final uploaded = localOnly.copyWith(remoteId: 'asset-1');
|
|
|
|
|
|
|
|
|
|
expect(localOnly.heroTag, isNot(uploaded.heroTag));
|
|
|
|
|
expect(uploaded.id, localOnly.id);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
test('differs between assets', () {
|
|
|
|
|
final a = RemoteAssetFactory.create(id: 'asset-1');
|
|
|
|
|
final b = RemoteAssetFactory.create(id: 'asset-2');
|
|
|
|
|
final local = LocalAssetFactory.create(id: 'local-1');
|
|
|
|
|
|
|
|
|
|
expect(a.id, isNot(b.id));
|
|
|
|
|
expect(local.id, isNot(a.id));
|
|
|
|
|
});
|
|
|
|
|
});
|
2026-07-09 02:22:35 +06:00
|
|
|
}
|