Files
Genarrative/src/hooks/useHostNetworkOnline.test.tsx
T
kdletters 621719077f 接入宿主网络状态队列轮询
新增宿主网络在线 Hook 并覆盖离线与恢复事件测试

平台外部生成队列概览在原生壳离线时暂停轮询

同步宿主壳网络状态消费方案与共享决策记录
2026-06-18 07:31:41 +08:00

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