This commit is contained in:
2026-08-26 20:39:55 +08:00
parent 7b50e92baf
commit 38031b0fa0
13 changed files with 122 additions and 71 deletions
@@ -23,8 +23,6 @@ vi.mock('../api/relabelOrders', () => ({
class ResizeObserverStub implements ResizeObserver { observe() {} unobserve() {} disconnect() {} }
function memoryStorage(): Storage { const values = new Map<string, string>(); return { get length() { return values.size }, clear: () => values.clear(), getItem: (key) => values.get(key) ?? null, key: (index) => [...values.keys()][index] ?? null, removeItem: (key) => values.delete(key), setItem: (key, value) => values.set(key, value) } }
function deferred<T>() { let resolve!: (value: T) => void; const promise = new Promise<T>((done) => { resolve = done }); return { promise, resolve } }
function formItem(wrapper: VueWrapper<any>, label: string) {
const item = wrapper.findAllComponents({ name: 'ElFormItem' }).find((candidate) => candidate.props('label') === label)
if (!item) throw new Error(`Missing form item: ${label}`)
@@ -51,10 +49,8 @@ describe('RelabelOrdersView', () => {
vi.mocked(changeRelabelOrderStatus).mockReset()
})
it('keeps only the latest selected customer warehouse response', async () => {
const first = deferred<Awaited<ReturnType<typeof listRelabelWarehouseOptions>>>()
const second = deferred<Awaited<ReturnType<typeof listRelabelWarehouseOptions>>>()
vi.mocked(listRelabelWarehouseOptions).mockReturnValueOnce(first.promise).mockReturnValueOnce(second.promise)
it('loads shared receiving warehouse options independently from the selected customer', async () => {
vi.mocked(listRelabelWarehouseOptions).mockResolvedValue({ records: [{ id: 'WH-B', customerId: '0', warehouseCode: 'B', warehouseName: 'B仓', warehouseType: 'OVERSEAS', status: 'ACTIVE' }], page: 1, size: 200, total: 1, pages: 1 })
const wrapper = mount(RelabelOrdersView, { attachTo: document.body, global: { plugins: [ElementPlus] } })
await flushPromises()
await wrapper.findAll('button').find((button) => button.text().includes('新增换标单'))!.trigger('click')
@@ -63,17 +59,10 @@ describe('RelabelOrdersView', () => {
const customer = select(wrapper, '请选择 ACTIVE 客户')
customer.vm.$emit('update:modelValue', '10001'); customer.vm.$emit('change', '10001')
await flushPromises()
customer.vm.$emit('update:modelValue', '10002'); customer.vm.$emit('change', '10002')
await flushPromises()
second.resolve({ records: [{ id: 'WH-B', customerId: '10002', warehouseCode: 'B', warehouseName: 'B仓', warehouseType: 'OVERSEAS', status: 'ACTIVE' }], page: 1, size: 200, total: 1, pages: 1 })
await flushPromises()
first.resolve({ records: [{ id: 'WH-A', customerId: '10001', warehouseCode: 'A', warehouseName: 'A仓', warehouseType: 'OVERSEAS', status: 'ACTIVE' }], page: 1, size: 200, total: 1, pages: 1 })
await flushPromises()
const labels = wrapper.findAllComponents({ name: 'ElOption' }).map((option) => option.props('label'))
expect(listRelabelWarehouseOptions).toHaveBeenCalledOnce()
expect(labels).toContain('B仓 · B')
expect(labels).not.toContain('A仓 · A')
})
it('reuses one idempotency key after a failed create retry', async () => {
@@ -87,7 +76,7 @@ describe('RelabelOrdersView', () => {
const customer = select(wrapper, '请选择 ACTIVE 客户')
customer.vm.$emit('update:modelValue', '10001'); customer.vm.$emit('change', '10001')
await flushPromises()
const warehouse = select(wrapper, '请先选择客户,再选择其海外仓')
const warehouse = select(wrapper, '请选择 ACTIVE+RECEIVING 海外仓')
warehouse.vm.$emit('update:modelValue', 'WH-1')
formItem(wrapper, '关联订单').findComponent({ name: 'ElInput' }).vm.$emit('update:modelValue', 'CO-1')
formItem(wrapper, '商品SKU').findComponent({ name: 'ElInput' }).vm.$emit('update:modelValue', 'SKU-1')