agent-ecosystem/test/renderer/hooks/useVisibleAIGroup.test.ts

54 lines
1.7 KiB
TypeScript

import React from 'react';
import { createRoot } from 'react-dom/client';
import { act } from 'react-dom/test-utils';
import { afterEach, describe, expect, it, vi } from 'vitest';
import { useVisibleAIGroup } from '../../../src/renderer/hooks/useVisibleAIGroup';
class FakeIntersectionObserver {
constructor(_callback: IntersectionObserverCallback, _options?: IntersectionObserverInit) {}
observe(): void {}
unobserve(): void {}
disconnect(): void {}
takeRecords(): IntersectionObserverEntry[] {
return [];
}
}
describe('useVisibleAIGroup', () => {
afterEach(() => {
vi.restoreAllMocks();
document.body.innerHTML = '';
});
it('uses provided rootRef as IntersectionObserver root', async () => {
const observerSpy = vi.fn((cb: IntersectionObserverCallback, opts?: IntersectionObserverInit) =>
new FakeIntersectionObserver(cb, opts)
);
vi.stubGlobal('IntersectionObserver', observerSpy as unknown as typeof IntersectionObserver);
const host = document.createElement('div');
document.body.appendChild(host);
const rootEl = document.createElement('div');
function Harness(): React.JSX.Element {
const rootRef = React.useRef<HTMLElement>(rootEl);
useVisibleAIGroup({ onVisibleChange: () => undefined, rootRef });
return React.createElement('div');
}
const root = createRoot(host);
await act(async () => {
root.render(React.createElement(Harness));
await Promise.resolve();
});
expect(observerSpy).toHaveBeenCalled();
const lastCall = observerSpy.mock.calls[observerSpy.mock.calls.length - 1];
expect(lastCall?.[1]?.root).toBe(rootEl);
root.unmount();
});
});