Files
Neon-Desk/components/charts/utils/chart-data-transformers.test.ts

83 lines
2.0 KiB
TypeScript

import { describe, expect, it } from 'bun:test';
import { mergeDataSeries } from './chart-data-transformers';
type PricePoint = {
date: string;
price: number;
};
describe('mergeDataSeries', () => {
it('normalizes intraday timestamps onto the same trading day', () => {
const merged = mergeDataSeries<PricePoint>([
{
id: 'stock',
data: [
{ date: '2026-03-10T21:00:00.000Z', price: 100 },
{ date: '2026-03-11T21:00:00.000Z', price: 101 }
]
},
{
id: 'sp500',
data: [
{ date: '2026-03-10', price: 5000 },
{ date: '2026-03-11', price: 5050 }
]
}
]);
expect(merged).toEqual([
{ date: '2026-03-10', stock: 100, sp500: 5000 },
{ date: '2026-03-11', stock: 101, sp500: 5050 }
]);
});
it('fills a comparison series from the nearest prior trading day when dates are missing', () => {
const merged = mergeDataSeries<PricePoint>([
{
id: 'stock',
data: [
{ date: '2026-03-10', price: 100 },
{ date: '2026-03-11', price: 103 },
{ date: '2026-03-12', price: 104 }
]
},
{
id: 'sp500',
data: [
{ date: '2026-03-10', price: 5000 },
{ date: '2026-03-12', price: 5060 }
]
}
]);
expect(merged).toEqual([
{ date: '2026-03-10', stock: 100, sp500: 5000 },
{ date: '2026-03-11', stock: 103, sp500: 5000 },
{ date: '2026-03-12', stock: 104, sp500: 5060 }
]);
});
it('does not backfill dates before a series first appears', () => {
const merged = mergeDataSeries<PricePoint>([
{
id: 'stock',
data: [
{ date: '2026-03-10', price: 100 },
{ date: '2026-03-11', price: 103 }
]
},
{
id: 'sp500',
data: [
{ date: '2026-03-11', price: 5000 }
]
}
]);
expect(merged).toEqual([
{ date: '2026-03-10', stock: 100 },
{ date: '2026-03-11', stock: 103, sp500: 5000 }
]);
});
});