import '@testing-library/jest-dom' // Mock Taro Components jest.mock('@tarojs/components', () => ({ View: 'view', Text: 'text', Input: 'input', ScrollView: 'scroll-view', Picker: 'picker', Image: 'image' })) // Mock Taro APIs jest.mock('@tarojs/taro', () => ({ useRouter: () => ({ params: {} }), navigateTo: jest.fn(), redirectTo: jest.fn(), switchTab: jest.fn(), reLaunch: jest.fn(), navigateBack: jest.fn(), showModal: jest.fn(), showToast: jest.fn(), showLoading: jest.fn(), hideLoading: jest.fn(), showActionSheet: jest.fn(), request: jest.fn(), uploadFile: jest.fn(), downloadFile: jest.fn(), connectSocket: jest.fn(), onSocketOpen: jest.fn(), onSocketError: jest.fn(), onSocketMessage: jest.fn(), onSocketClose: jest.fn(), sendSocketMessage: jest.fn(), closeSocket: jest.fn(), chooseImage: jest.fn(), previewImage: jest.fn(), getImageInfo: jest.fn(), saveImageToPhotosAlbum: jest.fn(), startRecord: jest.fn(), stopRecord: jest.fn(), playVoice: jest.fn(), pauseVoice: jest.fn(), stopVoice: jest.fn(), getBackgroundAudioPlayerState: jest.fn(), playBackgroundAudio: jest.fn(), pauseBackgroundAudio: jest.fn(), seekBackgroundAudio: jest.fn(), stopBackgroundAudio: jest.fn(), onBackgroundAudioPlay: jest.fn(), onBackgroundAudioPause: jest.fn(), onBackgroundAudioStop: jest.fn(), chooseVideo: jest.fn(), saveVideoToPhotosAlbum: jest.fn(), getLocation: jest.fn(), chooseLocation: jest.fn(), openLocation: jest.fn(), getSystemInfo: jest.fn(), getNetworkType: jest.fn(), onNetworkStatusChange: jest.fn(), onAccelerometerChange: jest.fn(), startAccelerometer: jest.fn(), stopAccelerometer: jest.fn(), onCompassChange: jest.fn(), startCompass: jest.fn(), stopCompass: jest.fn(), makePhoneCall: jest.fn(), scanCode: jest.fn(), setClipboardData: jest.fn(), getClipboardData: jest.fn(), openBluetoothAdapter: jest.fn(), closeBluetoothAdapter: jest.fn(), getBluetoothDevices: jest.fn(), getConnectedBluetoothDevices: jest.fn(), onBluetoothDeviceFound: jest.fn(), onBluetoothAdapterStateChange: jest.fn(), createBLEConnection: jest.fn(), closeBLEConnection: jest.fn(), getBLEDeviceServices: jest.fn(), getBLEDeviceCharacteristics: jest.fn(), readBLECharacteristicValue: jest.fn(), writeBLECharacteristicValue: jest.fn(), notifyBLECharacteristicValueChange: jest.fn(), onBLEConnectionStateChange: jest.fn(), onBLECharacteristicValueChange: jest.fn(), startBeaconDiscovery: jest.fn(), stopBeaconDiscovery: jest.fn(), getBeacons: jest.fn(), onBeaconUpdate: jest.fn(), onBeaconServiceChange: jest.fn(), addPhoneContact: jest.fn(), getHCEState: jest.fn(), startHCE: jest.fn(), stopHCE: jest.fn(), onHCEMessage: jest.fn(), sendHCEMessage: jest.fn(), startWifi: jest.fn(), stopWifi: jest.fn(), connectWifi: jest.fn(), getWifiList: jest.fn(), onGetWifiList: jest.fn(), setWifiList: jest.fn(), onWifiConnected: jest.fn(), getConnectedWifi: jest.fn(), showShareMenu: jest.fn(), hideShareMenu: jest.fn(), updateShareMenu: jest.fn(), getShareInfo: jest.fn(), authCode: jest.fn(), login: jest.fn(), checkSession: jest.fn(), authorize: jest.fn(), getUserInfo: jest.fn(), requestPayment: jest.fn(), showTabBarRedDot: jest.fn(), hideTabBarRedDot: jest.fn(), showTabBar: jest.fn(), hideTabBar: jest.fn(), setTabBarBadge: jest.fn(), removeTabBarBadge: jest.fn(), setTabBarItem: jest.fn(), setTabBarStyle: jest.fn(), setNavigationBarTitle: jest.fn(), setNavigationBarColor: jest.fn(), showNavigationBarLoading: jest.fn(), hideNavigationBarLoading: jest.fn(), setBackgroundColor: jest.fn(), setBackgroundTextStyle: jest.fn(), showTabBar: jest.fn(), hideTabBar: jest.fn(), setTabBarStyle: jest.fn(), setTabBarItem: jest.fn(), showTabBarRedDot: jest.fn(), hideTabBarRedDot: jest.fn(), setTabBarBadge: jest.fn(), removeTabBarBadge: jest.fn(), pageScrollTo: jest.fn(), startPullDownRefresh: jest.fn(), stopPullDownRefresh: jest.fn(), createSelectorQuery: jest.fn(), createIntersectionObserver: jest.fn(), getMenuButtonBoundingClientRect: jest.fn(), canvasToTempFilePath: jest.fn(), canvasPutImageData: jest.fn(), canvasGetImageData: jest.fn(), setStorage: jest.fn(), getStorage: jest.fn(), getStorageInfo: jest.fn(), removeStorage: jest.fn(), clearStorage: jest.fn(), setStorageSync: jest.fn(), getStorageSync: jest.fn(), getStorageInfoSync: jest.fn(), removeStorageSync: jest.fn(), clearStorageSync: jest.fn(), getSystemInfoSync: jest.fn(), getEnv: jest.fn(() => 'h5'), ENV_TYPE: { WEAPP: 'WEAPP', SWAN: 'SWAN', ALIPAY: 'ALIPAY', TT: 'TT', QQ: 'QQ', JD: 'JD', WEB: 'WEB', RN: 'RN', HARMONY: 'HARMONY' } })) // Mock React Query jest.mock('@tanstack/react-query', () => ({ useQuery: jest.fn(() => ({ data: null, isLoading: false, error: null })), useMutation: jest.fn(() => ({ mutate: jest.fn(), isLoading: false, error: null })) })) // Mock API client jest.mock('../src/api', () => ({ areaClient: { provinces: { $get: jest.fn(() => Promise.resolve({ status: 200, json: () => Promise.resolve([ { id: 1, name: '北京市', code: '110000' }, { id: 2, name: '上海市', code: '310000' }, { id: 3, name: '广东省', code: '440000' } ]) })) }, cities: { $get: jest.fn(() => Promise.resolve({ status: 200, json: () => Promise.resolve([ { id: 1, name: '北京市', code: '110100', provinceId: 1 }, { id: 2, name: '上海市', code: '310100', provinceId: 2 }, { id: 3, name: '广州市', code: '440100', provinceId: 3 }, { id: 4, name: '深圳市', code: '440300', provinceId: 3 } ]) })) }, districts: { $get: jest.fn(() => Promise.resolve({ status: 200, json: () => Promise.resolve([ { id: 1, name: '东城区', code: '110101', cityId: 1 }, { id: 2, name: '西城区', code: '110102', cityId: 1 }, { id: 3, name: '天河区', code: '440106', cityId: 3 }, { id: 4, name: '越秀区', code: '440104', cityId: 3 } ]) })) } }, locationClient: { $get: jest.fn(() => Promise.resolve({ status: 200, json: () => Promise.resolve({ data: [ { id: 1, name: '北京首都国际机场', province: '北京市', city: '北京市', district: '顺义区' }, { id: 2, name: '北京南站', province: '北京市', city: '北京市', district: '丰台区' }, { id: 3, name: '上海虹桥机场', province: '上海市', city: '上海市', district: '长宁区' }, { id: 4, name: '上海火车站', province: '上海市', city: '上海市', district: '静安区' } ] }) })) }, routeClient: { search: { $get: jest.fn(() => Promise.resolve({ status: 200, json: () => Promise.resolve([ { id: 1, startLocation: { name: '北京首都国际机场' }, endLocation: { name: '上海虹桥机场' }, activities: [ { id: 1, name: '上海音乐节', startDate: '2025-10-20', venueLocation: { name: '上海音乐厅' } } ], routeType: 'departure' } ]) })) } } }))