import { describe, expect, test, vi } from 'vitest'; import { getMobileNetworkStatus, normalizeMobileNetworkStatus, subscribeMobileNetworkStatus, } from './mobileShellNetwork'; vi.mock('expo-network', () => ({ addNetworkStateListener: vi.fn(), getNetworkStateAsync: vi.fn(), NetworkStateType: { CELLULAR: 'CELLULAR', ETHERNET: 'ETHERNET', NONE: 'NONE', WIFI: 'WIFI', }, })); describe('mobileShellNetwork', async () => { const Network = await import('expo-network'); test('归一化 Expo Network 状态', () => { expect( normalizeMobileNetworkStatus({ type: Network.NetworkStateType.WIFI, isConnected: true, isInternetReachable: true, }), ).toEqual({ isConnected: true, isInternetReachable: true, connectionType: 'wifi', nativeType: 'WIFI', }); expect( normalizeMobileNetworkStatus({ type: Network.NetworkStateType.NONE, }), ).toEqual({ isConnected: false, isInternetReachable: null, connectionType: 'none', nativeType: 'NONE', }); }); test('查询和订阅真实 Expo Network API', async () => { vi.mocked(Network.getNetworkStateAsync).mockResolvedValue({ type: Network.NetworkStateType.CELLULAR, isConnected: true, isInternetReachable: false, }); const remove = vi.fn(); vi.mocked(Network.addNetworkStateListener).mockReturnValue({ remove }); const listener = vi.fn(); await expect(getMobileNetworkStatus()).resolves.toEqual({ isConnected: true, isInternetReachable: false, connectionType: 'cellular', nativeType: 'CELLULAR', }); const unsubscribe = subscribeMobileNetworkStatus(listener); const networkListener = vi.mocked(Network.addNetworkStateListener).mock .calls[0]?.[0]; networkListener?.({ type: Network.NetworkStateType.ETHERNET, isConnected: true, isInternetReachable: true, }); unsubscribe(); expect(listener).toHaveBeenCalledWith({ isConnected: true, isInternetReachable: true, connectionType: 'ethernet', nativeType: 'ETHERNET', }); expect(remove).toHaveBeenCalledTimes(1); }); });