import { createRequire } from 'node:module'; import { afterEach, describe, expect, it, vi } from 'vitest'; import { useState } from 'react'; import { Animated, Platform, Pressable, Text, TextInput, useAnimatedValue } from 'react-native'; import { fireEvent, render, screen, waitFor } from '@testing-library/react-native'; function Counter() { const [count, setCount] = useState(0); return ( setCount(count + 1)}> {count} ); } function Field() { const [value, setValue] = useState(''); return ; } function DelayedText() { const [visible, setVisible] = useState(false); return ( setTimeout(() => setVisible(true), 100)}> {visible ? 'Ready' : 'Waiting'} ); } function AnimatedBalance() { const value = useAnimatedValue(0); const [balance, setBalance] = useState(0); return ( { value.addListener(({ value: nextValue }) => setBalance(nextValue)); Animated.spring(value, { toValue: 123, useNativeDriver: false }).start(); }} > {balance} ); } describe('installRuntime()', () => { afterEach(() => { vi.useRealTimers(); }); it('should render native components', async () => { await render(Hello, native); expect(screen.getByText('Hello, native')).toBeOnTheScreen(); }); it('should update a native component after user interaction', async () => { await render(); await fireEvent.press(screen.getByRole('button')); expect(screen.getByText('1')).toBeOnTheScreen(); }); it('should update a native text input', async () => { await render(); await fireEvent.changeText(screen.getByLabelText('Name'), 'Ada'); expect(screen.getByDisplayValue('Ada')).toBeOnTheScreen(); }); it('should advance fake timers while waiting for native state', async () => { vi.useFakeTimers(); await render(); await fireEvent.press(screen.getByText('Waiting')); await waitFor(() => expect(screen.getByText('Ready')).toBeOnTheScreen()); }); it('should finish native animations synchronously in the test environment', async () => { await render(); await fireEvent.press(screen.getByText('0')); expect(screen.getByText('123')).toBeOnTheScreen(); expect(Platform.isTesting).toBe(true); }); it('should start each test with an empty native screen', () => { expect(screen.isDetached).toBe(true); }); it('should report an unresolved dependency without recursive resolution', () => { const require = createRequire(import.meta.url); expect(() => require('vitest-native-missing-dependency')).toThrow( /Cannot find (?:module|package)/, ); }); });