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)/,
);
});
});