@open-mercato/core 0.4.5-develop-2e9903a57a → 0.4.5-develop-eeccf7adf4

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 (473) hide show
  1. package/package.json +2 -2
  2. package/dist/modules/auth/__integration__/TC-AUTH-001.spec.js +0 -9
  3. package/dist/modules/auth/__integration__/TC-AUTH-001.spec.js.map +0 -7
  4. package/dist/modules/auth/__integration__/TC-AUTH-002.spec.js +0 -22
  5. package/dist/modules/auth/__integration__/TC-AUTH-002.spec.js.map +0 -7
  6. package/dist/modules/auth/__integration__/TC-AUTH-003.spec.js +0 -21
  7. package/dist/modules/auth/__integration__/TC-AUTH-003.spec.js.map +0 -7
  8. package/dist/modules/auth/__integration__/TC-AUTH-004.spec.js +0 -15
  9. package/dist/modules/auth/__integration__/TC-AUTH-004.spec.js.map +0 -7
  10. package/dist/modules/auth/__integration__/TC-AUTH-005.spec.js +0 -11
  11. package/dist/modules/auth/__integration__/TC-AUTH-005.spec.js.map +0 -7
  12. package/dist/modules/auth/__integration__/TC-AUTH-006.spec.js +0 -11
  13. package/dist/modules/auth/__integration__/TC-AUTH-006.spec.js.map +0 -7
  14. package/dist/modules/auth/__integration__/TC-AUTH-007.spec.js +0 -14
  15. package/dist/modules/auth/__integration__/TC-AUTH-007.spec.js.map +0 -7
  16. package/dist/modules/auth/__integration__/TC-AUTH-008.spec.js +0 -26
  17. package/dist/modules/auth/__integration__/TC-AUTH-008.spec.js.map +0 -7
  18. package/dist/modules/auth/__integration__/TC-AUTH-009.spec.js +0 -16
  19. package/dist/modules/auth/__integration__/TC-AUTH-009.spec.js.map +0 -7
  20. package/dist/modules/auth/__integration__/TC-AUTH-010.spec.js +0 -32
  21. package/dist/modules/auth/__integration__/TC-AUTH-010.spec.js.map +0 -7
  22. package/dist/modules/auth/__integration__/TC-AUTH-011.spec.js +0 -26
  23. package/dist/modules/auth/__integration__/TC-AUTH-011.spec.js.map +0 -7
  24. package/dist/modules/auth/__integration__/TC-AUTH-012.spec.js +0 -30
  25. package/dist/modules/auth/__integration__/TC-AUTH-012.spec.js.map +0 -7
  26. package/dist/modules/auth/__integration__/TC-AUTH-013.spec.js +0 -41
  27. package/dist/modules/auth/__integration__/TC-AUTH-013.spec.js.map +0 -7
  28. package/dist/modules/auth/__integration__/TC-AUTH-014.spec.js +0 -25
  29. package/dist/modules/auth/__integration__/TC-AUTH-014.spec.js.map +0 -7
  30. package/dist/modules/auth/__integration__/TC-AUTH-015.spec.js +0 -20
  31. package/dist/modules/auth/__integration__/TC-AUTH-015.spec.js.map +0 -7
  32. package/dist/modules/auth/__integration__/TC-AUTH-016.spec.js +0 -76
  33. package/dist/modules/auth/__integration__/TC-AUTH-016.spec.js.map +0 -7
  34. package/dist/modules/catalog/__integration__/TC-CAT-001.spec.js +0 -20
  35. package/dist/modules/catalog/__integration__/TC-CAT-001.spec.js.map +0 -7
  36. package/dist/modules/catalog/__integration__/TC-CAT-002.spec.js +0 -12
  37. package/dist/modules/catalog/__integration__/TC-CAT-002.spec.js.map +0 -7
  38. package/dist/modules/catalog/__integration__/TC-CAT-003.spec.js +0 -28
  39. package/dist/modules/catalog/__integration__/TC-CAT-003.spec.js.map +0 -7
  40. package/dist/modules/catalog/__integration__/TC-CAT-004.spec.js +0 -33
  41. package/dist/modules/catalog/__integration__/TC-CAT-004.spec.js.map +0 -7
  42. package/dist/modules/catalog/__integration__/TC-CAT-005.spec.js +0 -30
  43. package/dist/modules/catalog/__integration__/TC-CAT-005.spec.js.map +0 -7
  44. package/dist/modules/catalog/__integration__/TC-CAT-006.spec.js +0 -31
  45. package/dist/modules/catalog/__integration__/TC-CAT-006.spec.js.map +0 -7
  46. package/dist/modules/catalog/__integration__/TC-CAT-007.spec.js +0 -31
  47. package/dist/modules/catalog/__integration__/TC-CAT-007.spec.js.map +0 -7
  48. package/dist/modules/catalog/__integration__/TC-CAT-008.spec.js +0 -65
  49. package/dist/modules/catalog/__integration__/TC-CAT-008.spec.js.map +0 -7
  50. package/dist/modules/catalog/__integration__/TC-CAT-009.spec.js +0 -31
  51. package/dist/modules/catalog/__integration__/TC-CAT-009.spec.js.map +0 -7
  52. package/dist/modules/catalog/__integration__/TC-CAT-010.spec.js +0 -28
  53. package/dist/modules/catalog/__integration__/TC-CAT-010.spec.js.map +0 -7
  54. package/dist/modules/catalog/__integration__/TC-CAT-011.spec.js +0 -34
  55. package/dist/modules/catalog/__integration__/TC-CAT-011.spec.js.map +0 -7
  56. package/dist/modules/catalog/__integration__/TC-CAT-012.spec.js +0 -27
  57. package/dist/modules/catalog/__integration__/TC-CAT-012.spec.js.map +0 -7
  58. package/dist/modules/core/__integration__/admin/TC-ADMIN-001.spec.js +0 -44
  59. package/dist/modules/core/__integration__/admin/TC-ADMIN-001.spec.js.map +0 -7
  60. package/dist/modules/core/__integration__/admin/TC-ADMIN-002.spec.js +0 -53
  61. package/dist/modules/core/__integration__/admin/TC-ADMIN-002.spec.js.map +0 -7
  62. package/dist/modules/core/__integration__/admin/TC-ADMIN-003.spec.js +0 -26
  63. package/dist/modules/core/__integration__/admin/TC-ADMIN-003.spec.js.map +0 -7
  64. package/dist/modules/core/__integration__/admin/TC-ADMIN-004.spec.js +0 -47
  65. package/dist/modules/core/__integration__/admin/TC-ADMIN-004.spec.js.map +0 -7
  66. package/dist/modules/core/__integration__/admin/TC-ADMIN-005.spec.js +0 -33
  67. package/dist/modules/core/__integration__/admin/TC-ADMIN-005.spec.js.map +0 -7
  68. package/dist/modules/core/__integration__/admin/TC-ADMIN-006.spec.js +0 -30
  69. package/dist/modules/core/__integration__/admin/TC-ADMIN-006.spec.js.map +0 -7
  70. package/dist/modules/core/__integration__/admin/TC-ADMIN-007.spec.js +0 -36
  71. package/dist/modules/core/__integration__/admin/TC-ADMIN-007.spec.js.map +0 -7
  72. package/dist/modules/core/__integration__/admin/TC-ADMIN-008.spec.js +0 -113
  73. package/dist/modules/core/__integration__/admin/TC-ADMIN-008.spec.js.map +0 -7
  74. package/dist/modules/core/__integration__/admin/TC-ADMIN-009.spec.js +0 -25
  75. package/dist/modules/core/__integration__/admin/TC-ADMIN-009.spec.js.map +0 -7
  76. package/dist/modules/core/__integration__/admin/TC-ADMIN-010.spec.js +0 -35
  77. package/dist/modules/core/__integration__/admin/TC-ADMIN-010.spec.js.map +0 -7
  78. package/dist/modules/core/__integration__/helpers/api.js +0 -64
  79. package/dist/modules/core/__integration__/helpers/api.js.map +0 -7
  80. package/dist/modules/core/__integration__/helpers/auth.js +0 -98
  81. package/dist/modules/core/__integration__/helpers/auth.js.map +0 -7
  82. package/dist/modules/core/__integration__/helpers/authUi.js +0 -31
  83. package/dist/modules/core/__integration__/helpers/authUi.js.map +0 -7
  84. package/dist/modules/core/__integration__/helpers/catalogFixtures.js +0 -49
  85. package/dist/modules/core/__integration__/helpers/catalogFixtures.js.map +0 -7
  86. package/dist/modules/core/__integration__/helpers/crmFixtures.js +0 -73
  87. package/dist/modules/core/__integration__/helpers/crmFixtures.js.map +0 -7
  88. package/dist/modules/core/__integration__/helpers/salesFixtures.js +0 -63
  89. package/dist/modules/core/__integration__/helpers/salesFixtures.js.map +0 -7
  90. package/dist/modules/core/__integration__/helpers/salesUi.js +0 -464
  91. package/dist/modules/core/__integration__/helpers/salesUi.js.map +0 -7
  92. package/dist/modules/core/__integration__/integration/TC-INT-001.spec.js +0 -26
  93. package/dist/modules/core/__integration__/integration/TC-INT-001.spec.js.map +0 -7
  94. package/dist/modules/core/__integration__/integration/TC-INT-002.spec.js +0 -60
  95. package/dist/modules/core/__integration__/integration/TC-INT-002.spec.js.map +0 -7
  96. package/dist/modules/core/__integration__/integration/TC-INT-003.spec.js +0 -36
  97. package/dist/modules/core/__integration__/integration/TC-INT-003.spec.js.map +0 -7
  98. package/dist/modules/core/__integration__/integration/TC-INT-004.spec.js +0 -74
  99. package/dist/modules/core/__integration__/integration/TC-INT-004.spec.js.map +0 -7
  100. package/dist/modules/core/__integration__/integration/TC-INT-005.spec.js +0 -21
  101. package/dist/modules/core/__integration__/integration/TC-INT-005.spec.js.map +0 -7
  102. package/dist/modules/customers/__integration__/TC-CRM-001.spec.js +0 -32
  103. package/dist/modules/customers/__integration__/TC-CRM-001.spec.js.map +0 -7
  104. package/dist/modules/customers/__integration__/TC-CRM-002.spec.js +0 -35
  105. package/dist/modules/customers/__integration__/TC-CRM-002.spec.js.map +0 -7
  106. package/dist/modules/customers/__integration__/TC-CRM-003.spec.js +0 -40
  107. package/dist/modules/customers/__integration__/TC-CRM-003.spec.js.map +0 -7
  108. package/dist/modules/customers/__integration__/TC-CRM-004.spec.js +0 -40
  109. package/dist/modules/customers/__integration__/TC-CRM-004.spec.js.map +0 -7
  110. package/dist/modules/customers/__integration__/TC-CRM-005.spec.js +0 -37
  111. package/dist/modules/customers/__integration__/TC-CRM-005.spec.js.map +0 -7
  112. package/dist/modules/customers/__integration__/TC-CRM-006.spec.js +0 -42
  113. package/dist/modules/customers/__integration__/TC-CRM-006.spec.js.map +0 -7
  114. package/dist/modules/customers/__integration__/TC-CRM-007.spec.js +0 -44
  115. package/dist/modules/customers/__integration__/TC-CRM-007.spec.js.map +0 -7
  116. package/dist/modules/customers/__integration__/TC-CRM-008.spec.js +0 -50
  117. package/dist/modules/customers/__integration__/TC-CRM-008.spec.js.map +0 -7
  118. package/dist/modules/customers/__integration__/TC-CRM-009.spec.js +0 -33
  119. package/dist/modules/customers/__integration__/TC-CRM-009.spec.js.map +0 -7
  120. package/dist/modules/customers/__integration__/TC-CRM-010.spec.js +0 -39
  121. package/dist/modules/customers/__integration__/TC-CRM-010.spec.js.map +0 -7
  122. package/dist/modules/customers/__integration__/TC-CRM-011.spec.js +0 -37
  123. package/dist/modules/customers/__integration__/TC-CRM-011.spec.js.map +0 -7
  124. package/dist/modules/customers/__integration__/TC-CRM-012.spec.js +0 -38
  125. package/dist/modules/customers/__integration__/TC-CRM-012.spec.js.map +0 -7
  126. package/dist/modules/customers/__integration__/TC-CRM-013.spec.js +0 -43
  127. package/dist/modules/customers/__integration__/TC-CRM-013.spec.js.map +0 -7
  128. package/dist/modules/customers/__integration__/TC-CRM-014.spec.js +0 -23
  129. package/dist/modules/customers/__integration__/TC-CRM-014.spec.js.map +0 -7
  130. package/dist/modules/customers/__integration__/TC-CRM-015.spec.js +0 -63
  131. package/dist/modules/customers/__integration__/TC-CRM-015.spec.js.map +0 -7
  132. package/dist/modules/customers/__integration__/TC-CRM-016.spec.js +0 -46
  133. package/dist/modules/customers/__integration__/TC-CRM-016.spec.js.map +0 -7
  134. package/dist/modules/customers/__integration__/TC-CRM-017.spec.js +0 -29
  135. package/dist/modules/customers/__integration__/TC-CRM-017.spec.js.map +0 -7
  136. package/dist/modules/customers/__integration__/TC-CRM-018.spec.js +0 -52
  137. package/dist/modules/customers/__integration__/TC-CRM-018.spec.js.map +0 -7
  138. package/dist/modules/customers/__integration__/TC-CRM-019.spec.js +0 -37
  139. package/dist/modules/customers/__integration__/TC-CRM-019.spec.js.map +0 -7
  140. package/dist/modules/customers/__integration__/TC-CRM-020.spec.js +0 -65
  141. package/dist/modules/customers/__integration__/TC-CRM-020.spec.js.map +0 -7
  142. package/dist/modules/progress/__integration__/TC-PROG-001.spec.js +0 -51
  143. package/dist/modules/progress/__integration__/TC-PROG-001.spec.js.map +0 -7
  144. package/dist/modules/resources/__integration__/TC-INT-007.spec.js +0 -88
  145. package/dist/modules/resources/__integration__/TC-INT-007.spec.js.map +0 -7
  146. package/dist/modules/resources/__integration__/helpers/resourcesFixtures.js +0 -45
  147. package/dist/modules/resources/__integration__/helpers/resourcesFixtures.js.map +0 -7
  148. package/dist/modules/sales/__integration__/TC-SALES-001.spec.js +0 -20
  149. package/dist/modules/sales/__integration__/TC-SALES-001.spec.js.map +0 -7
  150. package/dist/modules/sales/__integration__/TC-SALES-002.spec.js +0 -31
  151. package/dist/modules/sales/__integration__/TC-SALES-002.spec.js.map +0 -7
  152. package/dist/modules/sales/__integration__/TC-SALES-003.spec.js +0 -13
  153. package/dist/modules/sales/__integration__/TC-SALES-003.spec.js.map +0 -7
  154. package/dist/modules/sales/__integration__/TC-SALES-004.spec.js +0 -14
  155. package/dist/modules/sales/__integration__/TC-SALES-004.spec.js.map +0 -7
  156. package/dist/modules/sales/__integration__/TC-SALES-005.spec.js +0 -15
  157. package/dist/modules/sales/__integration__/TC-SALES-005.spec.js.map +0 -7
  158. package/dist/modules/sales/__integration__/TC-SALES-006.spec.js +0 -20
  159. package/dist/modules/sales/__integration__/TC-SALES-006.spec.js.map +0 -7
  160. package/dist/modules/sales/__integration__/TC-SALES-007.spec.js +0 -19
  161. package/dist/modules/sales/__integration__/TC-SALES-007.spec.js.map +0 -7
  162. package/dist/modules/sales/__integration__/TC-SALES-008.spec.js +0 -7
  163. package/dist/modules/sales/__integration__/TC-SALES-008.spec.js.map +0 -7
  164. package/dist/modules/sales/__integration__/TC-SALES-009.spec.js +0 -7
  165. package/dist/modules/sales/__integration__/TC-SALES-009.spec.js.map +0 -7
  166. package/dist/modules/sales/__integration__/TC-SALES-010.spec.js +0 -16
  167. package/dist/modules/sales/__integration__/TC-SALES-010.spec.js.map +0 -7
  168. package/dist/modules/sales/__integration__/TC-SALES-011.spec.js +0 -20
  169. package/dist/modules/sales/__integration__/TC-SALES-011.spec.js.map +0 -7
  170. package/dist/modules/sales/__integration__/TC-SALES-012.spec.js +0 -7
  171. package/dist/modules/sales/__integration__/TC-SALES-012.spec.js.map +0 -7
  172. package/dist/modules/sales/__integration__/TC-SALES-013.spec.js +0 -66
  173. package/dist/modules/sales/__integration__/TC-SALES-013.spec.js.map +0 -7
  174. package/dist/modules/sales/__integration__/TC-SALES-014.spec.js +0 -13
  175. package/dist/modules/sales/__integration__/TC-SALES-014.spec.js.map +0 -7
  176. package/dist/modules/sales/__integration__/TC-SALES-015.spec.js +0 -13
  177. package/dist/modules/sales/__integration__/TC-SALES-015.spec.js.map +0 -7
  178. package/dist/modules/sales/__integration__/TC-SALES-016.spec.js +0 -13
  179. package/dist/modules/sales/__integration__/TC-SALES-016.spec.js.map +0 -7
  180. package/dist/modules/sales/__integration__/TC-SALES-017.spec.js +0 -44
  181. package/dist/modules/sales/__integration__/TC-SALES-017.spec.js.map +0 -7
  182. package/dist/modules/sales/__integration__/TC-SALES-018.spec.js +0 -18
  183. package/dist/modules/sales/__integration__/TC-SALES-018.spec.js.map +0 -7
  184. package/dist/modules/sales/__integration__/TC-SALES-019.spec.js +0 -16
  185. package/dist/modules/sales/__integration__/TC-SALES-019.spec.js.map +0 -7
  186. package/dist/modules/sales/__integration__/TC-SALES-020.spec.js +0 -75
  187. package/dist/modules/sales/__integration__/TC-SALES-020.spec.js.map +0 -7
  188. package/dist/modules/staff/__integration__/TC-INT-006.spec.js +0 -64
  189. package/dist/modules/staff/__integration__/TC-INT-006.spec.js.map +0 -7
  190. package/dist/modules/translations/__integration__/TC-TRANS-001.spec.js +0 -48
  191. package/dist/modules/translations/__integration__/TC-TRANS-001.spec.js.map +0 -7
  192. package/dist/modules/translations/__integration__/TC-TRANS-002.spec.js +0 -94
  193. package/dist/modules/translations/__integration__/TC-TRANS-002.spec.js.map +0 -7
  194. package/dist/modules/translations/__integration__/TC-TRANS-003.spec.js +0 -61
  195. package/dist/modules/translations/__integration__/TC-TRANS-003.spec.js.map +0 -7
  196. package/dist/modules/translations/__integration__/TC-TRANS-004.spec.js +0 -52
  197. package/dist/modules/translations/__integration__/TC-TRANS-004.spec.js.map +0 -7
  198. package/dist/modules/translations/__integration__/TC-TRANS-005.spec.js +0 -106
  199. package/dist/modules/translations/__integration__/TC-TRANS-005.spec.js.map +0 -7
  200. package/dist/modules/translations/__integration__/TC-TRANS-006.spec.js +0 -94
  201. package/dist/modules/translations/__integration__/TC-TRANS-006.spec.js.map +0 -7
  202. package/dist/modules/translations/__integration__/TC-TRANS-007.spec.js +0 -62
  203. package/dist/modules/translations/__integration__/TC-TRANS-007.spec.js.map +0 -7
  204. package/dist/modules/translations/__integration__/TC-TRANS-008.spec.js +0 -168
  205. package/dist/modules/translations/__integration__/TC-TRANS-008.spec.js.map +0 -7
  206. package/dist/modules/translations/__integration__/helpers/translationFixtures.js +0 -63
  207. package/dist/modules/translations/__integration__/helpers/translationFixtures.js.map +0 -7
  208. package/dist/modules/workflows/__integration__/TC-WF-001.spec.js +0 -73
  209. package/dist/modules/workflows/__integration__/TC-WF-001.spec.js.map +0 -7
  210. package/src/__tests__/module-decoupling.test.ts +0 -356
  211. package/src/modules/api_keys/api/__tests__/keys.route.test.ts +0 -244
  212. package/src/modules/attachments/api/__tests__/attachments.api.test.ts +0 -240
  213. package/src/modules/attachments/components/__tests__/AttachmentContentPreview.test.tsx +0 -45
  214. package/src/modules/attachments/data/__tests__/entities-ocr.test.ts +0 -15
  215. package/src/modules/attachments/lib/__tests__/ocr-config.test.ts +0 -27
  216. package/src/modules/attachments/lib/__tests__/textExtraction.test.ts +0 -64
  217. package/src/modules/audit_logs/api/__tests__/access.route.test.ts +0 -118
  218. package/src/modules/audit_logs/api/__tests__/redo.route.test.ts +0 -131
  219. package/src/modules/audit_logs/api/__tests__/undo.route.test.ts +0 -103
  220. package/src/modules/audit_logs/services/__tests__/actionLogService.test.ts +0 -26
  221. package/src/modules/auth/__integration__/TC-AUTH-001.spec.ts +0 -13
  222. package/src/modules/auth/__integration__/TC-AUTH-002.spec.ts +0 -30
  223. package/src/modules/auth/__integration__/TC-AUTH-003.spec.ts +0 -28
  224. package/src/modules/auth/__integration__/TC-AUTH-004.spec.ts +0 -21
  225. package/src/modules/auth/__integration__/TC-AUTH-005.spec.ts +0 -17
  226. package/src/modules/auth/__integration__/TC-AUTH-006.spec.ts +0 -17
  227. package/src/modules/auth/__integration__/TC-AUTH-007.spec.ts +0 -19
  228. package/src/modules/auth/__integration__/TC-AUTH-008.spec.ts +0 -31
  229. package/src/modules/auth/__integration__/TC-AUTH-009.spec.ts +0 -22
  230. package/src/modules/auth/__integration__/TC-AUTH-010.spec.ts +0 -39
  231. package/src/modules/auth/__integration__/TC-AUTH-011.spec.ts +0 -35
  232. package/src/modules/auth/__integration__/TC-AUTH-012.spec.ts +0 -36
  233. package/src/modules/auth/__integration__/TC-AUTH-013.spec.ts +0 -48
  234. package/src/modules/auth/__integration__/TC-AUTH-014.spec.ts +0 -31
  235. package/src/modules/auth/__integration__/TC-AUTH-015.spec.ts +0 -28
  236. package/src/modules/auth/__integration__/TC-AUTH-016.spec.ts +0 -109
  237. package/src/modules/auth/__tests__/cli-rotate-encryption.test.ts +0 -97
  238. package/src/modules/auth/__tests__/cli-setup-acl.test.ts +0 -148
  239. package/src/modules/auth/api/__tests__/feature-check.test.ts +0 -65
  240. package/src/modules/auth/api/__tests__/login.test.ts +0 -47
  241. package/src/modules/auth/commands/__tests__/roles.custom-fields.test.ts +0 -126
  242. package/src/modules/auth/commands/__tests__/users.custom-fields.test.ts +0 -147
  243. package/src/modules/auth/lib/__tests__/rateLimitCheck.test.ts +0 -224
  244. package/src/modules/auth/services/__tests__/authService.test.ts +0 -32
  245. package/src/modules/auth/services/__tests__/rbacService.test.ts +0 -814
  246. package/src/modules/business_rules/api/__tests__/execute.route.test.ts +0 -311
  247. package/src/modules/business_rules/api/__tests__/logs-detail.route.test.ts +0 -181
  248. package/src/modules/business_rules/api/__tests__/logs.route.test.ts +0 -261
  249. package/src/modules/business_rules/api/__tests__/rules-detail.route.test.ts +0 -115
  250. package/src/modules/business_rules/api/__tests__/rules.route.test.ts +0 -746
  251. package/src/modules/business_rules/api/__tests__/sets-detail.route.test.ts +0 -169
  252. package/src/modules/business_rules/api/__tests__/sets-members.route.test.ts +0 -367
  253. package/src/modules/business_rules/api/__tests__/sets.route.test.ts +0 -361
  254. package/src/modules/business_rules/api/__tests__/test-helpers.ts +0 -42
  255. package/src/modules/business_rules/components/utils/__tests__/formHelpers.test.ts +0 -69
  256. package/src/modules/business_rules/data/__tests__/validators.test.ts +0 -637
  257. package/src/modules/business_rules/lib/__tests__/action-executor.test.ts +0 -728
  258. package/src/modules/business_rules/lib/__tests__/expression-evaluator.test.ts +0 -592
  259. package/src/modules/business_rules/lib/__tests__/rule-engine.test.ts +0 -805
  260. package/src/modules/business_rules/lib/__tests__/rule-evaluator.test.ts +0 -436
  261. package/src/modules/catalog/__integration__/TC-CAT-001.spec.ts +0 -32
  262. package/src/modules/catalog/__integration__/TC-CAT-002.spec.ts +0 -19
  263. package/src/modules/catalog/__integration__/TC-CAT-003.spec.ts +0 -39
  264. package/src/modules/catalog/__integration__/TC-CAT-004.spec.ts +0 -41
  265. package/src/modules/catalog/__integration__/TC-CAT-005.spec.ts +0 -37
  266. package/src/modules/catalog/__integration__/TC-CAT-006.spec.ts +0 -40
  267. package/src/modules/catalog/__integration__/TC-CAT-007.spec.ts +0 -37
  268. package/src/modules/catalog/__integration__/TC-CAT-008.spec.ts +0 -76
  269. package/src/modules/catalog/__integration__/TC-CAT-009.spec.ts +0 -39
  270. package/src/modules/catalog/__integration__/TC-CAT-010.spec.ts +0 -36
  271. package/src/modules/catalog/__integration__/TC-CAT-011.spec.ts +0 -44
  272. package/src/modules/catalog/__integration__/TC-CAT-012.spec.ts +0 -35
  273. package/src/modules/catalog/api/__tests__/offers.route.test.ts +0 -161
  274. package/src/modules/catalog/api/__tests__/prices.route.test.ts +0 -39
  275. package/src/modules/catalog/api/__tests__/products.route.test.ts +0 -91
  276. package/src/modules/catalog/api/__tests__/utils.test.ts +0 -36
  277. package/src/modules/catalog/api/__tests__/variants.route.test.ts +0 -44
  278. package/src/modules/catalog/backend/catalog/products/__tests__/ProductsDataTable.test.tsx +0 -172
  279. package/src/modules/catalog/commands/__tests__/products.delete.test.ts +0 -146
  280. package/src/modules/catalog/commands/__tests__/products.update.test.ts +0 -142
  281. package/src/modules/catalog/commands/__tests__/registration.test.ts +0 -54
  282. package/src/modules/catalog/commands/__tests__/shared.test.ts +0 -129
  283. package/src/modules/catalog/components/__tests__/catalogComponentsRender.test.tsx +0 -373
  284. package/src/modules/catalog/components/products/__tests__/ProductImageCell.test.tsx +0 -51
  285. package/src/modules/catalog/components/products/__tests__/productForm.test.ts +0 -32
  286. package/src/modules/catalog/lib/__tests__/pricing.test.ts +0 -150
  287. package/src/modules/catalog/services/__tests__/catalogPricingService.test.ts +0 -21
  288. package/src/modules/configs/components/__tests__/CachePanel.test.tsx +0 -134
  289. package/src/modules/configs/components/__tests__/SystemStatusPanel.test.tsx +0 -93
  290. package/src/modules/configs/lib/__tests__/system-status.test.ts +0 -55
  291. package/src/modules/configs/lib/__tests__/upgrade-actions.test.ts +0 -135
  292. package/src/modules/core/__integration__/admin/TC-ADMIN-001.spec.ts +0 -70
  293. package/src/modules/core/__integration__/admin/TC-ADMIN-002.spec.ts +0 -83
  294. package/src/modules/core/__integration__/admin/TC-ADMIN-003.spec.ts +0 -50
  295. package/src/modules/core/__integration__/admin/TC-ADMIN-004.spec.ts +0 -77
  296. package/src/modules/core/__integration__/admin/TC-ADMIN-005.spec.ts +0 -49
  297. package/src/modules/core/__integration__/admin/TC-ADMIN-006.spec.ts +0 -59
  298. package/src/modules/core/__integration__/admin/TC-ADMIN-007.spec.ts +0 -68
  299. package/src/modules/core/__integration__/admin/TC-ADMIN-008.spec.ts +0 -127
  300. package/src/modules/core/__integration__/admin/TC-ADMIN-009.spec.ts +0 -48
  301. package/src/modules/core/__integration__/admin/TC-ADMIN-010.spec.ts +0 -57
  302. package/src/modules/core/__integration__/helpers/api.ts +0 -84
  303. package/src/modules/core/__integration__/helpers/auth.ts +0 -110
  304. package/src/modules/core/__integration__/helpers/authUi.ts +0 -33
  305. package/src/modules/core/__integration__/helpers/catalogFixtures.ts +0 -73
  306. package/src/modules/core/__integration__/helpers/crmFixtures.ts +0 -101
  307. package/src/modules/core/__integration__/helpers/salesFixtures.ts +0 -89
  308. package/src/modules/core/__integration__/helpers/salesUi.ts +0 -528
  309. package/src/modules/core/__integration__/integration/TC-INT-001.spec.ts +0 -34
  310. package/src/modules/core/__integration__/integration/TC-INT-002.spec.ts +0 -74
  311. package/src/modules/core/__integration__/integration/TC-INT-003.spec.ts +0 -43
  312. package/src/modules/core/__integration__/integration/TC-INT-004.spec.ts +0 -82
  313. package/src/modules/core/__integration__/integration/TC-INT-005.spec.ts +0 -29
  314. package/src/modules/currencies/backend/exchange-rates/__tests__/formatDateTimeLocal.test.ts +0 -78
  315. package/src/modules/currencies/data/__tests__/validators.test.ts +0 -100
  316. package/src/modules/currencies/services/__tests__/exchangeRateService.test.ts +0 -666
  317. package/src/modules/currencies/services/__tests__/rateFetchingService.basic.test.ts +0 -398
  318. package/src/modules/currencies/services/__tests__/rateFetchingService.errors.test.ts +0 -296
  319. package/src/modules/currencies/services/__tests__/rateFetchingService.providers.test.ts +0 -350
  320. package/src/modules/currencies/services/__tests__/rateFetchingService.setup.ts +0 -188
  321. package/src/modules/customers/__integration__/TC-CRM-001.spec.ts +0 -42
  322. package/src/modules/customers/__integration__/TC-CRM-002.spec.ts +0 -47
  323. package/src/modules/customers/__integration__/TC-CRM-003.spec.ts +0 -55
  324. package/src/modules/customers/__integration__/TC-CRM-004.spec.ts +0 -57
  325. package/src/modules/customers/__integration__/TC-CRM-005.spec.ts +0 -50
  326. package/src/modules/customers/__integration__/TC-CRM-006.spec.ts +0 -60
  327. package/src/modules/customers/__integration__/TC-CRM-007.spec.ts +0 -57
  328. package/src/modules/customers/__integration__/TC-CRM-008.spec.ts +0 -62
  329. package/src/modules/customers/__integration__/TC-CRM-009.spec.ts +0 -46
  330. package/src/modules/customers/__integration__/TC-CRM-010.spec.ts +0 -49
  331. package/src/modules/customers/__integration__/TC-CRM-011.spec.ts +0 -47
  332. package/src/modules/customers/__integration__/TC-CRM-012.spec.ts +0 -49
  333. package/src/modules/customers/__integration__/TC-CRM-013.spec.ts +0 -61
  334. package/src/modules/customers/__integration__/TC-CRM-014.spec.ts +0 -31
  335. package/src/modules/customers/__integration__/TC-CRM-015.spec.ts +0 -89
  336. package/src/modules/customers/__integration__/TC-CRM-016.spec.ts +0 -55
  337. package/src/modules/customers/__integration__/TC-CRM-017.spec.ts +0 -37
  338. package/src/modules/customers/__integration__/TC-CRM-018.spec.ts +0 -62
  339. package/src/modules/customers/__integration__/TC-CRM-019.spec.ts +0 -44
  340. package/src/modules/customers/__integration__/TC-CRM-020.spec.ts +0 -73
  341. package/src/modules/customers/api/__tests__/utils.test.ts +0 -61
  342. package/src/modules/customers/api/dashboard/widgets/new-deals/__tests__/route.test.ts +0 -54
  343. package/src/modules/customers/commands/__tests__/shared.test.ts +0 -263
  344. package/src/modules/customers/commands/__tests__/undo.custom-fields.test.ts +0 -1184
  345. package/src/modules/customers/components/detail/__tests__/ActivityForm.validation.test.ts +0 -37
  346. package/src/modules/customers/components/detail/__tests__/DealForm.validation.test.ts +0 -45
  347. package/src/modules/customers/components/detail/__tests__/InlineEditors.test.tsx +0 -166
  348. package/src/modules/customers/components/detail/__tests__/TaskForm.submit.test.ts +0 -21
  349. package/src/modules/customers/components/detail/hooks/__tests__/useCustomerDictionary.test.ts +0 -97
  350. package/src/modules/customers/lib/__tests__/customFieldRouting.test.ts +0 -107
  351. package/src/modules/customers/utils/__tests__/addressFormat.test.ts +0 -105
  352. package/src/modules/customers/utils/__tests__/phoneDuplicates.test.ts +0 -98
  353. package/src/modules/dashboards/__tests__/widgets.test.ts +0 -70
  354. package/src/modules/dashboards/lib/__tests__/aggregations.test.ts +0 -328
  355. package/src/modules/dashboards/lib/__tests__/formatters.test.ts +0 -128
  356. package/src/modules/directory/backend/directory/organizations/__tests__/create-submit.test.ts +0 -46
  357. package/src/modules/directory/backend/directory/organizations/__tests__/edit-submit.test.ts +0 -49
  358. package/src/modules/directory/components/__tests__/OrganizationSelect.test.tsx +0 -71
  359. package/src/modules/directory/components/__tests__/TenantSelect.test.tsx +0 -75
  360. package/src/modules/entities/__tests__/cli-decrypt-database.test.ts +0 -534
  361. package/src/modules/entities/__tests__/cli-rotate-encryption.test.ts +0 -123
  362. package/src/modules/entities/api/__tests__/encryption.api.test.ts +0 -57
  363. package/src/modules/entities/api/__tests__/records.get.custom-entity.test.ts +0 -43
  364. package/src/modules/entities/api/__tests__/records.validation.test.ts +0 -53
  365. package/src/modules/entities/backend/entities/user/__tests__/create-entity-submit.test.ts +0 -47
  366. package/src/modules/entities/backend/entities/user/__tests__/records-submit.test.ts +0 -104
  367. package/src/modules/feature_toggles/commands/__tests__/global.test.ts +0 -325
  368. package/src/modules/feature_toggles/commands/__tests__/overrides.test.ts +0 -186
  369. package/src/modules/feature_toggles/lib/__tests__/feature-flag-check.test.ts +0 -365
  370. package/src/modules/feature_toggles/lib/__tests__/queries.test.ts +0 -130
  371. package/src/modules/inbox_ops/api/emails/[id]/reprocess/__tests__/route.test.ts +0 -194
  372. package/src/modules/inbox_ops/api/proposals/[id]/__tests__/route.test.ts +0 -124
  373. package/src/modules/inbox_ops/api/proposals/[id]/accept-all/__tests__/route.test.ts +0 -154
  374. package/src/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/__tests__/route.test.ts +0 -200
  375. package/src/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/accept/__tests__/route.test.ts +0 -261
  376. package/src/modules/inbox_ops/api/proposals/[id]/actions/[actionId]/reject/__tests__/route.test.ts +0 -201
  377. package/src/modules/inbox_ops/api/proposals/[id]/reject/__tests__/route.test.ts +0 -123
  378. package/src/modules/inbox_ops/api/proposals/[id]/replies/[replyId]/send/__tests__/route.test.ts +0 -232
  379. package/src/modules/inbox_ops/api/proposals/[id]/translate/__tests__/route.test.ts +0 -173
  380. package/src/modules/inbox_ops/api/proposals/__tests__/route.test.ts +0 -185
  381. package/src/modules/inbox_ops/api/webhook/__tests__/inbound.test.ts +0 -317
  382. package/src/modules/inbox_ops/data/__tests__/validators.test.ts +0 -463
  383. package/src/modules/inbox_ops/lib/__tests__/catalogLookup.test.ts +0 -143
  384. package/src/modules/inbox_ops/lib/__tests__/contactMatcher.test.ts +0 -158
  385. package/src/modules/inbox_ops/lib/__tests__/emailParser.test.ts +0 -191
  386. package/src/modules/inbox_ops/lib/__tests__/executionEngine.test.ts +0 -1419
  387. package/src/modules/inbox_ops/lib/__tests__/extractionPrompt.test.ts +0 -151
  388. package/src/modules/inbox_ops/lib/__tests__/priceValidator.test.ts +0 -259
  389. package/src/modules/inbox_ops/lib/__tests__/translationProvider.test.ts +0 -99
  390. package/src/modules/inbox_ops/subscribers/__tests__/extractionWorker.test.ts +0 -803
  391. package/src/modules/notifications/__tests__/deliver-notification.test.ts +0 -285
  392. package/src/modules/notifications/__tests__/deliveryStrategies.test.ts +0 -19
  393. package/src/modules/notifications/__tests__/notificationService.test.ts +0 -248
  394. package/src/modules/planner/__tests__/availabilityMerge.test.ts +0 -99
  395. package/src/modules/planner/__tests__/plannerAvailabilityService.test.ts +0 -89
  396. package/src/modules/planner/data/__tests__/validators.test.ts +0 -78
  397. package/src/modules/progress/__integration__/TC-PROG-001.spec.ts +0 -67
  398. package/src/modules/progress/__tests__/progressService.test.ts +0 -377
  399. package/src/modules/query_index/__tests__/hybrid-engine.test.ts +0 -365
  400. package/src/modules/query_index/__tests__/indexer.test.ts +0 -175
  401. package/src/modules/resources/__integration__/TC-INT-007.spec.ts +0 -110
  402. package/src/modules/resources/__integration__/helpers/resourcesFixtures.ts +0 -50
  403. package/src/modules/resources/data/__tests__/validators.test.ts +0 -65
  404. package/src/modules/sales/__integration__/TC-SALES-001.spec.ts +0 -26
  405. package/src/modules/sales/__integration__/TC-SALES-002.spec.ts +0 -38
  406. package/src/modules/sales/__integration__/TC-SALES-003.spec.ts +0 -18
  407. package/src/modules/sales/__integration__/TC-SALES-004.spec.ts +0 -19
  408. package/src/modules/sales/__integration__/TC-SALES-005.spec.ts +0 -21
  409. package/src/modules/sales/__integration__/TC-SALES-006.spec.ts +0 -26
  410. package/src/modules/sales/__integration__/TC-SALES-007.spec.ts +0 -23
  411. package/src/modules/sales/__integration__/TC-SALES-008.spec.ts +0 -11
  412. package/src/modules/sales/__integration__/TC-SALES-009.spec.ts +0 -12
  413. package/src/modules/sales/__integration__/TC-SALES-010.spec.ts +0 -20
  414. package/src/modules/sales/__integration__/TC-SALES-011.spec.ts +0 -26
  415. package/src/modules/sales/__integration__/TC-SALES-012.spec.ts +0 -12
  416. package/src/modules/sales/__integration__/TC-SALES-013.spec.ts +0 -73
  417. package/src/modules/sales/__integration__/TC-SALES-014.spec.ts +0 -17
  418. package/src/modules/sales/__integration__/TC-SALES-015.spec.ts +0 -17
  419. package/src/modules/sales/__integration__/TC-SALES-016.spec.ts +0 -17
  420. package/src/modules/sales/__integration__/TC-SALES-017.spec.ts +0 -60
  421. package/src/modules/sales/__integration__/TC-SALES-018.spec.ts +0 -25
  422. package/src/modules/sales/__integration__/TC-SALES-019.spec.ts +0 -22
  423. package/src/modules/sales/__integration__/TC-SALES-020.spec.ts +0 -107
  424. package/src/modules/sales/api/__tests__/channels.route.test.ts +0 -50
  425. package/src/modules/sales/api/__tests__/document-history.test.ts +0 -146
  426. package/src/modules/sales/api/__tests__/documents.factory.test.ts +0 -98
  427. package/src/modules/sales/api/__tests__/documents.routes.test.ts +0 -149
  428. package/src/modules/sales/api/__tests__/quotes.acceptance.test.ts +0 -209
  429. package/src/modules/sales/api/__tests__/timeline.test.tsx +0 -165
  430. package/src/modules/sales/api/dashboard/widgets/new-orders/__tests__/route.test.ts +0 -112
  431. package/src/modules/sales/api/dashboard/widgets/new-quotes/__tests__/route.test.ts +0 -116
  432. package/src/modules/sales/commands/__tests__/documents.cache.test.ts +0 -126
  433. package/src/modules/sales/commands/__tests__/documents.undo.test.ts +0 -170
  434. package/src/modules/sales/commands/__tests__/registration.test.ts +0 -141
  435. package/src/modules/sales/components/__tests__/salesComponentsRender.test.tsx +0 -456
  436. package/src/modules/sales/lib/__tests__/calculations.test.ts +0 -210
  437. package/src/modules/sales/services/__tests__/salesCalculationService.test.ts +0 -181
  438. package/src/modules/sales/services/__tests__/taxCalculationService.test.ts +0 -79
  439. package/src/modules/sales/widgets/dashboard/new-orders/__tests__/config.test.ts +0 -47
  440. package/src/modules/sales/widgets/dashboard/new-quotes/__tests__/config.test.ts +0 -47
  441. package/src/modules/staff/__integration__/TC-INT-006.spec.ts +0 -71
  442. package/src/modules/staff/data/__tests__/validators.test.ts +0 -60
  443. package/src/modules/translations/__integration__/TC-TRANS-001.spec.ts +0 -57
  444. package/src/modules/translations/__integration__/TC-TRANS-002.spec.ts +0 -114
  445. package/src/modules/translations/__integration__/TC-TRANS-003.spec.ts +0 -71
  446. package/src/modules/translations/__integration__/TC-TRANS-004.spec.ts +0 -66
  447. package/src/modules/translations/__integration__/TC-TRANS-005.spec.ts +0 -135
  448. package/src/modules/translations/__integration__/TC-TRANS-006.spec.ts +0 -113
  449. package/src/modules/translations/__integration__/TC-TRANS-007.spec.ts +0 -80
  450. package/src/modules/translations/__integration__/TC-TRANS-008.spec.ts +0 -209
  451. package/src/modules/translations/__integration__/helpers/translationFixtures.ts +0 -95
  452. package/src/modules/translations/api/__tests__/locales.test.ts +0 -67
  453. package/src/modules/translations/data/__tests__/validators.test.ts +0 -143
  454. package/src/modules/translations/lib/__tests__/extract-record-id.test.ts +0 -75
  455. package/src/modules/translations/lib/__tests__/helpers.test.ts +0 -215
  456. package/src/modules/translations/lib/__tests__/locale.test.ts +0 -115
  457. package/src/modules/translations/lib/__tests__/resolve-field-list.test.ts +0 -176
  458. package/src/modules/translations/lib/__tests__/translatable-fields.test.ts +0 -79
  459. package/src/modules/translations/widgets/__tests__/injection-table.test.ts +0 -83
  460. package/src/modules/workflows/__integration__/TC-WF-001.spec.ts +0 -114
  461. package/src/modules/workflows/api/__tests__/definitions.route.test.ts +0 -762
  462. package/src/modules/workflows/api/__tests__/instances.route.test.ts +0 -869
  463. package/src/modules/workflows/data/__tests__/validators.test.ts +0 -707
  464. package/src/modules/workflows/lib/__tests__/activity-executor.test.ts +0 -1230
  465. package/src/modules/workflows/lib/__tests__/call-api.test.ts +0 -421
  466. package/src/modules/workflows/lib/__tests__/compensation.test.ts +0 -713
  467. package/src/modules/workflows/lib/__tests__/event-logger.test.ts +0 -615
  468. package/src/modules/workflows/lib/__tests__/integration.test.ts +0 -693
  469. package/src/modules/workflows/lib/__tests__/signals.test.ts +0 -566
  470. package/src/modules/workflows/lib/__tests__/step-handler.test.ts +0 -670
  471. package/src/modules/workflows/lib/__tests__/sub-workflow.test.ts +0 -934
  472. package/src/modules/workflows/lib/__tests__/transition-handler.test.ts +0 -925
  473. package/src/modules/workflows/lib/__tests__/workflow-executor.test.ts +0 -684
@@ -1,209 +0,0 @@
1
- import { expect, test } from '@playwright/test'
2
- import { apiRequest, getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api'
3
- import { createProductFixture, deleteCatalogProductIfExists } from '@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures'
4
- import { deleteTranslationIfExists, ensureRoleFeatures, getLocales, restoreRoleFeatures, setLocales } from './helpers/translationFixtures'
5
-
6
- const ENTITY_TYPE = 'catalog:catalog_product'
7
-
8
- /**
9
- * TC-TRANS-008: RBAC Authorization per Role
10
- * Verifies that translation API endpoints enforce correct feature-based access
11
- * control for admin (translations.*) and employee (translations.view + translations.manage).
12
- *
13
- * Role matrix:
14
- * superadmin — all features (implicit)
15
- * admin — translations.* (all)
16
- * employee — translations.view + translations.manage (edit translations)
17
- */
18
- test.describe('TC-TRANS-008: RBAC Authorization per Role', () => {
19
- let adminOriginalFeatures: string[] = []
20
- let employeeOriginalFeatures: string[] = []
21
-
22
- test.beforeAll(async ({ request }) => {
23
- const saToken = await getAuthToken(request, 'superadmin')
24
- adminOriginalFeatures = await ensureRoleFeatures(request, saToken, 'admin', ['translations.*'])
25
- employeeOriginalFeatures = await ensureRoleFeatures(request, saToken, 'employee', ['translations.view', 'translations.manage'])
26
- })
27
-
28
- test.afterAll(async ({ request }) => {
29
- const saToken = await getAuthToken(request, 'superadmin')
30
- await restoreRoleFeatures(request, saToken, 'admin', adminOriginalFeatures).catch(() => {})
31
- await restoreRoleFeatures(request, saToken, 'employee', employeeOriginalFeatures).catch(() => {})
32
- })
33
-
34
- // ─── Admin: full access ───────────────────────────────────────────
35
-
36
- test('admin can GET translations (translations.view)', async ({ request }) => {
37
- const adminToken = await getAuthToken(request, 'admin')
38
- const saToken = await getAuthToken(request, 'superadmin')
39
- const productTitle = `QA TC-TRANS-008-admin-get ${Date.now()}`
40
- const sku = `QA-T008-AG-${Date.now()}`
41
- let productId: string | null = null
42
-
43
- try {
44
- productId = await createProductFixture(request, adminToken, { title: productTitle, sku })
45
-
46
- await apiRequest(request, 'PUT', `/api/translations/${ENTITY_TYPE}/${productId}`, {
47
- token: saToken,
48
- data: { de: { title: 'Admin GET Test' } },
49
- })
50
-
51
- const response = await apiRequest(request, 'GET', `/api/translations/${ENTITY_TYPE}/${productId}`, { token: adminToken })
52
- expect(response.ok()).toBeTruthy()
53
- } finally {
54
- await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)
55
- await deleteCatalogProductIfExists(request, adminToken, productId)
56
- }
57
- })
58
-
59
- test('admin can PUT translations (translations.manage)', async ({ request }) => {
60
- const adminToken = await getAuthToken(request, 'admin')
61
- const saToken = await getAuthToken(request, 'superadmin')
62
- const productTitle = `QA TC-TRANS-008-admin-put ${Date.now()}`
63
- const sku = `QA-T008-AP-${Date.now()}`
64
- let productId: string | null = null
65
-
66
- try {
67
- productId = await createProductFixture(request, adminToken, { title: productTitle, sku })
68
-
69
- const response = await apiRequest(request, 'PUT', `/api/translations/${ENTITY_TYPE}/${productId}`, {
70
- token: adminToken,
71
- data: { de: { title: 'Admin PUT Test' } },
72
- })
73
- expect(response.ok()).toBeTruthy()
74
- } finally {
75
- await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)
76
- await deleteCatalogProductIfExists(request, adminToken, productId)
77
- }
78
- })
79
-
80
- test('admin can DELETE translations (translations.manage)', async ({ request }) => {
81
- const adminToken = await getAuthToken(request, 'admin')
82
- const saToken = await getAuthToken(request, 'superadmin')
83
- const productTitle = `QA TC-TRANS-008-admin-del ${Date.now()}`
84
- const sku = `QA-T008-AD-${Date.now()}`
85
- let productId: string | null = null
86
-
87
- try {
88
- productId = await createProductFixture(request, adminToken, { title: productTitle, sku })
89
-
90
- await apiRequest(request, 'PUT', `/api/translations/${ENTITY_TYPE}/${productId}`, {
91
- token: saToken,
92
- data: { de: { title: 'To delete' } },
93
- })
94
-
95
- const response = await apiRequest(request, 'DELETE', `/api/translations/${ENTITY_TYPE}/${productId}`, { token: adminToken })
96
- expect(response.status()).toBe(204)
97
- } finally {
98
- await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)
99
- await deleteCatalogProductIfExists(request, adminToken, productId)
100
- }
101
- })
102
-
103
- test('admin can PUT locales (translations.manage_locales)', async ({ request }) => {
104
- const adminToken = await getAuthToken(request, 'admin')
105
- const originalLocales = await getLocales(request, adminToken)
106
-
107
- try {
108
- const response = await apiRequest(request, 'PUT', '/api/translations/locales', {
109
- token: adminToken,
110
- data: { locales: ['en', 'de'] },
111
- })
112
- expect(response.ok()).toBeTruthy()
113
- } finally {
114
- await setLocales(request, adminToken, originalLocales).catch(() => {})
115
- }
116
- })
117
-
118
- // ─── Employee: can edit translations, cannot manage locales ───────
119
-
120
- test('employee can GET translations (translations.view)', async ({ request }) => {
121
- const adminToken = await getAuthToken(request, 'admin')
122
- const saToken = await getAuthToken(request, 'superadmin')
123
- const employeeToken = await getAuthToken(request, 'employee')
124
- const productTitle = `QA TC-TRANS-008-emp-get ${Date.now()}`
125
- const sku = `QA-T008-EG-${Date.now()}`
126
- let productId: string | null = null
127
-
128
- try {
129
- productId = await createProductFixture(request, adminToken, { title: productTitle, sku })
130
-
131
- await apiRequest(request, 'PUT', `/api/translations/${ENTITY_TYPE}/${productId}`, {
132
- token: saToken,
133
- data: { de: { title: 'Employee GET Test' } },
134
- })
135
-
136
- const response = await apiRequest(request, 'GET', `/api/translations/${ENTITY_TYPE}/${productId}`, { token: employeeToken })
137
- expect(response.ok()).toBeTruthy()
138
- const body = (await response.json()) as { translations: Record<string, Record<string, string>> }
139
- expect(body.translations.de.title).toBe('Employee GET Test')
140
- } finally {
141
- await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)
142
- await deleteCatalogProductIfExists(request, adminToken, productId)
143
- }
144
- })
145
-
146
- test('employee can GET locales (translations.view)', async ({ request }) => {
147
- const employeeToken = await getAuthToken(request, 'employee')
148
- const response = await apiRequest(request, 'GET', '/api/translations/locales', { token: employeeToken })
149
- expect(response.ok()).toBeTruthy()
150
- const body = (await response.json()) as { locales: string[] }
151
- expect(Array.isArray(body.locales)).toBeTruthy()
152
- })
153
-
154
- test('employee can PUT translations (translations.manage)', async ({ request }) => {
155
- const adminToken = await getAuthToken(request, 'admin')
156
- const employeeToken = await getAuthToken(request, 'employee')
157
- const productTitle = `QA TC-TRANS-008-emp-put ${Date.now()}`
158
- const sku = `QA-T008-EP-${Date.now()}`
159
- let productId: string | null = null
160
-
161
- try {
162
- productId = await createProductFixture(request, adminToken, { title: productTitle, sku })
163
-
164
- const response = await apiRequest(request, 'PUT', `/api/translations/${ENTITY_TYPE}/${productId}`, {
165
- token: employeeToken,
166
- data: { de: { title: 'Employee PUT Test' } },
167
- })
168
- expect(response.ok()).toBeTruthy()
169
- } finally {
170
- const saToken = await getAuthToken(request, 'superadmin')
171
- await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)
172
- await deleteCatalogProductIfExists(request, adminToken, productId)
173
- }
174
- })
175
-
176
- test('employee can DELETE translations (translations.manage)', async ({ request }) => {
177
- const adminToken = await getAuthToken(request, 'admin')
178
- const saToken = await getAuthToken(request, 'superadmin')
179
- const employeeToken = await getAuthToken(request, 'employee')
180
- const productTitle = `QA TC-TRANS-008-emp-del ${Date.now()}`
181
- const sku = `QA-T008-ED-${Date.now()}`
182
- let productId: string | null = null
183
-
184
- try {
185
- productId = await createProductFixture(request, adminToken, { title: productTitle, sku })
186
-
187
- await apiRequest(request, 'PUT', `/api/translations/${ENTITY_TYPE}/${productId}`, {
188
- token: saToken,
189
- data: { de: { title: 'Cannot delete' } },
190
- })
191
-
192
- const response = await apiRequest(request, 'DELETE', `/api/translations/${ENTITY_TYPE}/${productId}`, { token: employeeToken })
193
- expect(response.status()).toBe(204)
194
- } finally {
195
- await deleteTranslationIfExists(request, saToken, ENTITY_TYPE, productId)
196
- await deleteCatalogProductIfExists(request, adminToken, productId)
197
- }
198
- })
199
-
200
- test('employee cannot PUT locales (403 — missing translations.manage_locales)', async ({ request }) => {
201
- const employeeToken = await getAuthToken(request, 'employee')
202
-
203
- const response = await apiRequest(request, 'PUT', '/api/translations/locales', {
204
- token: employeeToken,
205
- data: { locales: ['en', 'de', 'fr'] },
206
- })
207
- expect(response.status()).toBe(403)
208
- })
209
- })
@@ -1,95 +0,0 @@
1
- import { type APIRequestContext } from '@playwright/test'
2
- import { apiRequest } from '@open-mercato/core/modules/core/__integration__/helpers/api'
3
-
4
- export async function getLocales(
5
- request: APIRequestContext,
6
- token: string,
7
- ): Promise<string[]> {
8
- const response = await apiRequest(request, 'GET', '/api/translations/locales', { token })
9
- if (!response.ok()) return []
10
- const body = (await response.json()) as { locales?: string[] }
11
- return body.locales ?? []
12
- }
13
-
14
- export async function setLocales(
15
- request: APIRequestContext,
16
- token: string,
17
- locales: string[],
18
- ): Promise<void> {
19
- await apiRequest(request, 'PUT', '/api/translations/locales', { token, data: { locales } })
20
- }
21
-
22
- export async function deleteTranslationIfExists(
23
- request: APIRequestContext,
24
- token: string | null,
25
- entityType: string,
26
- entityId: string | null,
27
- ): Promise<void> {
28
- if (!token || !entityId) return
29
- try {
30
- await apiRequest(request, 'DELETE', `/api/translations/${entityType}/${entityId}`, { token })
31
- } catch {
32
- return
33
- }
34
- }
35
-
36
- type RoleAclPayload = { features: string[]; isSuperAdmin: boolean; organizations: string[] | null }
37
-
38
- async function findRoleId(
39
- request: APIRequestContext,
40
- token: string,
41
- roleName: string,
42
- ): Promise<string> {
43
- const response = await apiRequest(request, 'GET', `/api/auth/roles?search=${encodeURIComponent(roleName)}&pageSize=50`, { token })
44
- const body = (await response.json()) as { items?: Array<{ id: string; name: string }> }
45
- const role = (body.items ?? []).find((r) => r.name === roleName)
46
- if (!role) throw new Error(`Role "${roleName}" not found`)
47
- return role.id
48
- }
49
-
50
- async function getRoleAcl(
51
- request: APIRequestContext,
52
- token: string,
53
- roleId: string,
54
- ): Promise<RoleAclPayload> {
55
- const response = await apiRequest(request, 'GET', `/api/auth/roles/acl?roleId=${roleId}`, { token })
56
- const body = (await response.json()) as Partial<RoleAclPayload>
57
- return {
58
- features: Array.isArray(body.features) ? body.features : [],
59
- isSuperAdmin: !!body.isSuperAdmin,
60
- organizations: body.organizations ?? null,
61
- }
62
- }
63
-
64
- export async function ensureRoleFeatures(
65
- request: APIRequestContext,
66
- token: string,
67
- roleName: string,
68
- requiredFeatures: string[],
69
- ): Promise<string[]> {
70
- const roleId = await findRoleId(request, token, roleName)
71
- const acl = await getRoleAcl(request, token, roleId)
72
- const original = [...acl.features]
73
- const merged = Array.from(new Set([...acl.features, ...requiredFeatures]))
74
- if (merged.length !== acl.features.length) {
75
- await apiRequest(request, 'PUT', '/api/auth/roles/acl', {
76
- token,
77
- data: { roleId, features: merged, isSuperAdmin: acl.isSuperAdmin },
78
- })
79
- }
80
- return original
81
- }
82
-
83
- export async function restoreRoleFeatures(
84
- request: APIRequestContext,
85
- token: string,
86
- roleName: string,
87
- features: string[],
88
- ): Promise<void> {
89
- const roleId = await findRoleId(request, token, roleName)
90
- const acl = await getRoleAcl(request, token, roleId)
91
- await apiRequest(request, 'PUT', '/api/auth/roles/acl', {
92
- token,
93
- data: { roleId, features, isSuperAdmin: acl.isSuperAdmin },
94
- })
95
- }
@@ -1,67 +0,0 @@
1
- import { z } from 'zod'
2
- import { isValidIso639 } from '@open-mercato/shared/lib/i18n/iso639'
3
-
4
- const bodySchema = z.object({
5
- locales: z.array(
6
- z.string().min(2).max(10).refine(isValidIso639, { message: 'Invalid ISO 639-1 language code' }),
7
- ).min(1).max(50),
8
- })
9
-
10
- describe('locales API body schema', () => {
11
- it('accepts valid locales', () => {
12
- const result = bodySchema.safeParse({ locales: ['en', 'fr'] })
13
- expect(result.success).toBe(true)
14
- })
15
-
16
- it('accepts single locale', () => {
17
- const result = bodySchema.safeParse({ locales: ['en'] })
18
- expect(result.success).toBe(true)
19
- })
20
-
21
- it('rejects invalid ISO 639-1 code', () => {
22
- const result = bodySchema.safeParse({ locales: ['xx'] })
23
- expect(result.success).toBe(false)
24
- })
25
-
26
- it('rejects when any locale is invalid (mixed valid/invalid)', () => {
27
- const result = bodySchema.safeParse({ locales: ['en', 'xyz'] })
28
- expect(result.success).toBe(false)
29
- })
30
-
31
- it('rejects empty array', () => {
32
- const result = bodySchema.safeParse({ locales: [] })
33
- expect(result.success).toBe(false)
34
- })
35
-
36
- it('rejects missing locales field', () => {
37
- const result = bodySchema.safeParse({})
38
- expect(result.success).toBe(false)
39
- })
40
-
41
- it('rejects code shorter than 2 chars', () => {
42
- const result = bodySchema.safeParse({ locales: ['e'] })
43
- expect(result.success).toBe(false)
44
- })
45
-
46
- it('rejects code longer than 10 chars', () => {
47
- const result = bodySchema.safeParse({ locales: ['abcdefghijk'] })
48
- expect(result.success).toBe(false)
49
- })
50
-
51
- it('accepts up to 50 locales', () => {
52
- // Use first 50 valid ISO codes
53
- const validCodes = ['aa', 'ab', 'af', 'ak', 'am', 'an', 'ar', 'as', 'av', 'ay',
54
- 'az', 'ba', 'be', 'bg', 'bh', 'bi', 'bm', 'bn', 'bo', 'br',
55
- 'bs', 'ca', 'ce', 'ch', 'co', 'cr', 'cs', 'cu', 'cv', 'cy',
56
- 'da', 'de', 'dv', 'dz', 'ee', 'el', 'en', 'eo', 'es', 'et',
57
- 'eu', 'fa', 'ff', 'fi', 'fj', 'fo', 'fr', 'fy', 'ga', 'gd']
58
- const result = bodySchema.safeParse({ locales: validCodes })
59
- expect(result.success).toBe(true)
60
- })
61
-
62
- it('rejects more than 50 locales', () => {
63
- const codes = Array.from({ length: 51 }, (_, i) => `l${String(i).padStart(2, '0')}`)
64
- const result = bodySchema.safeParse({ locales: codes })
65
- expect(result.success).toBe(false)
66
- })
67
- })
@@ -1,143 +0,0 @@
1
- import { translationBodySchema, entityTypeParamSchema, entityIdParamSchema } from '../validators'
2
-
3
- describe('translation validators', () => {
4
- describe('translationBodySchema', () => {
5
- it('accepts valid single-locale body', () => {
6
- const result = translationBodySchema.safeParse({ en: { title: 'Hello' } })
7
- expect(result.success).toBe(true)
8
- })
9
-
10
- it('accepts multiple locales', () => {
11
- const result = translationBodySchema.safeParse({
12
- en: { title: 'Hello' },
13
- fr: { title: 'Bonjour' },
14
- })
15
- expect(result.success).toBe(true)
16
- })
17
-
18
- it('accepts null field values', () => {
19
- const result = translationBodySchema.safeParse({ en: { title: null } })
20
- expect(result.success).toBe(true)
21
- })
22
-
23
- it('accepts dot-path field keys', () => {
24
- const result = translationBodySchema.safeParse({ en: { 'options.red.label': 'Rot' } })
25
- expect(result.success).toBe(true)
26
- })
27
-
28
- it('rejects empty locale key', () => {
29
- const result = translationBodySchema.safeParse({ '': { title: 'x' } })
30
- expect(result.success).toBe(false)
31
- })
32
-
33
- it('rejects locale key longer than 10 chars', () => {
34
- const result = translationBodySchema.safeParse({ abcdefghijk: { title: 'x' } })
35
- expect(result.success).toBe(false)
36
- })
37
-
38
- it('rejects empty field key', () => {
39
- const result = translationBodySchema.safeParse({ en: { '': 'value' } })
40
- expect(result.success).toBe(false)
41
- })
42
-
43
- it('rejects field key longer than 100 chars', () => {
44
- const longKey = 'a'.repeat(101)
45
- const result = translationBodySchema.safeParse({ en: { [longKey]: 'value' } })
46
- expect(result.success).toBe(false)
47
- })
48
-
49
- it('rejects field value longer than 10000 chars', () => {
50
- const longValue = 'x'.repeat(10001)
51
- const result = translationBodySchema.safeParse({ en: { title: longValue } })
52
- expect(result.success).toBe(false)
53
- })
54
-
55
- it('accepts exactly 50 locales (boundary)', () => {
56
- const body: Record<string, Record<string, string>> = {}
57
- for (let i = 0; i < 50; i++) {
58
- body[`l${String(i).padStart(2, '0')}`] = { title: `val${i}` }
59
- }
60
- const result = translationBodySchema.safeParse(body)
61
- expect(result.success).toBe(true)
62
- })
63
-
64
- it('rejects 51 locales (over limit)', () => {
65
- const body: Record<string, Record<string, string>> = {}
66
- for (let i = 0; i < 51; i++) {
67
- body[`l${String(i).padStart(2, '0')}`] = { title: `val${i}` }
68
- }
69
- const result = translationBodySchema.safeParse(body)
70
- expect(result.success).toBe(false)
71
- })
72
-
73
- it('accepts field value at exactly 10000 chars', () => {
74
- const exactValue = 'x'.repeat(10000)
75
- const result = translationBodySchema.safeParse({ en: { title: exactValue } })
76
- expect(result.success).toBe(true)
77
- })
78
-
79
- it('rejects non-string non-null field values', () => {
80
- const result = translationBodySchema.safeParse({ en: { title: 123 } })
81
- expect(result.success).toBe(false)
82
- })
83
- })
84
-
85
- describe('entityTypeParamSchema', () => {
86
- it('accepts valid entity type with colon', () => {
87
- const result = entityTypeParamSchema.safeParse('catalog:product')
88
- expect(result.success).toBe(true)
89
- })
90
-
91
- it('accepts snake_case entity type', () => {
92
- const result = entityTypeParamSchema.safeParse('my_module:my_entity')
93
- expect(result.success).toBe(true)
94
- })
95
-
96
- it('rejects missing colon', () => {
97
- const result = entityTypeParamSchema.safeParse('catalogproduct')
98
- expect(result.success).toBe(false)
99
- })
100
-
101
- it('rejects uppercase characters', () => {
102
- const result = entityTypeParamSchema.safeParse('Catalog:Product')
103
- expect(result.success).toBe(false)
104
- })
105
-
106
- it('rejects empty string', () => {
107
- const result = entityTypeParamSchema.safeParse('')
108
- expect(result.success).toBe(false)
109
- })
110
-
111
- it('rejects numbers in entity type', () => {
112
- const result = entityTypeParamSchema.safeParse('mod1:entity2')
113
- expect(result.success).toBe(false)
114
- })
115
-
116
- it('rejects hyphens', () => {
117
- const result = entityTypeParamSchema.safeParse('my-module:my-entity')
118
- expect(result.success).toBe(false)
119
- })
120
- })
121
-
122
- describe('entityIdParamSchema', () => {
123
- it('accepts UUID-like string', () => {
124
- const result = entityIdParamSchema.safeParse('550e8400-e29b-41d4-a716-446655440000')
125
- expect(result.success).toBe(true)
126
- })
127
-
128
- it('accepts composite ID', () => {
129
- const result = entityIdParamSchema.safeParse('catalog:product:field_key')
130
- expect(result.success).toBe(true)
131
- })
132
-
133
- it('accepts simple short ID', () => {
134
- const result = entityIdParamSchema.safeParse('abc-123')
135
- expect(result.success).toBe(true)
136
- })
137
-
138
- it('rejects empty string', () => {
139
- const result = entityIdParamSchema.safeParse('')
140
- expect(result.success).toBe(false)
141
- })
142
- })
143
- })
@@ -1,75 +0,0 @@
1
- import { extractRecordId } from '../extract-record-id'
2
-
3
- describe('extractRecordId', () => {
4
- describe('explicit id param', () => {
5
- it('returns string id directly', () => {
6
- expect(extractRecordId({ id: 'abc-123-def-456-ghi' })).toBe('abc-123-def-456-ghi')
7
- })
8
-
9
- it('returns first element when id is an array', () => {
10
- expect(extractRecordId({ id: ['first-id-value-abcdef', 'second'] })).toBe('first-id-value-abcdef')
11
- })
12
-
13
- it('returns numeric id as string', () => {
14
- expect(extractRecordId({ id: '42' })).toBe('42')
15
- })
16
- })
17
-
18
- describe('UUID-like detection from other params', () => {
19
- it('finds UUID in non-id param', () => {
20
- expect(extractRecordId({ slug: 'short', recordId: 'a1b2c3d4-e5f6-7890-abcd-ef1234567890' }))
21
- .toBe('a1b2c3d4-e5f6-7890-abcd-ef1234567890')
22
- })
23
-
24
- it('finds UUID-like value with at least 20 hex chars', () => {
25
- expect(extractRecordId({ key: '0123456789abcdef01234' }))
26
- .toBe('0123456789abcdef01234')
27
- })
28
-
29
- it('finds UUID in array param', () => {
30
- expect(extractRecordId({ parts: ['short', 'a1b2c3d4e5f6789012345678'] }))
31
- .toBe('a1b2c3d4e5f6789012345678')
32
- })
33
-
34
- it('returns undefined when no param matches UUID pattern', () => {
35
- expect(extractRecordId({ slug: 'my-product', page: '3' })).toBeUndefined()
36
- })
37
-
38
- it('requires at least 20 chars for UUID-like match', () => {
39
- expect(extractRecordId({ key: 'abcdef1234567890123' })).toBeUndefined() // 19 chars
40
- })
41
-
42
- it('matches case-insensitively', () => {
43
- expect(extractRecordId({ key: 'ABCDEF1234567890ABCDEF' }))
44
- .toBe('ABCDEF1234567890ABCDEF')
45
- })
46
-
47
- it('allows hyphens in UUID pattern', () => {
48
- expect(extractRecordId({ key: 'a1b2c3d4-e5f6-7890-abcd' }))
49
- .toBe('a1b2c3d4-e5f6-7890-abcd')
50
- })
51
- })
52
-
53
- describe('priority', () => {
54
- it('prefers explicit id over UUID-like params', () => {
55
- expect(extractRecordId({
56
- id: 'explicit-id',
57
- other: 'a1b2c3d4e5f6789012345678',
58
- })).toBe('explicit-id')
59
- })
60
- })
61
-
62
- describe('edge cases', () => {
63
- it('returns undefined for empty params', () => {
64
- expect(extractRecordId({})).toBeUndefined()
65
- })
66
-
67
- it('skips empty string values', () => {
68
- expect(extractRecordId({ key: '' })).toBeUndefined()
69
- })
70
-
71
- it('rejects strings with non-hex characters', () => {
72
- expect(extractRecordId({ key: 'this-is-not-a-valid-uuid-at-all' })).toBeUndefined()
73
- })
74
- })
75
- })