feat: create function to handle fetching data from multiple sources

This helps since sometimes the data sources have issues occasionally
This commit is contained in:
2024-05-14 22:44:04 -04:00
parent 6c771eaaad
commit 1e1729ae30
2 changed files with 128 additions and 0 deletions

View File

@@ -0,0 +1,92 @@
import { describe, expect, it } from "bun:test";
import { fetchFromMultipleSources } from "./fetchFromMultipleSources";
describe("fetchFromMultipleSources", () => {
it("no promises, throws exception", () => {
expect(() => fetchFromMultipleSources([])).toThrow(
"fetchPromises cannot be empty",
);
});
it("has promises, returns first one with value", async () => {
const actual = await fetchFromMultipleSources<number>([
() => Promise.resolve(undefined),
() => Promise.resolve(null),
() => Promise.reject(),
() => Promise.resolve(2),
() => Promise.resolve(3),
]);
const expected = 2;
expect(actual).toEqual(expected);
});
it("has promises, no valid responses, returns null", async () => {
const actual = await fetchFromMultipleSources<number>([
() => Promise.resolve(null),
() => Promise.reject(),
() => Promise.resolve(undefined),
]);
const expected = null;
expect(actual).toBe(expected);
});
it("has promises, has cached value, returns cached value", async () => {
const actual = await fetchFromMultipleSources<number>(
[
() => Promise.resolve(null),
() => Promise.reject(),
() => Promise.resolve(undefined),
],
{
fetchFromCache: () => Promise.resolve(-1),
saveInCache: async () => {},
},
);
const expected = -1;
expect(actual).toBe(expected);
});
it("has promises, no cached value, no valid response, should not save in cache", async () => {
let actual;
await fetchFromMultipleSources<number>(
[
() => Promise.resolve(null),
() => Promise.reject(),
() => Promise.resolve(undefined),
],
{
fetchFromCache: () => Promise.resolve(null),
saveInCache: async (value) => {
actual = value;
},
},
);
const expected = undefined;
expect(actual).toBe(expected);
});
it("has promises, no cached value, has valid response, should save in cache", async () => {
let actual: number | undefined;
await fetchFromMultipleSources<number>(
[
() => Promise.resolve(null),
() => Promise.reject(),
() => Promise.resolve(3),
],
{
fetchFromCache: () => Promise.resolve(null),
saveInCache: async (value) => {
actual = value;
},
},
);
const expected = 3;
expect(actual).toBe(expected);
});
});