@api-client/core 0.11.11 → 0.12.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (252) hide show
  1. package/Testing.md +1 -1
  2. package/bin/plugins/events/EventPlugin.ts +61 -0
  3. package/bin/plugins/events/assert.ts +193 -0
  4. package/bin/plugins/events/types.ts +6 -0
  5. package/bin/test.ts +8 -1
  6. package/build/src/amf/AmfShapeGenerator.d.ts +6 -3
  7. package/build/src/amf/AmfShapeGenerator.d.ts.map +1 -1
  8. package/build/src/amf/AmfShapeGenerator.js +4 -1
  9. package/build/src/amf/AmfShapeGenerator.js.map +1 -1
  10. package/build/src/amf/AmfTypes.d.ts +2 -2
  11. package/build/src/amf/AmfTypes.d.ts.map +1 -1
  12. package/build/src/amf/AmfTypes.js.map +1 -1
  13. package/build/src/amf/DataValueGenerator.d.ts +15 -15
  14. package/build/src/amf/DataValueGenerator.d.ts.map +1 -1
  15. package/build/src/amf/DataValueGenerator.js +14 -14
  16. package/build/src/amf/DataValueGenerator.js.map +1 -1
  17. package/build/src/browser.d.ts +12 -9
  18. package/build/src/browser.d.ts.map +1 -1
  19. package/build/src/browser.js +11 -8
  20. package/build/src/browser.js.map +1 -1
  21. package/build/src/exceptions/attach_exception.d.ts +11 -0
  22. package/build/src/exceptions/attach_exception.d.ts.map +1 -0
  23. package/build/src/exceptions/attach_exception.js +11 -0
  24. package/build/src/exceptions/attach_exception.js.map +1 -0
  25. package/build/src/exceptions/detach_exception.d.ts +11 -0
  26. package/build/src/exceptions/detach_exception.d.ts.map +1 -0
  27. package/build/src/exceptions/detach_exception.js +11 -0
  28. package/build/src/exceptions/detach_exception.js.map +1 -0
  29. package/build/src/exceptions/remove_model_exception.d.ts +8 -0
  30. package/build/src/exceptions/remove_model_exception.d.ts.map +1 -0
  31. package/build/src/exceptions/remove_model_exception.js +8 -0
  32. package/build/src/exceptions/remove_model_exception.js.map +1 -0
  33. package/build/src/exceptions/remove_namespace_exception.d.ts +8 -0
  34. package/build/src/exceptions/remove_namespace_exception.d.ts.map +1 -0
  35. package/build/src/exceptions/remove_namespace_exception.js +8 -0
  36. package/build/src/exceptions/remove_namespace_exception.js.map +1 -0
  37. package/build/src/index.d.ts +12 -9
  38. package/build/src/index.d.ts.map +1 -1
  39. package/build/src/index.js +11 -8
  40. package/build/src/index.js.map +1 -1
  41. package/build/src/legacy.d.ts +8 -0
  42. package/build/src/legacy.d.ts.map +1 -1
  43. package/build/src/legacy.js +9 -0
  44. package/build/src/legacy.js.map +1 -1
  45. package/build/src/modeling/Bindings.d.ts +2 -2
  46. package/build/src/modeling/Bindings.d.ts.map +1 -1
  47. package/build/src/modeling/Bindings.js.map +1 -1
  48. package/build/src/modeling/DataDomain.d.ts +601 -0
  49. package/build/src/modeling/DataDomain.d.ts.map +1 -0
  50. package/build/src/modeling/DataDomain.js +1142 -0
  51. package/build/src/modeling/DataDomain.js.map +1 -0
  52. package/build/src/modeling/DataFormat.d.ts +42 -41
  53. package/build/src/modeling/DataFormat.d.ts.map +1 -1
  54. package/build/src/modeling/DataFormat.js +30 -131
  55. package/build/src/modeling/DataFormat.js.map +1 -1
  56. package/build/src/modeling/DomainAssociation.d.ts +281 -0
  57. package/build/src/modeling/DomainAssociation.d.ts.map +1 -0
  58. package/build/src/modeling/DomainAssociation.js +440 -0
  59. package/build/src/modeling/DomainAssociation.js.map +1 -0
  60. package/build/src/modeling/DomainElement.d.ts +33 -0
  61. package/build/src/modeling/DomainElement.d.ts.map +1 -0
  62. package/build/src/modeling/DomainElement.js +32 -0
  63. package/build/src/modeling/DomainElement.js.map +1 -0
  64. package/build/src/modeling/DomainEntity.d.ts +383 -0
  65. package/build/src/modeling/DomainEntity.d.ts.map +1 -0
  66. package/build/src/modeling/DomainEntity.js +718 -0
  67. package/build/src/modeling/DomainEntity.js.map +1 -0
  68. package/build/src/modeling/DomainFile.d.ts +25 -0
  69. package/build/src/modeling/DomainFile.d.ts.map +1 -0
  70. package/build/src/modeling/DomainFile.js +86 -0
  71. package/build/src/modeling/DomainFile.js.map +1 -0
  72. package/build/src/modeling/DomainImpactAnalysis.d.ts +60 -47
  73. package/build/src/modeling/DomainImpactAnalysis.d.ts.map +1 -1
  74. package/build/src/modeling/DomainImpactAnalysis.js +201 -132
  75. package/build/src/modeling/DomainImpactAnalysis.js.map +1 -1
  76. package/build/src/modeling/DomainModel.d.ts +226 -0
  77. package/build/src/modeling/DomainModel.d.ts.map +1 -0
  78. package/build/src/modeling/DomainModel.js +401 -0
  79. package/build/src/modeling/DomainModel.js.map +1 -0
  80. package/build/src/modeling/DomainNamespace.d.ts +268 -0
  81. package/build/src/modeling/DomainNamespace.d.ts.map +1 -0
  82. package/build/src/modeling/DomainNamespace.js +512 -0
  83. package/build/src/modeling/DomainNamespace.js.map +1 -0
  84. package/build/src/modeling/DomainProperty.d.ts +281 -0
  85. package/build/src/modeling/DomainProperty.d.ts.map +1 -0
  86. package/build/src/modeling/DomainProperty.js +560 -0
  87. package/build/src/modeling/DomainProperty.js.map +1 -0
  88. package/build/src/modeling/DomainSerialization.d.ts +40 -0
  89. package/build/src/modeling/DomainSerialization.d.ts.map +1 -0
  90. package/build/src/modeling/DomainSerialization.js +288 -0
  91. package/build/src/modeling/DomainSerialization.js.map +1 -0
  92. package/build/src/modeling/DomainVersioning.d.ts +17 -0
  93. package/build/src/modeling/DomainVersioning.d.ts.map +1 -0
  94. package/build/src/modeling/DomainVersioning.js +124 -0
  95. package/build/src/modeling/DomainVersioning.js.map +1 -0
  96. package/build/src/modeling/GraphUtils.d.ts +8 -0
  97. package/build/src/modeling/GraphUtils.d.ts.map +1 -0
  98. package/build/src/modeling/GraphUtils.js +26 -0
  99. package/build/src/modeling/GraphUtils.js.map +1 -0
  100. package/build/src/modeling/amf/ShapeGenerator.d.ts +164 -0
  101. package/build/src/modeling/amf/ShapeGenerator.d.ts.map +1 -0
  102. package/build/src/modeling/amf/ShapeGenerator.js +492 -0
  103. package/build/src/modeling/amf/ShapeGenerator.js.map +1 -0
  104. package/build/src/modeling/{DataAssociation.d.ts → legacy/DataAssociation.d.ts} +10 -5
  105. package/build/src/modeling/legacy/DataAssociation.d.ts.map +1 -0
  106. package/build/src/modeling/{DataAssociation.js → legacy/DataAssociation.js} +9 -6
  107. package/build/src/modeling/legacy/DataAssociation.js.map +1 -0
  108. package/build/src/modeling/{DataEntity.d.ts → legacy/DataEntity.d.ts} +12 -7
  109. package/build/src/modeling/legacy/DataEntity.d.ts.map +1 -0
  110. package/build/src/modeling/{DataEntity.js → legacy/DataEntity.js} +19 -18
  111. package/build/src/modeling/legacy/DataEntity.js.map +1 -0
  112. package/build/src/modeling/{DataEntityBuilder.d.ts → legacy/DataEntityBuilder.d.ts} +3 -2
  113. package/build/src/modeling/legacy/DataEntityBuilder.d.ts.map +1 -0
  114. package/build/src/modeling/{DataEntityBuilder.js → legacy/DataEntityBuilder.js} +3 -2
  115. package/build/src/modeling/legacy/DataEntityBuilder.js.map +1 -0
  116. package/build/src/modeling/legacy/DataImpactAnalysis.d.ts +298 -0
  117. package/build/src/modeling/legacy/DataImpactAnalysis.d.ts.map +1 -0
  118. package/build/src/modeling/legacy/DataImpactAnalysis.js +441 -0
  119. package/build/src/modeling/legacy/DataImpactAnalysis.js.map +1 -0
  120. package/build/src/modeling/{DataModel.d.ts → legacy/DataModel.d.ts} +6 -4
  121. package/build/src/modeling/legacy/DataModel.d.ts.map +1 -0
  122. package/build/src/modeling/{DataModel.js → legacy/DataModel.js} +7 -6
  123. package/build/src/modeling/legacy/DataModel.js.map +1 -0
  124. package/build/src/modeling/{DataNamespace.d.ts → legacy/DataNamespace.d.ts} +22 -3
  125. package/build/src/modeling/legacy/DataNamespace.d.ts.map +1 -0
  126. package/build/src/modeling/{DataNamespace.js → legacy/DataNamespace.js} +7 -3
  127. package/build/src/modeling/legacy/DataNamespace.js.map +1 -0
  128. package/build/src/modeling/{DataProperty.d.ts → legacy/DataProperty.d.ts} +13 -5
  129. package/build/src/modeling/legacy/DataProperty.d.ts.map +1 -0
  130. package/build/src/modeling/{DataProperty.js → legacy/DataProperty.js} +8 -5
  131. package/build/src/modeling/legacy/DataProperty.js.map +1 -0
  132. package/build/src/modeling/observed.d.ts +67 -0
  133. package/build/src/modeling/observed.d.ts.map +1 -0
  134. package/build/src/modeling/observed.js +230 -0
  135. package/build/src/modeling/observed.js.map +1 -0
  136. package/build/src/modeling/types.d.ts +165 -1
  137. package/build/src/modeling/types.d.ts.map +1 -1
  138. package/build/src/modeling/types.js.map +1 -1
  139. package/build/src/models/Thing.d.ts +26 -5
  140. package/build/src/models/Thing.d.ts.map +1 -1
  141. package/build/src/models/Thing.js +193 -91
  142. package/build/src/models/Thing.js.map +1 -1
  143. package/build/src/models/kinds.d.ts +31 -6
  144. package/build/src/models/kinds.d.ts.map +1 -1
  145. package/build/src/models/kinds.js +31 -6
  146. package/build/src/models/kinds.js.map +1 -1
  147. package/build/src/models/store/DataFile.d.ts +3 -1
  148. package/build/src/models/store/DataFile.d.ts.map +1 -1
  149. package/build/src/models/store/DataFile.js +2 -0
  150. package/build/src/models/store/DataFile.js.map +1 -1
  151. package/build/src/models/types.d.ts +12 -0
  152. package/build/src/models/types.d.ts.map +1 -0
  153. package/build/src/models/types.js +2 -0
  154. package/build/src/models/types.js.map +1 -0
  155. package/build/src/runtime/store/FilesSdk.d.ts +2 -2
  156. package/build/src/runtime/store/FilesSdk.d.ts.map +1 -1
  157. package/build/src/runtime/store/FilesSdk.js.map +1 -1
  158. package/data/models/example-generator-api.json +16 -16
  159. package/package.json +20 -6
  160. package/readme.md +1 -1
  161. package/src/amf/AmfShapeGenerator.ts +7 -4
  162. package/src/amf/AmfTypes.ts +2 -2
  163. package/src/amf/DataValueGenerator.ts +21 -21
  164. package/src/exceptions/attach_exception.ts +11 -0
  165. package/src/exceptions/detach_exception.ts +11 -0
  166. package/src/exceptions/remove_model_exception.ts +8 -0
  167. package/src/exceptions/remove_namespace_exception.ts +8 -0
  168. package/src/modeling/Bindings.ts +2 -2
  169. package/src/modeling/DataDomain.ts +1221 -0
  170. package/src/modeling/DataFormat.ts +54 -163
  171. package/src/modeling/DomainAssociation.ts +476 -0
  172. package/src/modeling/DomainElement.ts +50 -0
  173. package/src/modeling/DomainEntity.ts +769 -0
  174. package/src/modeling/DomainFile.ts +94 -0
  175. package/src/modeling/DomainImpactAnalysis.ts +218 -144
  176. package/src/modeling/DomainModel.ts +421 -0
  177. package/src/modeling/DomainNamespace.ts +537 -0
  178. package/src/modeling/DomainProperty.ts +548 -0
  179. package/src/modeling/DomainSerialization.ts +312 -0
  180. package/src/modeling/DomainVersioning.ts +144 -0
  181. package/src/modeling/GraphUtils.ts +28 -0
  182. package/src/modeling/amf/ShapeGenerator.ts +552 -0
  183. package/src/modeling/graph.md +115 -0
  184. package/src/modeling/{DataAssociation.ts → legacy/DataAssociation.ts} +13 -8
  185. package/src/modeling/{DataEntity.ts → legacy/DataEntity.ts} +28 -23
  186. package/src/modeling/{DataEntityBuilder.ts → legacy/DataEntityBuilder.ts} +4 -3
  187. package/src/modeling/legacy/DataImpactAnalysis.ts +530 -0
  188. package/src/modeling/{DataModel.ts → legacy/DataModel.ts} +10 -8
  189. package/src/modeling/{DataNamespace.ts → legacy/DataNamespace.ts} +23 -5
  190. package/src/modeling/{DataProperty.ts → legacy/DataProperty.ts} +15 -7
  191. package/src/modeling/observed.ts +267 -0
  192. package/src/modeling/types.ts +174 -1
  193. package/src/models/Thing.ts +70 -5
  194. package/src/models/kinds.ts +32 -6
  195. package/src/models/store/DataFile.ts +3 -1
  196. package/src/models/types.ts +11 -0
  197. package/src/runtime/store/FilesSdk.ts +2 -2
  198. package/tests/unit/amf/data_value_generator.spec.ts +15 -15
  199. package/tests/unit/legacy-transformers/ARC-legacy-import.spec.ts +1 -1
  200. package/tests/unit/modeling/amf/shape_generator.spec.ts +1174 -0
  201. package/tests/unit/modeling/data_domain.spec.ts +444 -0
  202. package/tests/unit/modeling/data_domain_associations.spec.ts +279 -0
  203. package/tests/unit/modeling/data_domain_change_observers.spec.ts +681 -0
  204. package/tests/unit/modeling/data_domain_entities.spec.ts +449 -0
  205. package/tests/unit/modeling/data_domain_foreign.spec.ts +355 -0
  206. package/tests/unit/modeling/data_domain_models.spec.ts +658 -0
  207. package/tests/unit/modeling/data_domain_namespaces.spec.ts +668 -0
  208. package/tests/unit/modeling/data_domain_property.spec.ts +264 -0
  209. package/tests/unit/modeling/data_domain_serialization.spec.ts +294 -0
  210. package/tests/unit/modeling/domain.property.spec.ts +822 -0
  211. package/tests/unit/modeling/domain_asociation.spec.ts +643 -0
  212. package/tests/unit/modeling/domain_asociation_targets.spec.ts +350 -0
  213. package/tests/unit/modeling/domain_entity.spec.ts +730 -0
  214. package/tests/unit/modeling/domain_entity_associations.spec.ts +330 -0
  215. package/tests/unit/modeling/domain_entity_example_generator_json.spec.ts +988 -0
  216. package/tests/unit/modeling/domain_entity_example_generator_xml.spec.ts +1451 -0
  217. package/tests/unit/modeling/domain_entity_fields.spec.ts +113 -0
  218. package/tests/unit/modeling/domain_entity_generators.spec.ts +20 -0
  219. package/tests/unit/modeling/domain_entity_parents.spec.ts +291 -0
  220. package/tests/unit/modeling/domain_entity_properties.spec.ts +305 -0
  221. package/tests/unit/modeling/{data_file.spec.ts → domain_file.spec.ts} +29 -85
  222. package/tests/unit/modeling/domain_impact_analysis.spec.ts +452 -0
  223. package/tests/unit/modeling/domain_model.spec.ts +568 -0
  224. package/tests/unit/modeling/domain_model_entities.spec.ts +408 -0
  225. package/tests/unit/modeling/domain_namespace.spec.ts +514 -0
  226. package/tests/unit/modeling/domain_namespace_models.spec.ts +324 -0
  227. package/tests/unit/modeling/domain_namespace_namespaces.spec.ts +404 -0
  228. package/tests/unit/modeling/domain_versioning.spec.ts +140 -0
  229. package/tests/unit/{amf → modeling/legacy}/amf_shape_generator.spec.ts +11 -11
  230. package/tests/unit/modeling/{data_association.spec.ts → legacy/data_association.spec.ts} +3 -11
  231. package/tests/unit/modeling/{data_entity.spec.ts → legacy/data_entity.spec.ts} +10 -8
  232. package/tests/unit/modeling/{data_entity_generator_json.spec.ts → legacy/data_entity_generator_json.spec.ts} +1 -1
  233. package/tests/unit/modeling/{data_entity_generator_xml.spec.ts → legacy/data_entity_generator_xml.spec.ts} +1 -1
  234. package/tests/unit/modeling/{data_model.spec.ts → legacy/data_model.spec.ts} +3 -3
  235. package/tests/unit/modeling/{data_namespace.spec.ts → legacy/data_namespace.spec.ts} +3 -10
  236. package/tests/unit/modeling/{data_property.spec.ts → legacy/data_property.spec.ts} +3 -6
  237. package/tests/unit/modeling/{impact_analysis.spec.ts → legacy/impact_analysis.spec.ts} +9 -9
  238. package/tests/unit/models/File/new.spec.ts +1 -1
  239. package/tests/unit/models/HttpProject.spec.ts +3 -3
  240. package/tsconfig.node.json +35 -0
  241. package/build/src/modeling/DataAssociation.d.ts.map +0 -1
  242. package/build/src/modeling/DataAssociation.js.map +0 -1
  243. package/build/src/modeling/DataEntity.d.ts.map +0 -1
  244. package/build/src/modeling/DataEntity.js.map +0 -1
  245. package/build/src/modeling/DataEntityBuilder.d.ts.map +0 -1
  246. package/build/src/modeling/DataEntityBuilder.js.map +0 -1
  247. package/build/src/modeling/DataModel.d.ts.map +0 -1
  248. package/build/src/modeling/DataModel.js.map +0 -1
  249. package/build/src/modeling/DataNamespace.d.ts.map +0 -1
  250. package/build/src/modeling/DataNamespace.js.map +0 -1
  251. package/build/src/modeling/DataProperty.d.ts.map +0 -1
  252. package/build/src/modeling/DataProperty.js.map +0 -1
@@ -0,0 +1,350 @@
1
+ import { test } from '@japa/runner'
2
+ import { DomainAssociation, DataDomain } from '../../../src/index.js'
3
+
4
+ test.group('DomainAssociation.addTarget()', () => {
5
+ test('adds a target entity to the association', ({ assert }) => {
6
+ const dataDomain = new DataDomain()
7
+ const model = dataDomain.addModel()
8
+ const entity1 = model.addEntity()
9
+ const entity2 = model.addEntity()
10
+ const association = new DomainAssociation(dataDomain, entity1.key)
11
+ association.addTarget(entity2)
12
+ assert.deepEqual(association.targets, [{ key: entity2.key }])
13
+ assert.isTrue(dataDomain.graph.hasEdge(association.key, entity2.key))
14
+ })
15
+
16
+ test('adds a target entity by key to the association', ({ assert }) => {
17
+ const dataDomain = new DataDomain()
18
+ const model = dataDomain.addModel()
19
+ const entity1 = model.addEntity()
20
+ const entity2 = model.addEntity()
21
+ const association = new DomainAssociation(dataDomain, entity1.key)
22
+ association.addTarget(entity2.key)
23
+ assert.deepEqual(association.targets, [{ key: entity2.key }])
24
+ assert.isTrue(dataDomain.graph.hasEdge(association.key, entity2.key))
25
+ })
26
+
27
+ test('adds a target entity with a foreign namespace', ({ assert }) => {
28
+ const dataDomain = new DataDomain()
29
+ const model = dataDomain.addModel()
30
+ const entity1 = model.addEntity()
31
+ const foreignDomain = new DataDomain()
32
+ foreignDomain.info.version = '1.0.0'
33
+ dataDomain.registerForeignDomain(foreignDomain)
34
+ const model2 = foreignDomain.addModel()
35
+ const entity2 = model2.addEntity()
36
+ const association = new DomainAssociation(dataDomain, entity1.key)
37
+ association.addTarget(entity2.key, foreignDomain.key)
38
+ assert.deepEqual(association.targets, [{ key: entity2.key, domain: foreignDomain.key }])
39
+ assert.isTrue(dataDomain.graph.hasEdge(association.key, `${foreignDomain.key}:${entity2.key}`))
40
+ })
41
+
42
+ test('throws an error if the target entity already exists', ({ assert }) => {
43
+ const dataDomain = new DataDomain()
44
+ const model = dataDomain.addModel()
45
+ const entity1 = model.addEntity()
46
+ const entity2 = model.addEntity()
47
+ const association = new DomainAssociation(dataDomain, entity1.key)
48
+ association.addTarget(entity2)
49
+ assert.throws(() => {
50
+ association.addTarget(entity2)
51
+ }, `Target ${entity2.key} already exists.`)
52
+ })
53
+
54
+ test('throws an error if the foreign namespace does not exist', ({ assert }) => {
55
+ const dataDomain = new DataDomain()
56
+ const model = dataDomain.addModel()
57
+ const entity1 = model.addEntity()
58
+ const entity2 = model.addEntity()
59
+ const association = new DomainAssociation(dataDomain, entity1.key)
60
+ assert.throws(() => {
61
+ association.addTarget(entity2.key, 'non-existent-namespace')
62
+ }, 'Foreign namespace "non-existent-namespace" does not exist.')
63
+ })
64
+
65
+ test('notifies change', async ({ assert }) => {
66
+ const dataDomain = new DataDomain()
67
+ const model = dataDomain.addModel()
68
+ const entity1 = model.addEntity()
69
+ const entity2 = model.addEntity()
70
+ const association = new DomainAssociation(dataDomain, entity1.key)
71
+ association.addTarget(entity2)
72
+ await assert.dispatches(dataDomain, 'change', { timeout: 20 })
73
+ })
74
+
75
+ test('creates a graph edge', ({ assert }) => {
76
+ const dataDomain = new DataDomain()
77
+ const model = dataDomain.addModel()
78
+ const entity1 = model.addEntity()
79
+ const entity2 = model.addEntity()
80
+ const association = new DomainAssociation(dataDomain, entity1.key)
81
+ association.addTarget(entity2)
82
+ assert.isTrue(dataDomain.graph.hasEdge(association.key, entity2.key))
83
+ assert.deepEqual(dataDomain.graph.edge(association.key, entity2.key), { type: 'association' })
84
+ })
85
+
86
+ test('adds a target entity to the association with a foreign domain', ({ assert }) => {
87
+ const dataDomain = new DataDomain()
88
+ const model = dataDomain.addModel()
89
+ const entity1 = model.addEntity()
90
+ const foreignDomain = new DataDomain()
91
+ foreignDomain.info.version = '1.0.0'
92
+ dataDomain.registerForeignDomain(foreignDomain)
93
+ const model2 = foreignDomain.addModel()
94
+ const entity2 = foreignDomain.addEntity(model2.key)
95
+ const association = new DomainAssociation(dataDomain, entity1.key)
96
+ association.addTarget(entity2)
97
+ assert.deepEqual(association.targets, [{ key: entity2.key, domain: foreignDomain.key }])
98
+ assert.isTrue(dataDomain.graph.hasEdge(association.key, `${foreignDomain.key}:${entity2.key}`))
99
+ })
100
+
101
+ test('adds a target entity to the association with a foreign domain - entity instance', ({ assert }) => {
102
+ const dataDomain = new DataDomain()
103
+ const model = dataDomain.addModel()
104
+ const entity1 = model.addEntity()
105
+ const foreignDomain = new DataDomain()
106
+ foreignDomain.info.version = '1.0.0'
107
+ dataDomain.registerForeignDomain(foreignDomain)
108
+ const model2 = foreignDomain.addModel()
109
+ const entity2 = foreignDomain.addEntity(model2.key)
110
+ const association = new DomainAssociation(dataDomain, entity1.key)
111
+ association.addTarget(entity2)
112
+ assert.deepEqual(association.targets, [{ key: entity2.key, domain: foreignDomain.key }])
113
+ assert.isTrue(dataDomain.graph.hasEdge(association.key, `${foreignDomain.key}:${entity2.key}`))
114
+ })
115
+
116
+ test('throws an error if the foreign namespace does not exist when adding a target entity with a foreign domain', ({
117
+ assert,
118
+ }) => {
119
+ const dataDomain = new DataDomain()
120
+ const model = dataDomain.addModel()
121
+ const entity1 = model.addEntity()
122
+ const association = new DomainAssociation(dataDomain, entity1.key)
123
+ assert.throws(() => {
124
+ association.addTarget('test-entity', 'non-existent-domain')
125
+ }, 'Foreign namespace "non-existent-domain" does not exist.')
126
+ })
127
+
128
+ test('throws an error if the target entity already exists with the same foreign namespace', ({ assert }) => {
129
+ const dataDomain = new DataDomain()
130
+ const model = dataDomain.addModel()
131
+ const entity1 = model.addEntity()
132
+ const foreignDomain = new DataDomain()
133
+ foreignDomain.info.version = '1.0.0'
134
+ dataDomain.registerForeignDomain(foreignDomain)
135
+ const model2 = foreignDomain.addModel()
136
+ const entity2 = foreignDomain.addEntity(model2.key)
137
+ const association = new DomainAssociation(dataDomain, entity1.key)
138
+ association.addTarget(entity2)
139
+ assert.throws(() => {
140
+ association.addTarget(entity2)
141
+ }, `Target ${entity2.key} already exists.`)
142
+ })
143
+ })
144
+
145
+ test.group('DomainAssociation.removeTarget()', () => {
146
+ test('removes a target entity from the targets list', ({ assert }) => {
147
+ const dataDomain = new DataDomain()
148
+ const model = dataDomain.addModel()
149
+ const entity1 = model.addEntity()
150
+ const entity2 = model.addEntity()
151
+ const association = new DomainAssociation(dataDomain, entity1.key)
152
+ association.addTarget(entity2)
153
+ association.removeTarget(entity2)
154
+ assert.deepEqual(association.targets, [])
155
+ assert.isFalse(dataDomain.graph.hasEdge(association.key, entity2.key))
156
+ })
157
+
158
+ test('removes a target entity by key from the targets list', ({ assert }) => {
159
+ const dataDomain = new DataDomain()
160
+ const model = dataDomain.addModel()
161
+ const entity1 = model.addEntity()
162
+ const entity2 = model.addEntity()
163
+ const association = new DomainAssociation(dataDomain, entity1.key)
164
+ association.addTarget(entity2)
165
+ association.removeTarget(entity2.key)
166
+ assert.deepEqual(association.targets, [])
167
+ assert.isFalse(dataDomain.graph.hasEdge(association.key, entity2.key))
168
+ })
169
+
170
+ test('does not throw an error if the target entity does not exist', ({ assert }) => {
171
+ const dataDomain = new DataDomain()
172
+ const model = dataDomain.addModel()
173
+ const entity1 = model.addEntity()
174
+ const association = new DomainAssociation(dataDomain, entity1.key)
175
+ association.removeTarget('non-existent-entity')
176
+ assert.deepEqual(association.targets, [])
177
+ })
178
+
179
+ test('notifies change', async ({ assert }) => {
180
+ const dataDomain = new DataDomain()
181
+ const model = dataDomain.addModel()
182
+ const entity1 = model.addEntity()
183
+ const entity2 = model.addEntity()
184
+ const association = new DomainAssociation(dataDomain, entity1.key)
185
+ association.addTarget(entity2)
186
+ association.removeTarget(entity2)
187
+ await assert.dispatches(dataDomain, 'change', { timeout: 20 })
188
+ })
189
+
190
+ test('removes the graph edge', ({ assert }) => {
191
+ const dataDomain = new DataDomain()
192
+ const model = dataDomain.addModel()
193
+ const entity1 = model.addEntity()
194
+ const entity2 = model.addEntity()
195
+ const association = new DomainAssociation(dataDomain, entity1.key)
196
+ association.addTarget(entity2)
197
+ association.removeTarget(entity2)
198
+ assert.isFalse(dataDomain.graph.hasEdge(association.key, entity2.key))
199
+ })
200
+
201
+ test('removes a target entity with a foreign namespace', ({ assert }) => {
202
+ const dataDomain = new DataDomain()
203
+ const model = dataDomain.addModel()
204
+ const entity1 = model.addEntity()
205
+ const foreignDomain = new DataDomain()
206
+ foreignDomain.info.version = '1.0.0'
207
+ dataDomain.registerForeignDomain(foreignDomain)
208
+ const model2 = foreignDomain.addModel()
209
+ const entity2 = model2.addEntity()
210
+ const association = new DomainAssociation(dataDomain, entity1.key)
211
+ association.addTarget(entity2.key, foreignDomain.key)
212
+ association.removeTarget(entity2.key)
213
+ assert.deepEqual(association.targets, [])
214
+ assert.isFalse(dataDomain.graph.hasEdge(association.key, entity2.key))
215
+ })
216
+
217
+ test('removes a target entity with a foreign namespace - entity instance', ({ assert }) => {
218
+ const dataDomain = new DataDomain()
219
+ const model = dataDomain.addModel()
220
+ const entity1 = model.addEntity()
221
+ const foreignDomain = new DataDomain()
222
+ foreignDomain.info.version = '1.0.0'
223
+ dataDomain.registerForeignDomain(foreignDomain)
224
+ const model2 = foreignDomain.addModel()
225
+ const entity2 = model2.addEntity()
226
+ const association = new DomainAssociation(dataDomain, entity1.key)
227
+ association.addTarget(entity2.key, foreignDomain.key)
228
+ association.removeTarget(entity2)
229
+ assert.deepEqual(association.targets, [])
230
+ assert.isFalse(dataDomain.graph.hasEdge(association.key, entity2.key))
231
+ })
232
+
233
+ test('removes only the specified target entity', ({ assert }) => {
234
+ const dataDomain = new DataDomain()
235
+ const model = dataDomain.addModel()
236
+ const entity1 = model.addEntity()
237
+ const entity2 = model.addEntity()
238
+ const entity3 = model.addEntity()
239
+ const association = new DomainAssociation(dataDomain, entity1.key)
240
+ association.addTarget(entity2)
241
+ association.addTarget(entity3)
242
+ association.removeTarget(entity2)
243
+ assert.deepEqual(association.targets, [{ key: entity3.key }])
244
+ assert.isFalse(dataDomain.graph.hasEdge(association.key, entity2.key))
245
+ assert.isTrue(dataDomain.graph.hasEdge(association.key, entity3.key))
246
+ })
247
+ })
248
+
249
+ test.group('DomainAssociation.listTargets()', () => {
250
+ test('lists all target entities', ({ assert }) => {
251
+ const dataDomain = new DataDomain()
252
+ const model = dataDomain.addModel()
253
+ const entity1 = model.addEntity()
254
+ const entity2 = model.addEntity()
255
+ const entity3 = model.addEntity()
256
+ const association = new DomainAssociation(dataDomain, entity1.key)
257
+ association.addTarget(entity2)
258
+ association.addTarget(entity3)
259
+ const targets = [...association.listTargets()]
260
+ assert.lengthOf(targets, 2)
261
+ assert.deepInclude(targets, entity2)
262
+ assert.deepInclude(targets, entity3)
263
+ })
264
+
265
+ test('returns an empty array if there are no target entities', ({ assert }) => {
266
+ const dataDomain = new DataDomain()
267
+ const model = dataDomain.addModel()
268
+ const entity1 = model.addEntity()
269
+ const association = new DomainAssociation(dataDomain, entity1.key)
270
+ const targets = [...association.listTargets()]
271
+ assert.lengthOf(targets, 0)
272
+ })
273
+
274
+ test('returns only entities that exist in the graph', ({ assert }) => {
275
+ const dataDomain = new DataDomain()
276
+ const model = dataDomain.addModel()
277
+ const entity1 = model.addEntity()
278
+ const entity2 = model.addEntity()
279
+ const association = new DomainAssociation(dataDomain, entity1.key)
280
+ association.addTarget(entity2)
281
+ association.addTarget('non-existent-entity')
282
+ const targets = [...association.listTargets()]
283
+ assert.lengthOf(targets, 1)
284
+ assert.deepInclude(targets, entity2)
285
+ })
286
+
287
+ test('lists target entities with foreign namespaces', ({ assert }) => {
288
+ const dataDomain = new DataDomain()
289
+ const model = dataDomain.addModel()
290
+ const entity1 = model.addEntity()
291
+ const foreignDomain = new DataDomain()
292
+ const model2 = foreignDomain.addModel()
293
+ const entity2 = model2.addEntity()
294
+ const association = new DomainAssociation(dataDomain, entity1.key)
295
+ foreignDomain.info.version = '1.0.0'
296
+ dataDomain.registerForeignDomain(foreignDomain)
297
+ association.addTarget(entity2.key, foreignDomain.key)
298
+
299
+ const targets = [...association.listTargets()]
300
+ assert.lengthOf(targets, 1)
301
+ assert.deepInclude(targets, dataDomain.findForeignEntity(entity2.key, foreignDomain.key)!)
302
+ })
303
+
304
+ test('lists target entities when some targets are from foreign namespaces and some are local', ({ assert }) => {
305
+ const dataDomain = new DataDomain()
306
+ const model = dataDomain.addModel()
307
+ const entity1 = model.addEntity()
308
+ const entity2 = model.addEntity()
309
+ const foreignDomain = new DataDomain()
310
+ const model2 = foreignDomain.addModel()
311
+ const entity3 = model2.addEntity()
312
+ const association = new DomainAssociation(dataDomain, entity1.key)
313
+ foreignDomain.info.version = '1.0.0'
314
+ dataDomain.registerForeignDomain(foreignDomain)
315
+ association.addTarget(entity2)
316
+ association.addTarget(entity3.key, foreignDomain.key)
317
+ const targets = [...association.listTargets()]
318
+ assert.lengthOf(targets, 2)
319
+ assert.deepInclude(targets, entity2)
320
+ assert.deepInclude(targets, dataDomain.findForeignEntity(entity3.key, foreignDomain.key)!)
321
+ })
322
+
323
+ test('lists target entities when the target entity is added as an instance', ({ assert }) => {
324
+ const dataDomain = new DataDomain()
325
+ const model = dataDomain.addModel()
326
+ const entity1 = model.addEntity()
327
+ const entity2 = model.addEntity()
328
+ const association = new DomainAssociation(dataDomain, entity1.key)
329
+ association.addTarget(entity2)
330
+ const targets = [...association.listTargets()]
331
+ assert.lengthOf(targets, 1)
332
+ assert.deepInclude(targets, entity2)
333
+ })
334
+
335
+ test('lists target entities when the target entity is added as an instance from a foreign domain', ({ assert }) => {
336
+ const dataDomain = new DataDomain()
337
+ const model = dataDomain.addModel()
338
+ const entity1 = model.addEntity()
339
+ const foreignDomain = new DataDomain()
340
+ const model2 = foreignDomain.addModel()
341
+ const entity2 = model2.addEntity()
342
+ const association = new DomainAssociation(dataDomain, entity1.key)
343
+ foreignDomain.info.version = '1.0.0'
344
+ dataDomain.registerForeignDomain(foreignDomain)
345
+ association.addTarget(entity2)
346
+ const targets = [...association.listTargets()]
347
+ assert.lengthOf(targets, 1)
348
+ assert.deepInclude(targets, dataDomain.findForeignEntity(entity2.key, foreignDomain.key)!)
349
+ })
350
+ })