500 lines
19 KiB
JavaScript
500 lines
19 KiB
JavaScript
'use strict';
|
|
|
|
const assert = require('assert');
|
|
|
|
const {
|
|
roundUpTimestampToUtcDay,
|
|
roundUpTimestampToUtcHour,
|
|
roundUpTimestampToUtcMinute,
|
|
roundUpTimestampToUtcSecond,
|
|
getUtcStartOfDayTs,
|
|
getUtcStartOfHourTs,
|
|
getUtcStartOfMinuteTs,
|
|
getUtcStartOfSecondTs,
|
|
areTimestampsFromSameUtcDay,
|
|
areTimestampsFromSameUtcHour,
|
|
areTimestampsFromSameUtcMinute,
|
|
areTimestampsFromSameUtcSecond,
|
|
} = require('matrix-public-archive-shared/lib/timestamp-utilities');
|
|
|
|
describe('timestamp-utilities', () => {
|
|
describe('roundUpTimestampToUtcX', () => {
|
|
function testRoundUpFunction(roundUpFunctionToTest, testMeta) {
|
|
it(`${new Date(testMeta.inputTs).toISOString()} -> ${new Date(
|
|
testMeta.expectedTs
|
|
).toISOString()}`, () => {
|
|
assert(testMeta.inputTs);
|
|
assert(testMeta.expectedTs);
|
|
const actualTs = roundUpFunctionToTest(testMeta.inputTs);
|
|
assert.strictEqual(
|
|
actualTs,
|
|
testMeta.expectedTs,
|
|
`Expected actualTs=${new Date(actualTs).toISOString()} to be expectedTs=${new Date(
|
|
testMeta.expectedTs
|
|
).toISOString()}`
|
|
);
|
|
});
|
|
}
|
|
|
|
describe('roundUpTimestampToUtcDay', () => {
|
|
[
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T05:05:05.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-16T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T05:05:05.001Z').getTime(),
|
|
expectedTs: new Date('2022-01-16T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.001Z').getTime(),
|
|
expectedTs: new Date('2022-01-16T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T23:59:59.999Z').getTime(),
|
|
expectedTs: new Date('2022-01-16T00:00:00.000Z').getTime(),
|
|
},
|
|
].forEach((testMeta) => {
|
|
testRoundUpFunction(roundUpTimestampToUtcDay, testMeta);
|
|
});
|
|
});
|
|
|
|
describe('roundUpTimestampToUtcHour', () => {
|
|
[
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T05:05:05.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T06:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T05:05:05.001Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T06:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.001Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T01:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T23:59:59.999Z').getTime(),
|
|
expectedTs: new Date('2022-01-16T00:00:00.000Z').getTime(),
|
|
},
|
|
].forEach((testMeta) => {
|
|
testRoundUpFunction(roundUpTimestampToUtcHour, testMeta);
|
|
});
|
|
});
|
|
|
|
describe('roundUpTimestampToUtcMinute', () => {
|
|
[
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T05:05:05.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T05:06:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T05:05:05.001Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T05:06:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.001Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:01:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T23:59:59.999Z').getTime(),
|
|
expectedTs: new Date('2022-01-16T00:00:00.000Z').getTime(),
|
|
},
|
|
].forEach((testMeta) => {
|
|
testRoundUpFunction(roundUpTimestampToUtcMinute, testMeta);
|
|
});
|
|
});
|
|
|
|
describe('roundUpTimestampToUtcSecond', () => {
|
|
[
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T05:05:05.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T05:05:05.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T05:05:05.001Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T05:05:06.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.001Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:01.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T23:59:59.999Z').getTime(),
|
|
expectedTs: new Date('2022-01-16T00:00:00.000Z').getTime(),
|
|
},
|
|
].forEach((testMeta) => {
|
|
testRoundUpFunction(roundUpTimestampToUtcSecond, testMeta);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('getUtcStartOfXTs', () => {
|
|
function testGetUtcStartOfXFunction(getUtcStartOfXFunctionToTest, testMeta) {
|
|
it(`${new Date(testMeta.inputTs).toISOString()} -> ${new Date(
|
|
testMeta.expectedTs
|
|
).toISOString()}`, () => {
|
|
assert(testMeta.inputTs);
|
|
assert(testMeta.expectedTs);
|
|
const actualTs = getUtcStartOfXFunctionToTest(testMeta.inputTs);
|
|
assert.strictEqual(
|
|
actualTs,
|
|
testMeta.expectedTs,
|
|
`Expected actualTs=${new Date(actualTs).toISOString()} to be expectedTs=${new Date(
|
|
testMeta.expectedTs
|
|
).toISOString()}`
|
|
);
|
|
});
|
|
}
|
|
|
|
describe('getUtcStartOfDayTs', () => {
|
|
[
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T05:05:05.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T15:35:35.750Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.001Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T23:59:59.999Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
].forEach((testMeta) => {
|
|
testGetUtcStartOfXFunction(getUtcStartOfDayTs, testMeta);
|
|
});
|
|
});
|
|
|
|
describe('getUtcStartOfHourTs', () => {
|
|
[
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T05:05:05.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T05:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T15:35:35.750Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T15:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.001Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T23:59:59.999Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T23:00:00.000Z').getTime(),
|
|
},
|
|
].forEach((testMeta) => {
|
|
testGetUtcStartOfXFunction(getUtcStartOfHourTs, testMeta);
|
|
});
|
|
});
|
|
|
|
describe('getUtcStartOfMinuteTs', () => {
|
|
[
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T05:05:05.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T05:05:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T15:35:35.750Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T15:35:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.001Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T23:59:59.999Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T23:59:00.000Z').getTime(),
|
|
},
|
|
].forEach((testMeta) => {
|
|
testGetUtcStartOfXFunction(getUtcStartOfMinuteTs, testMeta);
|
|
});
|
|
});
|
|
|
|
describe('getUtcStartOfSecondTs', () => {
|
|
[
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T05:05:05.000Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T05:05:05.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T15:35:35.750Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T15:35:35.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T00:00:00.001Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
},
|
|
{
|
|
inputTs: new Date('2022-01-15T23:59:59.999Z').getTime(),
|
|
expectedTs: new Date('2022-01-15T23:59:59.000Z').getTime(),
|
|
},
|
|
].forEach((testMeta) => {
|
|
testGetUtcStartOfXFunction(getUtcStartOfSecondTs, testMeta);
|
|
});
|
|
});
|
|
});
|
|
|
|
describe('areTimestampsFromSameUtcX', () => {
|
|
function testAreTimestampsFromSameXFunction(areTimestampsFromSameXFunctionToTest, testMeta) {
|
|
it(`${testMeta.description} -- A=${new Date(
|
|
testMeta.inputATs
|
|
).toISOString()} and B=${new Date(testMeta.inputBTs).toISOString()} should${
|
|
testMeta.expected ? '' : ' *NOT*'
|
|
} be from the same day`, () => {
|
|
assert(testMeta.inputATs);
|
|
assert(testMeta.inputBTs);
|
|
assert(testMeta.expected !== undefined);
|
|
|
|
const actualValue = areTimestampsFromSameXFunctionToTest(
|
|
testMeta.inputATs,
|
|
testMeta.inputBTs
|
|
);
|
|
assert.strictEqual(actualValue, testMeta.expected);
|
|
});
|
|
}
|
|
|
|
describe('areTimestampsFromSameUtcDay', () => {
|
|
[
|
|
{
|
|
description: 'same timestamp is considered from the same day',
|
|
inputATs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expected: true,
|
|
},
|
|
{
|
|
description: 'timestamp from same day',
|
|
inputATs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T05:05:05.005Z').getTime(),
|
|
expected: true,
|
|
},
|
|
{
|
|
description: 'timestamp at extremes of the day',
|
|
inputATs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T23:59:59.999Z').getTime(),
|
|
expected: true,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is only 1ms from the other but from another day should *NOT* be considered from the same day',
|
|
inputATs: new Date('2022-01-14T23:59:59.999Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expected: false,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is only 1ms from the other but from another day should *NOT* be considered from the same day (A and B switched)',
|
|
inputATs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-14T23:59:59.999Z').getTime(),
|
|
expected: false,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is less than a day apart but from different days should *NOT* be considered from the same day',
|
|
inputATs: new Date('2022-01-15T04:00:00.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-14T20:00:00.000Z').getTime(),
|
|
expected: false,
|
|
},
|
|
].forEach((testMeta) => {
|
|
testAreTimestampsFromSameXFunction(areTimestampsFromSameUtcDay, testMeta);
|
|
});
|
|
});
|
|
|
|
describe('areTimestampsFromSameUtcHour', () => {
|
|
[
|
|
{
|
|
description: 'same timestamp is considered from the same hour',
|
|
inputATs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expected: true,
|
|
},
|
|
{
|
|
description: 'timestamp from same hour',
|
|
inputATs: new Date('2022-01-15T05:05:05.005Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T05:35:35.035Z').getTime(),
|
|
expected: true,
|
|
},
|
|
{
|
|
description: 'timestamp at extremes of the hour',
|
|
inputATs: new Date('2022-01-15T23:00:00.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T23:59:59.999Z').getTime(),
|
|
expected: true,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is only 1ms from the other but from another day should *NOT* be considered from the same hour',
|
|
inputATs: new Date('2022-01-14T23:59:59.999Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expected: false,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is only 1ms from the other but from another day should *NOT* be considered from the same hour (A and B switched)',
|
|
inputATs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-14T23:59:59.999Z').getTime(),
|
|
expected: false,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is only 1ms from the other but from another hour should *NOT* be considered from the same hour (A and B switched)',
|
|
inputATs: new Date('2022-01-14T05:59:59.999Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T06:00:00.000Z').getTime(),
|
|
expected: false,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is less than a hour apart but from different hours should *NOT* be considered from the same hour',
|
|
inputATs: new Date('2022-01-15T04:45:00.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T05:10:00.000Z').getTime(),
|
|
expected: false,
|
|
},
|
|
].forEach((testMeta) => {
|
|
testAreTimestampsFromSameXFunction(areTimestampsFromSameUtcHour, testMeta);
|
|
});
|
|
});
|
|
|
|
describe('areTimestampsFromSameUtcMinute', () => {
|
|
[
|
|
{
|
|
description: 'same timestamp is considered from the same minute',
|
|
inputATs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expected: true,
|
|
},
|
|
{
|
|
description: 'timestamp from same minute',
|
|
inputATs: new Date('2022-01-15T05:05:05.005Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T05:05:35.035Z').getTime(),
|
|
expected: true,
|
|
},
|
|
{
|
|
description: 'timestamp at extremes of the minute',
|
|
inputATs: new Date('2022-01-15T23:59:00.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T23:59:59.999Z').getTime(),
|
|
expected: true,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is only 1ms from the other but from another day should *NOT* be considered from the same minute',
|
|
inputATs: new Date('2022-01-14T23:59:59.999Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expected: false,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is only 1ms from the other but from another day should *NOT* be considered from the same minute (A and B switched)',
|
|
inputATs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-14T23:59:59.999Z').getTime(),
|
|
expected: false,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is only 1ms from the other but from another minute should *NOT* be considered from the same minute (A and B switched)',
|
|
inputATs: new Date('2022-01-14T05:05:59.999Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T05:06:00.000Z').getTime(),
|
|
expected: false,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is less than a minute apart but from different minutes should *NOT* be considered from the same minute',
|
|
inputATs: new Date('2022-01-15T04:45:45.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T05:46:10.000Z').getTime(),
|
|
expected: false,
|
|
},
|
|
].forEach((testMeta) => {
|
|
testAreTimestampsFromSameXFunction(areTimestampsFromSameUtcMinute, testMeta);
|
|
});
|
|
});
|
|
|
|
describe('areTimestampsFromSameUtcSecond', () => {
|
|
[
|
|
{
|
|
description: 'same timestamp is considered from the same second',
|
|
inputATs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expected: true,
|
|
},
|
|
{
|
|
description: 'timestamp from same second',
|
|
inputATs: new Date('2022-01-15T05:05:35.005Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T05:05:35.035Z').getTime(),
|
|
expected: true,
|
|
},
|
|
{
|
|
description: 'timestamp at extremes of the second',
|
|
inputATs: new Date('2022-01-15T23:59:59.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T23:59:59.999Z').getTime(),
|
|
expected: true,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is only 1ms from the other but from another day should *NOT* be considered from the same second',
|
|
inputATs: new Date('2022-01-14T23:59:59.999Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
expected: false,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is only 1ms from the other but from another day should *NOT* be considered from the same second (A and B switched)',
|
|
inputATs: new Date('2022-01-15T00:00:00.000Z').getTime(),
|
|
inputBTs: new Date('2022-01-14T23:59:59.999Z').getTime(),
|
|
expected: false,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is only 1ms from the other but from another day should *NOT* be considered from the same second (A and B switched)',
|
|
inputATs: new Date('2022-01-14T05:05:59.999Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T05:06:00.000Z').getTime(),
|
|
expected: false,
|
|
},
|
|
{
|
|
description:
|
|
'timestamp that is less than a second apart but from different seconds should *NOT* be considered from the same second',
|
|
inputATs: new Date('2022-01-15T04:45:45.750Z').getTime(),
|
|
inputBTs: new Date('2022-01-15T05:45:46.110Z').getTime(),
|
|
expected: false,
|
|
},
|
|
].forEach((testMeta) => {
|
|
testAreTimestampsFromSameXFunction(areTimestampsFromSameUtcSecond, testMeta);
|
|
});
|
|
});
|
|
});
|
|
});
|