2026-08-13 11:57:44 +08:00
|
|
|
import { describe, expect, it } from 'vitest'
|
|
|
|
|
import { readFileSync } from 'node:fs'
|
|
|
|
|
import { resolve } from 'node:path'
|
|
|
|
|
|
|
|
|
|
const source = readFileSync(resolve(process.cwd(), 'src/modules/suppliers/pages/SuppliersView.vue'), 'utf8')
|
|
|
|
|
const formSource = readFileSync(resolve(process.cwd(), 'src/modules/suppliers/pages/SupplierFormView.vue'), 'utf8')
|
|
|
|
|
const detailSource = readFileSync(resolve(process.cwd(), 'src/modules/suppliers/pages/SupplierDetailView.vue'), 'utf8')
|
|
|
|
|
const routesSource = readFileSync(resolve(process.cwd(), 'src/modules/suppliers/routes.ts'), 'utf8')
|
|
|
|
|
|
|
|
|
|
describe('supplier formal pages', () => {
|
|
|
|
|
it('keeps actions first and fixed left while guarding all operations with backend permissions', () => {
|
|
|
|
|
expect(source).toContain("{ key: 'actions', label: '操作', width: 260, fixed: 'left'")
|
|
|
|
|
expect(source).toContain("access.can('platform:supplier:create')")
|
|
|
|
|
expect(source).toContain("access.can('platform:supplier:edit')")
|
|
|
|
|
expect(source).toContain("access.can('platform:supplier:status')")
|
|
|
|
|
expect(source).toContain("access.can('platform:supplier:list')")
|
2026-08-14 14:27:03 +08:00
|
|
|
expect(source).toContain('<el-button size="small" plain type="primary" @click="router.push')
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it('matches the prototype statistics, category tabs and search sequence', () => {
|
|
|
|
|
expect(source).toContain('class="supplier-list-top"')
|
|
|
|
|
expect(source).toContain('class="supplier-query-panel"')
|
|
|
|
|
expect(source).toContain('class="supplier-query-toolbar"')
|
|
|
|
|
expect(source).toContain('grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 12px')
|
2026-08-17 16:45:46 +08:00
|
|
|
expect(source).not.toContain('订舱范围')
|
|
|
|
|
expect(source).not.toContain('国内/国外')
|
|
|
|
|
expect(formSource).not.toContain('form.scope')
|
|
|
|
|
expect(formSource).not.toContain('prop="scope"')
|
|
|
|
|
expect(detailSource).not.toContain('国内/国外')
|
2026-08-13 11:57:44 +08:00
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it('uses independent routes for list, detail, create and edit', () => {
|
|
|
|
|
expect(routesSource).toContain("path: 'suppliers/new'")
|
|
|
|
|
expect(routesSource).toContain("path: 'suppliers/:id'")
|
|
|
|
|
expect(routesSource).toContain("path: 'suppliers/:id/edit'")
|
|
|
|
|
expect(routesSource).toContain("permission: 'platform:supplier:create'")
|
|
|
|
|
expect(routesSource).toContain("permission: 'platform:supplier:edit'")
|
|
|
|
|
expect(routesSource).toContain("permission: 'platform:supplier:list'")
|
|
|
|
|
expect(routesSource).not.toContain('platform:supplier:view')
|
|
|
|
|
expect(detailSource).toContain('供应商详情')
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
it('does not simulate supplier data or license upload and retains API errors', () => {
|
|
|
|
|
expect(source).not.toContain('supplierData')
|
|
|
|
|
expect(formSource).not.toContain('type="file"')
|
|
|
|
|
expect(formSource).toContain('平台公共供应商资质上传接口尚未提供')
|
|
|
|
|
expect(formSource).toContain('<ApiErrorMeta')
|
|
|
|
|
expect(detailSource).toContain('<ApiErrorMeta')
|
|
|
|
|
})
|
2026-08-14 14:27:03 +08:00
|
|
|
|
|
|
|
|
it('reloads detail data when the reused route id changes and protects the newer request', () => {
|
|
|
|
|
expect(detailSource).toContain("watch(supplierId, () => { void load() }, { immediate: true })")
|
|
|
|
|
expect(detailSource).toContain('const requestedId = supplierId.value')
|
|
|
|
|
expect(detailSource).toContain('if (sequence !== loadSequence || requestedId !== supplierId.value) return')
|
|
|
|
|
expect(detailSource).toContain("params: { id: supplier.id }")
|
|
|
|
|
})
|
2026-08-13 11:57:44 +08:00
|
|
|
})
|