From 770d069542d3bb97ef77b621b3ffab6cd64c94b2 Mon Sep 17 00:00:00 2001 From: Talia Rhodes Date: Wed, 3 Mar 2021 12:28:41 -0500 Subject: [PATCH] bug: fix race condition in hasValidStartExpirationDates --- package.json | 1 + src/utils/common.js | 6 ++-- src/utils/tests/common.test.js | 57 ++++++++++++++++++++++++++++++++++ 3 files changed, 62 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f0c068f0a..c63258dee 100644 --- a/package.json +++ b/package.json @@ -69,6 +69,7 @@ "build": "fedx-scripts webpack", "i18n_extract": "BABEL_ENV=i18n fedx-scripts babel src --quiet > /dev/null", "lint": "fedx-scripts eslint --ext .js --ext .jsx .", + "lint:fix": "fedx-scripts eslint --fix --ext .js --ext .jsx .", "is-es5": "es-check es5 ./dist/*.js", "precommit": "npm run lint", "snapshot": "fedx-scripts jest --updateSnapshot", diff --git a/src/utils/common.js b/src/utils/common.js index 9c9e1f7ef..fd6dda91a 100644 --- a/src/utils/common.js +++ b/src/utils/common.js @@ -38,7 +38,9 @@ export const hasTruthyValue = (value) => { return values.every(item => !!item); }; -export const hasValidStartExpirationDates = ({ startDate, expirationDate }) => { +export const hasValidStartExpirationDates = ({ startDate, expirationDate, endDate }) => { const now = moment(); - return now.isBetween(startDate, expirationDate); + // Subscriptions use "expirationDate" while Codes use "endDate" + const realEndDate = expirationDate || endDate; + return now.isBetween(startDate, realEndDate); }; diff --git a/src/utils/tests/common.test.js b/src/utils/tests/common.test.js index af38dbc0e..6dc87e428 100644 --- a/src/utils/tests/common.test.js +++ b/src/utils/tests/common.test.js @@ -1,8 +1,10 @@ +import moment from 'moment'; import { isDefinedAndNotNull, createArrayFromValue, isDefinedAndNull, hasTruthyValue, + hasValidStartExpirationDates, } from '../common'; function assertTestCaseEquals(testCase, expectedValue) { @@ -96,3 +98,58 @@ describe('hasTruthyValue', () => { expect(result).toBeFalsy(); }); }); + +const now = moment(); +const validStartDate = moment(now).subtract(5, 'days'); +const validEndDate = moment(now).add(5, 'days'); +const validExpirationDate = moment(now).add(6, 'days'); +const invalidStartDate = moment(now).add(1, 'days'); +const invalidEndDate = moment(now).subtract(1, 'days'); +const invalidExpirationDate = moment(now).subtract(2, 'days'); + +describe('hasValidStartExpirationDates', () => { + it('returns true when now is between startDate and endDate', () => { + const validStartEnd = { + startDate: validStartDate, + endDate: validEndDate, + }; + const result = hasValidStartExpirationDates(validStartEnd); + expect(result).toBeTruthy(); + }); + + it('returns true when now is between startDate and expirationDate', () => { + const validStartExp = { + startDate: validStartDate, + expirationDate: validExpirationDate, + }; + const result = hasValidStartExpirationDates(validStartExp); + expect(result).toBeTruthy(); + }); + + it('returns false when startDate is invalid', () => { + const invalidStart = { + startDate: invalidStartDate, + endDate: validEndDate, + }; + const result = hasValidStartExpirationDates(invalidStart); + expect(result).toBeFalsy(); + }); + + it('returns false when endDate is invalid', () => { + const invalidEnd = { + startDate: validStartDate, + endDate: invalidEndDate, + }; + const result = hasValidStartExpirationDates(invalidEnd); + expect(result).toBeFalsy(); + }); + + it('returns false when expirationDate is invalid', () => { + const invalidExp = { + startDate: validStartDate, + expirationDate: invalidExpirationDate, + }; + const result = hasValidStartExpirationDates(invalidExp); + expect(result).toBeFalsy(); + }); +});