sync_service_test.dart 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. import 'package:flutter/widgets.dart';
  2. import 'package:flutter_test/flutter_test.dart';
  3. import 'package:immich_mobile/shared/models/album.dart';
  4. import 'package:immich_mobile/shared/models/asset.dart';
  5. import 'package:immich_mobile/shared/models/exif_info.dart';
  6. import 'package:immich_mobile/shared/models/logger_message.model.dart';
  7. import 'package:immich_mobile/shared/models/store.dart';
  8. import 'package:immich_mobile/shared/models/user.dart';
  9. import 'package:immich_mobile/shared/services/immich_logger.service.dart';
  10. import 'package:immich_mobile/shared/services/sync.service.dart';
  11. import 'package:isar/isar.dart';
  12. void main() {
  13. Asset makeAsset({
  14. required String localId,
  15. String? remoteId,
  16. int deviceId = 1,
  17. int ownerId = 590700560494856554, // hash of "1"
  18. bool isLocal = false,
  19. }) {
  20. final DateTime date = DateTime(2000);
  21. return Asset(
  22. localId: localId,
  23. remoteId: remoteId,
  24. deviceId: deviceId,
  25. ownerId: ownerId,
  26. fileCreatedAt: date,
  27. fileModifiedAt: date,
  28. updatedAt: date,
  29. durationInSeconds: 0,
  30. type: AssetType.image,
  31. fileName: localId,
  32. isFavorite: false,
  33. isLocal: isLocal,
  34. isArchived: false,
  35. );
  36. }
  37. Isar loadDb() {
  38. return Isar.openSync(
  39. [
  40. ExifInfoSchema,
  41. AssetSchema,
  42. AlbumSchema,
  43. UserSchema,
  44. StoreValueSchema,
  45. LoggerMessageSchema
  46. ],
  47. maxSizeMiB: 256,
  48. );
  49. }
  50. group('Test SyncService grouped', () {
  51. late final Isar db;
  52. setUpAll(() async {
  53. WidgetsFlutterBinding.ensureInitialized();
  54. await Isar.initializeIsarCore(download: true);
  55. db = loadDb();
  56. ImmichLogger();
  57. db.writeTxnSync(() => db.clearSync());
  58. Store.init(db);
  59. await Store.put(
  60. StoreKey.currentUser,
  61. User(
  62. id: "1",
  63. updatedAt: DateTime.now(),
  64. email: "a@b.c",
  65. firstName: "first",
  66. lastName: "last",
  67. isAdmin: false,
  68. ),
  69. );
  70. });
  71. final List<Asset> initialAssets = [
  72. makeAsset(localId: "1", remoteId: "0-1", deviceId: 0),
  73. makeAsset(localId: "1", remoteId: "2-1", deviceId: 2),
  74. makeAsset(localId: "1", remoteId: "1-1", isLocal: true),
  75. makeAsset(localId: "2", isLocal: true),
  76. makeAsset(localId: "3", isLocal: true),
  77. ];
  78. setUp(() {
  79. db.writeTxnSync(() {
  80. db.assets.clearSync();
  81. db.assets.putAllSync(initialAssets);
  82. });
  83. });
  84. test('test inserting existing assets', () async {
  85. SyncService s = SyncService(db);
  86. final List<Asset> remoteAssets = [
  87. makeAsset(localId: "1", remoteId: "0-1", deviceId: 0),
  88. makeAsset(localId: "1", remoteId: "2-1", deviceId: 2),
  89. makeAsset(localId: "1", remoteId: "1-1"),
  90. ];
  91. expect(db.assets.countSync(), 5);
  92. final bool c1 = await s.syncRemoteAssetsToDb(() => remoteAssets);
  93. expect(c1, false);
  94. expect(db.assets.countSync(), 5);
  95. });
  96. test('test inserting new assets', () async {
  97. SyncService s = SyncService(db);
  98. final List<Asset> remoteAssets = [
  99. makeAsset(localId: "1", remoteId: "0-1", deviceId: 0),
  100. makeAsset(localId: "1", remoteId: "2-1", deviceId: 2),
  101. makeAsset(localId: "1", remoteId: "1-1"),
  102. makeAsset(localId: "2", remoteId: "1-2"),
  103. makeAsset(localId: "4", remoteId: "1-4"),
  104. makeAsset(localId: "1", remoteId: "3-1", deviceId: 3),
  105. ];
  106. expect(db.assets.countSync(), 5);
  107. final bool c1 = await s.syncRemoteAssetsToDb(() => remoteAssets);
  108. expect(c1, true);
  109. expect(db.assets.countSync(), 7);
  110. });
  111. test('test syncing duplicate assets', () async {
  112. SyncService s = SyncService(db);
  113. final List<Asset> remoteAssets = [
  114. makeAsset(localId: "1", remoteId: "0-1", deviceId: 0),
  115. makeAsset(localId: "1", remoteId: "1-1"),
  116. makeAsset(localId: "1", remoteId: "2-1", deviceId: 2),
  117. makeAsset(localId: "1", remoteId: "2-1b", deviceId: 2),
  118. makeAsset(localId: "1", remoteId: "2-1c", deviceId: 2),
  119. makeAsset(localId: "1", remoteId: "2-1d", deviceId: 2),
  120. ];
  121. expect(db.assets.countSync(), 5);
  122. final bool c1 = await s.syncRemoteAssetsToDb(() => remoteAssets);
  123. expect(c1, true);
  124. expect(db.assets.countSync(), 8);
  125. final bool c2 = await s.syncRemoteAssetsToDb(() => remoteAssets);
  126. expect(c2, false);
  127. expect(db.assets.countSync(), 8);
  128. remoteAssets.removeAt(4);
  129. final bool c3 = await s.syncRemoteAssetsToDb(() => remoteAssets);
  130. expect(c3, true);
  131. expect(db.assets.countSync(), 7);
  132. remoteAssets.add(makeAsset(localId: "1", remoteId: "2-1e", deviceId: 2));
  133. remoteAssets.add(makeAsset(localId: "2", remoteId: "2-2", deviceId: 2));
  134. final bool c4 = await s.syncRemoteAssetsToDb(() => remoteAssets);
  135. expect(c4, true);
  136. expect(db.assets.countSync(), 9);
  137. });
  138. });
  139. }