feat: add sync service with WebDAV merge logic
This commit is contained in:
parent
553284f3b2
commit
58e1cd0c19
2 changed files with 147 additions and 0 deletions
57
tests/syncService.test.ts
Normal file
57
tests/syncService.test.ts
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
import { mergeMeasurements } from '../src/sync/syncService'
|
||||
import { Measurement } from '../src/types'
|
||||
|
||||
jest.mock('expo-sqlite', () => ({
|
||||
openDatabaseAsync: jest.fn(),
|
||||
}))
|
||||
|
||||
const base: Measurement = {
|
||||
id: 'id-1',
|
||||
weight: 75,
|
||||
bmi: 22,
|
||||
bodyFatPercentage: 15,
|
||||
fatMass: 10,
|
||||
musclePercentage: 40,
|
||||
muscleMass: 30,
|
||||
visceralFat: 8,
|
||||
bmr: 1600,
|
||||
measuredAt: '2024-06-01T08:00:00.000Z',
|
||||
createdAt: '2024-06-01T08:00:00.000Z',
|
||||
updatedAt: '2024-06-01T08:00:00.000Z',
|
||||
syncStatus: 'local',
|
||||
}
|
||||
|
||||
describe('mergeMeasurements', () => {
|
||||
it('returns empty array when both are empty', () => {
|
||||
expect(mergeMeasurements([], [])).toEqual([])
|
||||
})
|
||||
|
||||
it('keeps local items not on remote', () => {
|
||||
const result = mergeMeasurements([base], [])
|
||||
expect(result).toHaveLength(1)
|
||||
expect(result[0].id).toBe('id-1')
|
||||
})
|
||||
|
||||
it('keeps remote items not on local', () => {
|
||||
const remote = { ...base, syncStatus: 'synced' as const }
|
||||
const result = mergeMeasurements([], [remote])
|
||||
expect(result).toHaveLength(1)
|
||||
expect(result[0].id).toBe('id-1')
|
||||
})
|
||||
|
||||
it('picks the newer version when both have same id', () => {
|
||||
const local = { ...base, weight: 75, updatedAt: '2024-06-02T08:00:00.000Z' }
|
||||
const remote = { ...base, weight: 76, updatedAt: '2024-06-03T08:00:00.000Z' }
|
||||
const result = mergeMeasurements([local], [remote])
|
||||
expect(result).toHaveLength(1)
|
||||
expect(result[0].weight).toBe(76)
|
||||
})
|
||||
|
||||
it('picks local when local is newer', () => {
|
||||
const local = { ...base, weight: 77, updatedAt: '2024-06-04T08:00:00.000Z' }
|
||||
const remote = { ...base, weight: 76, updatedAt: '2024-06-03T08:00:00.000Z' }
|
||||
const result = mergeMeasurements([local], [remote])
|
||||
expect(result).toHaveLength(1)
|
||||
expect(result[0].weight).toBe(77)
|
||||
})
|
||||
})
|
||||
Loading…
Reference in a new issue