synctos
Version:
The Syncmaker. A tool to build comprehensive sync functions for Couchbase Sync Gateway.
535 lines (425 loc) • 15.6 kB
JavaScript
const testFixtureMaker = require('../src/testing/test-fixture-maker');
const errorFormatter = require('../src/testing/validation-error-formatter');
describe('Date validation type:', () => {
const testFixture = testFixtureMaker.initFromSyncFunction('build/sync-functions/test-date-sync-function.js');
afterEach(() => {
testFixture.resetTestEnvironment();
});
describe('simple format validation', () => {
it('accepts a valid date with all components', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '2016-07-17'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a valid date without a day', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '0000-12'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a valid date without a month or day', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '9999'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a leap day for a year that is a multiple of four', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '2020-02-29'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a leap day for a year that is a multiple of 400', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '2000-02-29'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a leap day for year 0 (1 BCE)', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '0000-02-29'
};
testFixture.verifyDocumentCreated(doc);
});
it('rejects a date with an invalid year', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '999-07-17'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a date with an invalid month', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '2016-13-17'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a date with an invalid day', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '2016-07-32'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a leap day for a year that is not a multiple of four', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '2018-02-29'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a leap day for a year that is a multiple of 100 but not 400', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '1000-02-29'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a date with time and time zone components', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '2016-07-17T15:01:58.382-05:00'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a date with a time but no time zone', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '2016-07-17T21:27:10.894'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a date with a positive signed year', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '+2016-07-17'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a date with a negative signed year', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '-2016-07-17'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a value that is not a string', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: 20160717
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.typeConstraintViolation('formatValidationProp', 'date'));
});
});
describe('extended year format validation', () => {
it('accepts a valid date with a positive year and all date components', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '+178346-02-22'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a valid date with a negative year and all date components', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '-000045-11-13'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a valid date with a positive year and no day', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '+001970-01'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a valid date with a negative year and no day', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '-233694-11'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a valid date with a positive year and no month or day', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '+287396'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a valid date with a negative year and no month or day', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '-283457'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a leap day with a positive year that is a multiple of 4', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '+065244-02-29'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a leap day with a negative year that is a multiple of 4', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '-124660-02-29'
};
testFixture.verifyDocumentCreated(doc);
});
it('rejects a leap day for a positive year that is not a multiple of four', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '+234567-02-29'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a leap day for a negative year that is not a multiple of four', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '-098765-02-29'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a positive year with too many digits', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '+0123456-07-04'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a negative year with too many digits', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '-0123456-05-30'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a positive year with too few digits', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '+12345-06-17'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a negative year with too few digits', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '-12345-06-01'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a date with a positive year that is too large', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '+287397-01-01'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
it('rejects a date with a negative year that is too small', () => {
const doc = {
_id: 'dateDoc',
formatValidationProp: '-283458-12-31'
};
testFixture.verifyDocumentNotCreated(doc, 'dateDoc', errorFormatter.dateFormatInvalid('formatValidationProp'));
});
});
describe('inclusive range constraints', () => {
it('accepts a date with all components that is within the minimum and maximum values', () => {
const doc = {
_id: 'dateDoc',
inclusiveRangeValidationProp: '2016-01-01'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a date without a day that is within the minimum and maximum values', () => {
const doc = {
_id: 'dateDoc',
inclusiveRangeValidationProp: '2016-01'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a date with a month or day that is within the minimum and maximum values', () => {
const doc = {
_id: 'dateDoc',
inclusiveRangeValidationProp: '2016'
};
testFixture.verifyDocumentCreated(doc);
});
it('rejects a date that is less than the minimum value', () => {
const doc = {
_id: 'dateDoc',
inclusiveRangeValidationProp: '2015-12-31'
};
testFixture.verifyDocumentNotCreated(
doc,
'dateDoc',
errorFormatter.minimumValueViolation('inclusiveRangeValidationProp', '2015-12-31T23:59:59.999Z'));
});
it('rejects a date that is greater than the maximum value', () => {
const doc = {
_id: 'dateDoc',
inclusiveRangeValidationProp: '2016-01-02'
};
testFixture.verifyDocumentNotCreated(
doc,
'dateDoc',
errorFormatter.maximumValueViolation('inclusiveRangeValidationProp', '2016-01-01T23:59:59.999Z'));
});
});
describe('exclusive range constraints', () => {
it('accepts a date with all components that is within the minimum and maximum values', () => {
const doc = {
_id: 'dateDoc',
exclusiveRangeValidationProp: '2018-02-01'
};
testFixture.verifyDocumentCreated(doc);
});
it('accepts a date without a day that is within the minimum and maximum values', () => {
const doc = {
_id: 'dateDoc',
exclusiveRangeValidationProp: '2018-02'
};
testFixture.verifyDocumentCreated(doc);
});
it('rejects a date that is less than the minimum value', () => {
const doc = {
_id: 'dateDoc',
exclusiveRangeValidationProp: '2017-12-31'
};
testFixture.verifyDocumentNotCreated(
doc,
'dateDoc',
errorFormatter.minimumValueExclusiveViolation('exclusiveRangeValidationProp', '2018'));
});
it('rejects a date that is equal to the minimum value', () => {
const doc = {
_id: 'dateDoc',
exclusiveRangeValidationProp: '2018'
};
testFixture.verifyDocumentNotCreated(
doc,
'dateDoc',
errorFormatter.minimumValueExclusiveViolation('exclusiveRangeValidationProp', '2018'));
});
it('rejects a date that is greater than the maximum value', () => {
const doc = {
_id: 'dateDoc',
exclusiveRangeValidationProp: '2018-02-03'
};
testFixture.verifyDocumentNotCreated(
doc,
'dateDoc',
errorFormatter.maximumValueExclusiveViolation('exclusiveRangeValidationProp', '+002018-02-02'));
});
it('rejects a date that is equal to the maximum value', () => {
const doc = {
_id: 'dateDoc',
exclusiveRangeValidationProp: '2018-02-02'
};
testFixture.verifyDocumentNotCreated(
doc,
'dateDoc',
errorFormatter.maximumValueExclusiveViolation('exclusiveRangeValidationProp', '+002018-02-02'));
});
});
describe('intelligent equality constraint', () => {
it('allows a full date-only string that matches the expected date', () => {
const doc = {
_id: 'dateMustEqualDoc',
equalityValidationProp: '2018-01-01'
};
testFixture.verifyDocumentCreated(doc);
});
it('allows a date-only string without day that matches the expected date', () => {
const doc = {
_id: 'dateMustEqualDoc',
equalityValidationProp: '2018-01'
};
testFixture.verifyDocumentCreated(doc);
});
it('allows a date-only string without month and day that matches the expected date', () => {
const doc = {
_id: 'dateMustEqualDoc',
equalityValidationProp: '2018'
};
testFixture.verifyDocumentCreated(doc);
});
it('rejects a date-only string that does not match the expected date', () => {
const doc = {
_id: 'dateMustEqualDoc',
equalityValidationProp: '2017-12-31'
};
testFixture.verifyDocumentNotCreated(
doc,
'dateMustEqualDocType',
[ errorFormatter.mustEqualViolation('equalityValidationProp', '2018-01-01T00:00:00.000Z') ]);
});
});
describe('intelligent immutability constraint', () => {
it('allows a date that exactly matches the existing date', () => {
const oldDoc = {
_id: 'dateDoc',
immutableValidationProp: '2018-02-11'
};
const doc = {
_id: 'dateDoc',
immutableValidationProp: '2018-02-11'
};
testFixture.verifyDocumentReplaced(doc, oldDoc);
});
it('allows a date with omitted optional components that matches the existing date', () => {
const oldDoc = {
_id: 'dateDoc',
immutableValidationProp: new Date(Date.UTC(2017, 0, 1))
};
const doc = {
_id: 'dateDoc',
immutableValidationProp: '2017'
};
testFixture.verifyDocumentReplaced(doc, oldDoc);
});
it('rejects a date that does not match the existing date', () => {
const oldDoc = {
_id: 'dateDoc',
immutableValidationProp: '2018-11-12'
};
const doc = {
_id: 'dateDoc',
immutableValidationProp: '2017-11-12'
};
testFixture.verifyDocumentNotReplaced(doc, oldDoc, 'dateDoc', [ errorFormatter.immutableItemViolation('immutableValidationProp') ]);
});
});
describe('interpretation of years between 0 and 99', () => {
it('does not treat year 0 as 1900', () => {
const doc = {
_id: 'dateDoc',
twoDigitYearValidationProp: '0000-03-23'
};
testFixture.verifyDocumentNotCreated(
doc,
'dateDoc',
[ errorFormatter.minimumValueViolation('twoDigitYearValidationProp', '1900-01-01')]);
});
it('does not treat year 99 as 1999', () => {
const doc = {
_id: 'dateDoc',
twoDigitYearValidationProp: '0099-09-09'
};
testFixture.verifyDocumentNotCreated(
doc,
'dateDoc',
[ errorFormatter.minimumValueViolation('twoDigitYearValidationProp', '1900-01-01')]);
});
});
});