import { describe, it, expect, vi, beforeEach } from 'vitest' import { render as rtlRender, screen, fireEvent } from '@testing-library/react' import { TooltipProvider } from '@/components/ui/tooltip' import { EditorRightPanel } from './EditorRightPanel' import type { VaultEntry } from '../types' import { bindVaultConfigStore, resetVaultConfigStore } from '../utils/vaultConfigStore' vi.mock('../hooks/useCliAiAgent', async () => { const React = await import('react') return { useCliAiAgent: () => { const [messages, setMessages] = React.useState>([]) return { messages, status: 'idle', sendMessage: (text: string) => { setMessages([{ id: 'mock-session-message', userMessage: text, actions: [], response: 'Mock response', }]) }, clearConversation: () => setMessages([]), addLocalMarker: (text: string) => { setMessages([{ id: 'mock-local-marker', userMessage: '', actions: [], localMarker: text, }]) }, } }, } }) const entry: VaultEntry = { path: '/vault/note/test.md', filename: 'test.md', title: 'Test Note', isA: 'Note', aliases: [], belongsTo: [], relatedTo: [], status: null, owner: null, cadence: null, archived: false, modifiedAt: 1700000000, createdAt: 1700000000, fileSize: 100, snippet: '', wordCount: 0, relationships: {}, icon: null, color: null, order: null, sidebarLabel: null, template: null, sort: null, view: null, visible: null, organized: false, favorite: false, favoriteIndex: null, listPropertiesDisplay: [], outgoingLinks: [], properties: {}, hasH1: false, } function editorRightPanel(showAIChat: boolean) { return ( ) } function renderRightPanel(showAIChat: boolean) { return rtlRender( editorRightPanel(showAIChat), { wrapper: TooltipProvider }, ) } describe('EditorRightPanel', () => { beforeEach(() => { resetVaultConfigStore() bindVaultConfigStore({ zoom: null, view_mode: null, editor_mode: null, note_layout: null, tag_colors: null, status_colors: null, property_display_modes: null, inbox: null, allNotes: null, ai_agent_permission_mode: 'safe', }, vi.fn()) }) it('preserves the AI panel transcript across close and reopen', () => { const view = renderRightPanel(true) const input = screen.getByTestId('agent-input') input.textContent = 'keep this session' fireEvent.input(input) fireEvent.click(screen.getByTestId('agent-send')) expect(screen.getByText('keep this session')).toBeTruthy() expect(screen.getByText('Mock response')).toBeTruthy() view.rerender(editorRightPanel(false)) expect(screen.queryByTestId('ai-panel')).toBeNull() view.rerender(editorRightPanel(true)) expect(screen.getByText('keep this session')).toBeTruthy() expect(screen.getByText('Mock response')).toBeTruthy() }) })