Files
Genarrative/apps/mobile-shell/src/shell/network.test.ts
T
kdletters bc3b464349 统一三端桥接层职责命名
微信小程序 host-bridge 与 shell 文件改为职责命名

移动壳 host-bridge 与 shell 文件改为职责命名

更新原生壳结构门禁、微信 smoke 和宿主壳文档
2026-06-18 17:48:03 +08:00

85 lines
2.1 KiB
TypeScript

import { describe, expect, test, vi } from 'vitest';
import {
getMobileNetworkStatus,
normalizeMobileNetworkStatus,
subscribeMobileNetworkStatus,
} from './network';
vi.mock('expo-network', () => ({
addNetworkStateListener: vi.fn(),
getNetworkStateAsync: vi.fn(),
NetworkStateType: {
CELLULAR: 'CELLULAR',
ETHERNET: 'ETHERNET',
NONE: 'NONE',
WIFI: 'WIFI',
},
}));
describe('network', 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);
});
});