From abec0340ac3a781284ba3e500db04b34aaa2b01e Mon Sep 17 00:00:00 2001 From: Emily Rosario-Aquin <129111440+emrosarioa@users.noreply.github.com> Date: Thu, 20 Apr 2023 12:49:30 -0500 Subject: [PATCH] feat: check for valid term date format (#327) In the Support Tools: New Learner Credit Plan, a validity check was added that the term start and end date is in the format "YYYY-MM-DD". ENT-6940 --- .../ProvisioningForm/ProvisioningFormTerm.jsx | 14 +++++++++++--- .../tests/ProvisioningFormTerm.test.jsx | 9 +++++++++ src/utils/index.js | 2 ++ src/utils/index.test.js | 19 +++++++++++++++++++ 4 files changed, 41 insertions(+), 3 deletions(-) diff --git a/src/Configuration/Provisioning/ProvisioningForm/ProvisioningFormTerm.jsx b/src/Configuration/Provisioning/ProvisioningForm/ProvisioningFormTerm.jsx index 7f1ef7c3f..f2537ab47 100644 --- a/src/Configuration/Provisioning/ProvisioningForm/ProvisioningFormTerm.jsx +++ b/src/Configuration/Provisioning/ProvisioningForm/ProvisioningFormTerm.jsx @@ -3,6 +3,7 @@ import { Form } from '@edx/paragon'; import PROVISIONING_PAGE_TEXT from '../data/constants'; import useProvisioningContext from '../data/hooks'; import { selectProvisioningContext } from '../data/utils'; +import { isValidDateString } from '../../../utils'; const ProvisioningFormTerm = () => { const { TERM } = PROVISIONING_PAGE_TEXT.FORM; @@ -12,10 +13,17 @@ const ProvisioningFormTerm = () => { const handleDateChange = (e) => { const eventTarget = e.target; - if (eventTarget.dataset.testid.includes('start')) { - return setStartDate(eventTarget.value); + const isStartDate = eventTarget.dataset.testid.includes('start'); + if (isValidDateString(eventTarget.value)) { + if (isStartDate) { + return setStartDate(eventTarget.value); + } + return setEndDate(eventTarget.value); } - return setEndDate(eventTarget.value); + if (isStartDate) { + return setStartDate(''); + } + return setEndDate(''); }; useEffect(() => { diff --git a/src/Configuration/Provisioning/ProvisioningForm/tests/ProvisioningFormTerm.test.jsx b/src/Configuration/Provisioning/ProvisioningForm/tests/ProvisioningFormTerm.test.jsx index 63c9aba63..64c1f57a1 100644 --- a/src/Configuration/Provisioning/ProvisioningForm/tests/ProvisioningFormTerm.test.jsx +++ b/src/Configuration/Provisioning/ProvisioningForm/tests/ProvisioningFormTerm.test.jsx @@ -62,5 +62,14 @@ describe('ProvisioningFormTerm', () => { expect(endDateInputValue).toEqual('2020-01-01'); expect(screen.getByText(TERM.VALIDITY)).toBeTruthy(); + + fireEvent.change(endDateInput, { target: { value: 'foo' } }); + const invalidEndDateInputValue = endDateInput.getAttribute('value'); + expect(invalidEndDateInputValue).toEqual(''); + expect(startDateInput.getAttribute('value')).toEqual('2021-01-01'); + + fireEvent.change(startDateInput, { target: { value: '2020/09/08' } }); + const invalidStartDateInputValue = startDateInput.getAttribute('value'); + expect(invalidStartDateInputValue).toEqual(''); }); }); diff --git a/src/utils/index.js b/src/utils/index.js index 7b27de352..c9ea99972 100644 --- a/src/utils/index.js +++ b/src/utils/index.js @@ -99,3 +99,5 @@ export function extractParams(searchParams) { .map(queryParams => queryParams.split('=')), ); } + +export const isValidDateString = (dateString) => moment(dateString, 'YYYY-MM-DD', true).isValid(); diff --git a/src/utils/index.test.js b/src/utils/index.test.js index 6febf1214..b1d4bf5a5 100644 --- a/src/utils/index.test.js +++ b/src/utils/index.test.js @@ -11,6 +11,7 @@ import { isValidCourseID, extractMessageTuple, extractParams, + isValidDateString, isWholeDollarAmount, } from './index'; @@ -210,6 +211,24 @@ describe('Test Utils', () => { expect(params.get('')).toEqual(undefined); }); }); + + describe('isValidDate', () => { + it('returns true for valid date string in YYYY-MM-DD format', () => { + expect(isValidDateString('2022-03-24')).toBe(true); + expect(isValidDateString('1997-11-04')).toBe(true); + expect(isValidDateString('2022-01-01')).toBe(true); + }); + it('returns false for invalid date string', () => { + expect(isValidDateString('2022-3-24')).toBe(false); + expect(isValidDateString('2022-04-3oT12:00:00Z')).toBe(false); + expect(isValidDateString('2022/01/01')).toBe(false); + expect(isValidDateString('foo')).toBe(false); + }); + it('returns false for null or undefined input', () => { + expect(isValidDateString(null)).toBe(false); + expect(isValidDateString(undefined)).toBe(false); + }); + }); }); describe('isWholeDollarAmount', () => {