@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,822 @@
1
+ import { test } from '@japa/runner'
2
+ import { DataDomain, DomainPropertyKind, DomainProperty, Thing, DataFormat } from '../../../src/index.js'
3
+
4
+ test.group('DomainProperty.createSchema()', () => {
5
+ test('creates a schema with default values', ({ assert }) => {
6
+ const schema = DomainProperty.createSchema()
7
+ assert.equal(schema.kind, DomainPropertyKind)
8
+ assert.typeOf(schema.key, 'string')
9
+ assert.isNotEmpty(schema.key)
10
+ assert.deepInclude(schema.info, { name: 'New property' })
11
+ assert.equal(schema.type, 'string')
12
+ assert.isUndefined(schema.multiple)
13
+ assert.isUndefined(schema.required)
14
+ assert.isUndefined(schema.index)
15
+ assert.isUndefined(schema.primary)
16
+ assert.isUndefined(schema.readOnly)
17
+ assert.isUndefined(schema.writeOnly)
18
+ assert.isUndefined(schema.deprecated)
19
+ assert.isUndefined(schema.tags)
20
+ assert.isUndefined(schema.taxonomy)
21
+ assert.isUndefined(schema.schema)
22
+ assert.deepEqual(schema.bindings, [])
23
+ })
24
+
25
+ test('creates a schema with provided values', ({ assert }) => {
26
+ const schema = DomainProperty.createSchema({
27
+ key: 'test-property',
28
+ info: { name: 'Test Property', description: 'A test property' },
29
+ required: true,
30
+ multiple: true,
31
+ primary: true,
32
+ index: true,
33
+ readOnly: true,
34
+ writeOnly: true,
35
+ deprecated: true,
36
+ tags: ['tag1', 'tag2'],
37
+ taxonomy: ['tax1', 'tax2'],
38
+ type: 'number',
39
+ schema: { minimum: 0 },
40
+ bindings: [{ type: 'web', schema: { format: 'float' } }],
41
+ })
42
+ assert.equal(schema.kind, DomainPropertyKind)
43
+ assert.equal(schema.key, 'test-property')
44
+ assert.deepInclude(schema.info, { name: 'Test Property', description: 'A test property' })
45
+ assert.equal(schema.type, 'number')
46
+ assert.isTrue(schema.required)
47
+ assert.isTrue(schema.multiple)
48
+ assert.isTrue(schema.primary)
49
+ assert.isTrue(schema.index)
50
+ assert.isTrue(schema.readOnly)
51
+ assert.isTrue(schema.writeOnly)
52
+ assert.isTrue(schema.deprecated)
53
+ assert.deepEqual(schema.tags, ['tag1', 'tag2'])
54
+ assert.deepEqual(schema.taxonomy, ['tax1', 'tax2'])
55
+ assert.deepEqual(schema.schema, { minimum: 0 })
56
+ assert.deepEqual(schema.bindings, [{ type: 'web', schema: { format: 'float' } }])
57
+ })
58
+
59
+ test('creates a schema with partial info', ({ assert }) => {
60
+ const schema = DomainProperty.createSchema({
61
+ info: { name: 'Test Property' },
62
+ })
63
+ assert.deepInclude(schema.info, { name: 'Test Property' })
64
+ })
65
+
66
+ test('creates a schema with a specific type', ({ assert }) => {
67
+ const schema = DomainProperty.createSchema({
68
+ type: 'boolean',
69
+ })
70
+ assert.equal(schema.type, 'boolean')
71
+ })
72
+
73
+ test('throws an error with an invalid type', ({ assert }) => {
74
+ assert.throws(() => {
75
+ // @ts-expect-error Testing invalid type
76
+ DomainProperty.createSchema({ type: 'invalid-type' })
77
+ }, 'Invalid data property type invalid-type')
78
+ })
79
+
80
+ test('creates a schema with all properties undefined', ({ assert }) => {
81
+ const schema = DomainProperty.createSchema({
82
+ multiple: undefined,
83
+ required: undefined,
84
+ index: undefined,
85
+ primary: undefined,
86
+ readOnly: undefined,
87
+ writeOnly: undefined,
88
+ deprecated: undefined,
89
+ tags: undefined,
90
+ taxonomy: undefined,
91
+ schema: undefined,
92
+ bindings: undefined,
93
+ })
94
+ assert.equal(schema.kind, DomainPropertyKind)
95
+ assert.typeOf(schema.key, 'string')
96
+ assert.isNotEmpty(schema.key)
97
+ assert.deepInclude(schema.info, { name: 'New property' })
98
+ assert.equal(schema.type, 'string')
99
+ assert.isUndefined(schema.multiple)
100
+ assert.isUndefined(schema.required)
101
+ assert.isUndefined(schema.index)
102
+ assert.isUndefined(schema.primary)
103
+ assert.isUndefined(schema.readOnly)
104
+ assert.isUndefined(schema.writeOnly)
105
+ assert.isUndefined(schema.deprecated)
106
+ assert.isUndefined(schema.tags)
107
+ assert.isUndefined(schema.taxonomy)
108
+ assert.isUndefined(schema.schema)
109
+ assert.deepEqual(schema.bindings, [])
110
+ })
111
+
112
+ test('creates a schema with all properties null', ({ assert }) => {
113
+ const schema = DomainProperty.createSchema({
114
+ // @ts-expect-error Testing null values
115
+ multiple: null,
116
+ // @ts-expect-error Testing null values
117
+ required: null,
118
+ // @ts-expect-error Testing null values
119
+ index: null,
120
+ // @ts-expect-error Testing null values
121
+ primary: null,
122
+ // @ts-expect-error Testing null values
123
+ readOnly: null,
124
+ // @ts-expect-error Testing null values
125
+ writeOnly: null,
126
+ // @ts-expect-error Testing null values
127
+ deprecated: null,
128
+ // @ts-expect-error Testing null values
129
+ tags: null,
130
+ // @ts-expect-error Testing null values
131
+ taxonomy: null,
132
+ // @ts-expect-error Testing null values
133
+ schema: null,
134
+ // @ts-expect-error Testing null values
135
+ bindings: null,
136
+ })
137
+ assert.isUndefined(schema.multiple)
138
+ assert.isUndefined(schema.required)
139
+ assert.isUndefined(schema.index)
140
+ assert.isUndefined(schema.primary)
141
+ assert.isUndefined(schema.readOnly)
142
+ assert.isUndefined(schema.writeOnly)
143
+ assert.isUndefined(schema.deprecated)
144
+ assert.isUndefined(schema.tags)
145
+ assert.isUndefined(schema.taxonomy)
146
+ assert.isUndefined(schema.schema)
147
+ assert.deepEqual(schema.bindings, [])
148
+ })
149
+
150
+ test('creates a schema with all properties empty array', ({ assert }) => {
151
+ const schema = DomainProperty.createSchema({
152
+ tags: [],
153
+ taxonomy: [],
154
+ bindings: [],
155
+ })
156
+ assert.deepEqual(schema.tags, [])
157
+ assert.deepEqual(schema.taxonomy, [])
158
+ assert.deepEqual(schema.bindings, [])
159
+ })
160
+
161
+ test('creates a schema with all boolean properties set to false', ({ assert }) => {
162
+ const schema = DomainProperty.createSchema({
163
+ required: false,
164
+ multiple: false,
165
+ primary: false,
166
+ index: false,
167
+ readOnly: false,
168
+ writeOnly: false,
169
+ deprecated: false,
170
+ })
171
+ assert.isFalse(schema.required)
172
+ assert.isFalse(schema.multiple)
173
+ assert.isFalse(schema.primary)
174
+ assert.isFalse(schema.index)
175
+ assert.isFalse(schema.readOnly)
176
+ assert.isFalse(schema.writeOnly)
177
+ assert.isFalse(schema.deprecated)
178
+ })
179
+
180
+ test('creates a schema with all array properties set to empty arrays', ({ assert }) => {
181
+ const schema = DomainProperty.createSchema({
182
+ tags: [],
183
+ taxonomy: [],
184
+ bindings: [],
185
+ })
186
+ assert.deepEqual(schema.tags, [])
187
+ assert.deepEqual(schema.taxonomy, [])
188
+ assert.deepEqual(schema.bindings, [])
189
+ })
190
+
191
+ test('creates a schema with all object properties set to empty objects', ({ assert }) => {
192
+ const schema = DomainProperty.createSchema({
193
+ info: {},
194
+ schema: {},
195
+ })
196
+ assert.deepInclude(schema.info, { name: 'New property' })
197
+ assert.deepEqual(schema.schema, {})
198
+ })
199
+
200
+ test('creates a schema with all array properties set to null', ({ assert }) => {
201
+ const schema = DomainProperty.createSchema({
202
+ // @ts-expect-error Testing null values
203
+ tags: null,
204
+ // @ts-expect-error Testing null values
205
+ taxonomy: null,
206
+ // @ts-expect-error Testing null values
207
+ bindings: null,
208
+ })
209
+ assert.isUndefined(schema.tags)
210
+ assert.isUndefined(schema.taxonomy)
211
+ assert.deepEqual(schema.bindings, [])
212
+ })
213
+
214
+ test('creates a schema with all object properties set to null', ({ assert }) => {
215
+ const schema = DomainProperty.createSchema({
216
+ // @ts-expect-error Testing null values
217
+ info: null,
218
+ // @ts-expect-error Testing null values
219
+ schema: null,
220
+ })
221
+ assert.deepInclude(schema.info, { name: 'New property' })
222
+ assert.isUndefined(schema.schema)
223
+ })
224
+ })
225
+
226
+ test.group('DomainProperty.constructor()', () => {
227
+ test('creates a DomainProperty with default values', ({ assert }) => {
228
+ const root = new DataDomain()
229
+ const parent = 'test-parent'
230
+ const property = new DomainProperty(root, parent)
231
+ assert.equal(property.kind, DomainPropertyKind)
232
+ assert.typeOf(property.key, 'string')
233
+ assert.isNotEmpty(property.key)
234
+ assert.instanceOf(property.info, Thing)
235
+ assert.deepInclude(property.info.toJSON(), { name: 'New property' })
236
+ assert.equal(property.type, 'string')
237
+ assert.isUndefined(property.multiple)
238
+ assert.isUndefined(property.required)
239
+ assert.isUndefined(property.index)
240
+ assert.isUndefined(property.primary)
241
+ assert.isUndefined(property.readOnly)
242
+ assert.isUndefined(property.writeOnly)
243
+ assert.isUndefined(property.deprecated)
244
+ assert.deepEqual(property.tags, [])
245
+ assert.deepEqual(property.taxonomy, [])
246
+ assert.isUndefined(property.schema)
247
+ assert.deepEqual(property.bindings, [])
248
+ assert.equal(property['parent'], parent)
249
+ assert.equal(property.domain, root)
250
+ })
251
+
252
+ test('creates a DomainProperty with provided values', ({ assert }) => {
253
+ const root = new DataDomain()
254
+ const parent = 'test-parent'
255
+ const property = new DomainProperty(root, parent, {
256
+ key: 'test-property',
257
+ info: { name: 'Test Property', description: 'A test property' },
258
+ required: true,
259
+ multiple: true,
260
+ primary: true,
261
+ index: true,
262
+ readOnly: true,
263
+ writeOnly: true,
264
+ deprecated: true,
265
+ tags: ['tag1', 'tag2'],
266
+ taxonomy: ['tax1', 'tax2'],
267
+ type: 'number',
268
+ schema: { minimum: 0 },
269
+ bindings: [{ type: 'web', schema: { format: 'float' } }],
270
+ })
271
+ assert.equal(property.kind, DomainPropertyKind)
272
+ assert.equal(property.key, 'test-property')
273
+ assert.instanceOf(property.info, Thing)
274
+ assert.deepInclude(property.info.toJSON(), { name: 'Test Property', description: 'A test property' })
275
+ assert.equal(property.type, 'number')
276
+ assert.isTrue(property.required)
277
+ assert.isTrue(property.multiple)
278
+ assert.isTrue(property.primary)
279
+ assert.isTrue(property.index)
280
+ assert.isTrue(property.readOnly)
281
+ assert.isTrue(property.writeOnly)
282
+ assert.isTrue(property.deprecated)
283
+ assert.deepEqual(property.tags, ['tag1', 'tag2'])
284
+ assert.deepEqual(property.taxonomy, ['tax1', 'tax2'])
285
+ assert.deepEqual(property.schema, { minimum: 0 })
286
+ assert.deepEqual(property.bindings, [{ type: 'web', schema: { format: 'float' } }])
287
+ assert.equal(property['parent'], parent)
288
+ assert.equal(property.domain, root)
289
+ })
290
+
291
+ test('creates a DomainProperty with partial info', ({ assert }) => {
292
+ const root = new DataDomain()
293
+ const parent = 'test-parent'
294
+ const property = new DomainProperty(root, parent, {
295
+ info: { name: 'Test Property' },
296
+ })
297
+ assert.equal(property.kind, DomainPropertyKind)
298
+ assert.typeOf(property.key, 'string')
299
+ assert.isNotEmpty(property.key)
300
+ assert.instanceOf(property.info, Thing)
301
+ assert.deepInclude(property.info.toJSON(), { name: 'Test Property' })
302
+ })
303
+
304
+ test('creates a DomainProperty with a specific type', ({ assert }) => {
305
+ const root = new DataDomain()
306
+ const parent = 'test-parent'
307
+ const property = new DomainProperty(root, parent, {
308
+ type: 'boolean',
309
+ })
310
+ assert.equal(property.kind, DomainPropertyKind)
311
+ assert.typeOf(property.key, 'string')
312
+ assert.isNotEmpty(property.key)
313
+ assert.instanceOf(property.info, Thing)
314
+ assert.deepInclude(property.info.toJSON(), { name: 'New property' })
315
+ assert.equal(property.type, 'boolean')
316
+ })
317
+
318
+ test('throws an error with an invalid type', ({ assert }) => {
319
+ const root = new DataDomain()
320
+ const parent = 'test-parent'
321
+ assert.throws(() => {
322
+ // @ts-expect-error Testing invalid type
323
+ new DomainProperty(root, parent, { type: 'invalid-type' })
324
+ }, 'Invalid data property type invalid-type')
325
+ })
326
+ })
327
+
328
+ test.group('DomainProperty.validate()', () => {
329
+ test('returns false for null input', ({ assert }) => {
330
+ const result = DomainProperty.validate(null)
331
+ assert.isFalse(result)
332
+ })
333
+
334
+ test('returns false for undefined input', ({ assert }) => {
335
+ const result = DomainProperty.validate(undefined)
336
+ assert.isFalse(result)
337
+ })
338
+
339
+ test('returns false for non-object input', ({ assert }) => {
340
+ const result = DomainProperty.validate('string')
341
+ assert.isFalse(result)
342
+ })
343
+
344
+ test('returns true for valid input', ({ assert }) => {
345
+ const validInput = {
346
+ kind: DomainPropertyKind,
347
+ key: 'test-key',
348
+ info: { name: 'Test Property' },
349
+ type: 'string',
350
+ }
351
+ const result = DomainProperty.validate(validInput)
352
+ assert.isTrue(result)
353
+ })
354
+
355
+ test('returns false for mismatched kind in strict mode', ({ assert }) => {
356
+ const invalidInput = {
357
+ kind: 'InvalidKind',
358
+ key: 'test-key',
359
+ info: { name: 'Test Property' },
360
+ type: 'string',
361
+ }
362
+ const result = DomainProperty.validate(invalidInput, { strict: true })
363
+ assert.isFalse(result)
364
+ })
365
+
366
+ test('returns false for missing kind in strict mode', ({ assert }) => {
367
+ const invalidInput = {
368
+ key: 'test-key',
369
+ info: { name: 'Test Property' },
370
+ type: 'string',
371
+ }
372
+ const result = DomainProperty.validate(invalidInput, { strict: true })
373
+ assert.isFalse(result)
374
+ })
375
+
376
+ test('returns true for missing kind in non-strict mode', ({ assert }) => {
377
+ const validInput = {
378
+ key: 'test-key',
379
+ info: { name: 'Test Property' },
380
+ type: 'string',
381
+ }
382
+ const result = DomainProperty.validate(validInput)
383
+ assert.isTrue(result)
384
+ })
385
+ })
386
+
387
+ test.group('DomainProperty.toJSON()', () => {
388
+ test('serializes with default values', ({ assert }) => {
389
+ const root = new DataDomain()
390
+ const parent = 'test-parent'
391
+ const property = new DomainProperty(root, parent)
392
+ const json = property.toJSON()
393
+
394
+ assert.equal(json.kind, DomainPropertyKind)
395
+ assert.typeOf(json.key, 'string')
396
+ assert.isNotEmpty(json.key)
397
+ assert.deepInclude(json.info, { name: 'New property' })
398
+ assert.equal(json.type, 'string')
399
+ assert.isUndefined(json.multiple)
400
+ assert.isUndefined(json.required)
401
+ assert.isUndefined(json.index)
402
+ assert.isUndefined(json.primary)
403
+ assert.isUndefined(json.readOnly)
404
+ assert.isUndefined(json.writeOnly)
405
+ assert.isUndefined(json.deprecated)
406
+ assert.isUndefined(json.tags)
407
+ assert.isUndefined(json.taxonomy)
408
+ assert.isUndefined(json.schema)
409
+ assert.isUndefined(json.bindings)
410
+ })
411
+
412
+ test('serializes with custom values', ({ assert }) => {
413
+ const root = new DataDomain()
414
+ const parent = 'test-parent'
415
+ const property = new DomainProperty(root, parent, {
416
+ key: 'test-property',
417
+ info: { name: 'Test Property', description: 'A test property' },
418
+ required: true,
419
+ multiple: true,
420
+ primary: true,
421
+ index: true,
422
+ readOnly: true,
423
+ writeOnly: true,
424
+ deprecated: true,
425
+ tags: ['tag1', 'tag2'],
426
+ taxonomy: ['tax1', 'tax2'],
427
+ type: 'number',
428
+ schema: { minimum: 0 },
429
+ bindings: [{ type: 'web', schema: { format: 'float' } }],
430
+ })
431
+ const json = property.toJSON()
432
+
433
+ assert.equal(json.kind, DomainPropertyKind)
434
+ assert.equal(json.key, 'test-property')
435
+ assert.deepInclude(json.info, { name: 'Test Property', description: 'A test property' })
436
+ assert.equal(json.type, 'number')
437
+ assert.isTrue(json.required)
438
+ assert.isTrue(json.multiple)
439
+ assert.isTrue(json.primary)
440
+ assert.isTrue(json.index)
441
+ assert.isTrue(json.readOnly)
442
+ assert.isTrue(json.writeOnly)
443
+ assert.isTrue(json.deprecated)
444
+ assert.deepEqual(json.tags, ['tag1', 'tag2'])
445
+ assert.deepEqual(json.taxonomy, ['tax1', 'tax2'])
446
+ assert.deepEqual(json.schema, { minimum: 0 })
447
+ assert.deepEqual(json.bindings, [{ type: 'web', schema: { format: 'float' } }])
448
+ })
449
+
450
+ test('serializes with empty arrays', ({ assert }) => {
451
+ const root = new DataDomain()
452
+ const parent = 'test-parent'
453
+ const property = new DomainProperty(root, parent, {
454
+ tags: [],
455
+ taxonomy: [],
456
+ bindings: [],
457
+ })
458
+ const json = property.toJSON()
459
+
460
+ assert.isUndefined(json.tags)
461
+ assert.isUndefined(json.taxonomy)
462
+ assert.isUndefined(json.bindings)
463
+ })
464
+
465
+ test('excludes undefined properties', ({ assert }) => {
466
+ const root = new DataDomain()
467
+ const parent = 'test-parent'
468
+ const property = new DomainProperty(root, parent, {
469
+ required: undefined,
470
+ multiple: undefined,
471
+ index: undefined,
472
+ primary: undefined,
473
+ readOnly: undefined,
474
+ writeOnly: undefined,
475
+ deprecated: undefined,
476
+ tags: undefined,
477
+ taxonomy: undefined,
478
+ schema: undefined,
479
+ bindings: undefined,
480
+ })
481
+ const json = property.toJSON()
482
+
483
+ assert.isUndefined(json.required)
484
+ assert.isUndefined(json.multiple)
485
+ assert.isUndefined(json.index)
486
+ assert.isUndefined(json.primary)
487
+ assert.isUndefined(json.readOnly)
488
+ assert.isUndefined(json.writeOnly)
489
+ assert.isUndefined(json.deprecated)
490
+ assert.isUndefined(json.tags)
491
+ assert.isUndefined(json.taxonomy)
492
+ assert.isUndefined(json.schema)
493
+ assert.isUndefined(json.bindings)
494
+ })
495
+
496
+ test('serializes nested objects', ({ assert }) => {
497
+ const root = new DataDomain()
498
+ const parent = 'test-parent'
499
+ const property = new DomainProperty(root, parent, {
500
+ info: { name: 'Nested Info', description: 'Nested description' },
501
+ schema: { minimum: 10, maximum: 100 },
502
+ })
503
+ const json = property.toJSON()
504
+
505
+ assert.deepInclude(json.info, { name: 'Nested Info', description: 'Nested description' })
506
+ assert.deepEqual(json.schema, { minimum: 10, maximum: 100 })
507
+ })
508
+ })
509
+
510
+ test.group('DomainProperty.remove()', () => {
511
+ test('removes the property from the parent entity', ({ assert }) => {
512
+ const dataDomain = new DataDomain()
513
+ const model = dataDomain.addModel()
514
+ const entity = model.addEntity()
515
+ const property = entity.addProperty({ key: 'test-property', type: 'string' })
516
+ property.remove()
517
+ assert.isFalse(dataDomain.graph.hasNode(property.key))
518
+ assert.deepEqual(entity.fields, [])
519
+ })
520
+ })
521
+
522
+ test.group('DomainProperty.getParentInstance()', () => {
523
+ test('returns the parent entity when the property is a child', ({ assert }) => {
524
+ const dataDomain = new DataDomain()
525
+ const model = dataDomain.addModel()
526
+ const entity = model.addEntity()
527
+ const property = entity.addProperty()
528
+ const parent = property.getParentInstance()
529
+ assert.deepEqual(parent, entity)
530
+ })
531
+
532
+ test('returns undefined when the property has no parent', ({ assert }) => {
533
+ const dataDomain = new DataDomain()
534
+ const property = new DomainProperty(dataDomain, 'non-existent-entity')
535
+ dataDomain.graph.setNode(property.key, property)
536
+ const parent = property.getParentInstance()
537
+ assert.isUndefined(parent)
538
+ })
539
+
540
+ test('returns the correct parent when there are multiple levels of nesting', ({ assert }) => {
541
+ const dataDomain = new DataDomain()
542
+ const model = dataDomain.addModel()
543
+ const entity = model.addEntity()
544
+ const property = entity.addProperty()
545
+ const parent = property.getParentInstance()
546
+ assert.deepEqual(parent, entity)
547
+ })
548
+
549
+ test('returns undefined when the parent entity is removed from the graph', ({ assert }) => {
550
+ const dataDomain = new DataDomain()
551
+ const model = dataDomain.addModel()
552
+ const entity = model.addEntity()
553
+ const property = entity.addProperty()
554
+ dataDomain.graph.removeNode(entity.key)
555
+ const parent = property.getParentInstance()
556
+ assert.isUndefined(parent)
557
+ })
558
+ })
559
+
560
+ test.group('DomainProperty.isValidType()', () => {
561
+ test('returns true for valid data types', ({ assert }) => {
562
+ DataFormat.DomainPropertyTypes.forEach((type) => {
563
+ assert.isTrue(DomainProperty.isValidType(type), `Type "${type}" should be valid`)
564
+ })
565
+ })
566
+
567
+ test('returns false for invalid data types', ({ assert }) => {
568
+ assert.isFalse(DomainProperty.isValidType('invalid-type'))
569
+ assert.isFalse(DomainProperty.isValidType(123))
570
+ assert.isFalse(DomainProperty.isValidType(true))
571
+ assert.isFalse(DomainProperty.isValidType({}))
572
+ assert.isFalse(DomainProperty.isValidType([]))
573
+ assert.isFalse(DomainProperty.isValidType(null))
574
+ assert.isFalse(DomainProperty.isValidType(undefined))
575
+ })
576
+
577
+ test('returns false for non-string values', ({ assert }) => {
578
+ assert.isFalse(DomainProperty.isValidType(123))
579
+ assert.isFalse(DomainProperty.isValidType(true))
580
+ assert.isFalse(DomainProperty.isValidType({}))
581
+ assert.isFalse(DomainProperty.isValidType([]))
582
+ assert.isFalse(DomainProperty.isValidType(null))
583
+ assert.isFalse(DomainProperty.isValidType(undefined))
584
+ })
585
+
586
+ test('returns false for empty string', ({ assert }) => {
587
+ assert.isFalse(DomainProperty.isValidType(''))
588
+ })
589
+ })
590
+
591
+ test.group('DomainProperty.isValidAttribute()', () => {
592
+ test('returns true for valid data property attributes', ({ assert }) => {
593
+ const validAttributes: DataFormat.DomainAttributeAttribute[] = ['required', 'multiple']
594
+ validAttributes.forEach((attribute) => {
595
+ assert.isTrue(DomainProperty.isValidAttribute(attribute), `Attribute "${attribute}" should be valid`)
596
+ })
597
+ })
598
+
599
+ test('returns false for invalid data property attributes', ({ assert }) => {
600
+ assert.isFalse(DomainProperty.isValidAttribute('invalid-attribute'))
601
+ assert.isFalse(DomainProperty.isValidAttribute(123))
602
+ assert.isFalse(DomainProperty.isValidAttribute(true))
603
+ assert.isFalse(DomainProperty.isValidAttribute({}))
604
+ assert.isFalse(DomainProperty.isValidAttribute([]))
605
+ assert.isFalse(DomainProperty.isValidAttribute(null))
606
+ assert.isFalse(DomainProperty.isValidAttribute(undefined))
607
+ })
608
+
609
+ test('returns false for non-string values', ({ assert }) => {
610
+ assert.isFalse(DomainProperty.isValidAttribute(123))
611
+ assert.isFalse(DomainProperty.isValidAttribute(true))
612
+ assert.isFalse(DomainProperty.isValidAttribute({}))
613
+ assert.isFalse(DomainProperty.isValidAttribute([]))
614
+ assert.isFalse(DomainProperty.isValidAttribute(null))
615
+ assert.isFalse(DomainProperty.isValidAttribute(undefined))
616
+ })
617
+
618
+ test('returns false for empty string', ({ assert }) => {
619
+ assert.isFalse(DomainProperty.isValidAttribute(''))
620
+ })
621
+ })
622
+
623
+ test.group('DomainProperty.isValidFormat()', () => {
624
+ test('returns true for valid data property formats', ({ assert }) => {
625
+ const validFormats: DataFormat.DomainPropertyFormat[] = [...DataFormat.NumberFormats, ...DataFormat.BinaryFormats]
626
+ validFormats.forEach((format) => {
627
+ assert.isTrue(DomainProperty.isValidFormat(format), `Format "${format}" should be valid`)
628
+ })
629
+ })
630
+
631
+ test('returns true for undefined format', ({ assert }) => {
632
+ assert.isTrue(DomainProperty.isValidFormat(undefined), 'Undefined format should be valid')
633
+ })
634
+
635
+ test('returns false for invalid data property formats', ({ assert }) => {
636
+ assert.isFalse(DomainProperty.isValidFormat('invalid-format'))
637
+ assert.isFalse(DomainProperty.isValidFormat(123))
638
+ assert.isFalse(DomainProperty.isValidFormat(true))
639
+ assert.isFalse(DomainProperty.isValidFormat({}))
640
+ assert.isFalse(DomainProperty.isValidFormat([]))
641
+ assert.isFalse(DomainProperty.isValidFormat(null))
642
+ })
643
+
644
+ test('returns false for non-string values', ({ assert }) => {
645
+ assert.isFalse(DomainProperty.isValidFormat(123))
646
+ assert.isFalse(DomainProperty.isValidFormat(true))
647
+ assert.isFalse(DomainProperty.isValidFormat({}))
648
+ assert.isFalse(DomainProperty.isValidFormat([]))
649
+ assert.isFalse(DomainProperty.isValidFormat(null))
650
+ })
651
+ })
652
+
653
+ test.group('DomainProperty.ensureSchema()', () => {
654
+ test('creates the schema object if it does not exist', ({ assert }) => {
655
+ const dataDomain = new DataDomain()
656
+ const property = new DomainProperty(dataDomain, 'test-parent')
657
+ assert.isUndefined(property.schema)
658
+ const schema = property.ensureSchema()
659
+ assert.isDefined(property.schema)
660
+ assert.deepEqual(schema, {})
661
+ assert.deepEqual(schema, schema)
662
+ })
663
+
664
+ test('returns the existing schema object if it exists', ({ assert }) => {
665
+ const dataDomain = new DataDomain()
666
+ const property = new DomainProperty(dataDomain, 'test-parent', { schema: { minimum: 0 } })
667
+ const originalSchema = property.schema
668
+ const schema = property.ensureSchema()
669
+ assert.deepEqual(schema, { minimum: 0 })
670
+ assert.strictEqual(schema, originalSchema)
671
+ })
672
+
673
+ test('does not modify the existing schema object', ({ assert }) => {
674
+ const dataDomain = new DataDomain()
675
+ const property = new DomainProperty(dataDomain, 'test-parent', { schema: { minimum: 0 } })
676
+ const originalSchema = property.schema
677
+ property.ensureSchema()
678
+ assert.deepEqual(property.schema, { minimum: 0 })
679
+ assert.strictEqual(property.schema, originalSchema)
680
+ })
681
+ })
682
+
683
+ test.group('DomainProperty.getWebBinding()', () => {
684
+ test('creates web bindings if they do not exist', ({ assert }) => {
685
+ const dataDomain = new DataDomain()
686
+ const property = new DomainProperty(dataDomain, 'test-parent')
687
+ const webBindings = property.getWebBinding()
688
+ assert.isDefined(webBindings)
689
+ assert.deepEqual(webBindings, {})
690
+ assert.lengthOf(property.bindings, 1)
691
+ assert.equal(property.bindings[0].type, 'web')
692
+ })
693
+
694
+ test('returns existing web bindings if they exist', ({ assert }) => {
695
+ const dataDomain = new DataDomain()
696
+ const property = new DomainProperty(dataDomain, 'test-parent', {
697
+ bindings: [{ type: 'web', schema: { format: 'float' } }],
698
+ })
699
+ const webBindings = property.getWebBinding()
700
+ assert.isDefined(webBindings)
701
+ assert.deepEqual(webBindings, { format: 'float' })
702
+ assert.lengthOf(property.bindings, 1)
703
+ assert.equal(property.bindings[0].type, 'web')
704
+ })
705
+
706
+ test('does not modify existing web bindings object', ({ assert }) => {
707
+ const dataDomain = new DataDomain()
708
+ const property = new DomainProperty(dataDomain, 'test-parent', {
709
+ bindings: [{ type: 'web', schema: { format: 'float' } }],
710
+ })
711
+ const originalBindings = property.bindings[0].schema
712
+ property.getWebBinding()
713
+ assert.deepEqual(property.bindings[0].schema, { format: 'float' })
714
+ assert.deepEqual(property.bindings[0].schema, originalBindings)
715
+ })
716
+
717
+ test('notifies change when creating new bindings', async ({ assert }) => {
718
+ const dataDomain = new DataDomain()
719
+ const property = new DomainProperty(dataDomain, 'test-parent')
720
+ const webBindings = property.getWebBinding()
721
+ assert.isDefined(webBindings)
722
+ await assert.dispatches(dataDomain, 'change', { timeout: 20 })
723
+ })
724
+ })
725
+
726
+ test.group('DomainProperty.readBinding()', () => {
727
+ test('returns undefined if no binding exists for the given type', ({ assert }) => {
728
+ const dataDomain = new DataDomain()
729
+ const property = new DomainProperty(dataDomain, 'test-parent')
730
+ const binding = property.readBinding('web')
731
+ assert.isUndefined(binding)
732
+ })
733
+
734
+ test('returns the web binding schema if it exists', ({ assert }) => {
735
+ const dataDomain = new DataDomain()
736
+ const property = new DomainProperty(dataDomain, 'test-parent', {
737
+ bindings: [{ type: 'web', schema: { format: 'float' } }],
738
+ })
739
+ const webBindings = property.readBinding('web')
740
+ assert.deepEqual(webBindings, { format: 'float' })
741
+ })
742
+
743
+ test('returns the protobuf binding schema if it exists', ({ assert }) => {
744
+ const dataDomain = new DataDomain()
745
+ const property = new DomainProperty(dataDomain, 'test-parent', {
746
+ bindings: [{ type: 'protobuf', schema: { field: 1 } }],
747
+ })
748
+ const protobufBindings = property.readBinding('protobuf')
749
+ assert.deepEqual(protobufBindings, { field: 1 })
750
+ })
751
+
752
+ test('returns undefined if the binding exists but has no schema', ({ assert }) => {
753
+ const dataDomain = new DataDomain()
754
+ const property = new DomainProperty(dataDomain, 'test-parent', {
755
+ // @ts-expect-error Testing undefined value
756
+ bindings: [{ type: 'web', schema: undefined }],
757
+ })
758
+ const webBindings = property.readBinding('web')
759
+ assert.isUndefined(webBindings)
760
+ })
761
+
762
+ test('returns undefined if the binding exists but the schema is null', ({ assert }) => {
763
+ const dataDomain = new DataDomain()
764
+ const property = new DomainProperty(dataDomain, 'test-parent', {
765
+ // @ts-expect-error Testing null value
766
+ bindings: [{ type: 'web', schema: null }],
767
+ })
768
+ const webBindings = property.readBinding('web')
769
+ assert.isUndefined(webBindings)
770
+ })
771
+ })
772
+
773
+ test.group('DomainProperty.toApiShape()', () => {
774
+ test('returns an object', ({ assert }) => {
775
+ const dataDomain = new DataDomain()
776
+ const model = dataDomain.addModel()
777
+ const entity = model.addEntity()
778
+ const property = entity.addProperty()
779
+ const result = property.toApiShape()
780
+ assert.typeOf(result, 'object')
781
+ })
782
+
783
+ test('returns a shape with the correct kind', ({ assert }) => {
784
+ const dataDomain = new DataDomain()
785
+ const model = dataDomain.addModel()
786
+ const entity = model.addEntity()
787
+ const property = entity.addProperty()
788
+ const result = property.toApiShape()
789
+ // While we can't directly test the kind (as it's an AMF object),
790
+ // we can check for the presence of the @type property
791
+ // which is a good indicator that it's a valid AMF shape.
792
+ assert.isDefined(result)
793
+ })
794
+
795
+ test('returns a shape with the correct id', ({ assert }) => {
796
+ const dataDomain = new DataDomain()
797
+ const model = dataDomain.addModel()
798
+ const entity = model.addEntity()
799
+ const property = entity.addProperty({ key: 'test-property' })
800
+ const result = property.toApiShape()
801
+ assert.isDefined(result)
802
+ })
803
+
804
+ test('returns a shape with the correct data type', ({ assert }) => {
805
+ const dataDomain = new DataDomain()
806
+ const model = dataDomain.addModel()
807
+ const entity = model.addEntity()
808
+ const property = entity.addProperty({ type: 'number' })
809
+ const result = property.toApiShape()
810
+ assert.isDefined(result)
811
+ })
812
+
813
+ test('returns a shape with the correct data type and format', ({ assert }) => {
814
+ const dataDomain = new DataDomain()
815
+ const model = dataDomain.addModel()
816
+ const entity = model.addEntity()
817
+ const property = entity.addProperty({ type: 'number' })
818
+ property.getWebBinding().format = 'float'
819
+ const result = property.toApiShape()
820
+ assert.isDefined(result)
821
+ })
822
+ })