magic-date
Version:
A simple date utility for javascript
280 lines (251 loc) • 9.71 kB
text/typescript
/**
* @author Peter Ukonu
* @email [pukonu@gmail.com]
* @create date 2018-07-06 02:51:23
* @modify date 2018-07-06 02:53:23
* @revision date 2020-05-20 03:00:00 - v2
* @desc A date utility class to handle all sort of manipulation on a date
*/
import MagicDate from "./index";
/**
* This DateUtil class is capable of returning multiple permutations to a date
* and so for date we will have a very large set of test cases.
* First of let check that the correct date is returned, and then we will use a reference
* date and run the test across multiple scenarios.
*
* Date Reference to be used
* i. Sunday - March 18, 2018
* ii. Wednesday - June 20, 2018
*
* 1. DateUtil().now().today() should be today's date
* 2. Get the first day of a give week -- DateUtil().getWeekFirstDate()
* - Case (i) >> Sunday - March 18, 2018
* - Case (ii) >> Sunday - June 17, 2018
* 3. Get the last day of a give week -- DateUtil().getWeekLastDate()
* - Case (i) >> Saturday - March 24, 2018
* - Case (ii) >> Saturday - June 23, 2018
* 4. Get 3 days ahead from a reference date -- DateUtil().next("3 days")
* - Case (i) >> Saturday - March 24, 2018
* - Case (ii) >> Saturday - June 23, 2018
* 5. Get 3 days ago from reference date -- DateUtil().next("-3 days")
* - Case (i) >> Saturday - March 24, 2018
* - Case (ii) >> Saturday - June 23, 2018
* 6. Get next week from reference days -- DateUtil().next("1 week")
* - Case (i) >> Sunday - March 25, 2018
* - Case (ii) >> Sunday - June 24, 2018
* 7. Get next month from reference days -- DateUtil().next("1 month")
* - Case (i) >> Sunday - April 1, 2018
* - Case (ii) >> Sunday - July 1, 2018
* 8. Get the current week number -- DateUtil().getWeekNum()
* For weeks starting from sunday
* - Case (i) >> 11 (for week config starting Sunday)
* - Case (i) >> 12 (for week config starting Monday)
* - Case (ii) >> 25
* 9. Get the days from a week number -- DateUtil.getDatesFromWeekNum(25)
* - Case (i) >> [Sunday - March 18, 2018, ... ,Saturday - March 24, 2018]
* - Case (ii) >> [Sunday - June 17, 2018, ... ,Saturday - June 23, 2018]
* 10. Get a range of days between 2 reference days -- DateUtil.getDateFromTo()
* - Case >> (Sunday - March 18, 2018, Wednesday - June 20, 2018) : outputs an array
* of dates between the 2 reference dates
* 11. Get the first date of a given month -- DateUtil.getMonthFirstDate()
* - Case (i) >> Thursday - March 1, 2018
* - Case (ii) >> Friday - June 1, 2018
* - Case (iii) >> March, 2018 : returns Thursday - March 1, 2018
* 12. Get the last day of a given month -- DateUtil.getMonthLastDate()
* - Case (i) >> Saturday - March 31, 2018
* - Case (ii) >> Saturday - June 30, 2018
* - Case (iii) >> 11, 2017 : returns Thursday - November 30, 2017
* 13. Check if date one date is greater than the order -- DateUtil.validateDatePosition()
* - Case (Sunday - March 18, 2018, Wednesday - June 20, 2018) : returns false
* 14. Check if year of a reference date or year is a leap year -- DateUtil.isLeapYear()
* - Case (Sunday - March 18, 2018, Wednesday - June 20, 2018) : returns true
* - Case 2019 : return false
*/
const CASE1 = {
year: 2018,
month: 3,
day: 18,
};
const CASE2 = {
year: 2018,
month: 6,
day: 20
};
test("The class call should return a dictionary of the time value", () => {
// you can get the current date by just calling the class below
// or you can use the data factory makeDate() to make a new date with parameters
expect(new MagicDate()).toBeDefined();
// tmp
// const md = new MagicDate();
// const md = MagicDate.makeDateFromString("2020-05-21T01:05");
//
// console.log("md", md);
// console.log("md", md.toString());
// console.log("md", MagicDate.makeDate(CASE1).toString());
console.log(MagicDate.makeDate(CASE1).getWeekLastDate().toString())
});
test("the first day of week of a given week from a date object", () => {
// case1 should assert to Saturday - March 24, 2018
// case2 should assert to Sunday - June 17, 2018
expect(
MagicDate.makeDate(CASE1)
.getWeekFirstDate()
.toString()
).toMatch("2018-03-18");
expect(
MagicDate.makeDate(CASE2)
.getWeekFirstDate()
.toString()
).toMatch("2018-06-17");
});
test("the last day of week of a given week from a date object", () => {
// case1 should assert to Saturday - March 24, 2018
// case2 should assert to Sunday - June 23, 2018
expect(
MagicDate.makeDate(CASE1)
.getWeekLastDate()
.toString()
).toMatch("2018-03-24");
expect(
MagicDate.makeDate(CASE2)
.getWeekLastDate()
.toString()
).toMatch("2018-06-23");
});
test("get 3 days ahead from a reference date", () => {
// case1 should assert to Saturday - March 21, 2018
// case2 should assert to Sunday - June 23, 2018
expect(
MagicDate.makeDate(CASE1)
.next("3 days")
.toString()
).toMatch("2018-03-21");
expect(
MagicDate.makeDate(CASE2)
.next("3 days")
.toString()
).toMatch("2018-06-23");
});
test("get 3 prior from a reference date", () => {
// case1 should assert to Saturday - March 15, 2018
// case2 should assert to Sunday - June 17, 2018
expect(
MagicDate.makeDate(CASE1)
.next("-3 days")
.toString()
).toMatch("2018-03-15");
expect(
MagicDate.makeDate(CASE2)
.next("-3 days")
.toString()
).toMatch("2018-06-17");
});
test("get 3 weeks ahead from a reference date", () => {
// case1 should assert to Saturday - April 8, 2018
// case2 should assert to Sunday - July 11, 2018
expect(
MagicDate.makeDate(CASE1)
.next("3 weeks")
.toString()
).toMatch("2018-04-08");
expect(
MagicDate.makeDate(CASE2)
.next("3 weeks")
.toString()
).toMatch("2018-07-11");
});
test("get 1 month prior from a reference date", () => {
// we are reversing a month, from a month a longer length to a lower one,
// the utility should detect this and adjust accordingly
expect(
MagicDate.makeDate({
year: 2018,
month: 3,
day: 29
})
.next("-1 month")
.toDateString()
).toMatch("2018-02-28");
});
test("get 2 years and a month prior from a reference date", () => {
// this will reverse into a leap year, we should be expecting a Feb 29 date of 2016 .next("-1 month")
expect(
MagicDate.makeDate({
year: 2018,
month: 3,
day: 31
})
.next("-2 years")
.next("-1 month")
.toDateString()
).toMatch("2016-02-29");
});
test("get the week number based on a given date", () => {
// console.log(DateUtil.makeDate().getWeekNum());
expect(
MagicDate.makeDate(CASE1) // week starts on Sunday by default
.getWeekNum()
).toEqual(11);
expect(
MagicDate.makeDate(CASE1)
.setWeekStart(1) // set week to start on Monday
.getWeekNum()
).toEqual(12);
expect(MagicDate.makeDate(CASE2).getWeekNum()).toEqual(25);
});
test("get the first date from a given month", () => {
const $case1 = MagicDate.makeDate(CASE1);
const $case2 = MagicDate.makeDate(CASE2);
const $case3 = {
month: 3,
year: 2017
};
expect(MagicDate.getMonthFirstDate($case1).weekday?.name).toBe("Thursday");
expect(MagicDate.getMonthFirstDate($case2).weekday?.name).toBe("Friday");
expect(MagicDate.getMonthFirstDate($case3).weekday?.name).toBe("Wednesday");
});
test("get the last date from a given month", () => {
const $case1 = MagicDate.makeDate(CASE1);
const $case2 = MagicDate.makeDate(CASE2);
const $case3 = {
month: 11,
year: 2017
};
expect(MagicDate.getMonthLastDate($case1).weekday?.name).toBe("Saturday");
expect(MagicDate.getMonthLastDate($case2).weekday?.name).toBe("Saturday");
expect(MagicDate.getMonthLastDate($case3).weekday?.name).toBe("Thursday");
});
test("check if year of a given year or year is a leap year", () => {
const $refDate1 = MagicDate.makeDate(CASE1);
const $isLeapYearFromYear = MagicDate.isLeapYear(2016);
expect($refDate1.leapYear).toBeFalsy();
expect($isLeapYearFromYear).toBeTruthy();
});
test("check if date is in proper positions, checks if greater", () => {
const $start = MagicDate.makeDate(CASE1);
const $end = MagicDate.makeDate(CASE2);
expect(MagicDate.validateDatePosition($start, $end)).toBeTruthy();
});
test("get all dates between 2 reference dates", () => {
const $start = MagicDate.makeDate(CASE1);
const $end = MagicDate.makeDate(CASE2);
const daysArr = MagicDate.getDateFromTo($start, $end).map(v => v.toDateString());
expect(daysArr).toContain("2018-03-19");
expect(daysArr).toContain("2018-06-19");
expect(daysArr).toHaveLength(95)
});
test("get dates from a week number", () => {
const assertToValue = [
"2017-12-31",
"2018-01-01",
"2018-01-02",
"2018-01-03",
"2018-01-04",
"2018-01-05",
"2018-01-06"
];
const weekArr = MagicDate.getDatesFromWeekNum({weekNum: 1, year: 2018, includeEndDate: true}).map(v =>
v.setCast("%Y-%m-%d").toString()
);
expect(JSON.stringify(weekArr)).toBe(JSON.stringify(assertToValue));
});