UNPKG

@hcaptcha/react-native-hcaptcha

Version:

hCaptcha Library for React Native (both Android and iOS)

200 lines (176 loc) 5.95 kB
import React from 'react'; import { measureRenders } from 'reassure'; import { waitFor } from '@testing-library/react-native'; import Hcaptcha from '../Hcaptcha'; import ConfirmHcaptcha from '../index'; describe('Render Count Monitoring Tests', () => { // These tests specifically focus on ensuring render counts don't increase // They serve as a baseline for performance optimization test('Hcaptcha render count baseline - should not increase', async () => { // This establishes the baseline render count for Hcaptcha componen const result = await measureRenders( <Hcaptcha siteKey="00000000-0000-0000-0000-000000000000" url="https://hcaptcha.com" onMessage={() => {}} />, { runs: 15, warmupRuns: 3, removeOutliers: true, } ); // This test will fail if render count increases - only care about render coun expect(result.meanCount).toBe(1); }); test('ConfirmHcaptcha render count baseline - should not increase', async () => { // This establishes the baseline render count for ConfirmHcaptcha componen const result = await measureRenders( <ConfirmHcaptcha siteKey="00000000-0000-0000-0000-000000000000" baseUrl="https://hcaptcha.com" languageCode="en" onMessage={() => {}} />, { runs: 15, warmupRuns: 3, removeOutliers: true, } ); // This test will fail if render count increases - only care about render coun expect(result.meanCount).toBe(1); }); test('Hcaptcha prop changes should not cause excessive re-renders', async () => { // Test that changing props doesn't cause unnecessary re-renders const TestComponent = () => { const [theme, setTheme] = React.useState('light'); const [size, setSize] = React.useState('invisible'); React.useEffect(() => { // Simulate prop changes const timer = setTimeout(() => { setTheme('dark'); }, 100); const timer2 = setTimeout(() => { setSize('compact'); }, 200); return () => { clearTimeout(timer); clearTimeout(timer2); }; }, []); return ( <Hcaptcha siteKey="00000000-0000-0000-0000-000000000000" url="https://hcaptcha.com" theme={theme} size={size} onMessage={() => {}} /> ); }; const result = await measureRenders(<TestComponent />, { runs: 10, warmupRuns: 2, }); // Should not render more than necessary for prop changes - only care about render coun expect(result.meanCount).toBeLessThanOrEqual(3); }); test('ConfirmHcaptcha modal state changes render count', async () => { // Test modal show/hide doesn't cause excessive re-renders const TestComponent = () => { const [show, setShow] = React.useState(false); return ( <> <ConfirmHcaptcha siteKey="00000000-0000-0000-0000-000000000000" baseUrl="https://hcaptcha.com" languageCode="en" onMessage={() => {}} /> <button testID="toggle-button" onPress={() => setShow(!show)} > Toggle </button> </> ); }; const result = await measureRenders(<TestComponent />, { runs: 10, warmupRuns: 2, scenario: async () => { // Simulate modal interactions await waitFor(() => {}, { timeout: 200 }); }, }); // Modal state changes should be efficient - only care about render coun expect(result.meanCount).toBeLessThanOrEqual(2); }); test('Complex Hcaptcha configuration render count', async () => { // Test with complex configuration to ensure no render count increase const complexProps = { siteKey: '00000000-0000-0000-0000-000000000000', url: 'https://hcaptcha.com', size: 'normal', languageCode: 'en', showLoading: true, closableLoading: true, loadingIndicatorColor: '#123456', backgroundColor: 'rgba(0.1, 0.1, 0.1, 0.4)', theme: { palette: { mode: 'dark', primary: { main: '#26C6DA' }, warn: { main: '#FF8A80' }, }, }, rqdata: '{"complex": "data"}', sentry: true, jsSrc: 'https://js.hcaptcha.com/1/api.js', endpoint: 'https://api.hcaptcha.com', reportapi: 'https://accounts.hcaptcha.com', assethost: 'https://newassets.hcaptcha.com', imghost: 'https://imgs.hcaptcha.com', host: 'complex-host', debug: { complex: true, nested: { data: 'test' } }, orientation: 'portrait', phonePrefix: '44', phoneNumber: '+441234567890', onMessage: () => {}, }; const result = await measureRenders(<Hcaptcha {...complexProps} />, { runs: 12, warmupRuns: 3, }); // Complex configuration should not increase render count - only care about render coun expect(result.meanCount).toBe(1); }); test('Memory leak prevention - multiple mount/unmount cycles', async () => { // Test that multiple mount/unmount cycles don't cause render count to increase const TestComponent = ({ shouldRender }) => { if (!shouldRender) {return null;} return ( <Hcaptcha siteKey="00000000-0000-0000-0000-000000000000" url="https://hcaptcha.com" onMessage={() => {}} /> ); }; const result = await measureRenders( <TestComponent shouldRender={true} />, { runs: 8, warmupRuns: 2, scenario: async () => { // Simulate mount/unmount cycles await waitFor(() => {}, { timeout: 100 }); }, } ); // Mount/unmount should not cause render count to increase - only care about render coun expect(result.meanCount).toBe(1); }); });