140 lines
3.7 KiB
TypeScript
140 lines
3.7 KiB
TypeScript
import { describe, expect, it } from 'bun:test';
|
|
import { __financialStatementsInternals } from './financial-statements';
|
|
import type { FilingStatementSnapshotRecord } from '@/lib/server/repos/filing-statements';
|
|
|
|
function sampleSnapshot(): FilingStatementSnapshotRecord {
|
|
return {
|
|
id: 10,
|
|
filing_id: 44,
|
|
ticker: 'MSFT',
|
|
filing_date: '2025-12-31',
|
|
filing_type: '10-K',
|
|
period_end: '2025-12-31',
|
|
statement_bundle: {
|
|
periods: [
|
|
{
|
|
id: '2025-12-31-0001',
|
|
filingId: 44,
|
|
accessionNumber: '0001',
|
|
filingDate: '2025-12-31',
|
|
periodEnd: '2025-12-31',
|
|
filingType: '10-K',
|
|
periodLabel: 'Fiscal Year End'
|
|
}
|
|
],
|
|
statements: {
|
|
income: [
|
|
{
|
|
key: 'revenue-line',
|
|
label: 'Revenue',
|
|
concept: 'us-gaap:Revenues',
|
|
order: 1,
|
|
depth: 0,
|
|
isSubtotal: false,
|
|
values: { '2025-12-31-0001': 120_000 }
|
|
}
|
|
],
|
|
balance: [],
|
|
cash_flow: [],
|
|
equity: [],
|
|
comprehensive_income: []
|
|
}
|
|
},
|
|
standardized_bundle: {
|
|
periods: [
|
|
{
|
|
id: '2025-12-31-0001',
|
|
filingId: 44,
|
|
accessionNumber: '0001',
|
|
filingDate: '2025-12-31',
|
|
periodEnd: '2025-12-31',
|
|
filingType: '10-K',
|
|
periodLabel: 'Fiscal Year End'
|
|
}
|
|
],
|
|
statements: {
|
|
income: [
|
|
{
|
|
key: 'revenue',
|
|
label: 'Revenue',
|
|
concept: 'us-gaap:Revenues',
|
|
category: 'core',
|
|
sourceConcepts: ['us-gaap:Revenues'],
|
|
values: { '2025-12-31-0001': 120_000 }
|
|
}
|
|
],
|
|
balance: [],
|
|
cash_flow: [],
|
|
equity: [],
|
|
comprehensive_income: []
|
|
}
|
|
},
|
|
dimension_bundle: {
|
|
statements: {
|
|
income: [
|
|
{
|
|
rowKey: 'revenue-line',
|
|
concept: 'us-gaap:Revenues',
|
|
periodId: '2025-12-31-0001',
|
|
axis: 'srt:StatementBusinessSegmentsAxis',
|
|
member: 'acme:CloudMember',
|
|
value: 55_000,
|
|
unit: 'USD'
|
|
}
|
|
],
|
|
balance: [],
|
|
cash_flow: [],
|
|
equity: [],
|
|
comprehensive_income: []
|
|
}
|
|
},
|
|
parse_status: 'ready',
|
|
parse_error: null,
|
|
source: 'sec_filing_summary',
|
|
created_at: '2026-01-01T00:00:00.000Z',
|
|
updated_at: '2026-01-01T00:00:00.000Z'
|
|
};
|
|
}
|
|
|
|
describe('financial statements service internals', () => {
|
|
it('builds sorted periods for selected mode/statement', () => {
|
|
const snapshot = sampleSnapshot();
|
|
|
|
const periods = __financialStatementsInternals.buildPeriods(
|
|
[snapshot],
|
|
'standardized',
|
|
'income'
|
|
);
|
|
|
|
expect(periods.length).toBe(1);
|
|
expect(periods[0]?.id).toBe('2025-12-31-0001');
|
|
});
|
|
|
|
it('builds standardized rows and includes dimensions when requested', () => {
|
|
const snapshot = sampleSnapshot();
|
|
const periods = __financialStatementsInternals.buildPeriods(
|
|
[snapshot],
|
|
'standardized',
|
|
'income'
|
|
);
|
|
|
|
const result = __financialStatementsInternals.buildRows(
|
|
[snapshot],
|
|
periods,
|
|
'standardized',
|
|
'income',
|
|
true
|
|
);
|
|
|
|
expect(result.rows.length).toBe(1);
|
|
expect(result.rows[0]?.hasDimensions).toBe(true);
|
|
expect(result.dimensions).not.toBeNull();
|
|
expect(result.dimensions?.['revenue-line']?.length).toBe(1);
|
|
});
|
|
|
|
it('returns default sync limits by window', () => {
|
|
expect(__financialStatementsInternals.defaultFinancialSyncLimit('10y')).toBe(60);
|
|
expect(__financialStatementsInternals.defaultFinancialSyncLimit('all')).toBe(120);
|
|
});
|
|
});
|