@transitrix/diagrams 1.8.6 → 1.8.7

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 (247) hide show
  1. package/package.json +7 -2
  2. package/dist/__tests__/edge-path.test.d.ts +0 -1
  3. package/dist/__tests__/edge-path.test.js +0 -55
  4. package/dist/__tests__/node-size-presets.test.d.ts +0 -1
  5. package/dist/__tests__/node-size-presets.test.js +0 -30
  6. package/dist/__tests__/scope.test.d.ts +0 -1
  7. package/dist/__tests__/scope.test.js +0 -23
  8. package/dist/__tests__/yaml-normalize.test.d.ts +0 -1
  9. package/dist/__tests__/yaml-normalize.test.js +0 -148
  10. package/dist/activities/__tests__/cpm.test.d.ts +0 -1
  11. package/dist/activities/__tests__/cpm.test.js +0 -146
  12. package/dist/activities/__tests__/gantt.test.d.ts +0 -1
  13. package/dist/activities/__tests__/gantt.test.js +0 -263
  14. package/dist/activities/__tests__/layout.test.d.ts +0 -1
  15. package/dist/activities/__tests__/layout.test.js +0 -98
  16. package/dist/activities/__tests__/validate.test.d.ts +0 -1
  17. package/dist/activities/__tests__/validate.test.js +0 -397
  18. package/dist/activity-card/__tests__/example.test.d.ts +0 -1
  19. package/dist/activity-card/__tests__/example.test.js +0 -73
  20. package/dist/activity-card/__tests__/layout.test.d.ts +0 -1
  21. package/dist/activity-card/__tests__/layout.test.js +0 -141
  22. package/dist/activity-card/__tests__/resolver.test.d.ts +0 -1
  23. package/dist/activity-card/__tests__/resolver.test.js +0 -325
  24. package/dist/activity-card/__tests__/validate.test.d.ts +0 -1
  25. package/dist/activity-card/__tests__/validate.test.js +0 -149
  26. package/dist/actor/__tests__/validate.test.d.ts +0 -1
  27. package/dist/actor/__tests__/validate.test.js +0 -95
  28. package/dist/applications/__tests__/validate.test.d.ts +0 -1
  29. package/dist/applications/__tests__/validate.test.js +0 -223
  30. package/dist/assertion/__tests__/example.test.d.ts +0 -1
  31. package/dist/assertion/__tests__/example.test.js +0 -32
  32. package/dist/assertion/__tests__/validate.test.d.ts +0 -1
  33. package/dist/assertion/__tests__/validate.test.js +0 -130
  34. package/dist/blocks/__tests__/layout.test.d.ts +0 -1
  35. package/dist/blocks/__tests__/layout.test.js +0 -153
  36. package/dist/blocks/__tests__/validate.test.d.ts +0 -1
  37. package/dist/blocks/__tests__/validate.test.js +0 -235
  38. package/dist/business-service/__tests__/validate.test.d.ts +0 -1
  39. package/dist/business-service/__tests__/validate.test.js +0 -135
  40. package/dist/capability-map/__tests__/CapabilityMapView.test.d.ts +0 -1
  41. package/dist/capability-map/__tests__/CapabilityMapView.test.js +0 -217
  42. package/dist/capability-map/__tests__/address.test.d.ts +0 -1
  43. package/dist/capability-map/__tests__/address.test.js +0 -49
  44. package/dist/capability-map/__tests__/dsm-layout.test.d.ts +0 -1
  45. package/dist/capability-map/__tests__/dsm-layout.test.js +0 -46
  46. package/dist/capability-map/__tests__/dsm-mutations.test.d.ts +0 -1
  47. package/dist/capability-map/__tests__/dsm-mutations.test.js +0 -125
  48. package/dist/capability-map/__tests__/dsm-validate.test.d.ts +0 -1
  49. package/dist/capability-map/__tests__/dsm-validate.test.js +0 -56
  50. package/dist/capability-map/__tests__/validate.test.d.ts +0 -1
  51. package/dist/capability-map/__tests__/validate.test.js +0 -212
  52. package/dist/change/__tests__/validate.test.d.ts +0 -1
  53. package/dist/change/__tests__/validate.test.js +0 -79
  54. package/dist/codex/__tests__/example.test.d.ts +0 -1
  55. package/dist/codex/__tests__/example.test.js +0 -33
  56. package/dist/codex/__tests__/validate.test.d.ts +0 -1
  57. package/dist/codex/__tests__/validate.test.js +0 -68
  58. package/dist/compliance/__tests__/canon-catalog.test.d.ts +0 -1
  59. package/dist/compliance/__tests__/canon-catalog.test.js +0 -60
  60. package/dist/compliance/__tests__/classify.test.d.ts +0 -1
  61. package/dist/compliance/__tests__/classify.test.js +0 -58
  62. package/dist/compliance/__tests__/confidence.test.d.ts +0 -1
  63. package/dist/compliance/__tests__/confidence.test.js +0 -78
  64. package/dist/compliance/__tests__/coverage-metric.test.d.ts +0 -1
  65. package/dist/compliance/__tests__/coverage-metric.test.js +0 -264
  66. package/dist/compliance/__tests__/demo-scenario.test.d.ts +0 -1
  67. package/dist/compliance/__tests__/demo-scenario.test.js +0 -226
  68. package/dist/compliance/__tests__/example.test.d.ts +0 -1
  69. package/dist/compliance/__tests__/example.test.js +0 -51
  70. package/dist/compliance/__tests__/gap-report.test.d.ts +0 -1
  71. package/dist/compliance/__tests__/gap-report.test.js +0 -113
  72. package/dist/compliance/__tests__/html.test.d.ts +0 -1
  73. package/dist/compliance/__tests__/html.test.js +0 -122
  74. package/dist/compliance/__tests__/impact.test.d.ts +0 -1
  75. package/dist/compliance/__tests__/impact.test.js +0 -913
  76. package/dist/compliance/__tests__/markdown.test.d.ts +0 -1
  77. package/dist/compliance/__tests__/markdown.test.js +0 -85
  78. package/dist/compliance/__tests__/trace.test.d.ts +0 -1
  79. package/dist/compliance/__tests__/trace.test.js +0 -144
  80. package/dist/compliance/__tests__/view-resolution.test.d.ts +0 -1
  81. package/dist/compliance/__tests__/view-resolution.test.js +0 -59
  82. package/dist/compliance/__tests__/views.test.d.ts +0 -1
  83. package/dist/compliance/__tests__/views.test.js +0 -59
  84. package/dist/compliance-matrix/__tests__/build.test.d.ts +0 -1
  85. package/dist/compliance-matrix/__tests__/build.test.js +0 -183
  86. package/dist/compliance-matrix/__tests__/example.test.d.ts +0 -1
  87. package/dist/compliance-matrix/__tests__/example.test.js +0 -49
  88. package/dist/confidence/__tests__/score.test.d.ts +0 -1
  89. package/dist/confidence/__tests__/score.test.js +0 -188
  90. package/dist/constraint/__tests__/example.test.d.ts +0 -1
  91. package/dist/constraint/__tests__/example.test.js +0 -14
  92. package/dist/constraint/__tests__/validate.test.d.ts +0 -1
  93. package/dist/constraint/__tests__/validate.test.js +0 -58
  94. package/dist/factor/__tests__/validate.test.d.ts +0 -1
  95. package/dist/factor/__tests__/validate.test.js +0 -112
  96. package/dist/fgca/__tests__/chain-table.test.d.ts +0 -1
  97. package/dist/fgca/__tests__/chain-table.test.js +0 -158
  98. package/dist/fgca/__tests__/layout.test.d.ts +0 -1
  99. package/dist/fgca/__tests__/layout.test.js +0 -140
  100. package/dist/fgca/__tests__/parse-canonical.test.d.ts +0 -1
  101. package/dist/fgca/__tests__/parse-canonical.test.js +0 -268
  102. package/dist/fgca/__tests__/preview-layout.test.d.ts +0 -1
  103. package/dist/fgca/__tests__/preview-layout.test.js +0 -106
  104. package/dist/fgca/__tests__/resolver.test.d.ts +0 -1
  105. package/dist/fgca/__tests__/resolver.test.js +0 -185
  106. package/dist/fgca/__tests__/validate.test.d.ts +0 -1
  107. package/dist/fgca/__tests__/validate.test.js +0 -125
  108. package/dist/goals/__tests__/GoalTreeView.test.d.ts +0 -1
  109. package/dist/goals/__tests__/GoalTreeView.test.js +0 -337
  110. package/dist/goals/__tests__/layout.test.d.ts +0 -1
  111. package/dist/goals/__tests__/layout.test.js +0 -153
  112. package/dist/goals/__tests__/mutations.test.d.ts +0 -1
  113. package/dist/goals/__tests__/mutations.test.js +0 -134
  114. package/dist/goals/__tests__/parse-canonical.test.d.ts +0 -1
  115. package/dist/goals/__tests__/parse-canonical.test.js +0 -131
  116. package/dist/goals/__tests__/validate.test.d.ts +0 -1
  117. package/dist/goals/__tests__/validate.test.js +0 -183
  118. package/dist/integration/__tests__/validate.test.d.ts +0 -1
  119. package/dist/integration/__tests__/validate.test.js +0 -169
  120. package/dist/location/__tests__/validate.test.d.ts +0 -1
  121. package/dist/location/__tests__/validate.test.js +0 -107
  122. package/dist/node/__tests__/validate.test.d.ts +0 -1
  123. package/dist/node/__tests__/validate.test.js +0 -100
  124. package/dist/process-blueprint/__tests__/compliance-lane.test.d.ts +0 -1
  125. package/dist/process-blueprint/__tests__/compliance-lane.test.js +0 -272
  126. package/dist/process-blueprint/__tests__/layout.test.d.ts +0 -1
  127. package/dist/process-blueprint/__tests__/layout.test.js +0 -196
  128. package/dist/process-blueprint/__tests__/validate.test.d.ts +0 -1
  129. package/dist/process-blueprint/__tests__/validate.test.js +0 -280
  130. package/dist/process-map/__tests__/validate.test.d.ts +0 -1
  131. package/dist/process-map/__tests__/validate.test.js +0 -199
  132. package/dist/products/__tests__/validate.test.d.ts +0 -1
  133. package/dist/products/__tests__/validate.test.js +0 -210
  134. package/dist/repo-validate/__tests__/validate-repo.test.d.ts +0 -1
  135. package/dist/repo-validate/__tests__/validate-repo.test.js +0 -576
  136. package/dist/requirement/__tests__/example.test.d.ts +0 -1
  137. package/dist/requirement/__tests__/example.test.js +0 -21
  138. package/dist/requirement/__tests__/validate.test.d.ts +0 -1
  139. package/dist/requirement/__tests__/validate.test.js +0 -80
  140. package/dist/scenarios/__tests__/validate.test.d.ts +0 -1
  141. package/dist/scenarios/__tests__/validate.test.js +0 -183
  142. package/dist/stakeholder/__tests__/validate.test.d.ts +0 -1
  143. package/dist/stakeholder/__tests__/validate.test.js +0 -88
  144. package/dist/target-state/__tests__/validate.test.d.ts +0 -1
  145. package/dist/target-state/__tests__/validate.test.js +0 -78
  146. package/dist/technology-service/__tests__/validate.test.d.ts +0 -1
  147. package/dist/technology-service/__tests__/validate.test.js +0 -121
  148. package/dist/theme/__tests__/tokens.test.d.ts +0 -1
  149. package/dist/theme/__tests__/tokens.test.js +0 -159
  150. package/dist/webview/__tests__/entity-text-layout.test.d.ts +0 -1
  151. package/dist/webview/__tests__/entity-text-layout.test.js +0 -155
  152. package/dist/webview/__tests__/entry-notations.test.d.ts +0 -1
  153. package/dist/webview/__tests__/entry-notations.test.js +0 -62
  154. package/dist/webview/__tests__/entry.test.d.ts +0 -1
  155. package/dist/webview/__tests__/entry.test.js +0 -56
  156. package/dist/webview/__tests__/render-activities.test.d.ts +0 -1
  157. package/dist/webview/__tests__/render-activities.test.js +0 -91
  158. package/dist/webview/__tests__/render-blocks.test.d.ts +0 -1
  159. package/dist/webview/__tests__/render-blocks.test.js +0 -175
  160. package/dist/webview/__tests__/render-goals.test.d.ts +0 -1
  161. package/dist/webview/__tests__/render-goals.test.js +0 -120
  162. package/dist/webview/__tests__/render-process.test.d.ts +0 -1
  163. package/dist/webview/__tests__/render-process.test.js +0 -463
  164. package/dist/webview/__tests__/render-util.test.d.ts +0 -1
  165. package/dist/webview/__tests__/render-util.test.js +0 -54
  166. package/src/__tests__/edge-path.test.ts +0 -67
  167. package/src/__tests__/node-size-presets.test.ts +0 -50
  168. package/src/__tests__/scope.test.ts +0 -27
  169. package/src/__tests__/yaml-normalize.test.ts +0 -158
  170. package/src/activities/__tests__/cpm.test.ts +0 -164
  171. package/src/activities/__tests__/gantt.test.ts +0 -290
  172. package/src/activities/__tests__/layout.test.ts +0 -112
  173. package/src/activities/__tests__/validate.test.ts +0 -446
  174. package/src/activity-card/__tests__/example.test.ts +0 -83
  175. package/src/activity-card/__tests__/layout.test.ts +0 -162
  176. package/src/activity-card/__tests__/resolver.test.ts +0 -357
  177. package/src/activity-card/__tests__/validate.test.ts +0 -167
  178. package/src/actor/__tests__/validate.test.ts +0 -114
  179. package/src/applications/__tests__/validate.test.ts +0 -256
  180. package/src/assertion/__tests__/example.test.ts +0 -37
  181. package/src/assertion/__tests__/validate.test.ts +0 -142
  182. package/src/blocks/__tests__/layout.test.ts +0 -169
  183. package/src/blocks/__tests__/validate.test.ts +0 -260
  184. package/src/business-service/__tests__/validate.test.ts +0 -160
  185. package/src/capability-map/__tests__/CapabilityMapView.test.tsx +0 -232
  186. package/src/capability-map/__tests__/address.test.ts +0 -59
  187. package/src/capability-map/__tests__/dsm-layout.test.ts +0 -52
  188. package/src/capability-map/__tests__/dsm-mutations.test.ts +0 -141
  189. package/src/capability-map/__tests__/dsm-validate.test.ts +0 -65
  190. package/src/capability-map/__tests__/validate.test.ts +0 -238
  191. package/src/change/__tests__/validate.test.ts +0 -97
  192. package/src/codex/__tests__/example.test.ts +0 -40
  193. package/src/codex/__tests__/validate.test.ts +0 -84
  194. package/src/compliance/__tests__/canon-catalog.test.ts +0 -68
  195. package/src/compliance/__tests__/classify.test.ts +0 -64
  196. package/src/compliance/__tests__/confidence.test.ts +0 -98
  197. package/src/compliance/__tests__/coverage-metric.test.ts +0 -300
  198. package/src/compliance/__tests__/demo-scenario.test.ts +0 -273
  199. package/src/compliance/__tests__/example.test.ts +0 -57
  200. package/src/compliance/__tests__/gap-report.test.ts +0 -129
  201. package/src/compliance/__tests__/html.test.ts +0 -142
  202. package/src/compliance/__tests__/impact.test.ts +0 -1060
  203. package/src/compliance/__tests__/markdown.test.ts +0 -95
  204. package/src/compliance/__tests__/trace.test.ts +0 -157
  205. package/src/compliance/__tests__/view-resolution.test.ts +0 -80
  206. package/src/compliance/__tests__/views.test.ts +0 -64
  207. package/src/compliance-matrix/__tests__/build.test.ts +0 -200
  208. package/src/compliance-matrix/__tests__/example.test.ts +0 -57
  209. package/src/confidence/__tests__/score.test.ts +0 -254
  210. package/src/constraint/__tests__/example.test.ts +0 -19
  211. package/src/constraint/__tests__/validate.test.ts +0 -68
  212. package/src/factor/__tests__/validate.test.ts +0 -133
  213. package/src/fgca/__tests__/chain-table.test.ts +0 -172
  214. package/src/fgca/__tests__/layout.test.ts +0 -179
  215. package/src/fgca/__tests__/parse-canonical.test.ts +0 -296
  216. package/src/fgca/__tests__/preview-layout.test.ts +0 -124
  217. package/src/fgca/__tests__/resolver.test.ts +0 -209
  218. package/src/fgca/__tests__/validate.test.ts +0 -142
  219. package/src/goals/__tests__/GoalTreeView.test.tsx +0 -361
  220. package/src/goals/__tests__/layout.test.ts +0 -175
  221. package/src/goals/__tests__/mutations.test.ts +0 -153
  222. package/src/goals/__tests__/parse-canonical.test.ts +0 -147
  223. package/src/goals/__tests__/validate.test.ts +0 -202
  224. package/src/integration/__tests__/validate.test.ts +0 -203
  225. package/src/location/__tests__/validate.test.ts +0 -127
  226. package/src/node/__tests__/validate.test.ts +0 -118
  227. package/src/process-blueprint/__tests__/compliance-lane.test.ts +0 -320
  228. package/src/process-blueprint/__tests__/layout.test.ts +0 -240
  229. package/src/process-blueprint/__tests__/validate.test.ts +0 -310
  230. package/src/process-map/__tests__/validate.test.ts +0 -223
  231. package/src/products/__tests__/validate.test.ts +0 -239
  232. package/src/repo-validate/__tests__/validate-repo.test.ts +0 -699
  233. package/src/requirement/__tests__/example.test.ts +0 -24
  234. package/src/requirement/__tests__/validate.test.ts +0 -96
  235. package/src/scenarios/__tests__/validate.test.ts +0 -209
  236. package/src/stakeholder/__tests__/validate.test.ts +0 -105
  237. package/src/target-state/__tests__/validate.test.ts +0 -95
  238. package/src/technology-service/__tests__/validate.test.ts +0 -143
  239. package/src/theme/__tests__/tokens.test.ts +0 -185
  240. package/src/webview/__tests__/entity-text-layout.test.ts +0 -182
  241. package/src/webview/__tests__/entry-notations.test.ts +0 -77
  242. package/src/webview/__tests__/entry.test.ts +0 -64
  243. package/src/webview/__tests__/render-activities.test.ts +0 -100
  244. package/src/webview/__tests__/render-blocks.test.ts +0 -206
  245. package/src/webview/__tests__/render-goals.test.ts +0 -128
  246. package/src/webview/__tests__/render-process.test.ts +0 -538
  247. package/src/webview/__tests__/render-util.test.ts +0 -66
@@ -1,239 +0,0 @@
1
- import { describe, it, expect } from 'vitest';
2
- import { validateProductsCatalogue } from '../validate.js';
3
-
4
- const VALID_CATALOGUE = {
5
- notation: 'products',
6
- products_catalogue: {
7
- id: 'cat-2026',
8
- name: 'Portfolio 2026',
9
- updated_at: '2026-05-13',
10
- products: [
11
- {
12
- product_id: 'prod-001',
13
- name: 'Analytics Platform',
14
- type: 'platform',
15
- status: 'Active',
16
- domain: 'Data',
17
- maturity: 3,
18
- },
19
- {
20
- product_id: 'prod-002',
21
- name: 'HR Service',
22
- type: 'service',
23
- status: 'Draft',
24
- },
25
- ],
26
- },
27
- };
28
-
29
- describe('validateProductsCatalogue', () => {
30
- it('passes on valid input', () => {
31
- const r = validateProductsCatalogue(VALID_CATALOGUE);
32
- expect(r.valid).toBe(true);
33
- expect(r.errors).toHaveLength(0);
34
- });
35
-
36
- it('PROD-001: rejects non-object input', () => {
37
- const r = validateProductsCatalogue(null);
38
- expect(r.valid).toBe(false);
39
- expect(r.errors[0].code).toBe('PROD-001');
40
- });
41
-
42
- it('PROD-001: rejects missing notation field', () => {
43
- const { notation: _, ...rest } = VALID_CATALOGUE;
44
- const r = validateProductsCatalogue(rest);
45
- expect(r.valid).toBe(false);
46
- expect(r.errors.some(e => e.code === 'PROD-001')).toBe(true);
47
- });
48
-
49
- it('PROD-001: rejects wrong notation value', () => {
50
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, notation: 'goals' });
51
- expect(r.valid).toBe(false);
52
- expect(r.errors.some(e => e.code === 'PROD-001')).toBe(true);
53
- });
54
-
55
- it('PROD-002: rejects missing products_catalogue', () => {
56
- const r = validateProductsCatalogue({ notation: 'products' });
57
- expect(r.valid).toBe(false);
58
- expect(r.errors.some(e => e.code === 'PROD-002')).toBe(true);
59
- });
60
-
61
- it('PROD-002: rejects missing catalogue id', () => {
62
- const cat = { ...VALID_CATALOGUE.products_catalogue, id: '' };
63
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
64
- expect(r.valid).toBe(false);
65
- expect(r.errors.some(e => e.code === 'PROD-002' && e.message.includes('id'))).toBe(true);
66
- });
67
-
68
- it('PROD-002: rejects missing catalogue name', () => {
69
- const cat = { ...VALID_CATALOGUE.products_catalogue, name: ' ' };
70
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
71
- expect(r.valid).toBe(false);
72
- expect(r.errors.some(e => e.code === 'PROD-002' && e.message.includes('name'))).toBe(true);
73
- });
74
-
75
- it('PROD-002: rejects missing updated_at', () => {
76
- const { updated_at: _, ...cat } = VALID_CATALOGUE.products_catalogue;
77
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
78
- expect(r.valid).toBe(false);
79
- expect(r.errors.some(e => e.code === 'PROD-002' && e.message.includes('updated_at'))).toBe(true);
80
- });
81
-
82
- it('PROD-002: rejects non-array products', () => {
83
- const cat = { ...VALID_CATALOGUE.products_catalogue, products: 'not-an-array' };
84
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
85
- expect(r.valid).toBe(false);
86
- expect(r.errors.some(e => e.code === 'PROD-002')).toBe(true);
87
- });
88
-
89
- it('PROD-003: rejects missing product_id', () => {
90
- const products = [{ name: 'X', type: 'service', status: 'Active' }];
91
- const cat = { ...VALID_CATALOGUE.products_catalogue, products };
92
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
93
- expect(r.valid).toBe(false);
94
- expect(r.errors.some(e => e.code === 'PROD-003' && e.message.includes('product_id'))).toBe(true);
95
- });
96
-
97
- it('PROD-003: rejects missing name', () => {
98
- const products = [{ product_id: 'p1', name: '', type: 'service', status: 'Active' }];
99
- const cat = { ...VALID_CATALOGUE.products_catalogue, products };
100
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
101
- expect(r.valid).toBe(false);
102
- expect(r.errors.some(e => e.code === 'PROD-003' && e.message.includes('name'))).toBe(true);
103
- });
104
-
105
- it('PROD-003: rejects missing type', () => {
106
- const products = [{ product_id: 'p1', name: 'X', status: 'Active' }];
107
- const cat = { ...VALID_CATALOGUE.products_catalogue, products };
108
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
109
- expect(r.valid).toBe(false);
110
- expect(r.errors.some(e => e.code === 'PROD-003' && e.message.includes('type'))).toBe(true);
111
- });
112
-
113
- it('PROD-003: rejects missing status', () => {
114
- const products = [{ product_id: 'p1', name: 'X', type: 'service' }];
115
- const cat = { ...VALID_CATALOGUE.products_catalogue, products };
116
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
117
- expect(r.valid).toBe(false);
118
- expect(r.errors.some(e => e.code === 'PROD-003' && e.message.includes('status'))).toBe(true);
119
- });
120
-
121
- it('PROD-004: rejects invalid type', () => {
122
- const products = [{ product_id: 'p1', name: 'X', type: 'hardware', status: 'Active' }];
123
- const cat = { ...VALID_CATALOGUE.products_catalogue, products };
124
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
125
- expect(r.valid).toBe(false);
126
- expect(r.errors.some(e => e.code === 'PROD-004')).toBe(true);
127
- });
128
-
129
- it('PROD-004: accepts all valid types', () => {
130
- for (const type of ['digital_product', 'service', 'platform', 'bundle']) {
131
- const products = [{ product_id: 'p1', name: 'X', type, status: 'Active' }];
132
- const cat = { ...VALID_CATALOGUE.products_catalogue, products };
133
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
134
- expect(r.errors.some(e => e.code === 'PROD-004')).toBe(false);
135
- }
136
- });
137
-
138
- it('PROD-005: rejects invalid status', () => {
139
- const products = [{ product_id: 'p1', name: 'X', type: 'service', status: 'Active2' }];
140
- const cat = { ...VALID_CATALOGUE.products_catalogue, products };
141
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
142
- expect(r.valid).toBe(false);
143
- expect(r.errors.some(e => e.code === 'PROD-005')).toBe(true);
144
- });
145
-
146
- it('PROD-005: accepts all valid statuses', () => {
147
- for (const status of ['Draft', 'Active', 'Deprecated']) {
148
- const products = [{ product_id: 'p1', name: 'X', type: 'service', status }];
149
- const cat = { ...VALID_CATALOGUE.products_catalogue, products };
150
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
151
- expect(r.errors.some(e => e.code === 'PROD-005')).toBe(false);
152
- }
153
- });
154
-
155
- it('PROD-006: rejects maturity < 1', () => {
156
- const products = [{ product_id: 'p1', name: 'X', type: 'service', status: 'Active', maturity: 0 }];
157
- const cat = { ...VALID_CATALOGUE.products_catalogue, products };
158
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
159
- expect(r.valid).toBe(false);
160
- expect(r.errors.some(e => e.code === 'PROD-006')).toBe(true);
161
- });
162
-
163
- it('PROD-006: rejects maturity > 5', () => {
164
- const products = [{ product_id: 'p1', name: 'X', type: 'service', status: 'Active', maturity: 6 }];
165
- const cat = { ...VALID_CATALOGUE.products_catalogue, products };
166
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
167
- expect(r.valid).toBe(false);
168
- expect(r.errors.some(e => e.code === 'PROD-006')).toBe(true);
169
- });
170
-
171
- it('PROD-006: rejects non-integer maturity', () => {
172
- const products = [{ product_id: 'p1', name: 'X', type: 'service', status: 'Active', maturity: 2.5 }];
173
- const cat = { ...VALID_CATALOGUE.products_catalogue, products };
174
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
175
- expect(r.valid).toBe(false);
176
- expect(r.errors.some(e => e.code === 'PROD-006')).toBe(true);
177
- });
178
-
179
- it('PROD-006: accepts valid maturity range 1-5', () => {
180
- for (const maturity of [1, 2, 3, 4, 5]) {
181
- const products = [{ product_id: 'p1', name: 'X', type: 'service', status: 'Active', maturity }];
182
- const cat = { ...VALID_CATALOGUE.products_catalogue, products };
183
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
184
- expect(r.errors.some(e => e.code === 'PROD-006')).toBe(false);
185
- }
186
- });
187
-
188
- it('PROD-007: rejects malformed updated_at', () => {
189
- const cat = { ...VALID_CATALOGUE.products_catalogue, updated_at: '13-05-2026' };
190
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
191
- expect(r.valid).toBe(false);
192
- expect(r.errors.some(e => e.code === 'PROD-007')).toBe(true);
193
- });
194
-
195
- it('PROD-007: accepts YYYY-MM-DD format', () => {
196
- const cat = { ...VALID_CATALOGUE.products_catalogue, updated_at: '2026-01-01' };
197
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
198
- expect(r.errors.some(e => e.code === 'PROD-007')).toBe(false);
199
- });
200
-
201
- it('PROD-008: rejects duplicate product_id', () => {
202
- const products = [
203
- { product_id: 'p1', name: 'X', type: 'service', status: 'Active' },
204
- { product_id: 'p1', name: 'Y', type: 'platform', status: 'Draft' },
205
- ];
206
- const cat = { ...VALID_CATALOGUE.products_catalogue, products };
207
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
208
- expect(r.valid).toBe(false);
209
- expect(r.errors.some(e => e.code === 'PROD-008')).toBe(true);
210
- });
211
-
212
- it('accepts empty products array', () => {
213
- const cat = { ...VALID_CATALOGUE.products_catalogue, products: [] };
214
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
215
- expect(r.valid).toBe(true);
216
- });
217
-
218
- it('accepts optional fields when absent', () => {
219
- const products = [{ product_id: 'p1', name: 'X', type: 'service', status: 'Active' }];
220
- const cat = { ...VALID_CATALOGUE.products_catalogue, products };
221
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
222
- expect(r.valid).toBe(true);
223
- });
224
-
225
- // Pre-release blocker regression (orchestrator review 2026-05-21).
226
- it('[blocker] tolerates a null element in products[] without throwing', () => {
227
- const cat = { ...VALID_CATALOGUE.products_catalogue, products: [null] };
228
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
229
- expect(r.valid).toBe(false);
230
- expect(r.errors.some(e => e.code === 'PROD-003')).toBe(true);
231
- });
232
-
233
- it('[blocker] tolerates a string element in products[] without throwing', () => {
234
- const cat = { ...VALID_CATALOGUE.products_catalogue, products: ['x'] };
235
- const r = validateProductsCatalogue({ ...VALID_CATALOGUE, products_catalogue: cat });
236
- expect(r.valid).toBe(false);
237
- expect(r.errors.some(e => e.code === 'PROD-003')).toBe(true);
238
- });
239
- });