device-quality-model.test.mjs 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. import test from 'node:test'
  2. import assert from 'node:assert/strict'
  3. import {
  4. canBootstrapOrRevise,
  5. canEditIssues,
  6. canPublish,
  7. canReviewIssues,
  8. canRun,
  9. dueState,
  10. evidenceSummary,
  11. formatPassRate,
  12. formatScore,
  13. issueStatusLabel,
  14. policyStatusLabel,
  15. priorityLabel,
  16. recurrenceLabel,
  17. resultStatusLabel,
  18. ruleLabel,
  19. severityLabel,
  20. timelineActionLabel
  21. } from '../src/views/dataGovernance/development/deviceQualityModel.js'
  22. test('separates policy editing, publishing and execution permissions', () => {
  23. assert.equal(canBootstrapOrRevise(['device-quality:edit']), true)
  24. assert.equal(canBootstrapOrRevise(['device-quality:execute']), false)
  25. assert.equal(canPublish(['device-quality:publish']), true)
  26. assert.equal(canPublish(['device-quality:edit']), false)
  27. assert.equal(canRun(['device-quality:execute']), true)
  28. assert.equal(canRun(['governance:read']), false)
  29. })
  30. test('separates quality issue editing and independent review permissions', () => {
  31. assert.equal(canEditIssues(['quality-issues:edit']), true)
  32. assert.equal(canEditIssues(['governance:read']), false)
  33. assert.equal(canReviewIssues(['quality-issues:review']), true)
  34. assert.equal(canReviewIssues(['quality-issues:edit']), false)
  35. })
  36. test('presents issue lifecycle, recurrence and overdue state', () => {
  37. assert.equal(issueStatusLabel('pending_review'), '待复核')
  38. assert.equal(priorityLabel('critical'), '紧急')
  39. assert.equal(timelineActionLabel('reopened'), '重新打开')
  40. assert.equal(recurrenceLabel(1), '首次发生')
  41. assert.equal(recurrenceLabel(3), '第 3 次发生')
  42. assert.equal(dueState({
  43. status: 'in_progress',
  44. due_at: '2026-07-29T09:00:00Z'
  45. }, new Date('2026-07-29T10:00:00Z')), 'overdue')
  46. assert.equal(dueState({
  47. status: 'closed',
  48. due_at: '2026-07-29T09:00:00Z'
  49. }, new Date('2026-07-29T10:00:00Z')), 'normal')
  50. })
  51. test('presents governed policy and result labels', () => {
  52. assert.equal(policyStatusLabel('draft'), '草稿')
  53. assert.equal(policyStatusLabel('published'), '已发布')
  54. assert.equal(ruleLabel('maintenance_closed_loop'), '维修闭环完整性')
  55. assert.equal(severityLabel('critical'), '严重')
  56. assert.equal(resultStatusLabel('violated'), '存在违规')
  57. assert.equal(resultStatusLabel('not_applicable'), '不适用')
  58. })
  59. test('formats quality score and pass rate consistently', () => {
  60. assert.equal(formatScore(85), '85.0')
  61. assert.equal(formatScore(null), '—')
  62. assert.equal(formatPassRate(0.856), '85.6%')
  63. assert.equal(formatPassRate(undefined), '—')
  64. })
  65. test('summarizes bounded violation evidence without exposing raw attributes', () => {
  66. assert.deepEqual(evidenceSummary({
  67. asset_uid: 'asset-1',
  68. source_mapping_uid: 'mapping-1',
  69. missing_fields: ['location', 'organization'],
  70. password: 'must-not-be-shown'
  71. }), {
  72. assetUid: 'asset-1',
  73. sourceMappingUid: 'mapping-1',
  74. issueCount: 2
  75. })
  76. })