test: herschrijf tests voor timestamp-based sync, vervang updateMeasurement door setDeletedAt

This commit is contained in:
eddy 2026-07-20 17:03:44 +02:00
commit d0dd2f4e39
2 changed files with 41 additions and 58 deletions

View file

@ -1,72 +1,56 @@
import { mergeMeasurements } from '../src/sync/syncService'
import { Measurement } from '../src/types'
jest.mock('expo-sqlite', () => ({
openDatabaseAsync: jest.fn(),
}))
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',
}
const make = (overrides: Partial<Measurement> = {}): 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', ...overrides,
})
describe('mergeMeasurements', () => {
it('returns empty array when both are empty', () => {
it('both empty returns 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('local only kept', () => {
const r = mergeMeasurements([make()], [])
expect(r).toHaveLength(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('remote only kept', () => {
const r = mergeMeasurements([], [make({ id: 'r1' })])
expect(r).toHaveLength(1)
expect(r[0].id).toBe('r1')
})
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('last-writer-wins: remote newer', () => {
const local = make({ weight: 75, updatedAt: '2024-06-02T08:00:00.000Z' })
const remote = make({ weight: 76, updatedAt: '2024-06-03T08:00:00.000Z' })
const r = mergeMeasurements([local], [remote])
expect(r[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)
it('last-writer-wins: local newer', () => {
const local = make({ weight: 77, updatedAt: '2024-06-04T08:00:00.000Z' })
const remote = make({ weight: 76, updatedAt: '2024-06-03T08:00:00.000Z' })
const r = mergeMeasurements([local], [remote])
expect(r[0].weight).toBe(77)
})
it('excludes ids in excludeIds from both sides', () => {
const local = { ...base, id: 'id-1' }
const remote = { ...base, id: 'id-2' }
const result = mergeMeasurements([local], [remote], new Set(['id-1', 'id-2']))
expect(result).toHaveLength(0)
it('remote deleted wins over older local', () => {
const local = make({ updatedAt: '2024-06-01T08:00:00.000Z' })
const remote = make({ updatedAt: '2024-06-03T08:00:00.000Z', deletedAt: '2024-06-03T08:00:00.000Z' })
const r = mergeMeasurements([local], [remote])
expect(r[0].deletedAt).toBe('2024-06-03T08:00:00.000Z')
})
it('keeps ids not in excludeIds', () => {
const local = { ...base, id: 'id-1' }
const remote = { ...base, id: 'id-2' }
const result = mergeMeasurements([local], [remote], new Set(['id-1']))
expect(result).toHaveLength(1)
expect(result[0].id).toBe('id-2')
it('local wins over older remote deleted', () => {
const local = make({ updatedAt: '2024-06-03T08:00:00.000Z' })
const remote = make({ updatedAt: '2024-06-01T08:00:00.000Z', deletedAt: '2024-06-01T08:00:00.000Z' })
const r = mergeMeasurements([local], [remote])
expect(r[0].deletedAt).toBeUndefined()
})
})