synctos
Version:
The Syncmaker. A tool to build comprehensive sync functions for Couchbase Sync Gateway.
420 lines (385 loc) • 14.5 kB
JavaScript
const testFixtureMaker = require('../src/testing/test-fixture-maker');
const errorFormatter = require('../src/testing/validation-error-formatter');
describe('Non-null value constraint', () => {
const testFixture =
testFixtureMaker.initFromSyncFunction('build/sync-functions/test-must-not-be-null-sync-function.js');
afterEach(() => {
testFixture.resetTestEnvironment();
});
describe('with static validation', () => {
it('allows a doc with values that are neither null nor undefined', () => {
const doc = {
_id: 'staticDoc',
stringProp: '',
integerProp: 0,
floatProp: 0.0,
booleanProp: false,
datetimeProp: '1970-01-01T00:00:00.000Z',
dateProp: '1970-01-01',
enumProp: 0,
attachmentReferenceProp: '',
arrayProp: [ '' ],
objectProp: { subProp: 0 },
hashtableProp: { 'key': 0.0 }
};
testFixture.verifyDocumentCreated(doc);
});
it('blocks a doc with top-level values that are undefined', () => {
const doc = {
_id: 'staticDoc',
stringProp: void 0,
integerProp: void 0,
floatProp: void 0,
booleanProp: void 0,
datetimeProp: void 0,
dateProp: void 0,
enumProp: void 0,
attachmentReferenceProp: void 0,
arrayProp: void 0,
objectProp: void 0,
hashtableProp: void 0,
};
testFixture.verifyDocumentNotCreated(
doc,
'staticDoc',
[
errorFormatter.mustNotBeNullValueViolation('hashtableProp'),
errorFormatter.mustNotBeNullValueViolation('objectProp'),
errorFormatter.mustNotBeNullValueViolation('arrayProp'),
errorFormatter.mustNotBeNullValueViolation('attachmentReferenceProp'),
errorFormatter.mustNotBeNullValueViolation('enumProp'),
errorFormatter.mustNotBeNullValueViolation('dateProp'),
errorFormatter.mustNotBeNullValueViolation('datetimeProp'),
errorFormatter.mustNotBeNullValueViolation('booleanProp'),
errorFormatter.mustNotBeNullValueViolation('floatProp'),
errorFormatter.mustNotBeNullValueViolation('integerProp'),
errorFormatter.mustNotBeNullValueViolation('stringProp')
]);
});
it('blocks a doc with nested values that are undefined', () => {
const doc = {
_id: 'staticDoc',
stringProp: 'foobar',
integerProp: -45,
floatProp: 5.19,
booleanProp: true,
datetimeProp: '2017-04-10T16:10:39.773-07:00',
dateProp: '2017-04-10',
enumProp: 2,
attachmentReferenceProp: 'barfoo.baz',
arrayProp: [ void 0 ],
objectProp: { subProp: void 0 },
hashtableProp: { 'key': void 0 },
};
testFixture.verifyDocumentNotCreated(
doc,
'staticDoc',
[
errorFormatter.mustNotBeNullValueViolation('arrayProp[0]'),
errorFormatter.mustNotBeNullValueViolation('objectProp.subProp'),
errorFormatter.mustNotBeNullValueViolation('hashtableProp[key]')
]);
});
it('blocks a doc with top-level values that are missing', () => {
const doc = { _id: 'staticDoc' };
testFixture.verifyDocumentNotCreated(
doc,
'staticDoc',
[
errorFormatter.mustNotBeNullValueViolation('hashtableProp'),
errorFormatter.mustNotBeNullValueViolation('objectProp'),
errorFormatter.mustNotBeNullValueViolation('arrayProp'),
errorFormatter.mustNotBeNullValueViolation('attachmentReferenceProp'),
errorFormatter.mustNotBeNullValueViolation('enumProp'),
errorFormatter.mustNotBeNullValueViolation('dateProp'),
errorFormatter.mustNotBeNullValueViolation('datetimeProp'),
errorFormatter.mustNotBeNullValueViolation('booleanProp'),
errorFormatter.mustNotBeNullValueViolation('floatProp'),
errorFormatter.mustNotBeNullValueViolation('integerProp'),
errorFormatter.mustNotBeNullValueViolation('stringProp')
]);
});
it('blocks a doc with nested object property values that are missing', () => {
const doc = {
_id: 'staticDoc',
stringProp: 'foobar',
integerProp: -45,
floatProp: 5.19,
booleanProp: true,
datetimeProp: '2017-04-10T16:10:39.773-07:00',
dateProp: '2017-04-10',
enumProp: 2,
attachmentReferenceProp: 'barfoo.baz',
arrayProp: [ ],
objectProp: { },
hashtableProp: { },
};
testFixture.verifyDocumentNotCreated(
doc,
'staticDoc',
[ errorFormatter.mustNotBeNullValueViolation('objectProp.subProp') ]);
});
it('blocks a doc with top-level values that are null', () => {
const doc = {
_id: 'staticDoc',
stringProp: null,
integerProp: null,
floatProp: null,
booleanProp: null,
datetimeProp: null,
dateProp: null,
enumProp: null,
attachmentReferenceProp: null,
arrayProp: null,
objectProp: null,
hashtableProp: null,
};
testFixture.verifyDocumentNotCreated(
doc,
'staticDoc',
[
errorFormatter.mustNotBeNullValueViolation('hashtableProp'),
errorFormatter.mustNotBeNullValueViolation('objectProp'),
errorFormatter.mustNotBeNullValueViolation('arrayProp'),
errorFormatter.mustNotBeNullValueViolation('attachmentReferenceProp'),
errorFormatter.mustNotBeNullValueViolation('enumProp'),
errorFormatter.mustNotBeNullValueViolation('dateProp'),
errorFormatter.mustNotBeNullValueViolation('datetimeProp'),
errorFormatter.mustNotBeNullValueViolation('booleanProp'),
errorFormatter.mustNotBeNullValueViolation('floatProp'),
errorFormatter.mustNotBeNullValueViolation('integerProp'),
errorFormatter.mustNotBeNullValueViolation('stringProp')
]);
});
it('blocks a doc with nested values that are null', () => {
const doc = {
_id: 'staticDoc',
stringProp: 'foobar',
integerProp: -45,
floatProp: 5.19,
booleanProp: true,
datetimeProp: '2017-04-10T16:10:39.773-07:00',
dateProp: '2017-04-10',
enumProp: 2,
attachmentReferenceProp: 'barfoo.baz',
arrayProp: [ null ],
objectProp: { subProp: null },
hashtableProp: { 'key': null },
};
testFixture.verifyDocumentNotCreated(
doc,
'staticDoc',
[
errorFormatter.mustNotBeNullValueViolation('arrayProp[0]'),
errorFormatter.mustNotBeNullValueViolation('objectProp.subProp'),
errorFormatter.mustNotBeNullValueViolation('hashtableProp[key]')
]);
});
});
describe('with dynamic validation', () => {
it('allows a doc with values that are neither null nor undefined', () => {
const doc = {
_id: 'dynamicDoc',
dynamicPropsRequired: true,
stringProp: '',
integerProp: 0,
floatProp: 0.0,
booleanProp: false,
datetimeProp: '1970-01-01T00:00:00.000Z',
dateProp: '1970-01-01',
enumProp: 0,
attachmentReferenceProp: '',
arrayProp: [ '' ],
objectProp: { subProp: 0 },
hashtableProp: { 'key': 0.0 }
};
testFixture.verifyDocumentCreated(doc);
});
it('allows a doc with top-level values that are either null or undefined if enforcement is disabled', () => {
const doc = {
_id: 'dynamicDoc',
dynamicPropsRequired: false,
stringProp: null,
integerProp: void 0,
floatProp: null,
booleanProp: void 0,
datetimeProp: null,
dateProp: void 0,
enumProp: null,
attachmentReferenceProp: void 0,
arrayProp: null,
objectProp: void 0,
hashtableProp: null
};
testFixture.verifyDocumentCreated(doc);
});
it('allows a doc with nested values that are either null or undefined if enforcement is disabled', () => {
const doc = {
_id: 'dynamicDoc',
arrayProp: [ null ],
objectProp: { subProp: void 0 },
hashtableProp: { 'key': null }
};
testFixture.verifyDocumentCreated(doc);
});
it('blocks a doc with top-level values that are undefined', () => {
const doc = {
_id: 'dynamicDoc',
dynamicPropsRequired: true,
stringProp: void 0,
integerProp: void 0,
floatProp: void 0,
booleanProp: void 0,
datetimeProp: void 0,
dateProp: void 0,
enumProp: void 0,
attachmentReferenceProp: void 0,
arrayProp: void 0,
objectProp: void 0,
hashtableProp: void 0,
};
testFixture.verifyDocumentNotCreated(
doc,
'dynamicDoc',
[
errorFormatter.mustNotBeNullValueViolation('hashtableProp'),
errorFormatter.mustNotBeNullValueViolation('objectProp'),
errorFormatter.mustNotBeNullValueViolation('arrayProp'),
errorFormatter.mustNotBeNullValueViolation('attachmentReferenceProp'),
errorFormatter.mustNotBeNullValueViolation('enumProp'),
errorFormatter.mustNotBeNullValueViolation('dateProp'),
errorFormatter.mustNotBeNullValueViolation('datetimeProp'),
errorFormatter.mustNotBeNullValueViolation('booleanProp'),
errorFormatter.mustNotBeNullValueViolation('floatProp'),
errorFormatter.mustNotBeNullValueViolation('integerProp'),
errorFormatter.mustNotBeNullValueViolation('stringProp')
]);
});
it('blocks a doc with nested values that are undefined', () => {
const doc = {
_id: 'dynamicDoc',
dynamicPropsRequired: true,
stringProp: 'foobar',
integerProp: -45,
floatProp: 5.19,
booleanProp: true,
datetimeProp: '2017-04-10T16:10:39.773-07:00',
dateProp: '2017-04-10',
enumProp: 2,
attachmentReferenceProp: 'barfoo.baz',
arrayProp: [ void 0 ],
objectProp: { subProp: void 0 },
hashtableProp: { 'key': void 0 },
};
testFixture.verifyDocumentNotCreated(
doc,
'dynamicDoc',
[
errorFormatter.mustNotBeNullValueViolation('arrayProp[0]'),
errorFormatter.mustNotBeNullValueViolation('objectProp.subProp'),
errorFormatter.mustNotBeNullValueViolation('hashtableProp[key]')
]);
});
it('blocks a doc with top-level values that are missing', () => {
const doc = {
_id: 'dynamicDoc',
dynamicPropsRequired: true
};
testFixture.verifyDocumentNotCreated(
doc,
'dynamicDoc',
[
errorFormatter.mustNotBeNullValueViolation('hashtableProp'),
errorFormatter.mustNotBeNullValueViolation('objectProp'),
errorFormatter.mustNotBeNullValueViolation('arrayProp'),
errorFormatter.mustNotBeNullValueViolation('attachmentReferenceProp'),
errorFormatter.mustNotBeNullValueViolation('enumProp'),
errorFormatter.mustNotBeNullValueViolation('dateProp'),
errorFormatter.mustNotBeNullValueViolation('datetimeProp'),
errorFormatter.mustNotBeNullValueViolation('booleanProp'),
errorFormatter.mustNotBeNullValueViolation('floatProp'),
errorFormatter.mustNotBeNullValueViolation('integerProp'),
errorFormatter.mustNotBeNullValueViolation('stringProp')
]);
});
it('blocks a doc with nested object property values that are missing', () => {
const doc = {
_id: 'dynamicDoc',
dynamicPropsRequired: true,
stringProp: 'foobar',
integerProp: -45,
floatProp: 5.19,
booleanProp: true,
datetimeProp: '2017-04-10T16:10:39.773-07:00',
dateProp: '2017-04-10',
enumProp: 2,
attachmentReferenceProp: 'barfoo.baz',
arrayProp: [ ],
objectProp: { },
hashtableProp: { },
};
testFixture.verifyDocumentNotCreated(
doc,
'dynamicDoc',
[ errorFormatter.mustNotBeNullValueViolation('objectProp.subProp') ]);
});
it('blocks a doc with top-level values that are null', () => {
const doc = {
_id: 'dynamicDoc',
dynamicPropsRequired: true,
stringProp: null,
integerProp: null,
floatProp: null,
booleanProp: null,
datetimeProp: null,
dateProp: null,
enumProp: null,
attachmentReferenceProp: null,
arrayProp: null,
objectProp: null,
hashtableProp: null,
};
testFixture.verifyDocumentNotCreated(
doc,
'dynamicDoc',
[
errorFormatter.mustNotBeNullValueViolation('hashtableProp'),
errorFormatter.mustNotBeNullValueViolation('objectProp'),
errorFormatter.mustNotBeNullValueViolation('arrayProp'),
errorFormatter.mustNotBeNullValueViolation('attachmentReferenceProp'),
errorFormatter.mustNotBeNullValueViolation('enumProp'),
errorFormatter.mustNotBeNullValueViolation('dateProp'),
errorFormatter.mustNotBeNullValueViolation('datetimeProp'),
errorFormatter.mustNotBeNullValueViolation('booleanProp'),
errorFormatter.mustNotBeNullValueViolation('floatProp'),
errorFormatter.mustNotBeNullValueViolation('integerProp'),
errorFormatter.mustNotBeNullValueViolation('stringProp')
]);
});
it('blocks a doc with nested values that are null', () => {
const doc = {
_id: 'dynamicDoc',
dynamicPropsRequired: true,
stringProp: 'foobar',
integerProp: -45,
floatProp: 5.19,
booleanProp: true,
datetimeProp: '2017-04-10T16:10:39.773-07:00',
dateProp: '2017-04-10',
enumProp: 2,
attachmentReferenceProp: 'barfoo.baz',
arrayProp: [ null ],
objectProp: { subProp: null },
hashtableProp: { 'key': null },
};
testFixture.verifyDocumentNotCreated(
doc,
'dynamicDoc',
[
errorFormatter.mustNotBeNullValueViolation('arrayProp[0]'),
errorFormatter.mustNotBeNullValueViolation('objectProp.subProp'),
errorFormatter.mustNotBeNullValueViolation('hashtableProp[key]')
]);
});
});
});