import Operation from './Operation'; describe('Operation', () => { let updateOperation: Operation; let deleteOperation: Operation; const resetUpdateOperation = () => { updateOperation = new Operation( 'UPDATE', { entityType: 'item', id: 'abcdefg' }, { value: 30 } ); deleteOperation = new Operation( 'DELETE', { entityType: 'item', id: 'foobarbaz' } ); updateOperation.setBefore({ id: 'abcdefg', value: 40, createdAt: 123456789, children: [] }); }; beforeAll(() => resetUpdateOperation()); it('.modify(...) works', () => { updateOperation.modify({ value: 40, updatedAt: 123456799 }); deleteOperation.modify({ value: 40 }); expect(updateOperation.before) .toEqual({ id: 'abcdefg', value: 40, createdAt: 123456789, children: [] }); expect(updateOperation.after) .toEqual({ id: 'abcdefg', value: 40, createdAt: 123456789, children: [], updatedAt: 123456799 }); expect(deleteOperation.after) .toEqual({}); }); it('.addNumToProp(...) works', () => { resetUpdateOperation(); updateOperation.addNumToProp('value', -10); expect(updateOperation.before) .toEqual({ id: 'abcdefg', value: 40, createdAt: 123456789, children: [] }); expect(updateOperation.after) .toEqual({ id: 'abcdefg', value: 20, createdAt: 123456789, children: [] }); updateOperation.addNumToProp('value', -5); expect(updateOperation.before) .toEqual({ id: 'abcdefg', value: 40, createdAt: 123456789, children: [] }); expect(updateOperation.after) .toEqual({ id: 'abcdefg', value: 15, createdAt: 123456789, children: [] }); }); describe('.setItemToProp(...), .delItemFromProp(...)', () => { beforeAll(() => resetUpdateOperation()); it('should add child item', () => { updateOperation.setItemToProp( 'children', { data: 'foo' }, { entityType: 'child', id: '1' }, 0 ); expect(updateOperation.before.children).toEqual([]); expect(updateOperation.after.children).toEqual([ { id: '1', data: 'foo' } ]); }); it('should overwrite child item', () => { updateOperation.setItemToProp( 'children', { data: 'bar' }, { entityType: 'child', id: '1' }, 0 ); expect(updateOperation.after.children[0]).toEqual({ id: '1', data: 'bar' }); }); it('should limitate length of children and only latest children must survive', () => { updateOperation.setItemToProp( 'children', { data: 'baz' }, { entityType: 'child', id: '2' }, 2 ); updateOperation.setItemToProp( 'children', { data: 'quux' }, { entityType: 'child', id: '3' }, 2 ); updateOperation.setItemToProp( 'children', { data: 'foobar' }, { entityType: 'child', id: '4' }, 2 ); updateOperation.setItemToProp( 'children', { data: 'barbaz' }, { entityType: 'child', id: '5' }, 2 ); expect(updateOperation.after.children.length).toEqual(2); expect(updateOperation.after.children[0].id).toEqual('5'); expect(updateOperation.after.children[1].id).toEqual('4'); }); it('should remove items without errors', () => { updateOperation.delItemFromProp( 'children', { entityType: 'child', id: '4' } ); expect(updateOperation.after.children.length).toEqual(1); expect(updateOperation.after.children[0].id).toEqual('5'); updateOperation.delItemFromProp( 'children', { entityType: 'child', id: '5' } ); expect(updateOperation.after.children.length).toEqual(0); updateOperation.delItemFromProp( 'children', { entityType: 'child', id: 'not_exist' } ); expect(updateOperation.after.children.length).toEqual(0); }); }); });