import { render, screen } from '@testing-library/react-native'; import { Text } from 'react-native'; import TestAppWrapper from '@/tests/TestAppWrapper'; import SkeletonLoader from './Skeleton'; const WAIT = 800; describe('SkeletonLoader', () => { beforeAll(() => { jest.useFakeTimers(); }); it('renders children when not loading', () => { render( Loaded Content , { wrapper: TestAppWrapper, }, ); expect(screen.getByText('Loaded Content')).toBeTruthy(); }); it('renders skeleton when loading', () => { render(, { wrapper: TestAppWrapper, }); const skeleton = screen.getByTestId('skeleton-loader'); jest.advanceTimersByTime(WAIT); expect(skeleton).toBeTruthy(); }); it('applies correct height and width', () => { render(, { wrapper: TestAppWrapper, }); const skeleton = screen.getByTestId('skeleton-loader'); const animatedStyle: { value: { opacity: number }; } = skeleton.props.jestAnimatedStyle as { value: { opacity: number }; }; // TODO: use toHaveAnimatedStyle for better API but for now there is an issue with the library // expect(skeleton).toHaveAnimatedStyle({ // opacity: 0.2, // }); expect(animatedStyle.value).toEqual({ opacity: 0.2, }); jest.advanceTimersByTime(WAIT); expect(animatedStyle.value).toEqual({ opacity: 1, }); // TODO: use toHaveAnimatedStyle for better API but for now there is an issue with the library // expect(skeleton).toHaveAnimatedStyle({ // opacity: 1, // }); expect(skeleton).toHaveStyle({ backgroundColor: '#A1A1A1', borderRadius: 4, height: 50, width: 100, }); }); });