From 8d2e63d4ea3e4c10ca298d0fd44f715612bbcf55 Mon Sep 17 00:00:00 2001 From: Laura Whitaker Date: Fri, 3 May 2024 15:32:00 -0600 Subject: [PATCH] Fix UTC date on Schedule Backfill (#2082) * Add getUTCString util and tests * Use getUTCString util on schedule backfill --- src/lib/pages/schedule-view.svelte | 42 +++++++++------------------ src/lib/utilities/format-date.test.ts | 31 +++++++++++++++++++- src/lib/utilities/format-date.ts | 22 ++++++++++++++ 3 files changed, 66 insertions(+), 29 deletions(-) diff --git a/src/lib/pages/schedule-view.svelte b/src/lib/pages/schedule-view.svelte index b441454fd..5ff36bfc7 100644 --- a/src/lib/pages/schedule-view.svelte +++ b/src/lib/pages/schedule-view.svelte @@ -42,7 +42,7 @@ import { refresh, workflowCount } from '$lib/stores/workflows'; import type { OverlapPolicy } from '$lib/types/schedule'; import { decodeURIForSvelte } from '$lib/utilities/encode-uri'; - import { formatDate } from '$lib/utilities/format-date'; + import { formatDate, getUTCString } from '$lib/utilities/format-date'; import { routeForScheduleEdit, routeForSchedules, @@ -207,32 +207,6 @@ $: backfillConfirmationModalOpen && updateDefaultBackfillTimes(); - const applyTimeSelection = (): { - startTime: string; - endTime: string; - } => { - const startTimeUTC = Date.UTC( - startDate.getFullYear(), - startDate.getMonth(), - startDate.getDay(), - Number(startHour), - Number(startMinute), - Number(startSecond), - ); - const startTime = new Date(startTimeUTC).toISOString(); - const endTimeUTC = Date.UTC( - endDate.getFullYear(), - endDate.getMonth(), - endDate.getDay(), - Number(endHour), - Number(endMinute), - Number(endSecond), - ); - const endTime = new Date(endTimeUTC).toISOString(); - - return { startTime, endTime }; - }; - const closeBackfillModal = () => { backfillConfirmationModalOpen = false; viewMoreBackfillOptions = false; @@ -241,7 +215,19 @@ const handleBackfill = async () => { scheduleUpdating = true; - const { startTime, endTime } = applyTimeSelection(); + + const startTime = getUTCString({ + date: startDate, + hour: startHour, + minute: startMinute, + second: startSecond, + }); + const endTime = getUTCString({ + date: endDate, + hour: endHour, + minute: endMinute, + second: endSecond, + }); await backfillRequest({ namespace, diff --git a/src/lib/utilities/format-date.test.ts b/src/lib/utilities/format-date.test.ts index 990626359..c80678907 100644 --- a/src/lib/utilities/format-date.test.ts +++ b/src/lib/utilities/format-date.test.ts @@ -1,10 +1,11 @@ -import { describe, expect, it, vi } from 'vitest'; +import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { formatDate, formatUTCOffset, getLocalTime, getSelectedTimezone, + getUTCString, isValidDate, } from './format-date'; @@ -145,3 +146,31 @@ describe('getSelectedTimezone', () => { expect(getSelectedTimezone('UTC')).toBe('UTC'); }); }); + +describe('getUTCString', () => { + beforeEach(() => { + vi.useFakeTimers(); + vi.setSystemTime(new Date('2020-01-01').getTime()); + }); + + afterEach(() => { + vi.useRealTimers(); + }); + + it('should default to 00:00 for the current date', () => { + expect(getUTCString()).toBe('2020-01-01T00:00:00.000Z'); + }); + + it('should return a string with hours, minutes, and seconds set', () => { + expect(getUTCString({ hour: 1, minute: 1, second: 1 })).toBe( + '2020-01-01T01:01:01.000Z', + ); + expect(getUTCString({ hour: 1, minute: 61, second: 1 })).toBe( + '2020-01-01T02:01:01.000Z', + ); + expect(getUTCString({ hour: 1, minute: 1, second: 61 })).toBe( + '2020-01-01T01:02:01.000Z', + ); + expect(getUTCString({ hour: 25 })).toBe('2020-01-02T01:00:00.000Z'); + }); +}); diff --git a/src/lib/utilities/format-date.ts b/src/lib/utilities/format-date.ts index a1893125a..2ed8734a4 100644 --- a/src/lib/utilities/format-date.ts +++ b/src/lib/utilities/format-date.ts @@ -104,3 +104,25 @@ export function getSelectedTimezone(timeFormat: TimeFormat): string { return timeFormat; } + +export function getUTCString({ + date = new Date(), + hour = 0, + minute = 0, + second = 0, +}: { + date?: Date; + hour?: string | number; + minute?: string | number; + second?: string | number; +} = {}): string { + const utcTime = Date.UTC( + date.getFullYear(), + date.getMonth(), + date.getDate(), + Number(hour), + Number(minute), + Number(second), + ); + return new Date(utcTime).toISOString(); +}