Files
Genarrative/apps/mobile-shell/src/mobileShellNetwork.test.ts
T
kdletters 586e46fa63 接入原生壳网络状态能力
新增 network.status 与 network.statusChanged HostBridge 能力

Expo 壳通过 expo-network 查询并订阅真实网络状态

Tauri 壳通过主站可达性查询和 WebView online/offline 事件同步网络状态

更新壳能力检查、测试和架构文档
2026-06-18 02:35:48 +08:00

85 lines
2.2 KiB
TypeScript

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);
});
});