2026-08-20 18:02:52 +08:00
import ElementPlus from 'element-plus'
import { enableAutoUnmount , flushPromises , mount } from '@vue/test-utils'
import { afterAll , afterEach , beforeEach , describe , expect , it , vi } from 'vitest'
import { listPlatformTenants } from '@/modules/iam'
import { getInboundPlan } from '../api/inboundPlans'
import { listInventoryLedger } from '../api/inventory'
import InboundOrderDetailView from './InboundOrderDetailView.vue'
import InventoryTransactionsView from './InventoryTransactionsView.vue'
const routing = vi . hoisted (() => ({ push : vi.fn (), route : { params : {} as Record < string , string >, query : {} as Record < string , string > } }))
vi . mock ( 'vue-router' , () => ({ useRoute : () => routing . route , useRouter : () => ({ push : routing.push }) }))
vi . mock ( '@/modules/iam' , () => ({ listPlatformTenants : vi.fn () }))
vi . mock ( '../api/inboundPlans' , () => ({ getInboundPlan : vi.fn () }))
vi . mock ( '../api/inventory' , () => ({ listInventoryLedger : vi.fn () }))
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 ) } }
enableAutoUnmount ( afterEach ); afterAll (() => vi . unstubAllGlobals ())
describe ( 'overseas warehouse mounted real API pages' , () => {
beforeEach (() => {
vi . stubGlobal ( 'ResizeObserver' , ResizeObserverStub ); vi . stubGlobal ( 'localStorage' , memoryStorage ()); routing . push . mockReset (); routing . route . params = {}; routing . route . query = {}
vi . mocked ( listPlatformTenants ). mockReset (). mockResolvedValue ({ records : [{ id : '10001' , tenantName : '客户甲' , status : 'ACTIVE' } as never ], page : 1 , size : 200 , total : 1 , pages : 1 })
vi . mocked ( getInboundPlan ). mockReset (). mockResolvedValue ({ id : '9007199254740993' , planNo : 'IP-1' , customerId : '10001' , sourceOrderId : '9007199254740995' , status : 'PENDING_ASSIGNMENT' , lineCount : 1 , palletCount : 1 , totalVolumeCbm : 2 , lines : [{ id : '1' , orderId : '9007199254740995' , inboundCode : 'IN-1' , fbaWarehouseCode : 'ONT8' , destinationWarehouseName : '洛杉矶仓' , volumeCbm : 2 , requiredPackageCount : 10 , plannedPalletCount : 1 }], pallets : [], allocations : [] })
vi . mocked ( listInventoryLedger ). mockReset (). mockResolvedValue ({ records : [{ id : '9007199254740997' , customerId : '10001' , destinationWarehouseCode : 'LAX' , inboundOrderNo : 'IP-1' , businessType : 'STOCK_IN' , beforePackages : 0 , deltaPackages : 10 , afterPackages : 10 , occurredAt : '2026-08-20T10:00:00' }], page : 1 , size : 20 , total : 1 , pages : 1 })
})
it ( 'mounts inbound detail with a string-safe source order id' , async () => { routing . route . params = { orderId : 'IP-1' }; routing . route . query = { customerId : '10001' }; const wrapper = mount ( InboundOrderDetailView , { global : { plugins : [ ElementPlus ] } }); await flushPromises (); expect ( getInboundPlan ). toHaveBeenCalledWith ( 'IP-1' , '10001' ); expect ( wrapper . text ()). toContain ( '9007199254740995' ); expect ( wrapper . text ()). toContain ( '洛杉矶仓' ) })
2026-08-21 11:20:09 +08:00
it ( 'mounts inventory ledger as read-only facts' , async () => { const wrapper = mount ( InventoryTransactionsView , { global : { plugins : [ ElementPlus ] } }); await flushPromises (); expect ( listInventoryLedger ). toHaveBeenCalledWith ( expect . objectContaining ({ page : 1 , size : 20 })); expect ( listInventoryLedger ). not . toHaveBeenCalledWith ( expect . objectContaining ({ customerId : expect.anything () })); expect ( wrapper . text ()). toContain ( 'IP-1' ); expect ( wrapper . text ()). toContain ( '10' ); expect ( wrapper . text ()). toContain ( '不提供出库单跳转' ) })
2026-08-20 18:02:52 +08:00
})