This commit is contained in:
2026-08-20 09:10:36 +08:00
parent 033b5df6b6
commit 508f76924e
58 changed files with 1790 additions and 628 deletions
+35 -22
View File
@@ -4,50 +4,63 @@ import { describe, expect, it } from 'vitest'
const read = (path: string) => readFileSync(resolve(process.cwd(), `src/modules/overseas-business/${path}`), 'utf8')
describe('overseas business pending contract pages', () => {
describe('overseas business real contract pages', () => {
it('keeps operation columns first and renders no sample records', () => {
const purchase = read('pages/PurchaseOrdersView.vue')
const transport = read('pages/TransportOrdersView.vue')
const purchaseColumns = purchase.slice(purchase.indexOf('const columns'))
const transportColumns = transport.slice(transport.indexOf('const baseColumns'))
const truckColumns = transport.slice(transport.indexOf('const truckColumns'))
const looseboardColumns = transport.slice(transport.indexOf('const looseboardColumns'))
expect(purchaseColumns.indexOf("key: 'actions'")).toBeLessThan(purchaseColumns.indexOf("key: 'orderNo'"))
expect(transportColumns.indexOf("key: 'actions'")).toBeLessThan(transportColumns.indexOf("key: 'orderNo'"))
expect(purchase).toContain('const rows = ref<OverseasPurchaseOrder[]>([])')
expect(truckColumns.indexOf("key: 'actions'")).toBeLessThan(truckColumns.indexOf("key: 'orderNo'"))
expect(looseboardColumns.indexOf("key: 'actions'")).toBeLessThan(looseboardColumns.indexOf("key: 'orderNo'"))
expect(purchase).toContain('const rows = ref<OverseasPurchaseSummary[]>([])')
expect(transport).toContain('const rows = ref<Array<LocalTransportOrder | LocalLooseboardOrder>>([])')
expect(`${purchase}${transport}`).not.toMatch(/OPO\d|TK\d|LB\d/)
})
it('gives every formal list a stable query preference key without sharing transport preferences', () => {
it('gives every formal list a stable query preference key', () => {
const purchase = read('pages/PurchaseOrdersView.vue')
const transport = read('pages/TransportOrdersView.vue')
const purchaseToolbar = purchase.match(/<QueryToolbar[^>]*\/>/)?.[0]
const transportToolbar = transport.match(/<QueryToolbar[^>]*\/>/)?.[0]
expect(purchaseToolbar).toContain('preference-key="overseas-business-purchases-query"')
expect(transportToolbar).toContain(':preference-key="queryPreferenceKey"')
expect(purchase.match(/<QueryToolbar[^>]*\/>/)?.[0]).toContain('preference-key="overseas-business-purchases-query"')
expect(transport.match(/<QueryToolbar[^>]*\/>/)?.[0]).toContain(':preference-key="queryPreferenceKey"')
expect(transport).toContain("'overseas-business-truck-query'")
expect(transport).toContain("'overseas-business-looseboard-query'")
})
it('does not invent an overseas endpoint or success fallback', () => {
const apiContract = read('api/contracts.ts')
const allPages = ['PurchaseOrdersView.vue', 'PurchaseOrderDetailView.vue', 'PurchaseOrderEditView.vue', 'TransportOrdersView.vue', 'TransportOrderFormView.vue']
.map((file) => read(`pages/${file}`)).join('\n')
expect(apiContract).not.toContain("from '@/shared/api/http'")
expect(apiContract).not.toMatch(/\/platform\/v1|\/overseas\/v1|axios\.create/)
expect(allPages).not.toMatch(/ElMessage\.success|模拟成功|提交成功/)
expect(allPages).toContain('海外区域写端点待冻结')
expect(allPages).toContain('海外区域更新端点待冻结')
it('loads procurement list/detail and saves only the backend update contract', () => {
const list = read('pages/PurchaseOrdersView.vue')
const detail = read('pages/PurchaseOrderDetailView.vue')
const edit = read('pages/PurchaseOrderEditView.vue')
expect(list).toContain('listOverseasPurchases')
expect(list).toContain("query: { customerId: row.customerId }")
expect(detail).toContain('getOverseasPurchase(purchaseId.value, customerId.value)')
expect(edit).toContain('updateOverseasPurchase(purchaseId.value, customerId.value, payload)')
expect(edit).toContain('inboundQuantity: inboundEditable.value ? form.inboundQuantity : undefined')
expect(edit).toContain("form.status === 'APPROVED'")
expect(edit).not.toMatch(/payload[^\n]*(outboundQuantity|status):/)
expect(`${list}${detail}${edit}`).toContain('LoadErrorState')
})
it('keeps prototype-backed forms as routes with validation and unsaved-work registration', () => {
it('loads truck list/detail but keeps unsupported writes and looseboard blocked', () => {
const list = read('pages/TransportOrdersView.vue')
const form = read('pages/TransportOrderFormView.vue')
expect(list).toContain('listUsTruckOrders')
expect(list).toContain("query: { customerId: row.customerId }")
expect(form).toContain('getUsTruckOrder(orderId.value, customerId.value)')
expect(form).not.toMatch(/createUsTruck|updateUsTruck/)
expect(form).toContain('平台创建/普通编辑端点待后端补齐')
expect(list).toContain('本土散板接口待后端补齐')
expect(form).toContain('disabled><Save')
})
it('keeps unsaved-work protection on both prototype-backed forms', () => {
const purchaseEdit = read('pages/PurchaseOrderEditView.vue')
const transportForm = read('pages/TransportOrderFormView.vue')
expect(purchaseEdit).toContain('useUnsavedWorkRegistration')
expect(purchaseEdit).toContain('出库量不能大于入库量')
expect(purchaseEdit).toContain(':min="form.outboundQuantity"')
expect(transportForm).toContain('useUnsavedWorkRegistration')
expect(transportForm).toContain("message: '请输入起运地'")
expect(transportForm).toContain("message: '请输入目的地'")
expect(transportForm).toContain('disabled><Save')
})
})