import { describe, expect, it } from 'vitest'; import { parseAiResult } from '../insightParse.ts'; describe('parseAiResult with akar_masalah', () => { it('parses standard 3-section json output', () => { const raw = JSON.stringify({ kesimpulan: 'FCR 1.40 pada hari ke-28 berada di atas standar CP 707 (1.315).', akar_masalah: 'Suhu lingkungan fluktuatif dan distribusi pakan kurang merata.', insight: 'Lakukan kalibrasi suhu pemanas dan ratakan tempat pakan.', }); const res = parseAiResult(raw); expect(res).not.toBeNull(); expect(res?.summary).toBe('FCR 1.40 pada hari ke-28 berada di atas standar CP 707 (1.315).'); expect(res?.akar_masalah).toBe('Suhu lingkungan fluktuatif dan distribusi pakan kurang merata.'); expect(res?.insight).toBe('Lakukan kalibrasi suhu pemanas dan ratakan tempat pakan.'); }); it('handles markdown fences and think tags', () => { const raw = ` Evaluating data for day 28. FCR is high. \`\`\`json { "summary": "Kondisi pakan stabil.", "root_cause": "Kondisi operasional optimal, tidak terdeteksi indikasi anomali.", "rekomendasi": "Pertahankan ventilasi dan jadwal pemberian pakan." } \`\`\` `; const res = parseAiResult(raw); expect(res).not.toBeNull(); expect(res?.summary).toBe('Kondisi pakan stabil.'); expect(res?.akar_masalah).toBe('Kondisi operasional optimal, tidak terdeteksi indikasi anomali.'); expect(res?.insight).toBe('Pertahankan ventilasi dan jadwal pemberian pakan.'); }); it('tolerates legacy 2-field format without akar_masalah', () => { const raw = JSON.stringify({ kesimpulan: 'Bobot badan sesuai target.', insight: 'Lanjutkan monitoring bobot mingguan.', }); const res = parseAiResult(raw); expect(res).not.toBeNull(); expect(res?.summary).toBe('Bobot badan sesuai target.'); expect(res?.akar_masalah).toBeUndefined(); expect(res?.insight).toBe('Lanjutkan monitoring bobot mingguan.'); }); });