Download desktop/src/components/chat/LocalSlashCommandPanel.test.tsx from chenbhao/codev: direct link, hf CLI and curl.
- Browser
- Download file 4.23 kB
-
https://huggingface.co/chenbhao/codev/resolve/e40073cc959cd4729bf4009662bca374c5c4e266/desktop/src/components/chat/LocalSlashCommandPanel.test.tsx
- Command line
-
hf download hf://chenbhao/codev@e40073cc959cd4729bf4009662bca374c5c4e266/desktop/src/components/chat/LocalSlashCommandPanel.test.tsx
-
curl -L -o LocalSlashCommandPanel.test.tsx https://huggingface.co/chenbhao/codev/resolve/e40073cc959cd4729bf4009662bca374c5c4e266/desktop/src/components/chat/LocalSlashCommandPanel.test.tsx
4.23 kB
| import { fireEvent, render, screen, waitFor } from '@testing-library/react' | |
| import { beforeEach, describe, expect, it, vi } from 'vitest' | |
| import '@testing-library/jest-dom' | |
| const { sessionsApiMock } = vi.hoisted(() => ({ | |
| sessionsApiMock: { | |
| getInspection: vi.fn(), | |
| }, | |
| })) | |
| vi.mock('../../api/sessions', async (importOriginal) => { | |
| const actual = await importOriginal<typeof import('../../api/sessions')>() | |
| return { | |
| ...actual, | |
| sessionsApi: { | |
| getInspection: sessionsApiMock.getInspection, | |
| }, | |
| } | |
| }) | |
| import { LocalSlashCommandPanel } from './LocalSlashCommandPanel' | |
| import { useSettingsStore } from '../../stores/settingsStore' | |
| import { useTabStore, SETTINGS_TAB_ID } from '../../stores/tabStore' | |
| import { useUIStore } from '../../stores/uiStore' | |
| import type { SessionContextSnapshot, SessionInspectionResponse } from '../../api/sessions' | |
| const baseContext: SessionContextSnapshot = { | |
| categories: [ | |
| { | |
| name: 'memory', | |
| tokens: 120, | |
| color: '#14b8a6', | |
| }, | |
| ], | |
| totalTokens: 120, | |
| maxTokens: 200000, | |
| rawMaxTokens: 200000, | |
| percentage: 0.06, | |
| gridRows: [], | |
| model: 'Claude Test', | |
| memoryFiles: [], | |
| mcpTools: [], | |
| agents: [], | |
| messageBreakdown: { | |
| toolCallTokens: 0, | |
| toolResultTokens: 0, | |
| attachmentTokens: 0, | |
| assistantMessageTokens: 0, | |
| userMessageTokens: 0, | |
| toolCallsByType: [], | |
| attachmentsByType: [], | |
| }, | |
| } | |
| function inspectionWithContext(context: SessionContextSnapshot): SessionInspectionResponse { | |
| return { | |
| active: true, | |
| status: { | |
| sessionId: 'session-1', | |
| workDir: '/workspace/demo', | |
| permissionMode: 'default', | |
| model: 'Claude Test', | |
| tools: [], | |
| mcpServers: [], | |
| }, | |
| context, | |
| } | |
| } | |
| describe('LocalSlashCommandPanel memory context', () => { | |
| beforeEach(() => { | |
| vi.clearAllMocks() | |
| useSettingsStore.setState({ locale: 'en' }) | |
| useTabStore.setState(useTabStore.getInitialState(), true) | |
| useUIStore.setState({ | |
| pendingMemoryPath: null, | |
| pendingSettingsTab: null, | |
| }) | |
| }) | |
| it('shows loaded memory files and opens the selected project memory in settings', async () => { | |
| sessionsApiMock.getInspection.mockResolvedValue(inspectionWithContext({ | |
| ...baseContext, | |
| memoryFiles: [ | |
| { | |
| path: '/Users/test/.claude/projects/demo/memory/MEMORY.md', | |
| type: 'project', | |
| tokens: 4321, | |
| }, | |
| { | |
| path: '/Users/test/.claude/projects/demo/memory/feedback/reuse.md', | |
| type: 'feedback', | |
| tokens: 98, | |
| }, | |
| ], | |
| })) | |
| render( | |
| <LocalSlashCommandPanel | |
| command="context" | |
| sessionId="session-1" | |
| onClose={vi.fn()} | |
| />, | |
| ) | |
| expect(await screen.findByText('Memory files')).toBeInTheDocument() | |
| expect(screen.getByText('MEMORY.md')).toBeInTheDocument() | |
| expect(screen.getByText('/Users/test/.claude/projects/demo/memory/MEMORY.md')).toBeInTheDocument() | |
| expect(screen.getByText('feedback')).toBeInTheDocument() | |
| expect(screen.getByText('4,321 tokens')).toBeInTheDocument() | |
| fireEvent.click(screen.getByRole('button', { name: 'Open Memory' })) | |
| await waitFor(() => { | |
| expect(useUIStore.getState().pendingSettingsTab).toBe('memory') | |
| expect(useUIStore.getState().pendingMemoryPath).toBe('/Users/test/.claude/projects/demo/memory/MEMORY.md') | |
| expect(useTabStore.getState().activeTabId).toBe(SETTINGS_TAB_ID) | |
| }) | |
| }) | |
| it('keeps the memory settings entry available when no memory files are loaded', async () => { | |
| sessionsApiMock.getInspection.mockResolvedValue(inspectionWithContext({ | |
| ...baseContext, | |
| memoryFiles: [], | |
| })) | |
| render( | |
| <LocalSlashCommandPanel | |
| command="context" | |
| sessionId="session-1" | |
| onClose={vi.fn()} | |
| />, | |
| ) | |
| expect(await screen.findByText('No memory files are loaded in this session.')).toBeInTheDocument() | |
| fireEvent.click(screen.getByRole('button', { name: 'Open Memory' })) | |
| await waitFor(() => { | |
| expect(useUIStore.getState().pendingSettingsTab).toBe('memory') | |
| expect(useUIStore.getState().pendingMemoryPath).toBeNull() | |
| expect(useTabStore.getState().activeTabId).toBe(SETTINGS_TAB_ID) | |
| }) | |
| }) | |
| }) | |