@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,244 +0,0 @@
1
- /** @jest-environment node */
2
-
3
- import { features } from '../../acl'
4
-
5
- const secretFixture = { secret: 'omk_test.secret', prefix: 'omk_testpref' }
6
-
7
- type QueueEntry = { entity?: unknown }
8
- type OrmEntityInput = { data: Record<string, unknown>; [key: string]: unknown }
9
-
10
- interface MockEntityManager {
11
- findOne: jest.Mock<Promise<unknown>, [unknown, Record<string, unknown>?]>
12
- find: jest.Mock<Promise<unknown[]>, [unknown, Record<string, unknown>?]>
13
- fork: jest.Mock<MockEntityManager, []>
14
- }
15
-
16
- interface MockDataEngine {
17
- __queue: QueueEntry[]
18
- createOrmEntity: jest.Mock<Promise<Record<string, unknown>>, [OrmEntityInput]>
19
- emitOrmEntityEvent: jest.Mock<Promise<void>, [QueueEntry | undefined]>
20
- markOrmEntityChange: jest.Mock<void, [QueueEntry | undefined]>
21
- flushOrmEntityChanges: jest.Mock<Promise<void>, []>
22
- }
23
-
24
- interface MockRbacService {
25
- invalidateUserCache: jest.Mock<Promise<void>, [string]>
26
- loadAcl: jest.Mock<Promise<{ isSuperAdmin: boolean } | null>, [string, { tenantId: string | null; organizationId: string | null }]>
27
- }
28
-
29
- interface MockContainer {
30
- resolve: jest.Mock<unknown, [string]>
31
- }
32
-
33
- const queue: QueueEntry[] = []
34
-
35
- const mockGetAuthFromCookies = jest.fn()
36
- const mockGetAuthFromRequest = jest.fn()
37
- const mockResolveScope = jest.fn()
38
- const mockEm: MockEntityManager = {
39
- findOne: jest.fn<Promise<unknown>, [unknown, Record<string, unknown>?]>(),
40
- find: jest.fn<Promise<unknown[]>, [unknown, Record<string, unknown>?]>(),
41
- fork: jest.fn<MockEntityManager, []>(),
42
- }
43
- const mockDataEngine: MockDataEngine = {
44
- __queue: queue,
45
- createOrmEntity: jest.fn<Promise<Record<string, unknown>>, [OrmEntityInput]>(),
46
- emitOrmEntityEvent: jest.fn<Promise<void>, [QueueEntry | undefined]>(),
47
- markOrmEntityChange: jest.fn<void, [QueueEntry | undefined]>(),
48
- flushOrmEntityChanges: jest.fn<Promise<void>, []>(),
49
- }
50
- const mockRbac: MockRbacService = {
51
- invalidateUserCache: jest.fn<Promise<void>, [string]>(),
52
- loadAcl: jest.fn<Promise<{ isSuperAdmin: boolean } | null>, [string, { tenantId: string | null; organizationId: string | null }]>(),
53
- }
54
- const mockContainer: MockContainer = {
55
- resolve: jest.fn((token: string) => {
56
- if (token === 'em') return mockEm
57
- if (token === 'dataEngine') return mockDataEngine
58
- if (token === 'rbacService') return mockRbac
59
- return undefined
60
- }),
61
- }
62
- const mockHashApiKey = jest.fn<Promise<string>, [string]>((secret) => Promise.resolve(`hashed:${secret}`))
63
-
64
- jest.mock('@open-mercato/shared/lib/di/container', () => ({
65
- createRequestContainer: jest.fn(async () => mockContainer),
66
- }))
67
-
68
- jest.mock('@open-mercato/shared/lib/auth/server', () => ({
69
- getAuthFromCookies: jest.fn(() => mockGetAuthFromCookies()),
70
- getAuthFromRequest: jest.fn((request: Request) => mockGetAuthFromRequest(request)),
71
- }))
72
-
73
- jest.mock('@open-mercato/core/modules/directory/utils/organizationScope', () => ({
74
- resolveOrganizationScopeForRequest: jest.fn((args) => mockResolveScope(args)),
75
- }))
76
-
77
- jest.mock('@open-mercato/shared/lib/i18n/server', () => ({
78
- resolveTranslations: jest.fn(async () => ({
79
- translate: (_key: string, fallback: string) => fallback,
80
- })),
81
- }))
82
-
83
- jest.mock('../../services/apiKeyService', () => {
84
- const actual = jest.requireActual('../../services/apiKeyService')
85
- return {
86
- ...actual,
87
- generateApiKeySecret: jest.fn(() => secretFixture),
88
- hashApiKey: jest.fn((secret: string) => mockHashApiKey(secret)),
89
- }
90
- })
91
-
92
- type RouteModule = typeof import('../keys/route')
93
- let routeMetadata: RouteModule['metadata']
94
- let postHandler: RouteModule['POST']
95
-
96
- beforeAll(async () => {
97
- const routeModule = await import('../keys/route')
98
- routeMetadata = routeModule.metadata
99
- postHandler = routeModule.POST
100
- })
101
-
102
- describe('API Keys route', () => {
103
- beforeEach(() => {
104
- jest.clearAllMocks()
105
- mockDataEngine.__queue.length = 0
106
- mockEm.fork.mockReturnValue(mockEm)
107
- mockGetAuthFromCookies.mockResolvedValue({
108
- sub: 'user-1',
109
- tenantId: '123e4567-e89b-12d3-a456-426614174000',
110
- orgId: null,
111
- })
112
- mockGetAuthFromRequest.mockResolvedValue({
113
- sub: 'user-1',
114
- tenantId: '123e4567-e89b-12d3-a456-426614174000',
115
- orgId: null,
116
- })
117
- mockResolveScope.mockResolvedValue({
118
- selectedId: 'aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa',
119
- filterIds: ['aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa'],
120
- allowedIds: ['aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa'],
121
- })
122
- mockEm.findOne.mockResolvedValue(null)
123
- mockEm.find.mockImplementation(async (_entity: unknown, criteria: Record<string, unknown> = {}) => {
124
- const nameValue = typeof criteria.name === 'string' ? criteria.name : null
125
- if (nameValue && nameValue.toLowerCase() === 'manager') {
126
- return [
127
- {
128
- id: 'role-123',
129
- name: 'Manager',
130
- tenantId: '123e4567-e89b-12d3-a456-426614174000',
131
- },
132
- ]
133
- }
134
- if (criteria && typeof criteria === 'object' && 'id' in criteria) {
135
- const idCandidate = (criteria as { id?: unknown }).id
136
- if (idCandidate && typeof idCandidate === 'object' && '$in' in idCandidate) {
137
- const ids = (idCandidate as { $in?: unknown }).$in
138
- if (Array.isArray(ids)) {
139
- return ids.map((id) => ({
140
- id: String(id),
141
- name: id === 'role-123' ? 'Manager' : null,
142
- tenantId: '123e4567-e89b-12d3-a456-426614174000',
143
- }))
144
- }
145
- }
146
- }
147
- return []
148
- })
149
- mockDataEngine.createOrmEntity.mockImplementation(async ({ data }: OrmEntityInput) => ({
150
- id: 'key-1',
151
- ...data,
152
- }))
153
- mockDataEngine.emitOrmEntityEvent.mockResolvedValue(undefined)
154
- mockDataEngine.markOrmEntityChange.mockImplementation((entry: QueueEntry | undefined) => {
155
- if (!entry?.entity) return
156
- mockDataEngine.__queue.push(entry)
157
- })
158
- mockDataEngine.flushOrmEntityChanges.mockImplementation(async () => {
159
- while (mockDataEngine.__queue.length > 0) {
160
- const next = mockDataEngine.__queue.shift()
161
- await mockDataEngine.emitOrmEntityEvent(next)
162
- }
163
- })
164
- mockRbac.invalidateUserCache.mockResolvedValue(undefined)
165
- mockRbac.loadAcl.mockResolvedValue({ isSuperAdmin: false })
166
- mockHashApiKey.mockClear()
167
- })
168
-
169
- it('exports the expected ACL features', () => {
170
- const featureIds = features.map((entry) => entry.id)
171
- expect(featureIds).toEqual(expect.arrayContaining(['api_keys.view', 'api_keys.create', 'api_keys.delete']))
172
- })
173
-
174
- it('declares authorization metadata for GET/POST/DELETE', () => {
175
- expect(routeMetadata.GET?.requireAuth).toBe(true)
176
- expect(routeMetadata.GET?.requireFeatures).toEqual(['api_keys.view'])
177
- expect(routeMetadata.POST?.requireAuth).toBe(true)
178
- expect(routeMetadata.POST?.requireFeatures).toEqual(['api_keys.create'])
179
- expect(routeMetadata.DELETE?.requireAuth).toBe(true)
180
- expect(routeMetadata.DELETE?.requireFeatures).toEqual(['api_keys.delete'])
181
- })
182
-
183
- it('creates API keys with organization scope, hashed secret, and role mapping', async () => {
184
- const body = {
185
- name: 'Integration key',
186
- description: 'Machine access',
187
- roles: ['manager'],
188
- }
189
- const res = await postHandler(
190
- new Request('http://localhost/api/api_keys/keys', {
191
- method: 'POST',
192
- headers: { 'content-type': 'application/json' },
193
- body: JSON.stringify(body),
194
- }),
195
- )
196
- expect(res.status).toBe(201)
197
- const payload = await res.json()
198
- expect(payload).toMatchObject({
199
- id: 'key-1',
200
- name: 'Integration key',
201
- keyPrefix: secretFixture.prefix,
202
- secret: secretFixture.secret,
203
- organizationId: 'aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa',
204
- tenantId: '123e4567-e89b-12d3-a456-426614174000',
205
- })
206
- expect(payload.roles).toEqual([{ id: 'role-123', name: 'Manager' }])
207
- expect(mockDataEngine.createOrmEntity).toHaveBeenCalledTimes(1)
208
- const createArgs = mockDataEngine.createOrmEntity.mock.calls[0][0]
209
- expect(createArgs.data).toMatchObject({
210
- name: 'Integration key',
211
- description: 'Machine access',
212
- organizationId: 'aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa',
213
- tenantId: '123e4567-e89b-12d3-a456-426614174000',
214
- createdBy: 'user-1',
215
- rolesJson: ['role-123'],
216
- keyPrefix: secretFixture.prefix,
217
- keyHash: `hashed:${secretFixture.secret}`,
218
- })
219
- expect(mockHashApiKey).toHaveBeenCalledWith(secretFixture.secret)
220
- expect(mockRbac.invalidateUserCache).toHaveBeenCalledWith('api_key:key-1')
221
- })
222
-
223
- it('rejects creation when organization is outside the allowed scope', async () => {
224
- mockResolveScope.mockResolvedValueOnce({
225
- selectedId: null,
226
- filterIds: ['aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa'],
227
- allowedIds: ['aaaaaaaa-aaaa-4aaa-8aaa-aaaaaaaaaaaa'],
228
- })
229
- const res = await postHandler(
230
- new Request('http://localhost/api/api_keys/keys', {
231
- method: 'POST',
232
- headers: { 'content-type': 'application/json' },
233
- body: JSON.stringify({
234
- name: 'Forbidden key',
235
- organizationId: 'bbbbbbbb-bbbb-4bbb-8bbb-bbbbbbbbbbbb',
236
- }),
237
- }),
238
- )
239
- expect(res.status).toBe(403)
240
- const payload = await res.json()
241
- expect(payload.error).toBe('Organization out of scope')
242
- expect(mockDataEngine.createOrmEntity).not.toHaveBeenCalled()
243
- })
244
- })
@@ -1,240 +0,0 @@
1
- /** @jest-environment node */
2
- import { GET as list, POST as upload } from '@open-mercato/core/modules/attachments/api/route'
3
-
4
- const partitions = [
5
- { id: 'p-private', code: 'privateAttachments', title: 'Private', isPublic: false, storageDriver: 'local', requiresOcr: true },
6
- { id: 'p-products', code: 'productsMedia', title: 'Products', isPublic: true, storageDriver: 'local', requiresOcr: false },
7
- ]
8
-
9
- const mockEm = {
10
- findOne: jest.fn(async (entity: any, where: any) => {
11
- if (entity?.name === 'AttachmentPartition') {
12
- return partitions.find((p) => p.code === where?.code) ?? null
13
- }
14
- if (entity?.name === 'CustomFieldDef') {
15
- return { configJson: { maxAttachmentSizeMb: 0.001, acceptExtensions: ['pdf', 'docx'] } }
16
- }
17
- return null
18
- }),
19
- create: jest.fn((_cls: any, data: any) => ({ ...data })),
20
- persistAndFlush: jest.fn(async () => {}),
21
- getRepository: jest.fn(() => ({
22
- findAll: jest.fn(async () => partitions),
23
- create: jest.fn((data: any) => data),
24
- })),
25
- persist: jest.fn(),
26
- flush: jest.fn(),
27
- find: jest.fn(),
28
- }
29
-
30
- const mockDataEngine = {
31
- setCustomFields: jest.fn(async () => {}),
32
- markOrmEntityChange: jest.fn(),
33
- flushOrmEntityChanges: jest.fn(async () => {}),
34
- }
35
-
36
- jest.mock('@open-mercato/shared/lib/di/container', () => ({
37
- createRequestContainer: async () => ({
38
- resolve: (k: string) => {
39
- if (k === 'em') return mockEm
40
- if (k === 'dataEngine') return mockDataEngine
41
- return null
42
- },
43
- }),
44
- }))
45
-
46
- jest.mock('@open-mercato/shared/lib/auth/server', () => ({ getAuthFromRequest: () => ({ orgId: 'org', tenantId: 't1', roles: ['admin'] }) }))
47
-
48
- // Avoid touching disk
49
- import { promises as fsp } from 'fs'
50
- jest.spyOn(fsp, 'mkdir').mockResolvedValue(undefined as any)
51
- jest.spyOn(fsp, 'writeFile').mockResolvedValue(undefined as any)
52
-
53
- jest.mock('@open-mercato/core/modules/attachments/lib/textExtraction', () => ({
54
- extractAttachmentContent: jest.fn(),
55
- }))
56
- const mockExtractAttachmentContent = jest.requireMock('@open-mercato/core/modules/attachments/lib/textExtraction')
57
- .extractAttachmentContent as jest.Mock
58
-
59
- // Avoid loading MikroORM decorators in tests
60
- jest.mock('@open-mercato/core/modules/attachments/data/entities', () => ({
61
- Attachment: class Attachment {},
62
- AttachmentPartition: class AttachmentPartition {},
63
- }))
64
-
65
- function fdWith(file: File, extra: Record<string, string> = {}) {
66
- const fd = new FormData()
67
- fd.set('entityId', 'example:todo')
68
- fd.set('recordId', 'r1')
69
- fd.set('fieldKey', 'attachments')
70
- for (const [k, v] of Object.entries(extra)) fd.set(k, v)
71
- fd.set('file', file)
72
- return fd
73
- }
74
-
75
- describe('attachments API', () => {
76
- beforeEach(() => {
77
- jest.clearAllMocks()
78
- mockEm.find.mockReset()
79
- mockEm.find.mockResolvedValue([])
80
- mockExtractAttachmentContent.mockReset()
81
- delete process.env.OPENMERCATO_DEFAULT_ATTACHMENT_OCR_ENABLED
82
- })
83
-
84
- it('rejects disallowed extension', async () => {
85
- const file = new File([new Uint8Array([1,2,3])], 'img.png', { type: 'image/png' })
86
- const req = new Request('http://x/api/attachments', { method: 'POST', body: fdWith(file) as any })
87
- const res = await upload(req)
88
- expect(res.status).toBe(400)
89
- const j = await res.json()
90
- expect(j.error).toMatch(/not allowed/i)
91
- })
92
-
93
- it('accepts allowed small pdf', async () => {
94
- const file = new File([new Uint8Array([1,2,3])], 'doc.pdf', { type: 'application/pdf' })
95
- const req = new Request('http://x/api/attachments', {
96
- method: 'POST',
97
- body: fdWith(file, { customFields: JSON.stringify({ altText: 'Product spec' }) }) as any,
98
- })
99
- const res = await upload(req)
100
- expect(res.status).toBe(200)
101
- const j = await res.json()
102
- expect(j?.ok).toBe(true)
103
- expect(j?.item?.customFields).toEqual({ altText: 'Product spec' })
104
- const payload = mockEm.create.mock.calls[mockEm.create.mock.calls.length - 1]?.[1]
105
- expect(payload?.storageMetadata?.assignments).toEqual([{ type: 'example:todo', id: 'r1' }])
106
- expect(mockDataEngine.setCustomFields).toHaveBeenCalledWith(
107
- expect.objectContaining({
108
- entityId: expect.any(String),
109
- recordId: expect.any(String),
110
- values: { altText: 'Product spec' },
111
- }),
112
- )
113
- })
114
-
115
- it('rejects files that exceed configured size limit', async () => {
116
- const oversized = new Uint8Array(2048)
117
- const file = new File([oversized], 'doc.pdf', { type: 'application/pdf' })
118
- const req = new Request('http://x/api/attachments', { method: 'POST', body: fdWith(file) as any })
119
- const res = await upload(req)
120
- expect(res.status).toBe(400)
121
- const payload = await res.json()
122
- expect(payload.error).toMatch(/exceeds/i)
123
- })
124
-
125
- it('extracts content when partition requires OCR', async () => {
126
- mockExtractAttachmentContent.mockResolvedValue('extracted text')
127
- const file = new File(
128
- [new Uint8Array([1, 2, 3])],
129
- 'doc.docx',
130
- { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' },
131
- )
132
- const req = new Request('http://x/api/attachments', { method: 'POST', body: fdWith(file) as any })
133
- const res = await upload(req)
134
- expect(res.status).toBe(200)
135
- expect(mockExtractAttachmentContent).toHaveBeenCalled()
136
- const payload = mockEm.create.mock.calls.find((call) => call[0].name === 'Attachment')?.[1]
137
- expect(payload?.content).toBe('extracted text')
138
- })
139
-
140
- it('skips OCR when partition disables it', async () => {
141
- const disabledPartition = { ...partitions[0], requiresOcr: false }
142
- mockEm.findOne.mockImplementation(async (entity: any, where: any) => {
143
- if (entity?.name === 'AttachmentPartition') return disabledPartition
144
- if (entity?.name === 'CustomFieldDef') {
145
- return { configJson: { maxAttachmentSizeMb: 0.001, acceptExtensions: ['pdf'] } }
146
- }
147
- return null
148
- })
149
- const file = new File([new Uint8Array([1, 2, 3])], 'doc.pdf', { type: 'application/pdf' })
150
- const req = new Request('http://x/api/attachments', { method: 'POST', body: fdWith(file) as any })
151
- const res = await upload(req)
152
- expect(res.status).toBe(200)
153
- expect(mockExtractAttachmentContent).not.toHaveBeenCalled()
154
- const payload = mockEm.create.mock.calls.find((call) => call[0].name === 'Attachment')?.[1]
155
- expect(payload?.content ?? null).toBeNull()
156
- })
157
-
158
- it('uses env default when partition flag is undefined', async () => {
159
- delete process.env.OPENMERCATO_DEFAULT_ATTACHMENT_OCR_ENABLED
160
- mockExtractAttachmentContent.mockResolvedValue('default text')
161
- const partitionWithoutFlag = { ...partitions[0] }
162
- delete (partitionWithoutFlag as any).requiresOcr
163
- mockEm.findOne.mockImplementation(async (entity: any, where: any) => {
164
- if (entity?.name === 'AttachmentPartition') return partitionWithoutFlag
165
- if (entity?.name === 'CustomFieldDef') {
166
- return { configJson: { maxAttachmentSizeMb: 0.001, acceptExtensions: ['pdf', 'docx'] } }
167
- }
168
- return null
169
- })
170
- const file = new File(
171
- [new Uint8Array([1, 2, 3])],
172
- 'doc.docx',
173
- { type: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document' },
174
- )
175
- const req = new Request('http://x/api/attachments', { method: 'POST', body: fdWith(file) as any })
176
- const res = await upload(req)
177
- expect(res.status).toBe(200)
178
- expect(mockExtractAttachmentContent).toHaveBeenCalled()
179
- })
180
-
181
- it('applies normalized tags and assignments from form payload', async () => {
182
- const file = new File([new Uint8Array([1, 2, 3])], 'doc.pdf', { type: 'application/pdf' })
183
- const fd = fdWith(file)
184
- fd.set('tags', '["primary","primary ",""]')
185
- fd.set(
186
- 'assignments',
187
- JSON.stringify([
188
- { type: 'catalog.products', id: 'prod-1', href: '/products/1', label: '' },
189
- { type: 'catalog.products', id: 'prod-1', href: '/products/1', label: ' Spec Sheet ' },
190
- ]),
191
- )
192
- const req = new Request('http://x/api/attachments', { method: 'POST', body: fd as any })
193
- const res = await upload(req)
194
- expect(res.status).toBe(200)
195
- const body = await res.json()
196
- expect(body.item.tags).toEqual(['primary'])
197
- expect(body.item.assignments).toEqual(
198
- expect.arrayContaining([
199
- expect.objectContaining({ type: 'catalog.products', id: 'prod-1', href: '/products/1', label: 'Spec Sheet' }),
200
- expect.objectContaining({ type: 'example:todo', id: 'r1' }),
201
- ]),
202
- )
203
- })
204
-
205
- it('lists attachments with sanitized metadata via GET', async () => {
206
- mockEm.find.mockResolvedValue([
207
- {
208
- id: 'att-1',
209
- entityId: 'example:todo',
210
- recordId: 'r1',
211
- organizationId: 'org',
212
- tenantId: 't1',
213
- fileName: ' doc.pdf ',
214
- url: 'http://cdn.local/doc.pdf',
215
- fileSize: 10,
216
- createdAt: '2024-01-01T00:00:00.000Z',
217
- partitionCode: 'privateAttachments',
218
- storageMetadata: { tags: ['primary', 'primary'], assignments: [{ type: 'catalog.products', id: 'prod-1' }] },
219
- },
220
- ])
221
- const req = new Request('http://x/api/attachments?entityId=example:todo&recordId=r1')
222
- const res = await list(req)
223
- expect(res.status).toBe(200)
224
- const payload = await res.json()
225
- expect(payload.items).toHaveLength(1)
226
- expect(payload.items[0]).toEqual(
227
- expect.objectContaining({
228
- id: 'att-1',
229
- tags: ['primary'],
230
- assignments: [{ type: 'catalog.products', id: 'prod-1' }],
231
- thumbnailUrl: expect.stringContaining('att-1'),
232
- }),
233
- )
234
- expect(mockEm.find).toHaveBeenCalledWith(
235
- expect.any(Function),
236
- expect.objectContaining({ entityId: 'example:todo', recordId: 'r1' }),
237
- expect.any(Object),
238
- )
239
- })
240
- })
@@ -1,45 +0,0 @@
1
- /**
2
- * @jest-environment jsdom
3
- */
4
- jest.mock('react-markdown', () => ({
5
- __esModule: true,
6
- default: (props: any) => <div data-testid="markdown-preview">{props.children}</div>,
7
- }))
8
-
9
- jest.mock('remark-gfm', () => ({
10
- __esModule: true,
11
- default: 'remark-gfm',
12
- }))
13
-
14
- import { render, screen, fireEvent } from '@testing-library/react'
15
- import { AttachmentContentPreview } from '../AttachmentContentPreview'
16
- describe('AttachmentContentPreview', () => {
17
- it('shows placeholder when content is missing', () => {
18
- render(<AttachmentContentPreview content={null} />)
19
- expect(screen.getByText(/no text extracted/i)).toBeInTheDocument()
20
- })
21
-
22
- it('renders inline content when short', () => {
23
- render(<AttachmentContentPreview content="hello world" />)
24
- expect(screen.getByText('hello world')).toBeInTheDocument()
25
- })
26
-
27
- it('truncates long content and can expand', () => {
28
- const longText = 'lorem ipsum '.repeat(80)
29
- render(<AttachmentContentPreview content={longText} />)
30
- const preview = screen.getByTestId('attachment-content-preview')
31
- expect(preview.textContent).toContain('lorem ipsum')
32
- expect(preview.textContent?.length).toBeLessThan(longText.length)
33
- const toggle = screen.getByRole('button', { name: /show more/i })
34
- fireEvent.click(toggle)
35
- expect(preview.textContent).toContain(longText.trim())
36
- })
37
-
38
- it('renders markdown preview when tab is selected', () => {
39
- const { container } = render(<AttachmentContentPreview content="**bold** text" />)
40
- const previewTab = screen.getByRole('tab', { name: /preview/i })
41
- fireEvent.click(previewTab)
42
- expect(previewTab).toHaveAttribute('aria-selected', 'true')
43
- expect(container.querySelector('[data-testid="markdown-preview"]')?.textContent).toContain('bold')
44
- })
45
- })
@@ -1,15 +0,0 @@
1
- import { Attachment, AttachmentPartition } from '../entities'
2
-
3
- describe('attachments entities', () => {
4
- it('exposes a nullable content field on Attachment', () => {
5
- const att = new Attachment() as any
6
- expect('content' in att).toBe(true)
7
- expect(att.content).toBeNull()
8
- })
9
-
10
- it('exposes requiresOcr flag on AttachmentPartition with boolean default', () => {
11
- const partition = new AttachmentPartition() as any
12
- expect('requiresOcr' in partition).toBe(true)
13
- expect(typeof partition.requiresOcr).toBe('boolean')
14
- })
15
- })
@@ -1,27 +0,0 @@
1
- describe('attachments OCR config default', () => {
2
- const ENV_KEY = 'OPENMERCATO_DEFAULT_ATTACHMENT_OCR_ENABLED'
3
-
4
- afterEach(() => {
5
- delete process.env[ENV_KEY]
6
- jest.resetModules()
7
- })
8
-
9
- it('defaults to true when env is missing', async () => {
10
- const { resolveDefaultAttachmentOcrEnabled } = await import('../ocrConfig')
11
- expect(resolveDefaultAttachmentOcrEnabled()).toBe(true)
12
- })
13
-
14
- it('reads boolean true when env set to "true"', async () => {
15
- process.env[ENV_KEY] = 'true'
16
- jest.resetModules()
17
- const { resolveDefaultAttachmentOcrEnabled } = await import('../ocrConfig')
18
- expect(resolveDefaultAttachmentOcrEnabled()).toBe(true)
19
- })
20
-
21
- it('reads boolean false when env set to "false"', async () => {
22
- process.env[ENV_KEY] = 'false'
23
- jest.resetModules()
24
- const { resolveDefaultAttachmentOcrEnabled } = await import('../ocrConfig')
25
- expect(resolveDefaultAttachmentOcrEnabled()).toBe(false)
26
- })
27
- })
@@ -1,64 +0,0 @@
1
- import { promises as fs } from 'fs'
2
- import { join } from 'path'
3
- import { tmpdir } from 'os'
4
-
5
- jest.mock('child_process', () => ({
6
- execFile: jest.fn(),
7
- }))
8
-
9
- const mockExecFile = jest.requireMock('child_process').execFile as jest.Mock
10
-
11
- async function writeTempFile(name: string, content: string): Promise<string> {
12
- const filePath = join(tmpdir(), name)
13
- await fs.writeFile(filePath, content, 'utf8')
14
- return filePath
15
- }
16
-
17
- describe('extractAttachmentContent', () => {
18
- afterEach(() => {
19
- mockExecFile.mockReset()
20
- })
21
-
22
- it('runs markitdown for non-image files and returns text', async () => {
23
- const filePath = await writeTempFile('sample.txt', 'hello world')
24
- mockExecFile.mockImplementation((_bin, _args, cb) => cb(null, 'converted text'))
25
- const { extractAttachmentContent } = await import('../textExtraction')
26
- const result = await extractAttachmentContent({ filePath, mimeType: 'text/plain' })
27
- expect(mockExecFile).toHaveBeenCalled()
28
- expect(result).toBe('converted text')
29
- })
30
-
31
- it('skips extraction for images', async () => {
32
- const filePath = await writeTempFile('image.png', 'binary')
33
- const { extractAttachmentContent } = await import('../textExtraction')
34
- const result = await extractAttachmentContent({ filePath, mimeType: 'image/png' })
35
- expect(mockExecFile).not.toHaveBeenCalled()
36
- expect(result).toBeNull()
37
- })
38
-
39
- it('returns null when markitdown fails', async () => {
40
- const filePath = await writeTempFile('doc.pdf', 'pdf')
41
- mockExecFile.mockImplementation((_bin, _args, cb) => cb(new Error('boom')))
42
- const { extractAttachmentContent } = await import('../textExtraction')
43
- const result = await extractAttachmentContent({ filePath, mimeType: 'application/pdf' })
44
- expect(mockExecFile).toHaveBeenCalled()
45
- expect(result).toBeNull()
46
- })
47
-
48
- it('allows markitdown for supported office/pdf/outlook types', async () => {
49
- const filePath = await writeTempFile('slides.pptx', 'content')
50
- mockExecFile.mockImplementation((_bin, _args, cb) => cb(null, 'converted text'))
51
- const { extractAttachmentContent } = await import('../textExtraction')
52
- const result = await extractAttachmentContent({ filePath, mimeType: 'application/vnd.openxmlformats-officedocument.presentationml.presentation' })
53
- expect(mockExecFile).toHaveBeenCalled()
54
- expect(result).toBe('converted text')
55
- })
56
-
57
- it('skips unsupported binary mime types', async () => {
58
- const filePath = await writeTempFile('binary.bin', 'bin')
59
- const { extractAttachmentContent } = await import('../textExtraction')
60
- const result = await extractAttachmentContent({ filePath, mimeType: 'application/x-custom-binary' })
61
- expect(mockExecFile).not.toHaveBeenCalled()
62
- expect(result).toBeNull()
63
- })
64
- })