ontology-workbench-model.test.mjs 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import assert from 'node:assert/strict'
  2. import test from 'node:test'
  3. import {
  4. applySuggestionDecisions,
  5. canEditOntology,
  6. canPublishOntology,
  7. emptyGraph,
  8. normalizeGraph,
  9. parseRevision,
  10. upsertGraphItem
  11. } from '../src/views/dataGovernance/ontology/model.js'
  12. test('normalizes every ontology graph section without mutating input', () => {
  13. const source = { classes: [{ uid: 'customer', name: '客户' }] }
  14. const graph = normalizeGraph(source)
  15. assert.deepEqual(Object.keys(graph), [
  16. 'classes',
  17. 'properties',
  18. 'relations',
  19. 'constraints',
  20. 'domain_links',
  21. 'element_mappings'
  22. ])
  23. assert.deepEqual(graph.classes, source.classes)
  24. assert.notEqual(graph.classes, source.classes)
  25. assert.deepEqual(emptyGraph().domain_links, [])
  26. })
  27. test('upserts an edited graph item by its stable identity', () => {
  28. const graph = normalizeGraph({
  29. classes: [{ uid: 'customer', name: '客户' }]
  30. })
  31. const updated = upsertGraphItem(
  32. graph,
  33. 'classes',
  34. { uid: 'customer', name: '客户主体' }
  35. )
  36. assert.equal(updated.classes.length, 1)
  37. assert.equal(updated.classes[0].name, '客户主体')
  38. })
  39. test('applies accepted and edited suggestions but skips rejected suggestions', () => {
  40. const graph = emptyGraph()
  41. const suggestions = [
  42. { uid: 's1', kind: 'class', payload: { uid: 'customer', name: '客户' } },
  43. { uid: 's2', kind: 'class', payload: { uid: 'order', name: '订单' } },
  44. { uid: 's3', kind: 'constraint', payload: { uid: 'c1', name: '非空' } }
  45. ]
  46. const decisions = [
  47. { suggestion_uid: 's1', decision: 'accept' },
  48. { suggestion_uid: 's2', decision: 'reject' },
  49. {
  50. suggestion_uid: 's3',
  51. decision: 'edit',
  52. payload: { uid: 'c1', name: '客户编号非空' }
  53. }
  54. ]
  55. const updated = applySuggestionDecisions(graph, suggestions, decisions)
  56. assert.deepEqual(updated.classes.map(item => item.uid), ['customer'])
  57. assert.equal(updated.constraints[0].name, '客户编号非空')
  58. })
  59. test('permissions separate edit and publish capabilities', () => {
  60. assert.equal(canEditOntology(['governance:read']), false)
  61. assert.equal(canEditOntology(['ontologies:edit']), true)
  62. assert.equal(canPublishOntology(['ontologies:edit']), false)
  63. assert.equal(canPublishOntology(['ontologies:publish']), true)
  64. })
  65. test('parses weak and quoted etag revisions safely', () => {
  66. assert.equal(parseRevision('"4"'), 4)
  67. assert.equal(parseRevision('W/"7"'), 7)
  68. assert.equal(parseRevision(undefined), 0)
  69. })