Spaces:
Paused
Paused
| import { describe, it, expect } from 'vitest'; | |
| import { parseAllPhaseSummaries, isAccumulatedSummary } from '../../../../ui/src/lib/log-parser.ts'; | |
| import { getFirstNonEmptySummary } from '../../../../ui/src/lib/summary-selection.ts'; | |
| /** | |
| * Mirrors summary source priority in agent-info-panel.tsx: | |
| * freshFeature.summary > feature.summary > summaryProp > agentInfo.summary | |
| */ | |
| function getCardEffectiveSummary(params: { | |
| freshFeatureSummary?: string | null; | |
| featureSummary?: string | null; | |
| summaryProp?: string | null; | |
| agentInfoSummary?: string | null; | |
| }): string | undefined | null { | |
| return getFirstNonEmptySummary( | |
| params.freshFeatureSummary, | |
| params.featureSummary, | |
| params.summaryProp, | |
| params.agentInfoSummary | |
| ); | |
| } | |
| /** | |
| * Mirrors SummaryDialog raw summary selection in summary-dialog.tsx: | |
| * summaryProp > feature.summary > agentInfo.summary | |
| */ | |
| function getDialogRawSummary(params: { | |
| summaryProp?: string | null; | |
| featureSummary?: string | null; | |
| agentInfoSummary?: string | null; | |
| }): string | undefined | null { | |
| return getFirstNonEmptySummary( | |
| params.summaryProp, | |
| params.featureSummary, | |
| params.agentInfoSummary | |
| ); | |
| } | |
| describe('Summary Source Flow Integration', () => { | |
| it('uses fresh per-feature summary in card and preserves it through summary dialog', () => { | |
| const staleListSummary = '## Old summary from stale list cache'; | |
| const freshAccumulatedSummary = `### Implementation | |
| Implemented auth + profile flow. | |
| --- | |
| ### Testing | |
| - Unit tests: 18 passed | |
| - Integration tests: 6 passed`; | |
| const parsedAgentInfoSummary = 'Fallback summary from parsed agent output'; | |
| const cardEffectiveSummary = getCardEffectiveSummary({ | |
| freshFeatureSummary: freshAccumulatedSummary, | |
| featureSummary: staleListSummary, | |
| summaryProp: undefined, | |
| agentInfoSummary: parsedAgentInfoSummary, | |
| }); | |
| expect(cardEffectiveSummary).toBe(freshAccumulatedSummary); | |
| const dialogRawSummary = getDialogRawSummary({ | |
| summaryProp: cardEffectiveSummary, | |
| featureSummary: staleListSummary, | |
| agentInfoSummary: parsedAgentInfoSummary, | |
| }); | |
| expect(dialogRawSummary).toBe(freshAccumulatedSummary); | |
| expect(isAccumulatedSummary(dialogRawSummary ?? undefined)).toBe(true); | |
| const phases = parseAllPhaseSummaries(dialogRawSummary ?? undefined); | |
| expect(phases).toHaveLength(2); | |
| expect(phases[0]?.phaseName).toBe('Implementation'); | |
| expect(phases[1]?.phaseName).toBe('Testing'); | |
| }); | |
| it('falls back in order when fresher sources are absent', () => { | |
| const cardEffectiveSummary = getCardEffectiveSummary({ | |
| freshFeatureSummary: undefined, | |
| featureSummary: '', | |
| summaryProp: undefined, | |
| agentInfoSummary: 'Agent parsed fallback', | |
| }); | |
| expect(cardEffectiveSummary).toBe('Agent parsed fallback'); | |
| const dialogRawSummary = getDialogRawSummary({ | |
| summaryProp: undefined, | |
| featureSummary: undefined, | |
| agentInfoSummary: cardEffectiveSummary, | |
| }); | |
| expect(dialogRawSummary).toBe('Agent parsed fallback'); | |
| expect(isAccumulatedSummary(dialogRawSummary ?? undefined)).toBe(false); | |
| }); | |
| it('treats whitespace-only summaries as empty during fallback selection', () => { | |
| const cardEffectiveSummary = getCardEffectiveSummary({ | |
| freshFeatureSummary: ' \n', | |
| featureSummary: '\t', | |
| summaryProp: ' ', | |
| agentInfoSummary: 'Agent parsed fallback', | |
| }); | |
| expect(cardEffectiveSummary).toBe('Agent parsed fallback'); | |
| }); | |
| }); | |