import { upsertPropertiesOfItemIntoArrayOfObjectsComparingId } from '@/utils/array/upsertPropertiesOfItemIntoArrayOfObjectsComparingId'; type TestObject = { id: string; name: string; value: number; }; const mockTestObjects: TestObject[] = [ { id: '1', name: 'Test 1', value: 100, }, { id: '2', name: 'Test 2', value: 200, }, { id: '3', name: 'Test 3', value: 300, }, ]; describe('upsertPropertiesOfItemIntoArrayOfObjectsComparingId', () => { it('should insert partial properties into empty array', () => { const partialItem = { id: '1', name: 'New Item' }; expect( upsertPropertiesOfItemIntoArrayOfObjectsComparingId( [], partialItem, ), ).toStrictEqual([partialItem]); }); it('should append item when id does not exist', () => { const newItem: TestObject = { id: '4', name: 'Test 4', value: 400, }; expect( upsertPropertiesOfItemIntoArrayOfObjectsComparingId( mockTestObjects, newItem, ), ).toStrictEqual([...mockTestObjects, newItem]); }); it('should merge partial properties into existing item', () => { const partialUpdate = { id: '2', name: 'Updated Test 2' }; expect( upsertPropertiesOfItemIntoArrayOfObjectsComparingId( mockTestObjects, partialUpdate, ), ).toStrictEqual([ mockTestObjects[0], { id: '2', name: 'Updated Test 2', value: 200 }, mockTestObjects[2], ]); }); it('should replace all properties when full item is provided', () => { const fullUpdate: TestObject = { id: '1', name: 'Replaced Test 1', value: 999, }; expect( upsertPropertiesOfItemIntoArrayOfObjectsComparingId( mockTestObjects, fullUpdate, ), ).toStrictEqual([fullUpdate, mockTestObjects[1], mockTestObjects[2]]); }); it('should not mutate original array when updating', () => { const originalArray = [...mockTestObjects]; const partialUpdate = { id: '2', value: 999 }; upsertPropertiesOfItemIntoArrayOfObjectsComparingId( mockTestObjects, partialUpdate, ); expect(mockTestObjects).toStrictEqual(originalArray); }); it('should not mutate original array when inserting', () => { const originalArray = [...mockTestObjects]; const newItem: TestObject = { id: '5', name: 'Test 5', value: 500 }; upsertPropertiesOfItemIntoArrayOfObjectsComparingId( mockTestObjects, newItem, ); expect(mockTestObjects).toStrictEqual(originalArray); }); });