Files
Neon-Desk/lib/financials/history-window.test.ts
francy51 17de3dd72d Add history window controls and expand taxonomy pack support
- add 3Y/5Y/10Y financial history filtering and reorganize normalization details UI
- add new fiscal taxonomy surface/income bridge/KPI packs and update Rust taxonomy loading
- auto-detect Homebrew SQLite for native `sqlite-vec` in local dev/e2e with docs and env guidance
2026-03-18 23:40:28 -04:00

121 lines
3.2 KiB
TypeScript

import { describe, expect, it } from "vitest";
import {
filterPeriodsByHistoryWindow,
financialHistoryLimit,
} from "@/lib/financials/history-window";
import type { FinancialStatementPeriod } from "@/lib/types";
function createPeriod(year: number, month = 12, day = 31) {
const suffix = `${year}-${String(month).padStart(2, "0")}-${String(day).padStart(2, "0")}`;
return {
id: suffix,
filingId: year,
accessionNumber: `0000-${year}`,
filingDate: `${year + 1}-02-01`,
periodStart: `${year}-01-01`,
periodEnd: suffix,
filingType: "10-K",
periodLabel: `FY ${year}`,
} satisfies FinancialStatementPeriod;
}
describe("financialHistoryLimit", () => {
it("scales fetch size for annual and ltm cadences", () => {
expect(financialHistoryLimit("annual", 3)).toBe(5);
expect(financialHistoryLimit("ltm", 10)).toBe(12);
});
it("fetches a buffered number of quarterly periods", () => {
expect(financialHistoryLimit("quarterly", 3)).toBe(16);
expect(financialHistoryLimit("quarterly", 5)).toBe(24);
expect(financialHistoryLimit("quarterly", 10)).toBe(44);
});
});
describe("filterPeriodsByHistoryWindow", () => {
it("keeps the latest three annual periods", () => {
const periods = [
createPeriod(2018),
createPeriod(2019),
createPeriod(2020),
createPeriod(2021),
createPeriod(2022),
createPeriod(2023),
createPeriod(2024),
];
expect(
filterPeriodsByHistoryWindow(periods, "annual", 3).map(
(period) => period.id,
),
).toEqual(["2022-12-31", "2023-12-31", "2024-12-31"]);
});
it("keeps the exact trailing annual count for longer windows", () => {
const periods = Array.from({ length: 12 }, (_, index) =>
createPeriod(2013 + index),
);
expect(
filterPeriodsByHistoryWindow(periods, "annual", 10).map(
(period) => period.id,
),
).toEqual([
"2015-12-31",
"2016-12-31",
"2017-12-31",
"2018-12-31",
"2019-12-31",
"2020-12-31",
"2021-12-31",
"2022-12-31",
"2023-12-31",
"2024-12-31",
]);
});
it("keeps the exact trailing quarterly count", () => {
const periods = [
createPeriod(2022, 3, 31),
createPeriod(2022, 6, 30),
createPeriod(2022, 9, 30),
createPeriod(2022, 12, 31),
createPeriod(2023, 3, 31),
createPeriod(2023, 6, 30),
createPeriod(2023, 9, 30),
createPeriod(2023, 12, 31),
createPeriod(2024, 3, 31),
createPeriod(2024, 6, 30),
createPeriod(2024, 9, 30),
createPeriod(2024, 12, 31),
createPeriod(2025, 3, 31),
];
expect(
filterPeriodsByHistoryWindow(periods, "quarterly", 3).map(
(period) => period.id,
),
).toEqual([
"2022-06-30",
"2022-09-30",
"2022-12-31",
"2023-03-31",
"2023-06-30",
"2023-09-30",
"2023-12-31",
"2024-03-31",
"2024-06-30",
"2024-09-30",
"2024-12-31",
"2025-03-31",
]);
});
it("returns all periods when the list is shorter than the requested window", () => {
const periods = [createPeriod(2024)];
expect(filterPeriodsByHistoryWindow(periods, "annual", 5)).toEqual(periods);
});
});