import { describe, expect, it, mock } from 'bun:test'; import { __companyOverviewSynthesisInternals, synthesizeCompanyOverview } from './company-overview-synthesis'; describe('company overview synthesis', () => { it('parses strict json AI responses', () => { const parsed = __companyOverviewSynthesisInternals.parseAiJson(JSON.stringify({ bull: ['Demand remains durable'], bear: ['Valuation is demanding'], weeklySummary: 'The week centered on enterprise demand and new disclosures.', weeklyHighlights: ['8-K signaled a new contract'] })); expect(parsed.bull).toEqual(['Demand remains durable']); expect(parsed.bear).toEqual(['Valuation is demanding']); expect(parsed.weeklyHighlights).toEqual(['8-K signaled a new contract']); }); it('falls back to memo-backed bullets when AI is unavailable', async () => { const result = await synthesizeCompanyOverview({ ticker: 'MSFT', companyName: 'Microsoft Corp', description: 'Microsoft builds software and cloud infrastructure.', memo: { id: 1, user_id: 'u1', organization_id: null, ticker: 'MSFT', rating: 'buy', conviction: 'high', time_horizon_months: 24, packet_title: null, packet_subtitle: null, thesis_markdown: 'Azure demand remains durable.', variant_view_markdown: '', catalysts_markdown: 'Copilot monetization can expand ARPU.', risks_markdown: 'Competition may compress pricing.', disconfirming_evidence_markdown: 'Enterprise optimization could slow seat growth.', next_actions_markdown: '', created_at: '2026-03-01T00:00:00.000Z', updated_at: '2026-03-10T00:00:00.000Z' }, latestFilingSummary: null, recentAiReports: [], recentDevelopments: [] }, { aiConfigured: false }); expect(result.bullBear.source).toBe('memo_fallback'); expect(result.bullBear.bull[0]).toContain('Azure demand'); expect(result.bullBear.bear[0]).toContain('Competition'); expect(result.weeklySnapshot?.source).toBe('heuristic'); }); it('uses AI output when available', async () => { const runAnalysis = mock(async () => ({ provider: 'zhipu' as const, model: 'glm-5', text: JSON.stringify({ bull: ['Demand remains durable'], bear: ['Spending could normalize'], weeklySummary: 'The week was defined by a new contract disclosure.', weeklyHighlights: ['8-K disclosed a new enterprise customer'] }) })); const result = await synthesizeCompanyOverview({ ticker: 'MSFT', companyName: 'Microsoft Corp', description: 'Microsoft builds software and cloud infrastructure.', memo: null, latestFilingSummary: null, recentAiReports: [], recentDevelopments: [] }, { aiConfigured: true, runAnalysis }); expect(runAnalysis).toHaveBeenCalledTimes(1); expect(result.bullBear.source).toBe('ai_synthesized'); expect(result.bullBear.bull).toEqual(['Demand remains durable']); expect(result.weeklySnapshot?.source).toBe('ai_synthesized'); }); });