From d5a066050f9fbddcee093dbbf4c1a4599259df58 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Fri, 26 Aug 2022 10:14:56 -0500 Subject: [PATCH] Ads: move isExpired to tested utils function --- app/soapbox/queries/ads.ts | 7 ++----- app/soapbox/utils/__tests__/ads.test.ts | 22 ++++++++++++++++++++++ app/soapbox/utils/ads.ts | 16 ++++++++++++++++ 3 files changed, 40 insertions(+), 5 deletions(-) create mode 100644 app/soapbox/utils/__tests__/ads.test.ts create mode 100644 app/soapbox/utils/ads.ts diff --git a/app/soapbox/queries/ads.ts b/app/soapbox/queries/ads.ts index 0b296f677..91c7da2fb 100644 --- a/app/soapbox/queries/ads.ts +++ b/app/soapbox/queries/ads.ts @@ -2,6 +2,7 @@ import { useQuery } from '@tanstack/react-query'; import { Ad, getProvider } from 'soapbox/features/ads/providers'; import { useAppDispatch } from 'soapbox/hooks'; +import { isExpired } from 'soapbox/utils/ads'; export default function useAds() { const dispatch = useAppDispatch(); @@ -22,11 +23,7 @@ export default function useAds() { }); // Filter out expired ads. - const data = result.data?.filter(ad => { - const now = new Date(); - const isExpired = ad.expires && (now.getTime() > ad.expires.getTime()); - return !isExpired; - }); + const data = result.data?.filter(isExpired); return { ...result, diff --git a/app/soapbox/utils/__tests__/ads.test.ts b/app/soapbox/utils/__tests__/ads.test.ts new file mode 100644 index 000000000..989048110 --- /dev/null +++ b/app/soapbox/utils/__tests__/ads.test.ts @@ -0,0 +1,22 @@ +import { normalizeCard } from 'soapbox/normalizers'; + +import { isExpired } from '../ads'; + +/** 3 minutes in milliseconds. */ +const threeMins = 3 * 60 * 1000; + +/** 5 minutes in milliseconds. */ +const fiveMins = 5 * 60 * 1000; + +test('isExpired()', () => { + const now = new Date(); + const card = normalizeCard({}); + + // Sanity tests. + expect(isExpired({ expires: now, card })).toBe(true); + expect(isExpired({ expires: new Date(now.getTime() + 999999), card })).toBe(false); + + // Testing the 5-minute mark. + expect(isExpired({ expires: new Date(now.getTime() + threeMins), card }, fiveMins)).toBe(true); + expect(isExpired({ expires: new Date(now.getTime() + fiveMins + 1000), card }, fiveMins)).toBe(false); +}); diff --git a/app/soapbox/utils/ads.ts b/app/soapbox/utils/ads.ts new file mode 100644 index 000000000..2d5a01040 --- /dev/null +++ b/app/soapbox/utils/ads.ts @@ -0,0 +1,16 @@ +import type { Ad } from 'soapbox/features/ads/providers'; + +/** Time (ms) window to not display an ad if it's about to expire. */ +const AD_EXPIRY_THRESHOLD = 5 * 60 * 1000; + +/** Whether the ad is expired or about to expire. */ +const isExpired = (ad: Ad, threshold = AD_EXPIRY_THRESHOLD): boolean => { + if (ad.expires) { + const now = new Date(); + return now.getTime() > (ad.expires.getTime() - threshold); + } else { + return false; + } +}; + +export { isExpired };