import { flushPromises, mount } from '@vue/test-utils' import { beforeEach, expect, it, vi } from 'vitest' import SourceAppointmentPanel from './SourceAppointmentPanel.vue' import { resolvePlanningSource, resolvePlanningOrder } from './planningApi' vi.mock('./planningApi', () => ({ resolvePlanningSource: vi.fn(), resolvePlanningOrder: vi.fn() })) beforeEach(() => vi.clearAllMocks()) it('shows every associated appointment for a multi-batch source and opens the chosen business number', async () => { const source = { customerId: 'customer-a', sourceKey: 'ORDER:1', destinationKey: 'FBA:ONT8' } vi.mocked(resolvePlanningSource).mockResolvedValue({source:{...source,orderId:'1',inboundCode:'IN-TEST',bookingNo:null,containerNo:'CN-TEST',originWarehouseId:'warehouse-1',originWarehouseName:'测试仓',destinationWarehouseCode:'ONT8',packages:100,sourceVersion:'v1',canFollowup:true,blockReasons:[]},coverage:{status:'MULTIPLE',missingFields:[],changeReviewRequired:false,appointments:['AP-A','AP-B'].map(appointmentNo=>({appointmentNo,confirmationNo:null,status:'PENDING',confirmedAt:null,confirmedEndAt:null,timezone:null}))}}) const wrapper = mount(SourceAppointmentPanel,{props:{source,canLeave:async()=>true},global:{stubs:{ElButton:{template:''},CargoVerificationForm:true,WorkAppointmentForm:{name:'WorkAppointmentForm',props:['appointmentNo'],template:'
{{ appointmentNo }}
'},AppointmentBatchForm:true,LoadErrorState:true,ApiErrorMeta:true}}}) await flushPromises(); expect(wrapper.text()).toContain('共 2 个关联预约') await wrapper.findAll('button').find(button=>button.text()==='AP-B')!.trigger('click'); await flushPromises() expect(wrapper.getComponent({name:'WorkAppointmentForm'}).props('appointmentNo')).toBe('AP-B') expect(resolvePlanningSource).toHaveBeenCalledExactlyOnceWith(source); wrapper.unmount() }) it('resolves an arrived external order to canonical BOOKING and passes only that source to cargo verification', async () => { const input = { orderId: '9007199254740993', customerId: 'customer-a', destinationKey: 'FBA:ONT8' } vi.mocked(resolvePlanningOrder).mockResolvedValue({source:{sourceKey:'BOOKING:external-booking',customerId:'customer-a',destinationKey:'FBA:ONT8',orderId:input.orderId,inboundCode:'IN-EXTERNAL',bookingNo:'BK-EXTERNAL',containerNo:null,originWarehouseId:'warehouse-1',originWarehouseName:'测试仓',destinationWarehouseCode:'ONT8',packages:100,sourceVersion:'booking-v1',canFollowup:true,blockReasons:[]},coverage:{status:'MULTIPLE',missingFields:[],changeReviewRequired:false,appointments:[]}}) const wrapper = mount(SourceAppointmentPanel,{props:{source:input,canLeave:async()=>true},global:{stubs:{ElButton:true,CargoVerificationForm:{name:'CargoVerificationForm',props:['source'],template:'
'},WorkAppointmentForm:true,AppointmentBatchForm:true,LoadErrorState:true,ApiErrorMeta:true}}}) await flushPromises() expect(resolvePlanningOrder).toHaveBeenCalledExactlyOnceWith(input) expect(resolvePlanningSource).not.toHaveBeenCalled() expect(wrapper.getComponent({name:'CargoVerificationForm'}).props('source')).toEqual({sourceKey:'BOOKING:external-booking',customerId:'customer-a',destinationKey:'FBA:ONT8'}) wrapper.unmount() })