diff --git a/__mocks__/unitOfWorkMapping.js b/__mocks__/unitOfWorkMapping.js index 2ac6fb2..f1f8543 100644 --- a/__mocks__/unitOfWorkMapping.js +++ b/__mocks__/unitOfWorkMapping.js @@ -7,6 +7,7 @@ cartMetadata.setAttributeList([ new Attribute('clientPhoneNumber', 'clientPhoneNumber', 'phone_number'), new Attribute('createdAt', 'createdAt', 'datetime'), new Attribute('data', 'data', 'object'), + new Attribute('codeList', 'codeList', 'array'), ]); cartMetadata.setRelationList([ new Relation( diff --git a/__tests__/UnitOfWork.test.js b/__tests__/UnitOfWork.test.js index 06212fa..48ccfb5 100644 --- a/__tests__/UnitOfWork.test.js +++ b/__tests__/UnitOfWork.test.js @@ -110,49 +110,6 @@ describe('UnitOfWork', () => { cartMetadata ) ).toEqual({ '@id': '/v12/carts/2', status: 'payed' }); - - expect( - unitOfWork.getDirtyData( - { - '@id': '/v12/carts/1', - status: 'payed', - data: { - foo: 'bar', - loo: 'baz', - }, - }, - { - '@id': '/v12/carts/1', - status: 'payed', - data: { - foo: 'bar', - }, - }, - cartMetadata - ) - ).toEqual({ data: { foo: 'bar', loo: 'baz' } }); - - expect( - unitOfWork.getDirtyData( - { - '@id': '/v12/carts/1', - status: 'payed', - data: { - foo: 'bar', - bad: 'baz', - }, - }, - { - '@id': '/v12/carts/1', - status: 'payed', - data: { - foo: 'bar', - bad: 'baz', - }, - }, - cartMetadata - ) - ).toEqual({}); }); test('get dirty data with more data', () => { @@ -541,4 +498,133 @@ describe('UnitOfWork', () => { }, }); }); + + test('get dirty data with object data', () => { + expect( + unitOfWork.getDirtyData( + { + '@id': '/v12/carts/1', + status: 'payed', + data: { + foo: 'bar', + loo: 'baz', + }, + }, + { + '@id': '/v12/carts/1', + status: 'payed', + data: { + foo: 'bar', + }, + }, + cartMetadata + ) + ).toEqual({ data: { foo: 'bar', loo: 'baz' } }); + + expect( + unitOfWork.getDirtyData( + { + '@id': '/v12/carts/1', + status: 'payed', + data: { + foo: 'bar', + bad: 'baz', + }, + }, + { + '@id': '/v12/carts/1', + status: 'payed', + data: { + foo: 'bar', + bad: 'baz', + }, + }, + cartMetadata + ) + ).toEqual({}); + }); + + test('get dirty data with array data', () => { + expect( + unitOfWork.getDirtyData( + { + '@id': '/v12/carts/1', + status: 'payed', + codeList: ['bar', 'baz'], + }, + { + '@id': '/v12/carts/1', + status: 'payed', + codeList: ['bar'], + }, + cartMetadata + ) + ).toEqual({ codeList: ['bar', 'baz'] }); + + expect( + unitOfWork.getDirtyData( + { + '@id': '/v12/carts/1', + status: 'payed', + codeList: ['bar', 'baz'], + }, + { + '@id': '/v12/carts/1', + status: 'payed', + codeList: ['bar', 'baz'], + }, + cartMetadata + ) + ).toEqual({}); + }); + + test('get dirty data with complex array data', () => { + expect( + unitOfWork.getDirtyData( + { + '@id': '/v12/carts/1', + status: 'payed', + codeList: [{ bar: 'bar' }, { baz: 'baz' }], + }, + { + '@id': '/v12/carts/1', + status: 'payed', + codeList: [{ bar: 'bar' }], + }, + cartMetadata + ) + ).toEqual({ codeList: [{ bar: 'bar' }, { baz: 'baz' }] }); + + expect( + unitOfWork.getDirtyData( + { + '@id': '/v12/carts/1', + status: 'payed', + codeList: [{ bar: 'bar' }, { baz: 'baz' }], + }, + { + '@id': '/v12/carts/1', + status: 'payed', + codeList: [{ bar: 'bar' }, { baz: 'bad' }], + }, + cartMetadata + ) + ).toEqual({ codeList: [{ bar: 'bar' }, { baz: 'baz' }] }); + + expect( + unitOfWork.getDirtyData( + { + '@id': '/v12/carts/1', + status: 'payed', + codeList: [{ bar: 'bar' }, { baz: 'baz' }], + }, + { + '@id': '/v12/carts/1', + status: 'payed', + codeList: [{ bar: 'bar' }, { baz: 'baz' }], + }, + cartMetadata + ) + ).toEqual({}); + }); }); diff --git a/src/UnitOfWork.ts b/src/UnitOfWork.ts index d9020a1..2a68058 100644 --- a/src/UnitOfWork.ts +++ b/src/UnitOfWork.ts @@ -148,7 +148,7 @@ class UnitOfWork { ): StringKeyObject { const dirtyFields = dirtyFieldsParam; - if (attribute.type === 'object') { + if (attribute.type === 'object' || attribute.type === 'array') { if (oldValue === undefined || objectDiffers(oldValue, newValue)) { dirtyFields[key] = newValue; }