Files
admin-web/src/modules/overseas-master-data/routeLocations.test.ts
T
2026-10-09 17:36:32 +08:00

43 lines
3.2 KiB
TypeScript

import { beforeEach, describe, expect, it, vi } from 'vitest'
import { getPlatformWarehouse, listAllPlatformWarehouses, type PlatformWarehouseDetailResource } from '@/modules/warehouses'
import { resolveRouteLocation, routeLocation } from './routeLocations'
vi.mock('@/modules/warehouses', () => ({ getPlatformWarehouse: vi.fn(), listAllPlatformWarehouses: vi.fn() }))
const detail = {
warehouse: { id: '900', warehouseCode: 'ABE3', warehouseName: 'ABE3', warehouseType: 'FBA' },
addresses: [{ addressType: 'OPERATING', addressLine1: '200 Example Road', addressLine2: null, district: null, city: 'Example City', stateProvince: 'PA', postalCode: '18000', countryCode: 'US' }], capabilities: [],
} as unknown as PlatformWarehouseDetailResource
beforeEach(() => {
vi.mocked(listAllPlatformWarehouses).mockReset().mockResolvedValue([detail.warehouse])
vi.mocked(getPlatformWarehouse).mockReset().mockResolvedValue(detail)
})
describe('route warehouse address resolver', () => {
it('looks up ABE3 by exact FBA code then reads its detail, never sending the code as an address', async () => {
expect(await resolveRouteLocation(routeLocation('ABE3'))).toBe('200 Example Road, Example City, PA, 18000, US')
expect(listAllPlatformWarehouses).toHaveBeenCalledExactlyOnceWith({ keyword: 'ABE3', warehouseType: 'FBA' })
expect(getPlatformWarehouse).toHaveBeenCalledExactlyOnceWith('900')
})
it('uses the origin warehouse ID instead of searching its name', async () => {
await resolveRouteLocation({ kind: 'warehouse', label: '起运仓', warehouseId: '900' })
expect(listAllPlatformWarehouses).not.toHaveBeenCalled()
})
it('rejects partial code matches and duplicates', async () => {
vi.mocked(listAllPlatformWarehouses).mockResolvedValue([{ ...detail.warehouse, warehouseCode: 'ABE30' }])
await expect(resolveRouteLocation(routeLocation('ABE3'))).rejects.toThrow('未找到')
vi.mocked(listAllPlatformWarehouses).mockResolvedValue([detail.warehouse, detail.warehouse])
await expect(resolveRouteLocation(routeLocation('ABE3'))).rejects.toThrow('多个仓库')
expect(getPlatformWarehouse).not.toHaveBeenCalled()
})
it('rejects missing street addresses, multiple operating addresses and detail/code mismatch', async () => {
vi.mocked(getPlatformWarehouse).mockResolvedValue({ ...detail, addresses: [{ ...detail.addresses[0]!, addressLine1: '' }] })
await expect(resolveRouteLocation(routeLocation('ABE3'))).rejects.toThrow('完整仓库地址')
vi.mocked(getPlatformWarehouse).mockResolvedValue({ ...detail, addresses: [detail.addresses[0]!, detail.addresses[0]!] })
await expect(resolveRouteLocation(routeLocation('ABE3'))).rejects.toThrow('不唯一')
vi.mocked(getPlatformWarehouse).mockResolvedValue({ ...detail, warehouse: { ...detail.warehouse, warehouseCode: 'ONT8' } })
await expect(resolveRouteLocation(routeLocation('ABE3'))).rejects.toThrow('不一致')
})
it('preserves explicit order addresses without a directory request', async () => {
expect(await resolveRouteLocation(routeLocation('Ontario', '100 Example Street'))).toBe('Ontario 100 Example Street')
expect(getPlatformWarehouse).not.toHaveBeenCalled(); expect(listAllPlatformWarehouses).not.toHaveBeenCalled()
})
})