621719077f
新增宿主网络在线 Hook 并覆盖离线与恢复事件测试 平台外部生成队列概览在原生壳离线时暂停轮询 同步宿主壳网络状态消费方案与共享决策记录
113 lines
3.0 KiB
TypeScript
113 lines
3.0 KiB
TypeScript
/* @vitest-environment jsdom */
|
|
|
|
import { act, renderHook, waitFor } from '@testing-library/react';
|
|
import { afterEach, describe, expect, test, vi } from 'vitest';
|
|
|
|
import {
|
|
getHostNetworkStatus,
|
|
subscribeHostNetworkStatusChange,
|
|
} from '../services/host-bridge/hostBridge';
|
|
import {
|
|
resolveHostNetworkOnline,
|
|
useHostNetworkOnline,
|
|
} from './useHostNetworkOnline';
|
|
|
|
vi.mock('../services/host-bridge/hostBridge', () => ({
|
|
getHostNetworkStatus: vi.fn(async () => false),
|
|
subscribeHostNetworkStatusChange: vi.fn(() => () => undefined),
|
|
}));
|
|
|
|
const getHostNetworkStatusMock = vi.mocked(getHostNetworkStatus);
|
|
const subscribeHostNetworkStatusChangeMock = vi.mocked(
|
|
subscribeHostNetworkStatusChange,
|
|
);
|
|
|
|
afterEach(() => {
|
|
vi.clearAllMocks();
|
|
});
|
|
|
|
describe('resolveHostNetworkOnline', () => {
|
|
test('宿主没有网络能力时按在线处理', () => {
|
|
expect(resolveHostNetworkOnline(false)).toBe(true);
|
|
expect(resolveHostNetworkOnline(null)).toBe(true);
|
|
});
|
|
|
|
test('宿主明确离线或不可达时按离线处理', () => {
|
|
expect(
|
|
resolveHostNetworkOnline({
|
|
isConnected: false,
|
|
isInternetReachable: null,
|
|
connectionType: 'none',
|
|
}),
|
|
).toBe(false);
|
|
expect(
|
|
resolveHostNetworkOnline({
|
|
isConnected: true,
|
|
isInternetReachable: false,
|
|
connectionType: 'wifi',
|
|
}),
|
|
).toBe(false);
|
|
});
|
|
});
|
|
|
|
describe('useHostNetworkOnline', () => {
|
|
test('默认保持在线并订阅宿主网络变化', async () => {
|
|
const { result } = renderHook(() => useHostNetworkOnline());
|
|
|
|
expect(result.current).toBe(true);
|
|
await waitFor(() => {
|
|
expect(getHostNetworkStatusMock).toHaveBeenCalledTimes(1);
|
|
});
|
|
expect(subscribeHostNetworkStatusChangeMock).toHaveBeenCalledTimes(1);
|
|
});
|
|
|
|
test('宿主初始离线时切到离线状态', async () => {
|
|
getHostNetworkStatusMock.mockResolvedValueOnce({
|
|
isConnected: true,
|
|
isInternetReachable: false,
|
|
connectionType: 'cellular',
|
|
});
|
|
|
|
const { result } = renderHook(() => useHostNetworkOnline());
|
|
|
|
await waitFor(() => {
|
|
expect(result.current).toBe(false);
|
|
});
|
|
});
|
|
|
|
test('宿主网络事件恢复在线并在卸载时取消订阅', () => {
|
|
const unsubscribe = vi.fn();
|
|
let networkListener:
|
|
| Parameters<typeof subscribeHostNetworkStatusChange>[0]
|
|
| null = null;
|
|
subscribeHostNetworkStatusChangeMock.mockImplementation((listener) => {
|
|
networkListener = listener;
|
|
return unsubscribe;
|
|
});
|
|
|
|
const { result, unmount } = renderHook(() => useHostNetworkOnline());
|
|
expect(result.current).toBe(true);
|
|
|
|
act(() => {
|
|
networkListener?.({
|
|
isConnected: false,
|
|
isInternetReachable: false,
|
|
connectionType: 'none',
|
|
});
|
|
});
|
|
expect(result.current).toBe(false);
|
|
|
|
act(() => {
|
|
networkListener?.({
|
|
isConnected: true,
|
|
isInternetReachable: true,
|
|
connectionType: 'wifi',
|
|
});
|
|
});
|
|
expect(result.current).toBe(true);
|
|
|
|
unmount();
|
|
expect(unsubscribe).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|