test-mp-crm-quote-dom.mjs 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import assert from 'node:assert/strict'
  2. import { readFile } from 'node:fs/promises'
  3. const root = new URL('../src/views/m/crm/quote/', import.meta.url)
  4. const list = await readFile(new URL('MpQuoteList.vue', root), 'utf8')
  5. const detail = await readFile(new URL('detail.vue', root), 'utf8')
  6. const form = await readFile(new URL('form.vue', root), 'utf8')
  7. const quoteScss = await readFile(new URL('quote.scss', root), 'utf8')
  8. assert.match(list, /<MpBusinessHeader/, '报价列表须用 MpBusinessHeader')
  9. assert.match(list, /van-tabs/, '报价列表须有状态 Tab')
  10. assert.match(list, /van-dropdown-menu/, '报价列表须用三栏筛选')
  11. assert.match(list, /mp-quote-list-card/, '报价列表须用扁平卡')
  12. assert.match(list, /更多字段/, '报价卡须提供更多字段展开')
  13. assert.doesNotMatch(list, /MpExpenseCard/, '报价列表不得再使用 MpExpenseCard')
  14. assert.doesNotMatch(list, /MpStatusTabs/, '报价列表不得再使用 MpStatusTabs')
  15. assert.doesNotMatch(list, /MpThreeColumnFilters/, '报价列表不得再使用 MpThreeColumnFilters')
  16. assert.match(list, /mode === 'manage'/, 'Speed Dial 必须只在管理入口出现')
  17. assert.match(list, /提交审批/, '管理草稿卡必须提供提交审批入口')
  18. assert.match(list, /驳回/, '待审批卡必须提供驳回入口')
  19. assert.match(list, /openDetailAction/, '列表动作必须复用详情状态机')
  20. assert.match(
  21. list,
  22. /pendingApprovalUserId|buildQuoteListQuery/,
  23. '审批入口必须保留当前用户待审批过滤'
  24. )
  25. assert.match(list, /approvedByUserId|buildQuoteListQuery/, '审批入口必须保留当前用户已审批过滤')
  26. assert.match(list, /useIntersectionObserver/, '报价列表须滚动加载')
  27. assert.doesNotMatch(list, /加载更多/, '报价列表不得使用加载更多按钮')
  28. assert.match(list, /mp-wv-card-actions--single/, '单按钮卡片不得撑满整行')
  29. assert.match(list, /van-date-picker/, '更多筛选日期须用 Vant 日期')
  30. assert.match(detail, /title="报价单详情"/, '详情顶栏必须使用固定标题')
  31. assert.doesNotMatch(detail, /\{\{\s*headerTitle\s*\}\}/, '详情顶栏不得使用记录标题')
  32. assert.doesNotMatch(detail, /mp-wv-header__sub/, '详情顶栏不得展示副标题')
  33. assert.match(detail, /class="mp-quote-detail-tabs"/, '详情必须提供业务 Tab')
  34. assert.match(detail, /<van-tabs/, '详情 Tab 须为 van-tabs')
  35. assert.match(detail, /<MpApprovalTimeline/, '审批信息必须使用共用时间轴')
  36. assert.match(detail, /<MpAttachmentGrid/, '附件必须使用 72×72 共用宫格')
  37. assert.match(detail, /mp-wv-fab-bar[\s\S]*mp-wv-touch-target/, '详情底栏按钮必须使用 44px 触达类')
  38. assert.match(detail, /onAnchorTab/, '详情 Tab 须为锚点')
  39. assert.match(detail, /--mp-quote-anchor-offset/, '详情锚点须避开吸顶 Tab')
  40. assert.match(detail, /mp-quote-approve-sheet/, '通过/驳回须使用审批弹层')
  41. assert.match(detail, /left-text="关闭"/, '审批弹层顶栏只保留关闭')
  42. assert.match(
  43. quoteScss,
  44. /\.mp-quote-approve-sheet__foot \.van-button[\s\S]*min-height: 30px/,
  45. '审批确认按钮上下内间距减半后高 30px'
  46. )
  47. assert.match(quoteScss, /#0a9f6d/, '审批弹层主色须为三墙绿')
  48. assert.doesNotMatch(detail, /#10b981/, '审批详情不得使用 Fresh Mint 主色')
  49. assert.match(detail, /返回报价单审批/, '审批入口返回文案须指向审批列表')
  50. assert.match(detail, /别名/, '详情产品须含别名')
  51. assert.match(quoteScss, /\.mp-quote-detail-page \.mp-wv-fab-bar[\s\S]*position: fixed/, '详情底栏须固定')
  52. assert.match(quoteScss, /\.mp-quote-form-footer[\s\S]*position: fixed/, '表单底栏须固定')
  53. assert.match(detail, /showCrmConfirmDialog/, '详情确认须走 CRM 确认弹窗')
  54. assert.match(detail, /kind: 'danger'/, '删除/驳回须危险确认语义')
  55. assert.match(form, /<MpBusinessHeader/, '表单外壳须用 MpBusinessHeader')
  56. console.log('quote DOM contract: PASS')