Files
dashboard-cpsp/utils/__tests__/endCycleRollups.test.ts
T
2026-10-01 13:23:45 +07:00

83 lines
2.2 KiB
TypeScript

import { describe, expect, it } from 'vitest';
import { buildEndCycleRollups, type DashboardInsightMetrics } from '../insightContextBuilders.ts';
const baseMetrics = (): DashboardInsightMetrics => ({
hari_ke: 21,
fcr: 1.45,
eef: 280,
ayam_hidup_ekor: 9000,
mortalitas_kumulatif_persen: 4.2,
bobot_avg_gram: 900,
doc_in_ekor: 10000,
kematian_kumulatif_ekor: 420,
panen_kumulatif_ekor: 0,
tonase_panen_kg: 0,
uniformity_persen: 78,
pakan_kumulatif_karung: 400,
weightSeries: [],
kpiSeries: [
{
hari: 7,
fcr: 0.9,
eef: null,
ayam_hidup_ekor: 9800,
mortalitas_kumulatif_persen: 1.5,
bobot_avg_gram: 180,
kematian_kumulatif_ekor: 150,
panen_kumulatif_ekor: 0,
tonase_panen_kg: 0,
uniformity_persen: 85,
pakan_kumulatif_karung: 80,
},
{
hari: 14,
fcr: 1.1,
eef: null,
ayam_hidup_ekor: 9600,
mortalitas_kumulatif_persen: 3.0,
bobot_avg_gram: 450,
kematian_kumulatif_ekor: 300,
panen_kumulatif_ekor: 0,
tonase_panen_kg: 0,
uniformity_persen: 82,
pakan_kumulatif_karung: 180,
},
{
hari: 21,
fcr: 1.45,
eef: null,
ayam_hidup_ekor: 9000,
mortalitas_kumulatif_persen: 4.2,
bobot_avg_gram: 900,
kematian_kumulatif_ekor: 420,
panen_kumulatif_ekor: 0,
tonase_panen_kg: 0,
uniformity_persen: 78,
pakan_kumulatif_karung: 400,
},
],
});
describe('buildEndCycleRollups', () => {
it('builds weekly mortality deltas and phase buckets', () => {
const rollups = buildEndCycleRollups(baseMetrics(), [
{
date: '2026-01-05',
hari: 5,
avg_temp_C: 28,
avg_humidity_pct: 60,
sample_count: 10,
hours_temp_below: 8,
hours_humidity_above: 0,
},
]);
expect(rollups.weekly_summaries).toHaveLength(3);
expect(rollups.weekly_summaries[0]?.mortalitas_delta_persen).toBe(1.5);
expect(rollups.weekly_summaries[1]?.mortalitas_delta_persen).toBe(1.5);
expect(rollups.weekly_summaries[0]?.jam_suhu_di_bawah_standar).toBe(8);
expect(rollups.phase_summaries.brooding?.mortalitas_delta_persen).toBe(3);
expect(rollups.mati_ekor).toBe(420);
});
});