94 lines
2.6 KiB
TypeScript
94 lines
2.6 KiB
TypeScript
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]);
|
|
});
|
|
});
|