import { BottomSheetModalProvider } from "@gorhom/bottom-sheet"; import { NavigationContainer } from "@react-navigation/native"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { render, screen } from "@testing-library/react-native"; import App from "components/App"; import INatPaperProvider from "providers/INatPaperProvider"; import React from "react"; import { GestureHandlerRootView } from "react-native-gesture-handler"; import Observation from "realmModels/Observation"; const queryClient = new QueryClient( { defaultOptions: { queries: { // No need to do default retries in tests retry: false, // Prevent `Jest did not exit one second after the test run has completed.` error // https://react-query-v3.tanstack.com/guides/testing#set-cachetime-to-infinity-with-jest cacheTime: Infinity } } } ); function renderComponent( component, update = null ) { const renderMethod = update || render; return renderMethod( { component } ); } function renderAppWithComponent( component, update = null ) { return renderComponent( { component }, update ); } function renderApp( update = null ) { return renderAppWithComponent( null, update ); } async function renderAppWithObservations( observations: Array, realmIdentifier: string ): any { if ( observations.length > 0 ) { await Promise.all( observations.map( async observation => { // If it looks like it was supposed to be unsynced, save it like a new // local obs if ( observation.needsSync && observation.needsSync( ) ) { // Save the mock observation in Realm return Observation.saveLocalObservationForUpload( observations[0], global.mockRealms[realmIdentifier] ); } // Otherwise save it like a remote obs return new Promise( resolve => { resolve( Observation.upsertRemoteObservations( [observation], global.mockRealms[realmIdentifier] ) ); } ); } ) ); } // Render the whole app with all the navigators renderAppWithComponent( ); // If we don't wait for the obs to render we get errors about things // happening outside of act(). Most tests will do this anyway, but this // caused me a lot of confusion when I was trying to debug other problems // by removing code until I was just rendering the stack navigator... and // that was still erroring out. Hopefully this will prevent that particular // point of confusion in the future. ~~~kueda 20240104 await screen.findByTestId( `MyObservations.obsListItem.${observations[0].uuid}` ); } export { renderApp, renderAppWithComponent, renderAppWithObservations, renderComponent };