2026-07-31 13:43:16 +08:00
|
|
|
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
2026-08-03 18:49:18 +08:00
|
|
|
import { http } from '@/shared/api/http'
|
2026-07-31 13:43:16 +08:00
|
|
|
import {
|
|
|
|
|
acceptPlatformFirstLegOrder,
|
|
|
|
|
addPlatformFirstLegOrderNote,
|
|
|
|
|
approvePlatformFirstLegOrder,
|
|
|
|
|
cancelPlatformFirstLegOrder,
|
|
|
|
|
completePlatformFirstLegOrder,
|
|
|
|
|
getPlatformFirstLegOrder,
|
|
|
|
|
listPlatformFirstLegOrders,
|
|
|
|
|
startPlatformFirstLegOrder,
|
|
|
|
|
updatePlatformFirstLegOrderExpress,
|
|
|
|
|
} from './platformFirstLegOrders'
|
|
|
|
|
|
2026-08-03 18:49:18 +08:00
|
|
|
vi.mock('@/shared/api/http', () => ({
|
2026-07-31 13:43:16 +08:00
|
|
|
http: { get: vi.fn(), post: vi.fn(), put: vi.fn() },
|
|
|
|
|
unwrapApiResponse: <T>(response: { data: T }) => response.data,
|
|
|
|
|
}))
|
|
|
|
|
|
|
|
|
|
describe('platform first-leg order API', () => {
|
|
|
|
|
beforeEach(() => {
|
|
|
|
|
vi.mocked(http.get).mockReset()
|
|
|
|
|
vi.mocked(http.post).mockReset()
|
|
|
|
|
vi.mocked(http.put).mockReset()
|
|
|
|
|
})
|
|
|
|
|
|
2026-08-04 12:57:50 +08:00
|
|
|
it('queries the cross-tenant review queue with one server-paginated request', async () => {
|
2026-07-31 13:43:16 +08:00
|
|
|
const page = { records: [], page: 2, size: 20, total: 0, pages: 0 }
|
2026-08-01 12:17:33 +08:00
|
|
|
vi.mocked(http.get).mockResolvedValue({ code: '200', message: 'success', data: page })
|
2026-07-31 13:43:16 +08:00
|
|
|
|
2026-08-04 12:57:50 +08:00
|
|
|
await expect(listPlatformFirstLegOrders({
|
2026-07-31 13:43:16 +08:00
|
|
|
keyword: 'FL2026', status: 'SUBMITTED', createdFrom: '2026-07-01T00:00:00', createdTo: '2026-07-31T23:59:59', page: 2, size: 20,
|
|
|
|
|
})).resolves.toEqual(page)
|
|
|
|
|
expect(http.get).toHaveBeenCalledWith('/platform/v1/orders/first-leg', {
|
|
|
|
|
params: {
|
2026-08-04 12:57:50 +08:00
|
|
|
keyword: 'FL2026', status: 'SUBMITTED', createdFrom: '2026-07-01T00:00:00', createdTo: '2026-07-31T23:59:59', page: 2, size: 20,
|
2026-07-31 13:43:16 +08:00
|
|
|
},
|
|
|
|
|
})
|
2026-08-04 12:57:50 +08:00
|
|
|
expect(http.get).toHaveBeenCalledTimes(1)
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it('adds the optional enterprise filter without changing server pagination', async () => {
|
|
|
|
|
const page = { records: [], page: 1, size: 20, total: 0, pages: 0 }
|
|
|
|
|
vi.mocked(http.get).mockResolvedValue({ code: '200', message: 'success', data: page })
|
|
|
|
|
|
|
|
|
|
await listPlatformFirstLegOrders({ tenantId: '2084455952401629185', status: 'SUBMITTED', page: 1, size: 20 })
|
|
|
|
|
|
|
|
|
|
expect(http.get).toHaveBeenCalledWith('/platform/v1/orders/first-leg', {
|
|
|
|
|
params: { tenantId: '2084455952401629185', status: 'SUBMITTED', page: 1, size: 20 },
|
|
|
|
|
})
|
2026-07-31 13:43:16 +08:00
|
|
|
})
|
|
|
|
|
|
2026-08-04 13:32:08 +08:00
|
|
|
it('normalizes string pagination fields returned by the gateway', async () => {
|
|
|
|
|
vi.mocked(http.get).mockResolvedValue({
|
|
|
|
|
code: '200',
|
|
|
|
|
message: 'success',
|
|
|
|
|
data: { records: [], page: '1', size: '20', total: '6', pages: '1' },
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
await expect(listPlatformFirstLegOrders({ status: 'SUBMITTED', page: 1, size: 20 })).resolves.toMatchObject({
|
|
|
|
|
page: 1,
|
|
|
|
|
size: 20,
|
|
|
|
|
total: 6,
|
|
|
|
|
pages: 1,
|
|
|
|
|
})
|
|
|
|
|
})
|
|
|
|
|
|
2026-07-31 13:43:16 +08:00
|
|
|
it('uses the platform lifecycle routes and target tenant query parameter', async () => {
|
2026-08-01 12:17:33 +08:00
|
|
|
vi.mocked(http.get).mockResolvedValue({ code: '200', message: 'success', data: { order: {} } })
|
|
|
|
|
vi.mocked(http.post).mockResolvedValue({ code: '200', message: 'success', data: null })
|
2026-07-31 13:43:16 +08:00
|
|
|
|
|
|
|
|
await getPlatformFirstLegOrder('10001', '90001')
|
|
|
|
|
await approvePlatformFirstLegOrder('10001', '90001')
|
|
|
|
|
await acceptPlatformFirstLegOrder('10001', '90001')
|
|
|
|
|
await startPlatformFirstLegOrder('10001', '90001')
|
|
|
|
|
await completePlatformFirstLegOrder('10001', '90001')
|
|
|
|
|
await cancelPlatformFirstLegOrder('10001', '90001', '客户取消')
|
|
|
|
|
await addPlatformFirstLegOrderNote('10001', '90001', '已联系客户确认')
|
|
|
|
|
|
|
|
|
|
expect(http.get).toHaveBeenCalledWith('/platform/v1/orders/first-leg/90001', { params: { tenantId: '10001' } })
|
|
|
|
|
expect(http.post).toHaveBeenNthCalledWith(1, '/platform/v1/orders/first-leg/90001/approve', undefined, { params: { tenantId: '10001' } })
|
|
|
|
|
expect(http.post).toHaveBeenNthCalledWith(2, '/platform/v1/orders/first-leg/90001/accept', undefined, { params: { tenantId: '10001' } })
|
|
|
|
|
expect(http.post).toHaveBeenNthCalledWith(3, '/platform/v1/orders/first-leg/90001/start', undefined, { params: { tenantId: '10001' } })
|
|
|
|
|
expect(http.post).toHaveBeenNthCalledWith(4, '/platform/v1/orders/first-leg/90001/complete', undefined, { params: { tenantId: '10001' } })
|
|
|
|
|
expect(http.post).toHaveBeenNthCalledWith(5, '/platform/v1/orders/first-leg/90001/cancel', { reason: '客户取消' }, { params: { tenantId: '10001' } })
|
|
|
|
|
expect(http.post).toHaveBeenNthCalledWith(6, '/platform/v1/orders/first-leg/90001/internal-notes', { content: '已联系客户确认' }, { params: { tenantId: '10001' } })
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it('writes the backend express contract as names, not a guessed master-data ID', async () => {
|
2026-08-01 12:17:33 +08:00
|
|
|
vi.mocked(http.put).mockResolvedValue({ code: '200', message: 'success', data: null })
|
2026-07-31 13:43:16 +08:00
|
|
|
|
|
|
|
|
await updatePlatformFirstLegOrderExpress('10001', '90001', { expressCompany: '顺丰速运', expressTrackingNo: 'SF123456' })
|
|
|
|
|
expect(http.put).toHaveBeenCalledWith(
|
|
|
|
|
'/platform/v1/orders/first-leg/90001/express',
|
|
|
|
|
{ expressCompany: '顺丰速运', expressTrackingNo: 'SF123456' },
|
|
|
|
|
{ params: { tenantId: '10001' } },
|
|
|
|
|
)
|
|
|
|
|
})
|
|
|
|
|
})
|