feat: implement sync conflict resolver with timestamp-based merging

Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2025-11-12 07:49:13 +00:00
parent afaf580a2b
commit 82c537d659
2 changed files with 133 additions and 0 deletions

View File

@@ -0,0 +1,75 @@
import { resolveConflict } from '@/lib/sync-conflict-resolver'
import { BibleHighlight } from '@/types'
describe('SyncConflictResolver', () => {
it('should prefer server version if newer', () => {
const clientVersion: BibleHighlight = {
id: 'h-1',
verseId: 'v-1',
color: 'yellow',
createdAt: 1000,
updatedAt: 1000,
syncStatus: 'pending'
}
const serverVersion: BibleHighlight = {
id: 'h-1',
verseId: 'v-1',
color: 'blue',
createdAt: 1000,
updatedAt: 2000, // newer
syncStatus: 'synced'
}
const result = resolveConflict(clientVersion, serverVersion)
expect(result.color).toBe('blue')
expect(result.updatedAt).toBe(2000)
})
it('should prefer client version if newer', () => {
const clientVersion: BibleHighlight = {
id: 'h-1',
verseId: 'v-1',
color: 'blue',
createdAt: 1000,
updatedAt: 3000, // newer
syncStatus: 'pending'
}
const serverVersion: BibleHighlight = {
id: 'h-1',
verseId: 'v-1',
color: 'yellow',
createdAt: 1000,
updatedAt: 2000,
syncStatus: 'synced'
}
const result = resolveConflict(clientVersion, serverVersion)
expect(result.color).toBe('blue')
expect(result.updatedAt).toBe(3000)
})
it('should mark as synced after resolution', () => {
const clientVersion: BibleHighlight = {
id: 'h-1',
verseId: 'v-1',
color: 'yellow',
createdAt: 1000,
updatedAt: 2000,
syncStatus: 'pending'
}
const serverVersion: BibleHighlight = {
id: 'h-1',
verseId: 'v-1',
color: 'yellow',
createdAt: 1000,
updatedAt: 2000,
syncStatus: 'synced'
}
const result = resolveConflict(clientVersion, serverVersion)
expect(result.syncStatus).toBe('synced')
})
})