接入原生壳网络状态能力
新增 network.status 与 network.statusChanged HostBridge 能力 Expo 壳通过 expo-network 查询并订阅真实网络状态 Tauri 壳通过主站可达性查询和 WebView online/offline 事件同步网络状态 更新壳能力检查、测试和架构文档
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
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);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user