import { describe, expect, it, vi } from 'vitest' import { createOceanBooking, listOceanBookings, performOceanBookingAction, requestOceanBookingChange } from './platformOceanBookings' import { http } from '@/shared/api/http' const detailResponse = (version = 0) => ({ oceanBooking: { id: 123, bookingNo: 'OB123', status: 'DRAFT', version, customerId: 456, customerName: '客户', containers: [], }, parties: [], containerRequirements: [], containerAllocations: [], histories: [], }) describe('ocean bookings api', () => { it('normalizes pagination and long ids', async () => { vi.spyOn(http, 'get').mockResolvedValueOnce({ code: '200', message: 'ok', data: { records: [{ id: 123, customerId: 456, containers: [] }], page: '2', size: '20', total: '21', pages: '2' } }) const result = await listOceanBookings({ page: 1, size: 10 }) expect(result.page).toBe(2) expect(result.total).toBe(21) expect(result.records[0]?.id).toBe('123') expect(result.records[0]?.customerId).toBe('456') }) it('uses version zero for create and extracts the id from the returned Detail', async () => { const post = vi.spyOn(http, 'post').mockResolvedValue({ code: '200', message: 'ok', data: detailResponse() }) const created = await createOceanBooking({ expectedVersion: 0, data: { customerId: '456', customerName: '客户', parties: [], containerRequirements: [] } }) expect(post.mock.calls[0]?.[1]).toMatchObject({ expectedVersion: 0 }) expect(post.mock.calls[0]?.[2]).toMatchObject({ headers: { 'Idempotency-Key': expect.any(String) } }) expect(created.id).toBe('123') expect(created.version).toBe(0) }) it('uses action and change-specific request contracts', async () => { const post = vi.spyOn(http, 'post').mockResolvedValue({ code: '200', message: 'ok', data: detailResponse(4) }) await performOceanBookingAction('123', 'confirm', { expectedVersion: 3, reason: 'ok' }) expect(post.mock.calls[0]?.[0]).toContain('/123/confirm') expect(post.mock.calls[0]?.[1]).toEqual({ expectedVersion: 3, reason: 'ok' }) await requestOceanBookingChange('123', { expectedVersion: 4, vesselName: 'VESSEL', voyageNo: 'V001', reason: '调整船期' }) expect(post.mock.calls[1]?.[0]).toContain('/123/change-request') expect(post.mock.calls[1]?.[1]).toMatchObject({ expectedVersion: 4, vesselName: 'VESSEL', voyageNo: 'V001', reason: '调整船期' }) }) })