Files
Wyndham-RSVN/client/src/tests/debugEmlView.spec.ts
T

151 lines
5.4 KiB
TypeScript

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<typeof import('@/services/debugEmlService')>()
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: '<script>alert("raw")</script><strong onclick="bad()">原始 HTML</strong>',
html_body_sanitized: '<strong>安全正文</strong>',
html_sanitize_required: true,
html_render_mode: 'SANITIZED_HTML',
agentbus_like_payload: {
schema_version: 'debug-eml-upload-v1',
source: {
original_message_id: '<original@example.test>',
},
},
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<typeof mountView>) {
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('<strong>安全正文</strong>')
expect(wrapper.find('.debug-eml-html-preview').html()).not.toContain('<script>')
expect(wrapper.find('.debug-eml-html-preview').html()).not.toContain('onclick')
expect(wrapper.text()).toContain('booking.eml')
expect(wrapper.text()).toContain('"schema_version": "debug-eml-upload-v1"')
expect(wrapper.text()).toContain('"ok": true')
})
it('does not render raw html with oss urls by default', 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 chooseFile(wrapper)
await wrapper.find('form').trigger('submit')
await flushPromises()
expect(wrapper.find('.debug-eml-html-preview').html()).not.toContain('原始 HTML')
expect(wrapper.find('details.debug-eml-raw-html').text()).toContain('原始 HTML')
})
it('shows mapped error_code messages without exposing the debug key', async () => {
vi.mocked(service.uploadDebugEmlSuperAgentRun).mockRejectedValue(
new DebugEmlUploadError('Debug 上传访问口令缺失或错误。', 401, 'DEBUG_UPLOAD_KEY_INVALID', {
error_code: 'DEBUG_UPLOAD_KEY_INVALID',
}),
)
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 chooseFile(wrapper)
await wrapper.find('form').trigger('submit')
await flushPromises()
expect(wrapper.text()).toContain('DEBUG_UPLOAD_KEY_INVALID')
expect(wrapper.text()).toContain('调试上传口令缺失或错误')
expect(wrapper.text()).not.toContain('manual-debug-key')
})
})