import { useEffect } from 'react' import { describe, it, expect, beforeEach, afterEach } from 'vitest' import { act, render } from '@testing-library/react' import type { ECharts } from 'echarts' import { useEchartInstance } from './use-echart-instance' import { clearAllWidgetStores, setEchartInstance, } from './widget-store-registry' const captured: { value: ECharts | null; renders: number } = { value: null, renders: 0, } function Probe({ id }: { id: string }) { const chart = useEchartInstance(id) // Capture in an effect so the React Compiler doesn't flag the // outside-component mutations during render. useEffect(() => { captured.value = chart captured.renders += 1 }) return null } beforeEach(() => { clearAllWidgetStores() captured.value = null captured.renders = 0 }) afterEach(() => clearAllWidgetStores()) function makeChart(): ECharts { return {} as unknown as ECharts } describe('useEchartInstance', () => { it('returns null when no instance is registered', () => { render() expect(captured.value).toBeNull() }) it('re-renders the consumer when the instance arrives', () => { render() const initialRenders = captured.renders const chart = makeChart() act(() => setEchartInstance('h2', chart)) expect(captured.value).toBe(chart) expect(captured.renders).toBeGreaterThan(initialRenders) }) it('re-renders again when the instance changes', () => { render() const a = makeChart() const b = makeChart() act(() => setEchartInstance('h3', a)) expect(captured.value).toBe(a) act(() => setEchartInstance('h3', b)) expect(captured.value).toBe(b) }) it('re-renders with null when the instance is cleared', () => { render() act(() => setEchartInstance('h4', makeChart())) expect(captured.value).not.toBeNull() act(() => setEchartInstance('h4', null)) expect(captured.value).toBeNull() }) it('isolates ids', () => { const latest: { a: ECharts | null; b: ECharts | null } = { a: null, b: null, } function ProbeMulti() { const a = useEchartInstance('h5-a') const b = useEchartInstance('h5-b') useEffect(() => { latest.a = a latest.b = b }) return null } render() const aChart = makeChart() act(() => setEchartInstance('h5-a', aChart)) expect(latest.a).toBe(aChart) expect(latest.b).toBeNull() }) })