|
|
@@ -0,0 +1,254 @@
|
|
|
+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'
|
|
|
+ }
|
|
|
+ ])
|
|
|
+ }))
|
|
|
+ }
|
|
|
+ }
|
|
|
+}))
|