From cd8df3284aeb0635d5507ce06b599139919eacb0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tim=20H=C3=A5rek=20Andreassen?= Date: Mon, 8 Apr 2024 17:13:01 +0200 Subject: [PATCH] test: Add tests for caching MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Tim HÄrek Andreassen --- lib/caching.test.ts | 52 +++++++++++++++++++++++++++++++++++++++++++++ lib/caching.ts | 31 +++++++++++++++++++-------- lib/test-utils.ts | 1 + 3 files changed, 75 insertions(+), 9 deletions(-) create mode 100644 lib/caching.test.ts diff --git a/lib/caching.test.ts b/lib/caching.test.ts new file mode 100644 index 0000000..b4879f5 --- /dev/null +++ b/lib/caching.test.ts @@ -0,0 +1,52 @@ +import { assertEquals } from "$std/assert/mod.ts"; +import { forTestingOnly } from "./caching.ts"; +import { storage } from "./storage.ts"; +import { testUtils } from "./test-utils.ts"; + +Deno.test("Verify getTimeSinceLastFetch for correct difference", () => { + const earlyDate = new Date("2024-04-07T20:24:32Z"); + const date = new Date("2024-04-07T23:24:32Z"); + const timeSinceLastFetch = forTestingOnly.getTimeSinceLastFetch(date, earlyDate); + + assertEquals(timeSinceLastFetch, 3); +}); + +Deno.test("Verify getTimeSinceLastFetch for bad date", () => { + const earlyDate = new Date("2024-04-07T20:24:32Z"); + const date = new Date("bad date"); + const timeSinceLastFetch = forTestingOnly.getTimeSinceLastFetch(date, earlyDate); + + assertEquals(timeSinceLastFetch, NaN); +}); + +Deno.test("Verify getTimeSinceLastFetch for bad dates (plural)", () => { + const earlyDate = new Date("badest date"); + const date = new Date("bad date"); + const timeSinceLastFetch = forTestingOnly.getTimeSinceLastFetch(date, earlyDate); + + assertEquals(timeSinceLastFetch, NaN); +}); + +Deno.test("Verify seriesFromStorage is old", () => { + const earlyDate = new Date("2024-04-07T21:24:32Z"); + const date = new Date("2024-04-07T23:24:32Z"); + const timeSinceLastFetch = forTestingOnly.getTimeSinceLastFetch(date, earlyDate); + + const series = testUtils.generateSeries({ lastFetchedAt: date }); + const syncInterval = 2; + const isNew = forTestingOnly.isSeriesFromStorageNew(series, syncInterval, timeSinceLastFetch); + + assertEquals(isNew, true); +}); + +Deno.test("Verify seriesFromStorage is new", () => { + const earlyDate = new Date("2024-04-07T20:24:32Z"); + const date = new Date("2024-04-07T23:24:32Z"); + const timeSinceLastFetch = forTestingOnly.getTimeSinceLastFetch(date, earlyDate); + + const series = testUtils.generateSeries({ lastFetchedAt: date }); + const syncInterval = 2; + const isNew = forTestingOnly.isSeriesFromStorageNew(series, syncInterval, timeSinceLastFetch); + + assertEquals(isNew, false); +}); diff --git a/lib/caching.ts b/lib/caching.ts index f54d96f..b0c46f8 100644 --- a/lib/caching.ts +++ b/lib/caching.ts @@ -52,6 +52,22 @@ async function updateFetch(existingSeries: Series): Promise { const seriesFromStorage = await storage.read(options); @@ -64,16 +80,8 @@ async function getSeries(options: { id: string }): Promise { return await initialFetch(options); } - const timeSinceLastFetch = - datetime.difference(seriesFromStorage.lastFetchedAt, new Date(), { units: ["hours"] }).hours; - // we have the feed in storage and it's not too old - if ( - seriesFromStorage !== null && - timeSinceLastFetch !== null && - timeSinceLastFetch !== undefined && - timeSinceLastFetch <= SYNC_INTERVAL_HOURS - ) { + if (isSeriesFromStorageNew(seriesFromStorage)) { return seriesFromStorage; } @@ -88,3 +96,8 @@ async function getSeries(options: { id: string }): Promise { export const caching = { getSeries, }; + +export const forTestingOnly = { + getTimeSinceLastFetch, + isSeriesFromStorageNew, +}; diff --git a/lib/test-utils.ts b/lib/test-utils.ts index 5e28565..23f0755 100644 --- a/lib/test-utils.ts +++ b/lib/test-utils.ts @@ -11,6 +11,7 @@ function generateSeries(overrides: Partial = {}): Series { lastFetchedAt: faker.date.recent(), episodes: new Array(faker.number.int({ min: 0, max: 100 })) .fill(null).map(() => (generateEpisode(overrides))), + ...overrides, }; }