import { beforeEach, describe, expect, it, vi } from 'vitest' const http = vi.hoisted(() => ({ get: vi.fn(), post: vi.fn(), })) vi.mock('@/shared/api/http', () => ({ http, unwrapApiResponse: (response: { data: T }) => response.data, })) import { downloadPlatformPriceBookSource, getPlatformPriceBook, listPlatformPriceBooks, publishPlatformPriceBook, uploadPlatformPriceBook, } from './platformPriceBooks' const version = { id: '9007199254740995', versionNo: '2', originalFileName: '2026-08-price-book.xlsx', sourceFileId: '9007199254740996', sourceSha256: 'a'.repeat(64), status: 'PENDING_CONFIRMATION' as const, channelCount: '15', rateCount: '42', blockingErrorCount: '2', warningCount: 1, parseIssuesJson: null, createdBy: '10001', createdAt: '2026-08-07T10:00:00', publishedBy: null, publishedAt: null, supersededAt: null, } const detail = { version, channels: [{ channelCode: 'MASON_TRUCK', channelName: '美森正班海卡', priceModel: 'FBA_WAREHOUSE_RATE' as const, sourceSheetName: '美森正班海卡', estimatedDepartureDate: '2026-08-12', estimatedDepartureText: '8月12日', latestWarehouseEntry: null, vesselName: null, voyageNo: null, referenceTransit: null, surchargeDescription: null, remark: null, }], rates: [{ id: '9007199254740997', channelCode: 'MASON_TRUCK', priceModel: 'FBA_WAREHOUSE_RATE' as const, originWarehouseId: null, originWarehouseCode: 'CN-YIWU-01', originWarehouseName: '义乌仓', destinationType: 'OVERSEAS' as const, destinationCode: 'US-LAX-01', destinationWarehouseId: null, destinationName: '洛杉矶仓', regionCode: null, pricingTaxMode: 'TAX_INCLUDED' as const, chargeUnit: 'KG' as const, weightFromKg: null, unitPrice: '12.5', currency: 'CNY', sourceSheetName: '美森正班海卡', sourceRowNumber: '8', sourceDestinationText: '洛杉矶仓', remark: null, }], issues: [{ severity: 'BLOCKING', issueCode: 'ORIGIN_MAPPING_REQUIRED', message: '起运仓需要映射到平台国内仓', sourceSheetName: '美森正班海卡', sourceRowNumber: '8', sourceCell: null, }], } describe('platform price-book API', () => { beforeEach(() => vi.clearAllMocks()) it('uses the platform price-book list endpoint without customer scope and preserves long ids', async () => { http.get.mockResolvedValue({ data: [version] }) const result = await listPlatformPriceBooks({ status: ' PENDING_CONFIRMATION ' }) expect(http.get).toHaveBeenCalledWith('/platform/v1/fba-pricing/carrier-rates/price-books', { params: { status: 'PENDING_CONFIRMATION' }, }) expect(result[0]).toMatchObject({ id: '9007199254740995', sourceFileId: '9007199254740996', createdBy: '10001', versionNo: 2, rateCount: 42, }) }) it('omits an empty status filter for the complete version history', async () => { http.get.mockResolvedValue({ data: [] }) await listPlatformPriceBooks({ status: ' ' }) expect(http.get).toHaveBeenCalledWith('/platform/v1/fba-pricing/carrier-rates/price-books', { params: {} }) }) it('uploads one workbook, loads its parsed detail, and normalizes parsed rows', async () => { http.post.mockResolvedValue({ data: detail }) http.get.mockResolvedValue({ data: detail }) const file = new File(['book'], 'price-book.xlsx', { type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet' }) const uploadResult = await uploadPlatformPriceBook(file) const detailResult = await getPlatformPriceBook('9007199254740995') expect(http.post).toHaveBeenCalledWith('/platform/v1/fba-pricing/carrier-rates/price-books', expect.any(FormData)) const form = http.post.mock.calls[0][1] as FormData expect(form.get('file')).toBe(file) expect(http.get).toHaveBeenCalledWith('/platform/v1/fba-pricing/carrier-rates/price-books/9007199254740995') expect(uploadResult.rates[0]).toMatchObject({ id: '9007199254740997', unitPrice: 12.5, sourceRowNumber: 8 }) expect(detailResult.issues[0].sourceRowNumber).toBe(8) }) it('publishes only confirmed warehouse mappings and downloads the original workbook', async () => { http.post.mockResolvedValue({ data: detail }) const request = { originMappings: [{ originWarehouseCode: 'CN-YIWU-01', warehouseId: '20001' }], overseasMappings: [{ sourceDestinationName: '洛杉矶仓', warehouseId: '20011' }], } await publishPlatformPriceBook('9007199254740995', request) await downloadPlatformPriceBookSource('9007199254740995') expect(http.post).toHaveBeenCalledWith( '/platform/v1/fba-pricing/carrier-rates/price-books/9007199254740995/publish', request, ) expect(http.get).toHaveBeenCalledWith( '/platform/v1/fba-pricing/carrier-rates/price-books/9007199254740995/source', { responseType: 'blob' }, ) }) })