// Mock expo-secure-store jest.mock('expo-secure-store', () => ({ getItemAsync: jest.fn(() => Promise.resolve(null)), setItemAsync: jest.fn(() => Promise.resolve()), deleteItemAsync: jest.fn(() => Promise.resolve()), })); // Mock expo-router jest.mock('expo-router', () => ({ useRouter: jest.fn(() => ({ push: jest.fn(), replace: jest.fn(), back: jest.fn(), })), useLocalSearchParams: jest.fn(() => ({})), usePathname: jest.fn(() => '/'), useSegments: jest.fn(() => []), Stack: { Screen: jest.fn(() => null), }, Tabs: { Screen: jest.fn(() => null), }, Link: jest.fn(() => null), })); // Mock @react-native-async-storage/async-storage jest.mock('@react-native-async-storage/async-storage', () => ({ default: { getItem: jest.fn(() => Promise.resolve(null)), setItem: jest.fn(() => Promise.resolve()), removeItem: jest.fn(() => Promise.resolve()), clear: jest.fn(() => Promise.resolve()), getAllKeys: jest.fn(() => Promise.resolve([])), }, })); // Mock react-native-reanimated jest.mock('react-native-reanimated', () => { const Reanimated = require('react-native-reanimated/mock'); Reanimated.default.call = () => {}; return Reanimated; }); // Mock @react-native-community/netinfo jest.mock('@react-native-community/netinfo', () => ({ addEventListener: jest.fn(() => jest.fn()), fetch: jest.fn(() => Promise.resolve({ isConnected: true })), })); // Global fetch mock global.fetch = jest.fn(() => Promise.resolve({ json: () => Promise.resolve({}), ok: true, status: 200, }) ); // Console error suppression for known issues const originalError = console.error; console.error = (...args) => { if ( typeof args[0] === 'string' && (args[0].includes('Warning: ReactDOM.render') || args[0].includes('Warning: An update to')) ) { return; } originalError.call(console, ...args); };