Files
dashboard-cpsp-executive/utils/__tests__/insightParse.test.ts
T

50 lines
1.9 KiB
TypeScript

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 = `
<think>
Evaluating data for day 28. FCR is high.
</think>
\`\`\`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.');
});
});