Merge remote-tracking branch 'origin/release/test' into dev
# Conflicts: # src/modules/container-loading/pages/ContainersView.vue
This commit is contained in:
@@ -1,6 +1,9 @@
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { http } from '@/shared/api/http'
|
||||
import {
|
||||
sendTerminalDrayageEmail,
|
||||
getTerminalDrayageEmails,
|
||||
retryTerminalDrayageEmail,
|
||||
getTerminalDrayageHistory,
|
||||
listTerminalDrayages,
|
||||
recordTerminalDrayageEmptyReturn,
|
||||
@@ -26,6 +29,18 @@ const view = {
|
||||
describe('terminal drayages API', () => {
|
||||
beforeEach(() => vi.clearAllMocks())
|
||||
|
||||
it('queues pickup email with version and idempotency and scopes retries to the container', async () => {
|
||||
vi.mocked(http.post).mockResolvedValueOnce({ data: view })
|
||||
await sendTerminalDrayageEmail('9007199254740993', 3)
|
||||
expect(http.post).toHaveBeenCalledWith('/platform/v1/terminal-drayages/9007199254740993/pickup-email',
|
||||
{ expectedVersion: 3 }, { headers: { 'Idempotency-Key': expect.any(String) } })
|
||||
vi.mocked(http.get).mockResolvedValueOnce({ data: { deliveryEnabled: false, records: [{ id: '9007199254740999', status: 'FAILED' }] } })
|
||||
expect((await getTerminalDrayageEmails('9007199254740993')).records[0].id).toBe('9007199254740999')
|
||||
vi.mocked(http.post).mockResolvedValueOnce({ data: null })
|
||||
await retryTerminalDrayageEmail('9007199254740993', '9007199254740999')
|
||||
expect(http.post).toHaveBeenLastCalledWith('/platform/v1/terminal-drayages/9007199254740993/emails/9007199254740999/retry')
|
||||
})
|
||||
|
||||
it('sends repeated container ids and preserves long identifiers as strings', async () => {
|
||||
vi.mocked(http.get).mockResolvedValueOnce({ data: [view] })
|
||||
const result = await listTerminalDrayages(['9007199254740993', '9007199254740994'])
|
||||
|
||||
@@ -1,7 +1,37 @@
|
||||
import { http, unwrapApiResponse, type ApiEnvelope } from '@/shared/api/http'
|
||||
|
||||
export type TerminalDrayageStatus = 'WAITING_FOR_ARRIVAL' | 'ARRIVED' | 'PICKUP_SCHEDULED' | 'PICKED_UP' | 'UNLOADED' | 'EMPTY_RETURNED'
|
||||
export type TerminalDrayageAction = 'SELECT_FLEET' | 'SCHEDULE_PICKUP' | 'RECORD_PICKUP' | 'RECORD_EMPTY_RETURN'
|
||||
export type TerminalDrayageAction = 'SELECT_FLEET' | 'SCHEDULE_PICKUP' | 'RECORD_PICKUP' | 'RECORD_EMPTY_RETURN' | 'SEND_PICKUP_EMAIL'
|
||||
|
||||
export interface TerminalDrayageEmail {
|
||||
id: string
|
||||
fleetName: string
|
||||
recipient: string
|
||||
kind: 'REQUEST_PICKUP' | 'CANCEL_PICKUP'
|
||||
subject: string
|
||||
body: string
|
||||
status: 'PENDING' | 'SENDING' | 'SENT' | 'FAILED'
|
||||
attempts: number
|
||||
failureReason: string | null
|
||||
createdAt: string
|
||||
sentAt: string | null
|
||||
}
|
||||
|
||||
export async function getTerminalDrayageEmails(containerId: string) {
|
||||
type Mailbox = { deliveryEnabled: boolean; records: TerminalDrayageEmail[] }
|
||||
const response = await http.get<ApiEnvelope<Mailbox>, ApiEnvelope<Mailbox>>(`${path}/${encodeURIComponent(containerId)}/emails`)
|
||||
const result = unwrapApiResponse(response)
|
||||
return { ...result, records: result.records.map((mail) => ({ ...mail, id: String(mail.id) })) }
|
||||
}
|
||||
|
||||
export function sendTerminalDrayageEmail(containerId: string, expectedVersion: number) {
|
||||
return command(containerId, 'pickup-email', { expectedVersion })
|
||||
}
|
||||
|
||||
export async function retryTerminalDrayageEmail(containerId: string, mailId: string) {
|
||||
const response = await http.post<ApiEnvelope<null>, ApiEnvelope<null>>(`${path}/${encodeURIComponent(containerId)}/emails/${encodeURIComponent(mailId)}/retry`)
|
||||
unwrapApiResponse(response)
|
||||
}
|
||||
export type EmptyReturnWarningStatus = 'NOT_APPLICABLE' | 'PENDING' | 'OVERDUE' | 'RESOLVED'
|
||||
|
||||
export interface EmptyReturnWarning {
|
||||
|
||||
Reference in New Issue
Block a user