Files
admin-web/src/modules/inbounds/measurement/InboundMeasurementDialog.test.ts
T
2026-09-04 14:43:34 +08:00

70 lines
3.7 KiB
TypeScript

import { readFileSync } from 'node:fs'
import { resolve } from 'node:path'
import { describe, expect, it } from 'vitest'
const source = readFileSync(resolve(process.cwd(), 'src/modules/inbounds/measurement/InboundMeasurementDialog.vue'), 'utf8')
const panelSource = readFileSync(resolve(process.cwd(), 'src/modules/inbounds/measurement/InboundMeasurementPanel.vue'), 'utf8')
const taskListSource = readFileSync(resolve(process.cwd(), 'src/modules/inbounds/components/InboundTaskList.vue'), 'utf8')
const orderListSource = readFileSync(resolve(process.cwd(), 'src/modules/unified-orders/pages/UnifiedOrdersView.vue'), 'utf8')
describe('InboundMeasurementDialog', () => {
it('owns the complete measurement workspace behind one centered dialog', () => {
expect(source).toContain("import AppDialog from '@/shared/components/AppDialog.vue'")
expect(source).toContain('<AppDialog')
expect(source).toContain('class="inbound-measurement-workspace-dialog"')
expect(source).toContain('width="min(1240px, calc(100vw - 32px))"')
expect(source).toContain('height: 92vh')
expect(source).toContain('padding: 10px 20px')
expect(source).toContain('<WeightOcrPanel')
expect(source).toContain('<InboundMeasurementPanel')
expect(source).toContain('class="measurement-dialog-weight"')
expect(source).not.toContain('class="surface-panel measurement-dialog-weight"')
expect(source).toContain('border-bottom: 1px solid var(--cc-border)')
expect(source).toContain('@summary-changed="handleWeightSummaryChanged"')
expect(source).toContain('measurementPanelRef.value?.updateActualWeights(actualGrossWeightKg, actualNetWeightKg)')
})
it('offers the shared fullscreen control without forcing fullscreen on open', () => {
expect(source).toContain('fullscreenable')
expect(source).not.toContain('default-fullscreen')
expect(source).not.toContain('<el-dialog')
})
it('shows the inbound code once in the dialog title and not as a second body heading', () => {
expect(source).toContain("`测量 · ${props.inboundCode?.trim() || '入仓码待补充'}`")
expect(source).not.toContain('props.inboundCode?.trim() || props.inboundId')
expect(source).toContain(':title="title"')
expect(panelSource).not.toContain('<span>入仓码</span>')
expect(panelSource).not.toContain('<strong>{{ detail.inboundCode')
expect(panelSource).toContain('class="measurement-summary-context"')
})
it('is the only measurement dialog opened by both formal list entries', () => {
for (const entrySource of [taskListSource, orderListSource]) {
expect(entrySource).toContain('<InboundMeasurementDialog')
expect(entrySource).not.toContain('<InboundMeasurementPanel')
expect(entrySource).not.toContain('<WeightOcrPanel')
}
})
it('keeps draft saves open, closes only after submit, and refreshes parent entries consistently', () => {
expect(source).toContain('@saved="handleUpdated"')
expect(source).toContain('@updated="handleUpdated"')
expect(source).toContain('@submitted="handleSubmitted"')
expect(source).toContain("emit('updated')")
expect(source).toContain("emit('update:modelValue', false)")
expect(source).toContain("emit('submitted')")
expect(panelSource).toContain("emit('saved')")
expect(panelSource).toContain("emit('submitted')")
})
it('uses the existing permission-aware panels and protects unsaved work on close', () => {
expect(source).toContain('measurementPanelRef.value?.isDirty')
expect(source).toContain('当前测量数据尚未保存')
expect(source).toContain(':close-on-click-modal="false"')
expect(source).toContain(':before-close="beforeClose"')
expect(source).toContain('measurementPanelRef?.canEdit')
expect(source).toContain('measurementPanelRef?.canSubmit')
})
})