UNPKG

synctos

Version:

The Syncmaker. A tool to build comprehensive sync functions for Couchbase Sync Gateway.

830 lines (715 loc) 29.7 kB
const testFixtureMaker = require('../src/testing/test-fixture-maker'); const errorFormatter = require('../src/testing/validation-error-formatter'); describe('Strict immutable item constraint:', () => { const testFixture = testFixtureMaker.initFromSyncFunction('build/sync-functions/test-immutable-items-strict-sync-function.js'); afterEach(() => { testFixture.resetTestEnvironment(); }); describe('array type with static property validation', () => { it('allows replacement of a document with an immutable array when the simple type elements have not changed', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, 46.0 ] }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, 46 ] }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement of a document with an immutable array when the nested complex type elements have not changed', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ [ 'foobar', 3, false ], void 0, [ 45.9 ], [ ], null, { foo: 'bar', baz: null } ] }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ [ 'foobar', 3, false ], void 0, [ 45.9 ], [ ], null, { foo: 'bar', baz: void 0 } ] }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement of a document with an immutable array when it is null', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: null }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: null }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement of a document with an immutable array when it is missing', () => { const doc = { _id: 'immutableItemsDoc' }; const oldDoc = { _id: 'immutableItemsDoc' }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows creation of a document with an immutable array when the old document does not exist', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ [ 'foobar', 3, false ], [ 45.9 ], [ ], { foo: 'bar' } ] }; testFixture.verifyDocumentCreated(doc); }); it('allows creation of a document with an immutable array when the old document was deleted', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ [ 'foobar', 3, false ], [ 45.9 ], [ ], { foo: 'bar' } ] }; const oldDoc = { _id: 'immutableItemsDoc', _deleted: true }; testFixture.verifyDocumentAccepted(doc, oldDoc, 'write'); }); it('allows removal of a document with an immutable array', () => { const oldDoc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, 45.9 ] }; testFixture.verifyDocumentDeleted(oldDoc); }); it('blocks replacement of a document with an immutable array when the elements are not equal', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, 45.9 ] }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, -13.7 ] }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableArrayProp')); }); it('blocks replacement of a document with an immutable array when a nested element is not equal', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, 45.9, [ ], { foo: 'bar' } ] }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, 45.9, [ ], { } ] }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableArrayProp')); }); it('blocks replacement of a document with an immutable array when one is a subset of the other', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, 45.9, { } ] }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, 45.9, { }, [ ] ] }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableArrayProp')); }); it('blocks replacement of a document with an immutable array when nested complex type elements are not the same type', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, 45.9, { } ] }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, 45.9, [ ] ] }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableArrayProp')); }); it('blocks replacement of a document with an immutable array when the element order has changed', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, null, false, 45.9, [ ] ] }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, null, 45.9, [ ] ] }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableArrayProp')); }); it('blocks replacement of a document with an immutable array when it is null in the new document', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: null }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, 45.9, [ ] ] }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableArrayProp')); }); it('blocks replacement of a document with an immutable array when it is missing in the new document', () => { const doc = { _id: 'immutableItemsDoc' }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, 45.9, [ ] ] }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableArrayProp')); }); it('blocks replacement of a document with an immutable array when it is null in the old document', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, 45.9, [ ] ] }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: null }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableArrayProp')); }); it('blocks replacement of a document with an immutable array when it is missing in the old document', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableArrayProp: [ 'foobar', 3, false, 45.9, [ ] ] }; const oldDoc = { _id: 'immutableItemsDoc' }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableArrayProp')); }); }); describe('array type with dynamic property validation', () => { it('allows replacement of a document when the array property elements have not changed', () => { const doc = { _id: 'immutableItemsDoc', dynamicImmutableArrayProp: [ 'barfoo', -72.0, true, 3.9 ], dynamicPropertiesAreImmutable: true }; const oldDoc = { _id: 'immutableItemsDoc', dynamicImmutableArrayProp: [ 'barfoo', -72, true, 3.9 ], dynamicPropertiesAreImmutable: true }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement of a document when the array property is not immutable', () => { const doc = { _id: 'immutableItemsDoc', dynamicImmutableArrayProp: [ 2, null ], dynamicPropertiesAreImmutable: false }; const oldDoc = { _id: 'immutableItemsDoc', dynamicImmutableArrayProp: [ '#1', void 0 ], dynamicPropertiesAreImmutable: false }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('blocks replacement of a document when the array property is immutable and its elements have changed', () => { const doc = { _id: 'immutableItemsDoc', dynamicImmutableArrayProp: [ '#4' ], dynamicPropertiesAreImmutable: true }; const oldDoc = { _id: 'immutableItemsDoc', dynamicImmutableArrayProp: [ 3.0 ], dynamicPropertiesAreImmutable: true }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('dynamicImmutableArrayProp')); }); }); describe('object type with static property validation', () => { it('allows replacement of a document with an immutable object when the nested simple type properties have not changed', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myStringProp: 'foobar', myIntegerProp: 8, myBooleanProp: true, myFloatProp: 88.92 } }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myStringProp: 'foobar', myIntegerProp: 8, myBooleanProp: true, myFloatProp: 88.92 } }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement of a document with an immutable object when the nested complex type elements have not changed', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myArrayProp: [ 'foobar', 3, false, 45.9, [ null ], { foo: void 0 } ], myObjectProp: { foo: 'bar', baz: 73, qux: [ ] } } }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myArrayProp: [ 'foobar', 3, false, 45.9, [ null ], { foo: null } ], myObjectProp: { foo: 'bar', baz: 73, qux: [ ] } } }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement of a document with an immutable object when the property is null', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: null }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: null }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement of a document with an immutable object when the property is missing', () => { const doc = { _id: 'immutableItemsDoc' }; const oldDoc = { _id: 'immutableItemsDoc' }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement of a document with an immutable object when the nested property order has changed', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myIntegerProp: 8, myNullProp: null, myStringProp: 'foobar' } }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myStringProp: 'foobar', myIntegerProp: 8, myNullProp: null } }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows creation of a document with an immutable object when the old document does not exist', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myArrayProp: [ 'foobar', 3, false, 45.9, [ null ] ], myObjectProp: { foo: 'bar', baz: 73 } } }; testFixture.verifyDocumentCreated(doc); }); it('allows creation of a document with an immutable object when the old document was deleted', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myArrayProp: [ 'foobar', 3, false, 45.9, [ null ] ], myObjectProp: { foo: 'bar', baz: 73 } } }; const oldDoc = { _id: 'immutableItemsDoc', _deleted: true }; testFixture.verifyDocumentAccepted(doc, oldDoc, 'write'); }); it('allows removal of a document with an immutable object', () => { const oldDoc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myArrayProp: [ 'foobar', 3, false, 45.9, [ null ] ], myObjectProp: { foo: 'bar', baz: 73 } } }; testFixture.verifyDocumentDeleted(oldDoc); }); it('blocks replacement of a document with an immutable object when the nested properties are not equal', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myArrayProp: [ 'foobar', 3, false, 45.9, [ { foo: 'baz' } ] ], myObjectProp: { foo: 'bar', baz: 73 } } }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myArrayProp: [ 'foobar', 3, false, 45.9, [ { } ] ], myObjectProp: { foo: 'bar', baz: 73 } } }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableObjectProp')); }); it('blocks replacement of a document with an immutable object when a nested property is missing', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myStringProp: 'foobar', myBooleanProp: true, myFloatProp: 88.92 } }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myStringProp: 'foobar', myIntegerProp: 8, myBooleanProp: true, myFloatProp: 88.92 } }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableObjectProp')); }); it('blocks replacement of a document with an immutable object when it is null in the new document', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: null }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myStringProp: 'foobar', myBooleanProp: true, myFloatProp: 88.92 } }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableObjectProp')); }); it('blocks replacement of a document with an immutable object when it is missing in the new document', () => { const doc = { _id: 'immutableItemsDoc' }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { myStringProp: 'foobar', myBooleanProp: true, myFloatProp: 88.92 } }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableObjectProp')); }); it('blocks replacement of a document with an immutable object when it is null in the old document', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { } }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: null }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableObjectProp')); }); it('blocks replacement of a document with an immutable object when it is missing in the old document', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableObjectProp: { } }; const oldDoc = { _id: 'immutableItemsDoc' }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableObjectProp')); }); }); describe('object type with dynamic property validation', () => { it('allows replacement of a document when the object property value has not changed', () => { const doc = { _id: 'immutableItemsDoc', dynamicImmutableObjectProp: { myFloatProp: 88.92 }, dynamicPropertiesAreImmutable: true }; const oldDoc = { _id: 'immutableItemsDoc', dynamicImmutableObjectProp: { myFloatProp: 88.92 }, dynamicPropertiesAreImmutable: true }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement of a document when the object property is not immutable', () => { const doc = { _id: 'immutableItemsDoc', dynamicImmutableObjectProp: { myIntegerProp: -33 }, dynamicPropertiesAreImmutable: false }; const oldDoc = { _id: 'immutableItemsDoc', dynamicImmutableObjectProp: { myFloatProp: 88.92 }, dynamicPropertiesAreImmutable: false }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('blocks replacement of a document when the object property is immutable and its value has changed', () => { const doc = { _id: 'immutableItemsDoc', dynamicImmutableObjectProp: { myStringProp: 'foo' }, dynamicPropertiesAreImmutable: true }; const oldDoc = { _id: 'immutableItemsDoc', dynamicImmutableObjectProp: { myIntegerProp: -33 }, dynamicPropertiesAreImmutable: true }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('dynamicImmutableObjectProp')); }); }); describe('hashtable type with static validation', () => { it('allows replacement of a document with an immutable hashtable when the nested simple type properties have not changed', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myStringProp: 'foobar', myIntegerProp: 8, myBooleanProp: true, myFloatProp: 88.92 } }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myStringProp: 'foobar', myIntegerProp: 8, myBooleanProp: true, myFloatProp: 88.92 } }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement of a document with an immutable hashtable when the nested complex type elements have not changed', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myArrayProp: [ 'foobar', 3, false, 45.9, [ null ], { foobar: 18.0 } ], myObjectProp: { foo: 'bar', baz: 73, qux: [ ] } } }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myArrayProp: [ 'foobar', 3, false, 45.9, [ null ], { foobar: 18, baz: void 0 } ], myObjectProp: { foo: 'bar', baz: 73, qux: [ ] } } }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement of a document with an immutable hashtable when the property is null', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: null }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: null }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement of a document with an immutable hashtable when the property is missing', () => { const doc = { _id: 'immutableItemsDoc' }; const oldDoc = { _id: 'immutableItemsDoc' }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement of a document with an immutable hashtable when the nested property order has changed', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myIntegerProp: 8, myStringProp: 'foobar', myNullProp: null } }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myNullProp: null, myStringProp: 'foobar', myIntegerProp: 8 } }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows creation of a document with an immutable hashtable when the old document does not exist', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myArrayProp: [ 'foobar', 3, false, 45.9, [ null ] ], myObjectProp: { foo: 'bar', baz: 73 } } }; testFixture.verifyDocumentCreated(doc); }); it('allows creation of a document with an immutable hashtable when the old document was deleted', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myArrayProp: [ 'foobar', 3, false, 45.9, [ null ] ], myObjectProp: { foo: 'bar', baz: 73 } } }; const oldDoc = { _id: 'immutableItemsDoc', _deleted: true }; testFixture.verifyDocumentAccepted(doc, oldDoc, 'write'); }); it('allows removal of a document with an immutable hashtable', () => { const oldDoc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myArrayProp: [ 'foobar', 3, false, 45.9, [ null ] ], myObjectProp: { foo: 'bar', baz: 73 } } }; testFixture.verifyDocumentDeleted(oldDoc); }); it('blocks replacement of a document with an immutable hashtable when the nested properties are not equal', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myArrayProp: [ 'foobar', 3, false, 45.9, [ { bar: 'baz' } ] ], myObjectProp: { foo: 'bar', baz: 73 } } }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myArrayProp: [ 'foobar', 3, false, 45.9, [ { foo: null } ] ], myObjectProp: { foo: 'bar', baz: 73 } } }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableHashtableProp')); }); it('blocks replacement of a document with an immutable hashtable when a nested property is missing', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myStringProp: 'foobar', myIntegerProp: 8, myBooleanProp: true } }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myStringProp: 'foobar', myIntegerProp: 8, myBooleanProp: true, myFloatProp: 88.92 } }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableHashtableProp')); }); it('blocks replacement of a document with an immutable hashtable when it is null in the new document', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: null }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myStringProp: 'foobar', myBooleanProp: true, myFloatProp: 88.92 } }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableHashtableProp')); }); it('blocks replacement of a document with an immutable hashtable when it is missing in the new document', () => { const doc = { _id: 'immutableItemsDoc' }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { myStringProp: 'foobar', myBooleanProp: true, myFloatProp: 88.92 } }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableHashtableProp')); }); it('blocks replacement of a document with an immutable hashtable when it is null in the old document', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { } }; const oldDoc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: null }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableHashtableProp')); }); it('blocks replacement of a document with an immutable hashtable when it is missing in the old document', () => { const doc = { _id: 'immutableItemsDoc', staticImmutableHashtableProp: { } }; const oldDoc = { _id: 'immutableItemsDoc' }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('staticImmutableHashtableProp')); }); }); describe('hashtable type with dynamic property validation', () => { it('allows replacement of a document when the hashtable property value has not changed', () => { const doc = { _id: 'immutableItemsDoc', dynamicImmutableHashtableProp: { myDateProp: '2017-04-07' }, dynamicPropertiesAreImmutable: true }; const oldDoc = { _id: 'immutableItemsDoc', dynamicImmutableHashtableProp: { myDateProp: '2017-04-07' }, dynamicPropertiesAreImmutable: true }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement of a document when the object property is not immutable', () => { const doc = { _id: 'immutableItemsDoc', dynamicImmutableHashtableProp: { myIntegerProp: -33 }, dynamicPropertiesAreImmutable: false }; const oldDoc = { _id: 'immutableItemsDoc', dynamicImmutableHashtableProp: { myBoolean: true }, dynamicPropertiesAreImmutable: false }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('blocks replacement of a document when the object property is immutable and its value has changed', () => { const doc = { _id: 'immutableItemsDoc', dynamicImmutableHashtableProp: { myStringProp: 'foo' }, dynamicPropertiesAreImmutable: true }; const oldDoc = { _id: 'immutableItemsDoc', dynamicImmutableHashtableProp: { myIntegerProp: -33 }, dynamicPropertiesAreImmutable: true }; testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'immutableItemsDoc', errorFormatter.immutableItemViolation('dynamicImmutableHashtableProp')); }); }); describe('for specialized string types', () => { it('allow values that match the old values exactly', () => { const oldDoc = { _id: 'immutableItemsDoc', staticImmutableDateProp: '1801-12-09', staticImmutableDatetimeProp: '2096-02-29T03:36:27.369+12:45', staticImmutableTimeProp: '11:58', staticImmutableTimezoneProp: '+13:00', staticImmutableUuidProp: 'b75a2f25-cae2-46b2-be92-e96f3063dec7' }; const doc = { _id: 'immutableItemsDoc', staticImmutableDateProp: '1801-12-09', staticImmutableDatetimeProp: '2096-02-29T03:36:27.369+12:45', staticImmutableTimeProp: '11:58', staticImmutableTimezoneProp: '+13:00', staticImmutableUuidProp: 'b75a2f25-cae2-46b2-be92-e96f3063dec7' }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('reject values that are semantically equal to the old values but not strictly equal', () => { const oldDoc = { _id: 'immutableItemsDoc', staticImmutableDateProp: '1970', staticImmutableDatetimeProp: '1970-01-01T18:24Z', staticImmutableTimeProp: '00:00', staticImmutableTimezoneProp: 'Z', staticImmutableUuidProp: '3bf7118b-19fa-48e2-b0c9-dab20b65bad8' }; const doc = { _id: 'immutableItemsDoc', staticImmutableDateProp: '1970-01-01', staticImmutableDatetimeProp: '1970-01-01T18:24:00.000Z', staticImmutableTimeProp: '00:00:00.000', staticImmutableTimezoneProp: '+00:00', staticImmutableUuidProp: oldDoc.staticImmutableUuidProp.toUpperCase() }; testFixture.verifyDocumentNotReplaced( doc, oldDoc, 'immutableItemsDoc', [ errorFormatter.immutableItemViolation('staticImmutableDateProp'), errorFormatter.immutableItemViolation('staticImmutableDatetimeProp'), errorFormatter.immutableItemViolation('staticImmutableTimeProp'), errorFormatter.immutableItemViolation('staticImmutableTimezoneProp'), errorFormatter.immutableItemViolation('staticImmutableUuidProp'), ]); }); }); });