This commit is contained in:
2026-08-04 13:32:08 +08:00
parent 6354f5ca66
commit 2192aed125
17 changed files with 711 additions and 354 deletions
@@ -22,11 +22,12 @@ import QueryToolbar from '@/shared/components/QueryToolbar.vue'
import { showExportTaskCreatedDialog } from '@/shared/components/exportTaskCreatedDialog'
import CustomersView from './CustomersView.vue'
const { routerPush } = vi.hoisted(() => ({ routerPush: vi.fn() }))
const { routerPush, routerReplace } = vi.hoisted(() => ({ routerPush: vi.fn(), routerReplace: vi.fn() }))
vi.mock('vue-router', async (importOriginal) => ({
...await importOriginal<typeof import('vue-router')>(),
useRouter: () => ({ push: routerPush }),
useRoute: () => ({ query: {} }),
useRouter: () => ({ push: routerPush, replace: routerReplace }),
}))
vi.mock('@/modules/iam', () => ({
@@ -172,72 +173,14 @@ describe('CustomersView', () => {
expect(downloadTenantQualification).not.toHaveBeenCalled()
})
it('shows uploaded qualifications in customer detail and opens the full preview', async () => {
vi.mocked(listTenantQualifications).mockResolvedValue([{
id: 'qualification-1', tenantId: fullTenant.id, qualificationType: 'BUSINESS_LICENSE',
certificateNo: fullTenant.unifiedSocialCreditCode, documentUrl: '/files/license.png',
status: 'PENDING', reviewComment: null, validTo: null,
}])
vi.mocked(downloadTenantQualification).mockResolvedValue(new Blob(['image'], { type: 'image/png' }))
it('opens customer detail as an independent route', async () => {
mount(CustomersView, { attachTo: document.body, global: { plugins: [pinia, ElementPlus] } })
await flushPromises()
tableButtonByText('详情')?.click()
await flushPromises()
await flushPromises()
const detailPreview = document.querySelector<HTMLButtonElement>('button[aria-label="查看营业执照:license.png"]')
expect(detailPreview?.querySelector('img[alt="营业执照缩略图"]')).not.toBeNull()
detailPreview?.click()
await flushPromises()
expect(document.querySelector('.qualification-preview img[alt="license.png预览"]')).not.toBeNull()
})
it('does not let an older customer detail response overwrite a newer one', async () => {
const secondTenant = {
...fullTenant, id: '9', tenantCode: 'TEN9', tenantName: '第二家客户', legalName: '第二家客户有限公司',
}
vi.mocked(listPlatformTenants).mockResolvedValue({
records: [fullTenant, secondTenant], page: 1, size: 10, total: 2, pages: 1,
})
let resolveFirst!: (value: PlatformTenantResource) => void
let resolveSecond!: (value: PlatformTenantResource) => void
vi.mocked(getPlatformTenant)
.mockImplementationOnce(() => new Promise((resolve) => { resolveFirst = resolve }))
.mockImplementationOnce(() => new Promise((resolve) => { resolveSecond = resolve }))
mount(CustomersView, { attachTo: document.body, global: { plugins: [pinia, ElementPlus] } })
await flushPromises()
const detailButtons = [...document.querySelectorAll<HTMLButtonElement>('.el-table__body button')]
.filter((button) => button.textContent?.trim() === '详情')
detailButtons[0]?.click()
detailButtons[1]?.click()
resolveSecond(secondTenant)
await flushPromises()
expect(document.querySelector('.customer-detail')?.textContent).toContain('第二家客户有限公司')
resolveFirst(fullTenant)
await flushPromises()
const detailText = document.querySelector('.customer-detail')?.textContent
expect(detailText).toContain('第二家客户有限公司')
expect(detailText).not.toContain('柏悦物流有限公司')
})
it('labels replaced qualification history without presenting it as pending review', async () => {
vi.mocked(listTenantQualifications).mockResolvedValue([{
id: 'qualification-old', tenantId: fullTenant.id, qualificationType: 'BUSINESS_LICENSE',
certificateNo: fullTenant.unifiedSocialCreditCode, documentUrl: '/files/old-license.pdf',
status: 'SUPERSEDED', reviewComment: '已替换', validTo: null,
}])
mount(CustomersView, { attachTo: document.body, global: { plugins: [pinia, ElementPlus] } })
await flushPromises()
tableButtonByText('详情')?.click()
await flushPromises()
expect(document.querySelector('.detail-qualification-meta .el-tag')?.textContent).toContain('已替换')
expect(routerPush).toHaveBeenCalledWith({ name: 'customer-detail', params: { tenantId: String(fullTenant.id) } })
expect(getPlatformTenant).not.toHaveBeenCalled()
})
it('saves customer data and selected qualifications with one action', async () => {