Files
tkmind_go/ui/desktop/src/hooks/useNavigationSessions.test.tsx
T

55 lines
1.9 KiB
TypeScript

import { act, renderHook } from '@testing-library/react';
import { beforeEach, describe, expect, it, vi } from 'vitest';
const navigateMock = vi.hoisted(() => vi.fn());
const routerState = vi.hoisted(() => ({ searchParams: new URLSearchParams() }));
vi.mock('react-router', () => ({
useNavigate: () => navigateMock,
useLocation: () => ({ pathname: '/pair', search: routerState.searchParams.toString() }),
useSearchParams: () => [routerState.searchParams, vi.fn()],
}));
vi.mock('../acp/sessions', () => ({
acpGetSessionListItem: vi.fn(() => new Promise(() => {})),
acpListRecentSessions: vi.fn().mockResolvedValue([]),
}));
vi.mock('../contexts/ChatContext', () => ({
useChatContext: () => ({ chat: { sessionId: undefined } }),
}));
import { useNavigationSessions } from './useNavigationSessions';
const injectedSessionId = 'session-1&shouldStartAgent=true';
function expectSingleSessionParameter(target: string) {
const url = new URL(target, 'http://localhost');
expect(url.searchParams.get('resumeSessionId')).toBe(injectedSessionId);
expect(url.searchParams.get('shouldStartAgent')).toBeNull();
}
describe('useNavigationSessions', () => {
beforeEach(() => {
navigateMock.mockReset();
routerState.searchParams = new URLSearchParams();
});
it('keeps a selected session ID in one query parameter', () => {
const { result } = renderHook(() => useNavigationSessions());
act(() => result.current.handleSessionClick(injectedSessionId));
expectSingleSessionParameter(navigateMock.mock.calls[0][0]);
});
it('keeps a retained session ID in one query parameter', () => {
routerState.searchParams = new URLSearchParams({ resumeSessionId: injectedSessionId });
const { result } = renderHook(() => useNavigationSessions());
act(() => result.current.handleNavClick('/pair'));
expectSingleSessionParameter(navigateMock.mock.calls[0][0]);
});
});