586e46fa63
新增 network.status 与 network.statusChanged HostBridge 能力 Expo 壳通过 expo-network 查询并订阅真实网络状态 Tauri 壳通过主站可达性查询和 WebView online/offline 事件同步网络状态 更新壳能力检查、测试和架构文档
85 lines
2.2 KiB
TypeScript
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);
|
|
});
|
|
});
|