/* eslint-disable @typescript-eslint/no-explicit-any */ import { render, screen } from '@testing-library/react'; import { beforeEach, describe, expect, it, vi } from 'vitest'; import { SafeArea } from './SafeArea'; import { useIsInMiniApp } from '../hooks/useIsInMiniApp'; import { useMiniKit } from '../hooks/useMiniKit'; vi.mock('../hooks/useIsInMiniApp', () => ({ useIsInMiniApp: vi.fn() })); vi.mock('../hooks/useMiniKit', () => ({ useMiniKit: vi.fn() })); describe('SafeArea', () => { beforeEach(() => { vi.clearAllMocks(); document.documentElement.style.removeProperty( '--ock-minikit-safe-area-inset-top', ); document.documentElement.style.removeProperty( '--ock-minikit-safe-area-inset-right', ); document.documentElement.style.removeProperty( '--ock-minikit-safe-area-inset-bottom', ); document.documentElement.style.removeProperty( '--ock-minikit-safe-area-inset-left', ); }); it('returns children unchanged and does not set variables when not in mini app', () => { (useIsInMiniApp as any).mockReturnValue({ isInMiniApp: false } as any); (useMiniKit as any).mockReturnValue({ context: { client: {} } } as any); render(
Hello
, ); expect(screen.getByTestId('content')).toHaveTextContent('Hello'); expect( document.documentElement.style.getPropertyValue( '--ock-minikit-safe-area-inset-top', ), ).toBe(''); }); it('sets css variables with px and wraps children with padding when asChild is false', () => { (useIsInMiniApp as any).mockReturnValue({ isInMiniApp: true } as any); (useMiniKit as any).mockReturnValue({ context: { client: { safeAreaInsets: { top: 10, right: 2, bottom: 3, left: 4 } }, }, } as any); const { container } = render(
Hello
, ); expect( document.documentElement.style .getPropertyValue('--ock-minikit-safe-area-inset-top') .trim(), ).toBe('10px'); expect( document.documentElement.style .getPropertyValue('--ock-minikit-safe-area-inset-right') .trim(), ).toBe('2px'); expect( document.documentElement.style .getPropertyValue('--ock-minikit-safe-area-inset-bottom') .trim(), ).toBe('3px'); expect( document.documentElement.style .getPropertyValue('--ock-minikit-safe-area-inset-left') .trim(), ).toBe('4px'); const wrapper = container.querySelector('div'); expect(wrapper).toBeTruthy(); expect(screen.getByTestId('content')).toBeInTheDocument(); }); it('asChild=true merges padding into single child style and preserves existing styles', () => { (useIsInMiniApp as any).mockReturnValue({ isInMiniApp: true } as any); (useMiniKit as any).mockReturnValue({ context: { client: { safeAreaInsets: { top: 5, right: 6, bottom: 7, left: 8 } }, }, } as any); render(
Hi
, ); const child = screen.getByTestId('child'); expect(child).toBeInTheDocument(); expect(child).toHaveStyle({ color: 'rgb(255, 0, 0)' }); }); it('asChild with non-element child warns and returns children as-is', () => { (useIsInMiniApp as any).mockReturnValue({ isInMiniApp: true } as any); (useMiniKit as any).mockReturnValue({ context: { client: { safeAreaInsets: { top: 1, right: 1, bottom: 1, left: 1 } }, }, } as any); const warnSpy = vi.spyOn(console, 'warn').mockImplementation(() => {}); render({'text child'}); expect(screen.getByText('text child')).toBeInTheDocument(); expect(warnSpy).toHaveBeenCalled(); warnSpy.mockRestore(); }); it('renders null with no children while still setting variables', () => { (useIsInMiniApp as any).mockReturnValue({ isInMiniApp: true } as any); (useMiniKit as any).mockReturnValue({ context: { client: { safeAreaInsets: { top: 11, right: 12, bottom: 13, left: 14 }, }, }, } as any); const { container } = render({null}); expect(container.firstChild).toBeNull(); expect( document.documentElement.style .getPropertyValue('--ock-minikit-safe-area-inset-top') .trim(), ).toBe('11px'); }); });