@variantjs/core
Version:
VariantJS common functions and utilities
219 lines (183 loc) • 8.08 kB
text/typescript
import parseDate from '../../dates/parseDate';
describe('parseDate', () => {
const defaultFormat = 'Y-m-d H:i:S';
const timeless = true;
describe('String parsing', () => {
it('returns undefined if empty date string', () => {
expect(parseDate('')).toBeUndefined();
});
it('returns undefined if NaN', () => {
expect(parseDate(NaN)).toBeUndefined();
});
it('returns undefined if passes a function', () => {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
const fn = (() => {}) as any;
const parser = () => parseDate(fn);
expect(parser).toThrow(new Error('Invalid date provided: () => { }'));
});
it('returns today date if passed `today`', () => {
const today = new Date(new Date().getFullYear(), (new Date()).getMonth(), (new Date()).getDate(), 0, 0, 0, 0);
expect(parseDate('today')).toEqual(today);
});
it('parses gmt dates', () => {
expect(parseDate('Sat, 23 Oct 2021 20:58:00 GMT'))
.toEqual(new Date(Date.UTC(2021, 9, 23, 20, 58, 0, 0)));
});
it('parses iso dates', () => {
expect(parseDate('2021-10-23T20:58:11.733Z'))
.toEqual(new Date(Date.UTC(2021, 9, 23, 20, 58, 11, 733)));
});
it('parses a date in the default format', () => {
expect(parseDate('2020-02-18 12:34:56')).toEqual(new Date(2020, 1, 18, 12, 34, 56));
});
it('parses a date ignoring time', () => {
expect(parseDate('2020-02-18 12:34:56', defaultFormat, timeless)).toEqual(new Date(2020, 1, 18, 0, 0, 0));
});
it('escapes the token', () => {
expect(parseDate('2020Y-02-18 12m:34:56', 'Y\\Y-m-d H\\m:i:S')).toEqual(new Date(2020, 1, 18, 12, 34, 56));
});
it('returns undefined if using an invalid format', () => {
const parser = () => parseDate('2020-11-12', 'X');
expect(parser).toThrow(new Error('Invalid date provided: 2020-11-12'));
});
it('returns undefined if dates doesnt matchs the format', () => {
const parser = () => parseDate('18021987', 'K');
expect(parser).toThrow(new Error('Invalid date provided: 18021987'));
});
describe('parse a single token', () => {
let baseDate: Date;
beforeEach(() => {
baseDate = new Date('2021-01-01T06:00:00.000Z');
jest
.useFakeTimers()
.setSystemTime(baseDate.getTime());
});
afterEach(() => {
jest.useRealTimers();
});
// d / Day of the month, 2 digits with leading zeros / 01 to 31
it('d', () => {
expect(parseDate('05', 'd')).toEqual(new Date('2021-01-05T06:00:00.000Z'));
});
// D / A textual representation of a day / Mon through Sun
it('D', () => {
// Doesnt affect the date when parsing
expect(parseDate('Tue', 'D')).toEqual(new Date('2021-01-01T06:00:00.000Z'));
});
// l (lowercase 'L') / A full textual representation of the day of the week / Sunday through Saturday
it('l', () => {
// Doesnt affect the date when parsing
expect(parseDate('Saturday', 'l')).toEqual(new Date('2021-01-01T06:00:00.000Z'));
});
// j / Day of the month without leading zeros / 1 to 31
it('j', () => {
expect(parseDate('10', 'j')).toEqual(new Date('2021-01-10T06:00:00.000Z'));
});
// J / Day of the month without leading zeros and ordinal suffix / 1st, 2nd, to 31st
it('J', () => {
expect(parseDate('22nd', 'J')).toEqual(new Date('2021-01-22T06:00:00.000Z'));
});
// w / Numeric representation of the day of the week / 0 (for Sunday) through 6 (for Saturday)
it('w', () => {
// Doesnt affect the date when parsing
expect(parseDate('4', 'w')).toEqual(new Date('2021-01-01T06:00:00.000Z'));
});
// W / Numeric representation of the week / 0 (first week of the year) through 52 (last week of the year)
it('W', () => {
expect(parseDate('32', 'W')).toEqual(new Date('2021-08-01T05:00:00.000Z'));
});
// F / A full textual representation of a month / January through December
it('F', () => {
expect(parseDate('November', 'F')).toEqual(new Date('2021-11-01T06:00:00.000Z'));
});
// m / Numeric representation of a month, with leading zero / 01 through 12
it('m', () => {
expect(parseDate('11', 'm')).toEqual(new Date('2021-11-01T06:00:00.000Z'));
});
// n / Numeric representation of a month, without leading zeros / 1 through 12
it('n', () => {
// Timezone affected because the daylight saving
expect(parseDate('9', 'n')).toEqual(new Date('2021-09-01T05:00:00.000Z'));
});
// M / A short textual representation of a month / Jan through Dec
it('M', () => {
expect(parseDate('Feb', 'M')).toEqual(new Date('2021-02-01T06:00:00.000Z'));
});
// U / The number of seconds since the Unix Epoch / 1413704993
it('U', () => {
expect(parseDate('1635080656', 'U')).toEqual(new Date('2021-10-24T13:04:16.000Z'));
});
// y / A two digit representation of a year / 99 or 03
it('y', () => {
expect(parseDate('20', 'y')).toEqual(new Date('2020-01-01T06:00:00.000Z'));
});
// Y / A full numeric representation of a year, 4 digits / 1999 or 2003
it('Y', () => {
expect(parseDate('2019', 'Y')).toEqual(new Date('2019-01-01T06:00:00.000Z'));
});
// Z / ISO Date format / 2017-03-04T01:23:43.000Z
it('Z', () => {
expect(parseDate('2020-01-01T06:00:00.000', 'Z')).toEqual(new Date('2020-01-01T12:00:00.000Z'));
});
// H / Hours (24 hours) / 00 to 23
it('H', () => {
expect(parseDate('14', 'H')).toEqual(new Date('2021-01-01T20:00:00.000Z'));
});
// h / Hours / 1 to 12
it('h', () => {
expect(parseDate('6', 'h')).toEqual(new Date('2021-01-01T12:00:00.000Z'));
});
// G / Hours, 2 digits with leading zeros / 1 to 12
it('G', () => {
expect(parseDate('10', 'G')).toEqual(new Date('2021-01-01T16:00:00.000Z'));
});
// i / Minutes / 00 to 59
it('i', () => {
expect(parseDate('35', 'i')).toEqual(new Date('2021-01-01T06:35:00.000Z'));
});
// S / Seconds, 2 digits / 00 to 59
it('S', () => {
expect(parseDate('42', 'S')).toEqual(new Date('2021-01-01T06:00:42.000Z'));
});
// s / Seconds / 0, 1 to 59
it('s', () => {
expect(parseDate('18', 's')).toEqual(new Date('2021-01-01T06:00:18.000Z'));
});
// K / AM/PM / AM or PM
it('K', () => {
expect(parseDate('PM', 'K')).toEqual(new Date('2021-01-01T18:00:00.000Z'));
});
it('K for AM', () => {
expect(parseDate('AM', 'K')).toEqual(new Date('2021-01-01T06:00:00.000Z'));
});
});
});
describe('Numeric values parsing', () => {
it('returns a 0 date if passed `0` as a param', () => {
expect(parseDate(0)).toEqual(new Date(0));
});
});
describe('Date instances parsing', () => {
it('returns a clone of the date passed as a paramenter', () => {
const date = new Date(2020, 2, 15);
expect(parseDate(date)).toEqual(new Date(2020, 2, 15));
});
it('returns same date but with the time reset if timeless', () => {
const date = new Date(2020, 2, 15, 12, 30, 45);
expect(parseDate(date, defaultFormat, timeless)).toEqual(new Date(2020, 2, 15, 0, 0, 0, 0));
});
});
describe('Timestamp instances parsing', () => {
it('returns a date when passing the timestamp ', () => {
const date = new Date(2020, 2, 15);
expect(parseDate(date.getTime())).toEqual(new Date(2020, 2, 15));
});
it('returns a date when passing the timestamp as number ', () => {
const date = new Date(2020, 2, 15);
expect(parseDate(+date)).toEqual(new Date(2020, 2, 15));
});
it('returns a date when passing the timestamp as a regular number ', () => {
expect(parseDate(1584252000000)).toEqual(new Date(2020, 2, 15));
});
});
});