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) }) })