mirror of
https://github.com/inaturalist/iNaturalistReactNative.git
synced 2025-12-23 22:18:36 -05:00
* (lint) MOB-1063 enforce trailing commas * autofix trailing commas * manually fix newly introduced maxlen violations * add trailing comma convention to i18n build
98 lines
2.5 KiB
JavaScript
98 lines
2.5 KiB
JavaScript
import { act } from "@testing-library/react-native";
|
|
import { Platform } from "react-native";
|
|
import ShareMenu from "react-native-share-menu";
|
|
import { renderApp } from "tests/helpers/render";
|
|
|
|
const JPEG = "image/jpeg";
|
|
|
|
const mockNavigate = jest.fn( );
|
|
|
|
jest.mock( "@react-navigation/native", ( ) => {
|
|
const actualNav = jest.requireActual( "@react-navigation/native" );
|
|
return {
|
|
...actualNav,
|
|
useNavigation: ( ) => ( {
|
|
navigate: mockNavigate,
|
|
addListener: mockNavigate,
|
|
} ),
|
|
};
|
|
} );
|
|
|
|
const mockIOSPhoto = {
|
|
mimeType: JPEG,
|
|
data: [{ data: "file://photo.jpg", mimeType: "image/jpeg" }],
|
|
};
|
|
|
|
const mockAndroidPhoto = {
|
|
mimeType: "image/jpeg",
|
|
data: "file://photo.jpg",
|
|
};
|
|
|
|
const setupShareMocks = ( ) => {
|
|
const mockListeners = [];
|
|
|
|
ShareMenu.getInitialShare.mockImplementation( callback => {
|
|
ShareMenu.__initialShareCallback = callback;
|
|
} );
|
|
|
|
ShareMenu.addNewShareListener.mockImplementation( callback => {
|
|
const listener = { callback, remove: jest.fn( ) };
|
|
mockListeners.push( listener );
|
|
return listener;
|
|
} );
|
|
|
|
return {
|
|
simulateInitialShare: shareData => {
|
|
ShareMenu.__initialShareCallback?.( shareData );
|
|
},
|
|
simulateNewShare: shareData => {
|
|
mockListeners.forEach( listener => listener.callback( shareData ) );
|
|
},
|
|
reset: ( ) => {
|
|
mockListeners.length = 0;
|
|
ShareMenu.__initialShareCallback = null;
|
|
},
|
|
};
|
|
};
|
|
|
|
describe( "Sharing photos into the app", ( ) => {
|
|
let shareHelpers;
|
|
|
|
beforeEach( ( ) => {
|
|
shareHelpers = setupShareMocks( );
|
|
} );
|
|
|
|
afterEach( ( ) => {
|
|
shareHelpers.reset( );
|
|
// test iOS as default, but test Android in a few specific tests
|
|
Platform.OS = "ios";
|
|
} );
|
|
|
|
it( "should handle iOS photo share on app launch", async ( ) => {
|
|
renderApp( );
|
|
|
|
await act( async ( ) => {
|
|
shareHelpers.simulateInitialShare( mockIOSPhoto );
|
|
} );
|
|
|
|
expect( mockNavigate ).toHaveBeenCalledWith( "NoBottomTabStackNavigator", {
|
|
screen: "PhotoSharing",
|
|
params: { item: expect.objectContaining( { mimeType: "image/jpeg" } ) },
|
|
} );
|
|
} );
|
|
|
|
it( "should handle Android photo share on app launch", async ( ) => {
|
|
Platform.OS = "android";
|
|
renderApp( );
|
|
|
|
await act( async ( ) => {
|
|
shareHelpers.simulateInitialShare( mockAndroidPhoto );
|
|
} );
|
|
|
|
expect( mockNavigate ).toHaveBeenCalledWith( "NoBottomTabStackNavigator", {
|
|
screen: "PhotoSharing",
|
|
params: { item: expect.objectContaining( { mimeType: "image/jpeg" } ) },
|
|
} );
|
|
} );
|
|
} );
|