/** * Tests for parseSummary (fix for #1360) * * Validates that false-positive summary matches (no sub-tags) are rejected * while real summaries — even with some missing fields — are still saved. */ import { describe, it, expect } from 'bun:test'; import { parseSummary } from '../../src/sdk/parser.js'; describe('parseSummary', () => { it('returns null when no tag present', () => { expect(parseSummary('foo')).toBeNull(); }); it('returns null when has no sub-tags (false positive — fix for #1360)', () => { // This is the bug: observation response accidentally contains some text expect(parseSummary('done some content here')).toBeNull(); }); it('returns null for bare with only plain text, no sub-tags', () => { expect(parseSummary('This session was productive.')).toBeNull(); }); it('returns summary when at least one sub-tag is present (respects maintainer note)', () => { const text = `Fix the bug`; const result = parseSummary(text); expect(result).not.toBeNull(); expect(result?.request).toBe('Fix the bug'); expect(result?.investigated).toBeNull(); expect(result?.learned).toBeNull(); }); it('returns full summary when all fields are present', () => { const text = ` Fix login bug Auth flow and JWT expiry Token was expiring too soon Extended token TTL to 24h Monitor error rates `; const result = parseSummary(text); expect(result).not.toBeNull(); expect(result?.request).toBe('Fix login bug'); expect(result?.investigated).toBe('Auth flow and JWT expiry'); expect(result?.learned).toBe('Token was expiring too soon'); expect(result?.completed).toBe('Extended token TTL to 24h'); expect(result?.next_steps).toBe('Monitor error rates'); }); it('returns null when skip_summary tag is present', () => { expect(parseSummary('')).toBeNull(); }); });