The chat showed 'Server offline' until the user opened Settings, and the selected model was forgotten on every restart. useAutoConnect fetches the models once after the persisted settings are restored; activeModelId is now persisted.
43 lines
1.5 KiB
TypeScript
43 lines
1.5 KiB
TypeScript
import { act, renderHook } from '@testing-library/react-native';
|
|
import { useAutoConnect } from '../hooks/useAutoConnect';
|
|
import * as api from '../services/lmStudioApi';
|
|
import { useAppStore } from '../store/useAppStore';
|
|
|
|
jest.mock('../services/lmStudioApi');
|
|
|
|
const mockApi = api as jest.Mocked<typeof api>;
|
|
|
|
beforeEach(() => {
|
|
jest.resetAllMocks();
|
|
useAppStore.setState(useAppStore.getInitialState(), true);
|
|
});
|
|
|
|
describe('useAutoConnect', () => {
|
|
it('loads the models once on mount and marks the server connected', async () => {
|
|
mockApi.getModels.mockResolvedValue([{ id: 'm1', object: 'model', owned_by: 'x' }]);
|
|
renderHook(() => useAutoConnect());
|
|
|
|
await act(async () => {});
|
|
expect(mockApi.getModels).toHaveBeenCalledTimes(1);
|
|
expect(useAppStore.getState().isConnected).toBe(true);
|
|
expect(useAppStore.getState().activeModelId).toBe('m1');
|
|
});
|
|
|
|
it('leaves the app offline when the server does not answer', async () => {
|
|
mockApi.getModels.mockRejectedValue(new Error('down'));
|
|
renderHook(() => useAutoConnect());
|
|
|
|
await act(async () => {});
|
|
expect(useAppStore.getState().isConnected).toBe(false);
|
|
});
|
|
|
|
it('does not check again on re-render', async () => {
|
|
mockApi.getModels.mockResolvedValue([]);
|
|
const { rerender } = renderHook(() => useAutoConnect());
|
|
await act(async () => {});
|
|
rerender({});
|
|
await act(async () => {});
|
|
expect(mockApi.getModels).toHaveBeenCalledTimes(1);
|
|
});
|
|
});
|