From e78a9cddf8f51b18ce025a872d5b4d2f2c05cc53 Mon Sep 17 00:00:00 2001 From: Rakshak05 <159248180+Rakshak05@users.noreply.github.com> Date: Fri, 14 Aug 2026 13:51:34 +0530 Subject: [PATCH] Resolves issue-#8633 --- utils/dateHelpers.test.ts | 54 ++++++++++++++++++++++++++++++++++----- utils/dateHelpers.ts | 2 +- 2 files changed, 49 insertions(+), 7 deletions(-) diff --git a/utils/dateHelpers.test.ts b/utils/dateHelpers.test.ts index 7a8797337..323810b7e 100644 --- a/utils/dateHelpers.test.ts +++ b/utils/dateHelpers.test.ts @@ -34,16 +34,58 @@ describe('dateHelpers', () => { }); describe('getViewerLocalHour', () => { - it('returns a valid hour (0-23) for a valid ISO string', () => { - const hour = getViewerLocalHour('2024-03-10T15:30:00+02:00'); - expect(hour).toBeGreaterThanOrEqual(0); - expect(hour).toBeLessThanOrEqual(23); + it('returns a valid hour (0-23) for valid ISO strings with timezone offsets', () => { + const hourPositive = getViewerLocalHour('2024-03-10T15:30:00+02:00'); + expect(hourPositive).toBeGreaterThanOrEqual(0); + expect(hourPositive).toBeLessThanOrEqual(23); + + const hourNegative = getViewerLocalHour('2024-03-10T08:15:00-05:00'); + expect(hourNegative).toBeGreaterThanOrEqual(0); + expect(hourNegative).toBeLessThanOrEqual(23); + + const hourUtc = getViewerLocalHour('2024-03-10T00:45:00Z'); + expect(hourUtc).toBeGreaterThanOrEqual(0); + expect(hourUtc).toBeLessThanOrEqual(23); }); - it('returns 0 for invalid strings', () => { - expect(getViewerLocalHour('invalid-date')).toBe(0); + it('returns a valid hour (0-23) for partial ISO date strings', () => { + const hourDateOnly = getViewerLocalHour('2024-03-10'); + expect(hourDateOnly).toBeGreaterThanOrEqual(0); + expect(hourDateOnly).toBeLessThanOrEqual(23); + + const hourYearMonth = getViewerLocalHour('2024-03'); + expect(hourYearMonth).toBeGreaterThanOrEqual(0); + expect(hourYearMonth).toBeLessThanOrEqual(23); + }); + + it('returns 0 for empty string', () => { expect(getViewerLocalHour('')).toBe(0); }); + + it('returns 0 for date strings with invalid characters', () => { + expect(getViewerLocalHour('invalid-date')).toBe(0); + expect(getViewerLocalHour('2024-03-XX')).toBe(0); + expect(getViewerLocalHour('hello world')).toBe(0); + expect(getViewerLocalHour('2024-03-10T15:30:00XYZ')).toBe(0); + }); + + it('returns 0 for incomplete or out-of-range ISO strings', () => { + expect(getViewerLocalHour('2024-03-10T')).toBe(0); + expect(getViewerLocalHour('2024-13-99T25:99:00')).toBe(0); + }); + + it('returns 0 for invalid very old dates before year 0', () => { + expect(getViewerLocalHour('-9999999-01-01')).toBe(0); + }); + + it('returns 0 for future dates far beyond reasonable ranges', () => { + expect(getViewerLocalHour('999999999-01-01')).toBe(0); + }); + + it('returns 0 for non-string, null, or undefined inputs', () => { + expect(getViewerLocalHour(null as unknown as string)).toBe(0); + expect(getViewerLocalHour(undefined as unknown as string)).toBe(0); + }); }); describe('processCommitTimestamps', () => { diff --git a/utils/dateHelpers.ts b/utils/dateHelpers.ts index 23f20732a..fa52459ee 100644 --- a/utils/dateHelpers.ts +++ b/utils/dateHelpers.ts @@ -63,7 +63,7 @@ export function getAuthorLocalHour(isoDate: string): number { * This converts the timestamp to the browser's local timezone. */ export function getViewerLocalHour(isoDate: string): number { - if (!isoDate) return 0; + if (!isoDate || typeof isoDate !== 'string') return 0; const parsed = new Date(isoDate); return isNaN(parsed.getTime()) ? 0 : parsed.getHours(); }