import { flushPromises, mount } from '@vue/test-utils' import { beforeEach, describe, expect, it, vi } from 'vitest' import { createI18n } from 'vue-i18n' import zhCN from '@/i18n/locales/zh-CN' import { DebugEmlUploadError } from '@/services/debugEmlService' import DebugEmlSuperAgentRunView from '@/views/debug/DebugEmlSuperAgentRunView.vue' vi.mock('@/services/debugEmlService', async (importOriginal) => { const actual = await importOriginal() return { ...actual, uploadDebugEmlSuperAgentRun: vi.fn(), } }) const service = await import('@/services/debugEmlService') function mountView() { const i18n = createI18n({ legacy: false, locale: 'zh-CN', messages: { 'zh-CN': zhCN, }, }) return mount(DebugEmlSuperAgentRunView, { global: { plugins: [i18n], }, }) } function createResult() { return { debug_run_id: '90001', source_message_id: '30001', source_provider: 'DEBUG_EML_UPLOAD', external_message_id: 'debug-eml-run-90001-abcdef123456', external_conversation_id: 'debug-thread-90001', original_eml_oss_url: 'https://oss.example/raw.eml', original_eml_sha256: 'sha256', uploaded_media: [ { media_type: 'ORIGINAL_EMAIL', file_name: 'booking.eml', content_type: 'message/rfc822', size_bytes: 1200, external_url: 'https://oss.example/raw.eml', external_media_id: 'raw', object_key: 'debug/eml/raw/booking.eml', }, ], html_body_with_oss_urls: '原始 HTML', html_body_sanitized: '安全正文', html_sanitize_required: true, html_render_mode: 'SANITIZED_HTML', agentbus_like_payload: { schema_version: 'debug-eml-upload-v1', source: { original_message_id: '', }, }, superagent_session_id: 'session-1', superagent_run_id: 'run-1', superagent_raw_answer: '{"ok":true}', superagent_parsed_json: { ok: true }, warnings: ['SuperAgent 返回非 JSON 时会展示原始回答'], status: 'SUPERAGENT_SUCCEEDED', } } async function chooseFile(wrapper: ReturnType) { const file = new File(['From: guest@example.test'], 'booking.eml', { type: 'message/rfc822' }) const input = wrapper.find('input[type="file"]') Object.defineProperty(input.element, 'files', { value: [file], configurable: true, }) await input.trigger('change') return file } describe('DebugEmlSuperAgentRunView', () => { beforeEach(() => { vi.mocked(service.uploadDebugEmlSuperAgentRun).mockReset() }) it('submits the selected eml file and renders sanitized debug result', async () => { vi.mocked(service.uploadDebugEmlSuperAgentRun).mockResolvedValue(createResult()) const wrapper = mountView() await wrapper.find('input[name="hotel_id"]').setValue('HOTEL-TEST') await wrapper.find('input[name="debug_upload_key"]').setValue('manual-debug-key') await wrapper.find('input[name="run_label"]').setValue('frontend-smoke') const file = await chooseFile(wrapper) await wrapper.find('form').trigger('submit') await flushPromises() expect(service.uploadDebugEmlSuperAgentRun).toHaveBeenCalledWith({ hotelId: 'HOTEL-TEST', debugUploadKey: 'manual-debug-key', runLabel: 'frontend-smoke', file, }) expect(wrapper.text()).toContain('90001') expect(wrapper.text()).toContain('30001') expect(wrapper.text()).toContain('DEBUG_EML_UPLOAD') expect(wrapper.find('.debug-eml-html-preview').html()).toContain('安全正文') expect(wrapper.find('.debug-eml-html-preview').html()).not.toContain('