fix(admin): stabilize released booking association
This commit is contained in:
@@ -1,10 +1,24 @@
|
||||
import { describe, expect, it } from 'vitest'
|
||||
import ElementPlus from 'element-plus'
|
||||
import { flushPromises, mount } from '@vue/test-utils'
|
||||
import { beforeEach, describe, expect, it, vi } from 'vitest'
|
||||
import { readFileSync } from 'node:fs'
|
||||
import { resolve } from 'node:path'
|
||||
import OceanBookingsView from './OceanBookingsView.vue'
|
||||
import { listOceanBookings } from '../api/platformOceanBookings'
|
||||
|
||||
const routerPush = vi.hoisted(() => vi.fn())
|
||||
vi.mock('vue-router', () => ({ useRouter: () => ({ push: routerPush }) }))
|
||||
vi.mock('@/core/access/accessPreview', () => ({ useAccessPreviewStore: () => ({ can: () => true }) }))
|
||||
vi.mock('@/modules/iam', () => ({ listPlatformTenants: vi.fn().mockResolvedValue({ records: [] }) }))
|
||||
vi.mock('../api/platformOceanBookings', () => ({ listOceanBookings: vi.fn() }))
|
||||
|
||||
const source = readFileSync(resolve(process.cwd(), 'src/modules/ocean-bookings/pages/OceanBookingsView.vue'), 'utf8')
|
||||
|
||||
describe('OceanBookingsView', () => {
|
||||
beforeEach(() => {
|
||||
vi.clearAllMocks()
|
||||
vi.mocked(listOceanBookings).mockResolvedValue({ records: [], page: 1, size: 20, total: 0, pages: 0 })
|
||||
})
|
||||
it('keeps the operation column first and left fixed', () => {
|
||||
expect(source.indexOf("key: 'actions'")).toBeLessThan(source.indexOf("prop: 'bookingNo'"))
|
||||
expect(source).toContain("fixed: 'left'")
|
||||
@@ -41,6 +55,24 @@ describe('OceanBookingsView', () => {
|
||||
}
|
||||
})
|
||||
|
||||
it('displays the server containerCount as the booking requirement total without detail N+1', async () => {
|
||||
vi.mocked(listOceanBookings).mockResolvedValueOnce({ records: [{
|
||||
id: '183', bookingNo: 'OB-260825-0183', status: 'RELEASED', containerCount: 1,
|
||||
customerName: '回归客户', vesselName: null, voyageNo: null, etd: null, eta: null, updatedAt: null,
|
||||
}], page: 1, size: 20, total: 1, pages: 1 } as never)
|
||||
const wrapper = mount(OceanBookingsView, { global: { plugins: [ElementPlus] } })
|
||||
|
||||
await (wrapper.vm as unknown as { load: () => Promise<void> }).load()
|
||||
await flushPromises()
|
||||
|
||||
const tableText = wrapper.find('.el-table__body-wrapper').text()
|
||||
expect(tableText).toContain('OB-260825-0183')
|
||||
expect(tableText).toContain('1')
|
||||
expect(source).toContain("label: '订舱柜量'")
|
||||
expect(source).not.toContain('getOceanBooking')
|
||||
wrapper.unmount()
|
||||
})
|
||||
|
||||
it('loads active customers by name and stays usable on narrow screens', () => {
|
||||
expect(source).toContain("listPlatformTenants({ page: 1, size: 200, status: 'ACTIVE' })")
|
||||
expect(source).toContain('label: customer.tenantName')
|
||||
|
||||
@@ -41,7 +41,7 @@ const columns = [
|
||||
{ prop: 'billOfLadingNo', label: '提单号', minWidth: 155, formatter: (row: OceanBookingResource) => row.billOfLadingNo || '—' },
|
||||
{ prop: 'shipperName', label: '提单发货人', minWidth: 160, formatter: (row: OceanBookingResource) => row.shipperName || '—' },
|
||||
{ prop: 'consigneeName', label: '提单收货人', minWidth: 160, formatter: (row: OceanBookingResource) => row.consigneeName || '—' },
|
||||
{ prop: 'containerCount', label: '柜量', width: 90, align: 'right' },
|
||||
{ prop: 'containerCount', label: '订舱柜量', width: 100, align: 'right' },
|
||||
{ prop: 'carrierName', label: '船公司', minWidth: 130 },
|
||||
{ prop: 'bookingAgent', label: '订舱代理', minWidth: 140 },
|
||||
{ prop: 'vesselName', label: '船名 / 航次', minWidth: 175, slotName: 'vessel' },
|
||||
|
||||
Reference in New Issue
Block a user