import { mount } from '@vue/test-utils'; import { describe, expect, it } from 'vitest'; import AiPromptInput from './AiPromptInput.vue'; describe('AiPromptInput', () => { it('emits send when loading is false', async () => { const wrapper = mount(AiPromptInput, { props: { loading: false, modelValue: '', }, }); await wrapper.find('textarea').setValue('你好'); await wrapper.setProps({ modelValue: '你好' }); await wrapper.find('[aria-label="发送"]').trigger('click'); expect(wrapper.emitted('send')?.[0]?.[0]).toBe('你好'); }); it('emits stop when loading is true', async () => { const wrapper = mount(AiPromptInput, { props: { loading: true, }, }); expect(wrapper.find('[aria-label="中止"]').exists()).toBe(true); await wrapper.find('[aria-label="中止"]').trigger('click'); expect(wrapper.emitted('stop')).toBeTruthy(); }); it('supports sending a ready image without text', async () => { const wrapper = mount(AiPromptInput, { props: { images: [ { localId: 'image-1', mimeType: 'image/png', name: 'test.png', previewUrl: 'data:image/png;base64,AA==', size: 1, status: 'ready', uploadId: 'upload-1', }, ], loading: false, }, }); await wrapper.find('[aria-label="发送"]').trigger('click'); expect(wrapper.emitted('send')?.[0]?.[0]).toBe(''); }); it('extracts image files from clipboard paste', async () => { const wrapper = mount(AiPromptInput, { props: { loading: false, }, }); const image = new File(['image'], 'pasted.png', { type: 'image/png' }); const event = new Event('paste', { bubbles: true, cancelable: true }); Object.defineProperty(event, 'clipboardData', { value: { files: [image] }, }); wrapper.find('textarea').element.dispatchEvent(event); await wrapper.vm.$nextTick(); expect(event.defaultPrevented).toBe(true); expect(wrapper.emitted('addFiles')?.[0]?.[0]).toEqual([image]); }); it('extracts image files from drop', async () => { const wrapper = mount(AiPromptInput, { props: { loading: false, }, }); const image = new File(['image'], 'dropped.jpg', { type: 'image/jpeg' }); const text = new File(['text'], 'note.txt', { type: 'text/plain' }); await wrapper.find('.ai-prompt-input').trigger('drop', { dataTransfer: { files: [image, text] }, }); expect(wrapper.emitted('addFiles')?.[0]?.[0]).toEqual([image]); }); });