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() }) })