la-gregory
Version:
jest date mocks
67 lines • 1.87 kB
JavaScript
let nowDate = undefined;
// performance.now() = nowDate + performanceOffset
let performanceOffset = 0;
const now = () => nowDate;
const mockDateClass = (OriginalDate) => {
// if undefined, use real date, or else mock date
const mockNow = () => (now() === undefined ? OriginalDate.now() : now());
// eslint-disable-next-line @typescript-eslint/no-explicit-any
function Date(...args) {
const dateArgs = args.length === 0 ? [mockNow()] : args;
const instance = new OriginalDate(...dateArgs);
// @ts-ignore
Object.setPrototypeOf(instance, Object.getPrototypeOf(this));
return instance;
}
Date.prototype = Object.create(OriginalDate.prototype);
Object.setPrototypeOf(Date, OriginalDate);
Date.now = () => mockNow();
Date.__OriginalDate__ = OriginalDate;
return Date;
};
const MockDate = mockDateClass(Date);
if (global.window) {
// dom env
global.window.Date = MockDate;
global.window.performance.now = function () {
return MockDate.now() + performanceOffset;
};
}
else {
// node / native env
global.Date = MockDate;
require('perf_hooks').performance.now = function () {
return MockDate.now() + performanceOffset;
};
}
/**
* Move date by offset `ms`
*/
export const advanceDate = (ms) => {
if (nowDate === undefined) {
nowDate = ms;
}
else {
nowDate += ms;
}
};
/**
* Set date to absolute value
*/
export const setDate = (dateOrMs) => {
nowDate = dateOrMs instanceof Date ? dateOrMs.getTime() : dateOrMs;
};
/**
* Clear date mock
*/
export const clearDateMock = () => {
nowDate = undefined;
performanceOffset = 0;
};
/**
* Set offset between performance.now() and Date.now()
*/
export const setPerformanceOffset = (offset) => {
performanceOffset = offset;
};
//# sourceMappingURL=index.js.map