| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- import assert from 'node:assert/strict'
- import { readFile } from 'node:fs/promises'
- import test from 'node:test'
- import { ensureUniqueSubsystemRouteNames } from '../src/router/routeNameUtils.js'
- const page = () => readFile('src/views/subSystem/alarm/common/audit.vue', 'utf8')
- test('shared audit page requires a decision but leaves the opinion optional with a length limit', async () => {
- const source = await page()
- assert.ok(source.includes("item.key !== 'UNREVIEWED'"))
- assert.ok(source.includes('v-for="item in reviewChoices"'))
- assert.ok(source.includes("auditStatus: [{ required: true, message: '请选择核实结果'"))
- assert.ok(source.includes("opinion: [{ max: 500, message: '核实意见最多500字', trigger: 'blur' }]"))
- assert.ok(source.includes('placeholder="选填,可填写核实情况、判定依据或误报原因"'))
- assert.ok(!source.includes('请填写审核意见'))
- assert.ok(source.includes('auditStatus: undefined'))
- assert.ok(source.includes('await formRef.value.validate()'))
- assert.ok(!source.includes('auditAction'))
- })
- test('closing the review skips discard confirmation and still protects active requests', async () => {
- const source = await page()
- assert.ok(source.includes(':before-close="closeReview"'))
- assert.ok(source.includes('@click="closeReview()"'))
- assert.ok(source.includes('reviewVisible.value = false'))
- assert.ok(source.includes("if (submitting.value || uploading.value) { ElMessage.warning('请等待上传或提交完成'); return false }"))
- assert.ok(!source.includes('ElMessageBox'))
- assert.ok(!source.includes('放弃本次审核'))
- assert.ok(!source.includes('const dirty'))
- })
- test('queue and statistics use shared REST endpoints with subsystem scope and server paging', async () => {
- const source = await page()
- const api = await readFile('src/api/alarmReview.js', 'utf8')
- for (const path of ['/api/alarm/reviews', '/api/alarm/reviews/statistics']) assert.ok(api.includes(path))
- assert.ok(source.includes('route.query.rootTypeId'))
- assert.ok(source.includes('route.query.warning_code'))
- assert.ok(source.includes('pageNum: pageNum.value, pageSize: pageSize.value'))
- assert.ok(source.includes('row.auditStatus === unreviewed.value'))
- assert.ok(!source.includes('仅展示未处理报警'))
- assert.ok(!source.includes('list-note'))
- })
- test('list omits numeric snapshots and shared detail guards alarms without an actual value', async () => {
- const source = await page()
- const summary = await readFile('src/views/subSystem/alarm/AlarmSummary.vue', 'utf8')
- assert.ok(!source.includes('row.actualValue'))
- assert.ok(summary.includes('<p v-if="hasActualValue(alarm)">实际值:'))
- })
- test('search card uses symmetric vertical padding without trailing form margins', async () => {
- const source = await page()
- assert.ok(source.includes('.search-card :deep(.el-card__body){padding:16px 20px}'))
- assert.ok(source.includes('.search-form :deep(.el-form-item){margin:0}'))
- assert.ok(source.includes('gap:12px 24px;margin:0'))
- })
- test('timeline renders thumbnails with teleported full-size image preview', async () => {
- const source = await page()
- const attachments = await readFile('src/views/subSystem/alarm/AlarmAttachments.vue', 'utf8')
- const history = await readFile('src/views/subSystem/alarm/AlarmHistory.vue', 'utf8')
- assert.ok(source.includes('<AlarmHistory :records="logs"'))
- assert.ok(history.includes('<AlarmAttachments v-if="item.attachUrl"'))
- assert.ok(attachments.includes(':preview-src-list="previewUrls"'))
- assert.ok(attachments.includes(':initial-index="index"'))
- assert.ok(attachments.includes('preview-teleported'))
- assert.ok(attachments.includes('images.value.map(file => file.url)'))
- assert.ok(!attachments.includes('<el-link'))
- assert.ok(attachments.includes('width: 96px; height: 72px;'))
- assert.ok(source.includes('accept=".jpg,.jpeg,.png"'))
- assert.ok(!source.includes('PDF'))
- assert.ok(!source.includes('|pdf'))
- })
- test('shared alarm detail navigates to authorized audit and supply map no longer implements auditing', async () => {
- const ledger = await readFile('src/views/subSystem/waterSupply/alarm/alarmGIS.vue','utf8')
- const detail = await readFile('src/views/subSystem/alarm/AlarmDetail.vue','utf8')
- assert.ok(detail.includes("navigate('alarmAudit'"))
- assert.ok(!ledger.includes("mode === 'manage'"))
- assert.ok(!ledger.includes('submitAudit'))
- assert.ok(!ledger.includes('auditOrderStatCards'))
- const api = await readFile('src/api/pipeNetwork/waterSupply.js','utf8')
- assert.ok(!api.includes('/waterSupply/alarm/audit'))
- })
- test('four identical relative alarmAudit paths retain unique router names', () => {
- const routes = ensureUniqueSubsystemRouteNames(['waterSupply','drainage','gas','manholeCover'].map(name => ({
- path: '/subSystem/' + name, children: [{path:'alarmAudit',name:'AlarmAudit'}]
- })))
- assert.equal(new Set(routes.map(route => route.children[0].name)).size,4)
- })
|