From d0dd2f4e391181cc2212f67fa0f13b73d6e51017 Mon Sep 17 00:00:00 2001 From: eddy Date: Mon, 20 Jul 2026 17:03:44 +0200 Subject: [PATCH] test: herschrijf tests voor timestamp-based sync, vervang updateMeasurement door setDeletedAt --- tests/database.test.ts | 13 +++--- tests/syncService.test.ts | 86 ++++++++++++++++----------------------- 2 files changed, 41 insertions(+), 58 deletions(-) diff --git a/tests/database.test.ts b/tests/database.test.ts index 48a7f22..f2b1a90 100644 --- a/tests/database.test.ts +++ b/tests/database.test.ts @@ -18,7 +18,6 @@ const mockMeasurement: Measurement = { measuredAt: '2024-01-01T08:00:00.000Z', createdAt: '2024-01-01T08:00:00.000Z', updatedAt: '2024-01-01T08:00:00.000Z', - syncStatus: 'local', } describe('database', () => { @@ -27,7 +26,7 @@ describe('database', () => { let insertMeasurement: any let getAllMeasurements: any let getLatestMeasurement: any - let updateMeasurement: any + let setDeletedAt: any beforeEach(async () => { jest.resetModules() @@ -46,7 +45,7 @@ describe('database', () => { insertMeasurement = mod.insertMeasurement getAllMeasurements = mod.getAllMeasurements getLatestMeasurement = mod.getLatestMeasurement - updateMeasurement = mod.updateMeasurement + setDeletedAt = mod.setDeletedAt }) it('initDatabase creates the measurements table', async () => { @@ -82,13 +81,13 @@ describe('database', () => { expect(result!.id).toBe(mockMeasurement.id) }) - it('updateMeasurement updates syncStatus', async () => { + it('setDeletedAt sets the deletedAt timestamp', async () => { db.runAsync.mockResolvedValue(undefined) await initDatabase() - await updateMeasurement(mockMeasurement.id, 'synced') + await setDeletedAt(mockMeasurement.id) expect(db.runAsync).toHaveBeenCalledWith( - expect.stringContaining('UPDATE measurements'), - expect.arrayContaining(['synced', mockMeasurement.id]) + expect.stringContaining('UPDATE measurements SET deletedAt'), + expect.arrayContaining([mockMeasurement.id]) ) }) }) diff --git a/tests/syncService.test.ts b/tests/syncService.test.ts index 1f5878d..ff769a7 100644 --- a/tests/syncService.test.ts +++ b/tests/syncService.test.ts @@ -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 => ({ + 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() }) })