fix: memories mobile sync for older clients (#32167)

fix: memories mobile sync for older clients (#32150)


(cherry picked from commit 8d377bfef5a0c9d840bf2c19d155f9779387baeb)

Co-authored-by: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
Co-authored-by: Santo Shakil <shakil.mezbah@gmail.com>
This commit is contained in:
immich-push-o-matic[bot]
2026-10-06 14:10:38 +00:00
committed by GitHub
co-authored by Daniel Dietzler Santo Shakil
parent 1aede8d8c3
commit ed3073624b
13 changed files with 281 additions and 14 deletions
@@ -131,7 +131,7 @@ void main() {
when(
() => mockSyncStreamRepo.updateAssetsExifV1(any(), debugLabel: any(named: 'debugLabel')),
).thenAnswer(successHandler);
when(() => mockSyncStreamRepo.updateMemoriesV1(any())).thenAnswer(successHandler);
when(() => mockSyncStreamRepo.updateMemoriesV2(any())).thenAnswer(successHandler);
when(() => mockSyncStreamRepo.deleteMemoriesV1(any())).thenAnswer(successHandler);
when(() => mockSyncStreamRepo.updateMemoryAssetsV1(any())).thenAnswer(successHandler);
when(() => mockSyncStreamRepo.deleteMemoryAssetsV1(any())).thenAnswer(successHandler);
@@ -320,7 +320,7 @@ void main() {
await simulateEvents(events);
verifyInOrder([
() => mockSyncStreamRepo.updateMemoriesV1(any()),
() => mockSyncStreamRepo.updateMemoriesV2(any()),
() => mockSyncApiRepo.ack(["5"]),
() => mockSyncStreamRepo.deleteMemoriesV1(any()),
() => mockSyncApiRepo.ack(["6"]),
@@ -349,14 +349,14 @@ void main() {
() => mockSyncApiRepo.ack(["1"]),
() => mockSyncStreamRepo.updateMemoryAssetsV1(any()),
() => mockSyncApiRepo.ack(["7"]),
() => mockSyncStreamRepo.updateMemoriesV1(any()),
() => mockSyncStreamRepo.updateMemoriesV2(any()),
() => mockSyncApiRepo.ack(["5"]),
]);
verifyNever(() => mockAbortCallbackWrapper());
});
test("handles memory sync failure gracefully", () async {
when(() => mockSyncStreamRepo.updateMemoriesV1(any())).thenThrow(Exception("Memory sync failed"));
when(() => mockSyncStreamRepo.updateMemoriesV2(any())).thenThrow(Exception("Memory sync failed"));
final events = [SyncStreamStub.memoryV1, SyncStreamStub.userV1Admin];
@@ -386,9 +386,22 @@ void main() {
await simulateEvents(events);
verify(() => mockSyncStreamRepo.updateMemoriesV1(any())).called(1);
verify(() => mockSyncStreamRepo.updateMemoriesV2(any())).called(1);
verify(() => mockSyncApiRepo.ack(["5"])).called(1);
});
test("processes memory v2 events", () async {
final events = [SyncStreamStub.memoryV2, SyncStreamStub.memoryToAssetV2];
await simulateEvents(events);
verifyInOrder([
() => mockSyncStreamRepo.updateMemoriesV2(any()),
() => mockSyncApiRepo.ack(["9"]),
() => mockSyncStreamRepo.updateMemoryAssetsV1(any()),
() => mockSyncApiRepo.ack(["10"]),
]);
});
});
group("SyncStreamService - remote trash & restore", () {
+26 -1
View File
@@ -47,7 +47,7 @@ abstract final class SyncStreamStub {
static final memoryV1 = SyncEvent(
type: SyncEntityType.memoryV1,
data: SyncMemoryV1(
data: SyncMemoryV2(
createdAt: DateTime(2023, 1, 1),
data: {"year": 2023, "title": "Test Memory"},
deletedAt: null,
@@ -64,6 +64,25 @@ abstract final class SyncStreamStub {
ack: "5",
);
static final memoryV2 = SyncEvent(
type: SyncEntityType.memoryV2,
data: SyncMemoryV2(
createdAt: DateTime(2023, 1, 1),
data: {"year": 2023},
deletedAt: null,
hideAt: null,
id: "memory-3",
isSaved: false,
memoryAt: DateTime(2023, 1, 1),
ownerId: "user-1",
seenAt: null,
showAt: DateTime(2023, 1, 1),
type: MemoryType.birthday,
updatedAt: DateTime(2023, 1, 1),
),
ack: "9",
);
static final memoryDeleteV1 = SyncEvent(
type: SyncEntityType.memoryDeleteV1,
data: SyncMemoryDeleteV1(memoryId: "memory-2"),
@@ -76,6 +95,12 @@ abstract final class SyncStreamStub {
ack: "7",
);
static final memoryToAssetV2 = SyncEvent(
type: SyncEntityType.memoryToAssetV2,
data: SyncMemoryAssetV1(assetId: "asset-1", memoryId: "memory-3"),
ack: "10",
);
static final memoryToAssetDeleteV1 = SyncEvent(
type: SyncEntityType.memoryToAssetDeleteV1,
data: SyncMemoryAssetDeleteV1(assetId: "asset-2", memoryId: "memory-1"),