67 lines
3.8 KiB
TypeScript
67 lines
3.8 KiB
TypeScript
import { readFileSync } from 'node:fs'
|
||
import { resolve } from 'node:path'
|
||
import ElementPlus from 'element-plus'
|
||
import { flushPromises, mount } from '@vue/test-utils'
|
||
import { describe, expect, it, vi } from 'vitest'
|
||
import { getRelabelOrder, getRelabelQuantities } from '../api/relabelOrders'
|
||
import RelabelOrderDetailView from './RelabelOrderDetailView.vue'
|
||
|
||
vi.mock('vue-router', () => ({ useRoute: () => ({ params: { orderId: 'RELABEL-1' } }), useRouter: () => ({ push: vi.fn() }) }))
|
||
vi.mock('@/core/access/accessPreview', () => ({ useAccessPreviewStore: () => ({ can: () => false }) }))
|
||
vi.mock('../api/relabelOrders', async importOriginal => ({
|
||
...await importOriginal<typeof import('../api/relabelOrders')>(), getRelabelOrder: vi.fn(), getRelabelQuantities: vi.fn(),
|
||
}))
|
||
vi.mock('@/modules/overseas-business', () => ({ BusinessDocumentFees: {
|
||
name: 'BusinessDocumentFees', props: ['businessType', 'businessNo', 'customerId', 'businessId'], template: '<section>本单费用</section>',
|
||
} }))
|
||
|
||
const source = readFileSync(resolve(process.cwd(), 'src/modules/overseas-warehouse/pages/RelabelOrderDetailView.vue'), 'utf8')
|
||
|
||
describe('RelabelOrderDetailView', () => {
|
||
it('resolves fees by the relabel identity without reusing the original customer order', async () => {
|
||
vi.mocked(getRelabelOrder).mockResolvedValue({
|
||
application: { id: '9007199254741004', relabelNo: 'RELABEL-1', lastlegOrderId: '9007199254741005', customerOrderNo: 'RETURN-1', chargeAmount: 25, chargeCurrency: 'CNY', walletStatus: 'NOT_REQUIRED' },
|
||
items: [], history: [],
|
||
})
|
||
vi.mocked(getRelabelQuantities).mockRejectedValue(new Error('数量暂不可用'))
|
||
const wrapper = mount(RelabelOrderDetailView, { global: { plugins: [ElementPlus], stubs: { AppDialog: true, RelabelDocumentsPanel: true } } })
|
||
await flushPromises()
|
||
expect(wrapper.findComponent({ name: 'BusinessDocumentFees' }).props()).toEqual({
|
||
businessType: 'RELABEL_ORDER', businessNo: 'RELABEL-1', customerId: undefined, businessId: '9007199254741004',
|
||
})
|
||
expect(wrapper.text()).toContain('原换标费')
|
||
expect(wrapper.text()).toContain('25.00 CNY')
|
||
expect(wrapper.text()).toContain('无需冻结或扣款')
|
||
expect(wrapper.text()).not.toContain('NOT_REQUIRED')
|
||
wrapper.unmount()
|
||
})
|
||
|
||
it('renders carton relabel mappings as a row list instead of summary form fields', () => {
|
||
expect(source).toContain('<template #content-after>')
|
||
expect(source).toContain('<h2>箱唛换标信息</h2>')
|
||
expect(source).toContain('v-for="item in detail?.items || []"')
|
||
expect(source).toContain('text(item.cartonMark)')
|
||
expect(source).toContain('text(item.fbaCartonMark)')
|
||
expect(source).not.toContain("{ title: '箱唛换标信息', fields:")
|
||
})
|
||
|
||
it('shows the review state and customer-facing return order and FBA warehouse codes', () => {
|
||
expect(source).toContain("PENDING_REVIEW: '待审核'")
|
||
expect(source).toContain('value?.application.customerOrderNo || value?.application.lastlegOrderNo')
|
||
expect(source).toContain('text(item.destinationFbaWarehouseCode)')
|
||
expect(source).not.toContain('item.destinationFbaWarehouseCode || item.destinationWarehouseId')
|
||
expect(source).toContain('items.flatMap(relabelSkuCodes)')
|
||
expect(source).toContain('v-for="(sku, index) in item.skuItems"')
|
||
expect(source).toContain('{{ sku.skuCode }} → {{ sku.newSkuCode }} × {{ sku.quantity }} 件')
|
||
})
|
||
|
||
it('lets platform operators confirm completion or return PDA work for rework', () => {
|
||
expect(source).toContain('@click="confirmCompletion"')
|
||
expect(source).toContain('确认换标完成')
|
||
expect(source).toContain('@click="returnForRework"')
|
||
expect(source).toContain('退回重新贴标')
|
||
expect(source).toContain('await confirmRelabelCompletion(orderId.value)')
|
||
expect(source).toContain('await returnRelabelForRework(orderId.value')
|
||
})
|
||
})
|