From db2d9e7d6be3c42e036139994ecd1313a0db460a Mon Sep 17 00:00:00 2001 From: titanventura Date: Sat, 13 Jan 2024 23:14:50 +0530 Subject: [PATCH] refactor. migrated date_utils file to typescript, add tests Signed-off-by: titanventura --- webapp/src/utils/date_utils.js | 49 ----------------------------- webapp/src/utils/date_utils.test.ts | 49 +++++++++++++++++++++++++++++ webapp/src/utils/date_utils.ts | 17 ++++++++++ 3 files changed, 66 insertions(+), 49 deletions(-) delete mode 100644 webapp/src/utils/date_utils.js create mode 100644 webapp/src/utils/date_utils.test.ts create mode 100644 webapp/src/utils/date_utils.ts diff --git a/webapp/src/utils/date_utils.js b/webapp/src/utils/date_utils.js deleted file mode 100644 index 4692152ce..000000000 --- a/webapp/src/utils/date_utils.js +++ /dev/null @@ -1,49 +0,0 @@ -export function formatDate(date, useMilitaryTime = false) { - const monthNames = [ - 'Jan', 'Feb', 'Mar', - 'Apr', 'May', 'Jun', 'Jul', - 'Aug', 'Sep', 'Oct', - 'Nov', 'Dec', - ]; - - const day = date.getDate(); - const monthIndex = date.getMonth(); - let hours = date.getHours(); - let minutes = date.getMinutes(); - - let ampm = ''; - if (!useMilitaryTime) { - ampm = ' AM'; - if (hours >= 12) { - ampm = ' PM'; - } - - hours %= 12; - if (!hours) { - hours = 12; - } - } - - if (minutes < 10) { - minutes = '0' + minutes; - } - - return `${monthNames[monthIndex]} ${day} at ${hours}:${minutes}${ampm}`; -} - -export function formatTimeSince(date) { - const secondsSince = Math.trunc((Date.now() - (new Date(date)).getTime()) / 1000); - if (secondsSince < 60) { - return `${secondsSince} ${secondsSince === 1 ? 'second' : 'seconds'}`; - } - const minutesSince = Math.trunc(secondsSince / 60); - if (minutesSince < 60) { - return `${minutesSince} ${minutesSince === 1 ? 'minute' : 'minutes'}`; - } - const hoursSince = Math.trunc(minutesSince / 60); - if (hoursSince < 24) { - return `${hoursSince} ${hoursSince === 1 ? 'hour' : 'hours'}`; - } - const daysSince = Math.trunc(hoursSince / 24); - return `${daysSince} ${daysSince === 1 ? 'day' : 'days'}`; -} diff --git a/webapp/src/utils/date_utils.test.ts b/webapp/src/utils/date_utils.test.ts new file mode 100644 index 000000000..2896fb48a --- /dev/null +++ b/webapp/src/utils/date_utils.test.ts @@ -0,0 +1,49 @@ +import {beforeAll, describe, expect, it, jest} from "@jest/globals"; +import {formatTimeSince} from "./date_utils"; + + +describe('formatTimeSince should work as expected', () => { + + beforeAll(() => { + const mockCurrentDate = new Date("December 17, 1995 10:11:00"); + jest.spyOn(Date, 'now').mockReturnValue(mockCurrentDate.getTime()); + }) + + it.each([ + { + dateString: 'December 17, 1995 10:10:30', + output: '30 seconds' + }, + { + dateString: 'December 17, 1995 10:10:59', + output: '1 second' + }, + { + dateString: 'December 17, 1995 09:41:00', + output: '30 minutes' + }, + { + dateString: 'December 17, 1995 10:10:00', + output: '1 minute' + }, + { + dateString: 'December 17, 1995 06:11:00', + output: '4 hours' + }, + { + dateString: 'December 17, 1995 09:11:00', + output: '1 hour' + }, + { + dateString: 'December 13, 1995 10:11:00', + output: '4 days' + }, + { + dateString: 'December 16, 1995 10:11:00', + output: '1 day' + }, + ])('should show time since current time in proper format', ({dateString, output}) => { + const result = formatTimeSince(dateString); + expect(result).toBe(output) + }); +}) \ No newline at end of file diff --git a/webapp/src/utils/date_utils.ts b/webapp/src/utils/date_utils.ts new file mode 100644 index 000000000..fe5fa41d8 --- /dev/null +++ b/webapp/src/utils/date_utils.ts @@ -0,0 +1,17 @@ +export function formatTimeSince(date: string): string { + const pastDateInSeconds = new Date(date).getTime(); + const secondsSince = Math.trunc((Date.now() - pastDateInSeconds) / 1000); + if (secondsSince < 60) { + return `${secondsSince} ${secondsSince === 1 ? 'second' : 'seconds'}`; + } + const minutesSince = Math.trunc(secondsSince / 60); + if (minutesSince < 60) { + return `${minutesSince} ${minutesSince === 1 ? 'minute' : 'minutes'}`; + } + const hoursSince = Math.trunc(minutesSince / 60); + if (hoursSince < 24) { + return `${hoursSince} ${hoursSince === 1 ? 'hour' : 'hours'}`; + } + const daysSince = Math.trunc(hoursSince / 24); + return `${daysSince} ${daysSince === 1 ? 'day' : 'days'}`; +}