import { render } from '@testing-library/react'; import { describe, expect, it, vi } from 'vitest'; import type { LiveClient } from '../../src/liveClient'; import type { LiveSample } from '../../src/liveBuffer'; import type { MetricQueryRequest } from '../../src/metricClient'; import { useLiveMetric } from '../../src/useLiveMetric'; const request: MetricQueryRequest = { metric: 'host.cpu.utilization', range: { from: '2026-08-10T06:00:00.000Z', to: '2026-08-10T06:05:00.000Z', stepSeconds: 15 }, aggregation: 'avg', }; function sample(timestamp: string, value: number): LiveSample { return { series: 'cpu', timestamp, value, freshness: 'fresh' }; } describe('useLiveMetric lifecycle', () => { it('updates historical seed data without recreating an unchanged live subscription', () => { const unsubscribe = vi.fn(); const subscribe = vi.fn(() => ({ key: 'cpu', unsubscribe })); const releaseUnused = vi.fn(); const client = { subscribe, releaseUnused } as unknown as LiveClient; function Harness({ initial, query = request }: { initial: LiveSample[]; query?: MetricQueryRequest }) { useLiveMetric(client, query, initial); return null; } const view = render(); expect(subscribe).toHaveBeenCalledTimes(1); view.rerender(); expect(subscribe).toHaveBeenCalledTimes(1); expect(unsubscribe).not.toHaveBeenCalled(); view.rerender(); expect(subscribe).toHaveBeenCalledTimes(1); expect(unsubscribe).not.toHaveBeenCalled(); view.unmount(); expect(unsubscribe).toHaveBeenCalledTimes(1); expect(releaseUnused).toHaveBeenCalledTimes(1); }); });