UNPKG

synctos

Version:

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

418 lines (367 loc) 13.1 kB
const testFixtureMaker = require('../src/testing/test-fixture-maker'); const errorFormatter = require('../src/testing/validation-error-formatter'); describe('Conditional validation type:', () => { const testFixture = testFixtureMaker.initFromSyncFunction('build/sync-functions/test-conditional-validation-sync-function.js'); afterEach(() => { testFixture.resetTestEnvironment(); }); describe('with static validation', () => { it('allows creation when a condition is satisifed and the contents are valid', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: 1534026439173 } }; testFixture.verifyDocumentCreated(doc); }); it('allows replacement when a condition is satisifed and the contents are valid', () => { const oldDoc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: '2018-08-11T15:25:00.0-07:00' } }; const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: '2018-08-11T15:25-07:00' // Semantically equal to the old value } }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows creation when no conditions are satisfied but the vale is null', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: null } }; testFixture.verifyDocumentCreated(doc); }); it('allows replacement when no conditions are satisfied but the value is missing', () => { const oldDoc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: null } }; const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { } }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('allows replacement when no conditions are satisfied but the value is unchanged', () => { const oldDoc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: { foo: 'bar' } } }; const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: { foo: 'bar' } } }; testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('rejects creation when no conditions are satisfied', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: [ ] } }; testFixture.verifyDocumentNotCreated( doc, 'conditionalValidationDoc', [ errorFormatter.validationConditionsViolation('staticParentObjectProp.conditionalValidationProp') ]); }); it('rejects replacement when no conditions are satisfied', () => { const oldDoc = { _id: 'my-doc', type: 'conditionalValidationDoc' }; const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: true } }; testFixture.verifyDocumentNotReplaced( doc, oldDoc, 'conditionalValidationDoc', [ errorFormatter.validationConditionsViolation('staticParentObjectProp.conditionalValidationProp') ]); }); it('rejects creation when a condition is satisfied but an inner constraint is violated', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: '2018-08-10T16:59:59.999-07:00' } }; testFixture.verifyDocumentNotCreated( doc, 'conditionalValidationDoc', [ errorFormatter.minimumValueViolation( 'staticParentObjectProp.conditionalValidationProp', '2018-08-10T24:00:00.000Z') ]); }); it('rejects replacement when a condition is satisfied but an inner constraint is violated', () => { const oldDoc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { } }; const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: 1533945599999 } }; testFixture.verifyDocumentNotReplaced( doc, oldDoc, 'conditionalValidationDoc', [ errorFormatter.minimumValueViolation('staticParentObjectProp.conditionalValidationProp', 1533945600000) ]); }); it('allows replacement when a condition is satisfied and an inner constraint overrides an outer constraint', () => { const oldDoc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: 1 } }; const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: 2533945600000 } }; // The outer (conditional) validator specifies that the property is immutable, but that is overridden by the inner // (integer) validator testFixture.verifyDocumentReplaced(doc, oldDoc); }); it('rejects replacement when a condition is satisfied but an outer constraint is violated', () => { const oldDoc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: '2018-08-11T20:11:33-07:00' } }; const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: '2018-08-11T20:21:02.13-07:00' } }; testFixture.verifyDocumentNotReplaced( doc, oldDoc, 'conditionalValidationDoc', [ errorFormatter.immutableItemViolation('staticParentObjectProp.conditionalValidationProp') ]); }); it('rejects replacement when the condition specifies that the same validator must be used as for the old doc', () => { const oldDoc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: 1534019296900 } }; const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', staticParentObjectProp: { conditionalValidationProp: '2018-08-11T20:28:16.9-07:00' } }; testFixture.verifyDocumentNotReplaced( doc, oldDoc, 'conditionalValidationDoc', [ errorFormatter.typeConstraintViolation('staticParentObjectProp.conditionalValidationProp', 'integer') ]); }); }); describe('with dynamic validation', () => { it('allows creation of a valid array when arrays are allowed', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', dynamicConfig: { excludeArrayValidator: false }, dynamicConditionalValidationProp: [ 53, 45.9 ] }; testFixture.verifyDocumentCreated(doc); }); it('allows creation of a valid object when objects are allowed', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', dynamicConfig: { excludeObjectValidator: false, excludeHashtableValidator: true }, dynamicConditionalValidationProp: { stringProp: 'foobar' } }; testFixture.verifyDocumentCreated(doc); }); it('allows creation of a valid hashtable when hashtables are allowed', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', dynamicConfig: { excludeObjectValidator: true, excludeHashtableValidator: false }, dynamicConditionalValidationProp: { 'foo-bar': '1a7072c4-116a-4552-865d-74a4206d7695' } }; testFixture.verifyDocumentCreated(doc); }); it('allows creation of a valid value with a dynamic validator', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', dynamicConfig: { dynamicConditionType: 'boolean' }, dynamicConditionalValidationProp: true }; testFixture.verifyDocumentCreated(doc); }); it('allows creation of an object because object comes before hashtable in the candidate list', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', dynamicConfig: { excludeObjectValidator: false, excludeHashtableValidator: false }, dynamicConditionalValidationProp: { stringProp: 'barbaz' } }; testFixture.verifyDocumentCreated(doc); }); it('rejects creation of an array when arrays are NOT allowed', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', dynamicConfig: { excludeArrayValidator: true }, dynamicConditionalValidationProp: [ ] }; testFixture.verifyDocumentNotCreated( doc, 'conditionalValidationDoc', [ errorFormatter.validationConditionsViolation('dynamicConditionalValidationProp') ]); }); it('rejects creation of an object/hashtable when they are NOT allowed', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', dynamicConfig: { excludeObjectValidator: true, excludeHashtableValidator: true }, dynamicConditionalValidationProp: { foo: 'bar' } }; testFixture.verifyDocumentNotCreated( doc, 'conditionalValidationDoc', [ errorFormatter.validationConditionsViolation('dynamicConditionalValidationProp') ]); }); it('rejects creation of an array when the value is invalid', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', dynamicConditionalValidationProp: [ ] }; testFixture.verifyDocumentNotCreated( doc, 'conditionalValidationDoc', [ errorFormatter.mustNotBeEmptyViolation('dynamicConditionalValidationProp') ]); }); it('rejects creation of an object when the value is invalid', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', dynamicConfig: { excludeObjectValidator: false, excludeHashtableValidator: true }, dynamicConditionalValidationProp: { stringProp: 2847 } }; testFixture.verifyDocumentNotCreated( doc, 'conditionalValidationDoc', [ errorFormatter.typeConstraintViolation('dynamicConditionalValidationProp.stringProp', 'string') ]); }); it('rejects creation of a hashtable when the value is invalid', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', dynamicConfig: { excludeObjectValidator: true, excludeHashtableValidator: false }, dynamicConditionalValidationProp: { 'my-value': 'not-a-uuid' } }; testFixture.verifyDocumentNotCreated( doc, 'conditionalValidationDoc', [ errorFormatter.typeConstraintViolation('dynamicConditionalValidationProp[my-value]', 'uuid') ]); }); it('rejects creation when the value does not match the type expected by the dynamic validator', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', dynamicConfig: { dynamicConditionType: 'boolean' }, dynamicConditionalValidationProp: 1 }; testFixture.verifyDocumentNotCreated( doc, 'conditionalValidationDoc', [ errorFormatter.validationConditionsViolation('dynamicConditionalValidationProp') ]); }); it('rejects creation of a hashtable because object comes before hashtable in the candidate list', () => { const doc = { _id: 'my-doc', type: 'conditionalValidationDoc', dynamicConfig: { excludeObjectValidator: false, excludeHashtableValidator: false }, dynamicConditionalValidationProp: { 'my-uuid': '6417e336-a9fc-4d2c-965b-6fb5a49a26f6' } }; testFixture.verifyDocumentNotCreated( doc, 'conditionalValidationDoc', [ errorFormatter.requiredValueViolation('dynamicConditionalValidationProp.stringProp'), errorFormatter.unsupportedProperty('dynamicConditionalValidationProp.my-uuid') ]); }); }); });