// @vitest-environment happy-dom import { expect, it, vi } from 'vitest' import { mount } from '@vue/test-utils' import { createPinia, setActivePinia } from 'pinia' import { useEditorStore } from '@/stores/editor' import WorkspaceChat from './WorkspaceChat.vue' import ChatView from './ChatView.vue' vi.mock('./ChatView.vue', () => ({ default: { props: ['workspaceContext'], template: '
{{ workspaceContext?.content }}
' } })) it('keeps the same floating chat while closing and uses the live unsaved editor contents', async () => { localStorage.clear() setActivePinia(createPinia()) const editor = useEditorStore(); editor.currentFilePath = 'draft.md'; editor.content = 'first' const wrapper = mount(WorkspaceChat, { props: { open: true }, attachTo: document.body }) expect(document.querySelector('.chat-stub')?.textContent).toBe('first') const chat = wrapper.findComponent(ChatView).vm await wrapper.setProps({ open: false }) editor.content = 'second' await wrapper.setProps({ open: true }) expect(wrapper.findComponent(ChatView).vm).toBe(chat) expect(document.querySelector('.chat-stub')?.textContent).toBe('second') const before = (document.querySelector('.workspace-chat') as HTMLElement).style.left document.querySelector('.workspace-chat-handle')!.dispatchEvent(new KeyboardEvent('keydown', { key: 'ArrowLeft', bubbles: true })); await wrapper.vm.$nextTick() expect((document.querySelector('.workspace-chat') as HTMLElement).style.left).not.toBe(before) wrapper.unmount() }) it('remembers resized bounds and resets the window', async () => { setActivePinia(createPinia()) localStorage.setItem('notes-agent.workspace-chat.bounds.v1', JSON.stringify({x:30,y:20,width:420,height:400})) const wrapper = mount(WorkspaceChat, {props:{open:true},attachTo:document.body}) const panel=document.querySelector('.workspace-chat') as HTMLElement expect(panel.style.width).toBe('420px') document.querySelector('.window-resizer')!.dispatchEvent(new KeyboardEvent('keydown',{key:'ArrowRight',bubbles:true})); await wrapper.vm.$nextTick() expect(panel.style.width).toBe('440px') expect(JSON.parse(localStorage.getItem('notes-agent.workspace-chat.bounds.v1')!).width).toBe(440) const reset=[...document.querySelectorAll('button')].find(b=>b.textContent==='重置窗口')! reset.click(); await wrapper.vm.$nextTick() expect(panel.style.width).toBe('640px') wrapper.unmount(); localStorage.clear() })