diff options
| author | nsfisis <nsfisis@gmail.com> | 2025-12-31 18:40:56 +0900 |
|---|---|---|
| committer | nsfisis <nsfisis@gmail.com> | 2025-12-31 18:41:36 +0900 |
| commit | 539e8f25b12d719084c8a986fcf65cf7848314b3 (patch) | |
| tree | 3e12eeb5a26b1cb33298ea9e54280461e1128f84 /src/client/sync/conflict.test.ts | |
| parent | 4755779975a140660e66acfcec2cc899179b0b71 (diff) | |
| download | kioku-539e8f25b12d719084c8a986fcf65cf7848314b3.tar.gz kioku-539e8f25b12d719084c8a986fcf65cf7848314b3.tar.zst kioku-539e8f25b12d719084c8a986fcf65cf7848314b3.zip | |
refactor(sync): remove legacy conflict resolution strategies
Remove the unused "local_wins" strategy and ConflictResolverOptions
interface from ConflictResolver. The CRDT-based conflict resolution
now always uses Automerge merge with server_wins fallback when CRDT
data is unavailable. This simplifies the codebase by removing
configuration options that were never used in production.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Diffstat (limited to 'src/client/sync/conflict.test.ts')
| -rw-r--r-- | src/client/sync/conflict.test.ts | 102 |
1 files changed, 13 insertions, 89 deletions
diff --git a/src/client/sync/conflict.test.ts b/src/client/sync/conflict.test.ts index 6cef6b0..3fe8b67 100644 --- a/src/client/sync/conflict.test.ts +++ b/src/client/sync/conflict.test.ts @@ -150,7 +150,7 @@ describe("ConflictResolver", () => { }); describe("resolveDeckConflict", () => { - it("should use server data with server_wins strategy", async () => { + it("should use server data when no CRDT data available", async () => { const localDeck = await localDeckRepository.create({ userId: "user-1", name: "Local Name", @@ -170,7 +170,7 @@ describe("ConflictResolver", () => { syncVersion: 5, }; - const resolver = new ConflictResolver({ strategy: "server_wins" }); + const resolver = new ConflictResolver(); const result = await resolver.resolveDeckConflict(localDeck, serverDeck); expect(result.resolution).toBe("server_wins"); @@ -181,39 +181,10 @@ describe("ConflictResolver", () => { expect(updatedDeck?.newCardsPerDay).toBe(20); expect(updatedDeck?._synced).toBe(true); }); - - it("should keep local data with local_wins strategy", async () => { - const localDeck = await localDeckRepository.create({ - userId: "user-1", - name: "Local Name", - description: "Local description", - newCardsPerDay: 10, - }); - - const serverDeck = { - id: localDeck.id, - userId: "user-1", - name: "Server Name", - description: "Server description", - newCardsPerDay: 20, - createdAt: new Date("2024-01-01"), - updatedAt: new Date("2024-01-03"), - deletedAt: null, - syncVersion: 5, - }; - - const resolver = new ConflictResolver({ strategy: "local_wins" }); - const result = await resolver.resolveDeckConflict(localDeck, serverDeck); - - expect(result.resolution).toBe("local_wins"); - - const updatedDeck = await localDeckRepository.findById(localDeck.id); - expect(updatedDeck?.name).toBe("Local Name"); - }); }); describe("resolveCardConflict", () => { - it("should use server data with server_wins strategy", async () => { + it("should use server data when no CRDT data available", async () => { const deck = await localDeckRepository.create({ userId: "user-1", name: "Test Deck", @@ -251,7 +222,7 @@ describe("ConflictResolver", () => { syncVersion: 3, }; - const resolver = new ConflictResolver({ strategy: "server_wins" }); + const resolver = new ConflictResolver(); const result = await resolver.resolveCardConflict(localCard, serverCard); expect(result.resolution).toBe("server_wins"); @@ -261,53 +232,6 @@ describe("ConflictResolver", () => { expect(updatedCard?.back).toBe("Server Answer"); expect(updatedCard?._synced).toBe(true); }); - - it("should keep local data with local_wins strategy", async () => { - const deck = await localDeckRepository.create({ - userId: "user-1", - name: "Test Deck", - description: null, - newCardsPerDay: 20, - }); - - const localCard = await localCardRepository.create({ - deckId: deck.id, - noteId: "test-note-id", - isReversed: false, - front: "Local Question", - back: "Local Answer", - }); - - const serverCard = { - id: localCard.id, - deckId: deck.id, - noteId: "test-note-id", - isReversed: false, - front: "Server Question", - back: "Server Answer", - state: CardState.New, - due: new Date(), - stability: 0, - difficulty: 0, - elapsedDays: 0, - scheduledDays: 0, - reps: 0, - lapses: 0, - lastReview: null, - createdAt: new Date(), - updatedAt: new Date(), - deletedAt: null, - syncVersion: 3, - }; - - const resolver = new ConflictResolver({ strategy: "local_wins" }); - const result = await resolver.resolveCardConflict(localCard, serverCard); - - expect(result.resolution).toBe("local_wins"); - - const updatedCard = await localCardRepository.findById(localCard.id); - expect(updatedCard?.front).toBe("Local Question"); - }); }); describe("resolveConflicts", () => { @@ -372,7 +296,7 @@ describe("ConflictResolver", () => { ...createEmptyPullResult(6), }; - const resolver = new ConflictResolver({ strategy: "server_wins" }); + const resolver = new ConflictResolver(); const result = await resolver.resolveConflicts(pushResult, pullResult); expect(result.decks).toHaveLength(2); @@ -441,7 +365,7 @@ describe("ConflictResolver", () => { ...createEmptyPullResult(3), }; - const resolver = new ConflictResolver({ strategy: "server_wins" }); + const resolver = new ConflictResolver(); const result = await resolver.resolveConflicts(pushResult, pullResult); expect(result.cards).toHaveLength(1); @@ -485,7 +409,7 @@ describe("ConflictResolver", () => { ...createEmptyPullResult(1), }; - const resolver = new ConflictResolver({ strategy: "server_wins" }); + const resolver = new ConflictResolver(); const result = await resolver.resolveConflicts(pushResult, pullResult); expect(result.decks).toHaveLength(1); @@ -522,7 +446,7 @@ describe("ConflictResolver", () => { ...createEmptyPullResult(0), }; - const resolver = new ConflictResolver({ strategy: "server_wins" }); + const resolver = new ConflictResolver(); const result = await resolver.resolveConflicts(pushResult, pullResult); // No resolution since server doesn't have the item @@ -533,7 +457,7 @@ describe("ConflictResolver", () => { expect(localDeck?.name).toBe("Local Only Deck"); }); - it("should default to crdt strategy", async () => { + it("should use CRDT strategy by default", async () => { const deck = await localDeckRepository.create({ userId: "user-1", name: "Local Name", @@ -647,7 +571,7 @@ describe("ConflictResolver", () => { ], }; - const resolver = new ConflictResolver({ strategy: "crdt" }); + const resolver = new ConflictResolver(); const result = await resolver.resolveConflicts(pushResult, pullResult); expect(result.decks).toHaveLength(1); @@ -708,7 +632,7 @@ describe("ConflictResolver", () => { ], }; - const resolver = new ConflictResolver({ strategy: "crdt" }); + const resolver = new ConflictResolver(); const result = await resolver.resolveConflicts(pushResult, pullResult); // Should still resolve using fallback @@ -759,7 +683,7 @@ describe("ConflictResolver", () => { ...createEmptyPullResult(5), }; - const resolver = new ConflictResolver({ strategy: "crdt" }); + const resolver = new ConflictResolver(); const result = await resolver.resolveConflicts(pushResult, pullResult); expect(result.decks).toHaveLength(1); @@ -822,7 +746,7 @@ describe("ConflictResolver", () => { ], }; - const resolver = new ConflictResolver({ strategy: "crdt" }); + const resolver = new ConflictResolver(); const result = await resolver.resolveConflicts(pushResult, pullResult); expect(result.decks).toHaveLength(1); |
