@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,365 +0,0 @@
1
- import { HybridQueryEngine } from '../../query_index/lib/engine'
2
-
3
- function createFakeKnex(config: {
4
- baseTable: string
5
- hasIndexAny: boolean
6
- baseCount: number
7
- indexCount: number
8
- customFieldKeys?: Record<string, string[]>
9
- }) {
10
- const defaultCustomFieldKeys: Record<string, string[]> = {
11
- 'example:todo': ['priority'],
12
- 'customers:customer_entity': ['sector'],
13
- 'customers:customer_person_profile': ['birthday'],
14
- 'customers:customer_company_profile': ['industry'],
15
- }
16
- const customFieldKeys = config.customFieldKeys ?? defaultCustomFieldKeys
17
- const calls: any[] = []
18
- function raw(sql: string, params?: any[]) { return { toString: () => sql, sql, params } }
19
- function normalizeTable(t: any): { table: string; alias?: string } {
20
- if (typeof t === 'string') return { table: t }
21
- if (t && typeof t === 'object') {
22
- const alias = Object.keys(t)[0]
23
- const table = (t as any)[alias]
24
- return { table, alias }
25
- }
26
- return { table: String(t) }
27
- }
28
- function builderFor(tableArg: any) {
29
- const { table, alias } = normalizeTable(tableArg)
30
- const ops = { table, alias, wheres: [] as any[], joins: [] as any[], selects: [] as any[], orderBys: [] as any[], limits: 0, offsets: 0, isCountDistinct: false, isCount: false }
31
- const b: any = {
32
- _ops: ops,
33
- select: function (...cols: any[]) { ops.selects.push(cols); return this },
34
- where: function (...args: any[]) { ops.wheres.push(args); return this },
35
- andWhere: function (...args: any[]) { ops.wheres.push(args); return this },
36
- whereIn: function (...args: any[]) { ops.wheres.push(['in', ...args]); return this },
37
- whereNotIn: function (...args: any[]) { ops.wheres.push(['notIn', ...args]); return this },
38
- whereNull: function (col: any) { ops.wheres.push(['isNull', col]); return this },
39
- whereNotNull: function (col: any) { ops.wheres.push(['notNull', col]); return this },
40
- leftJoin: function (aliasObj: any, on: any) { ops.joins.push({ aliasObj, on }); return this },
41
- orderBy: function (col: any, dir?: any) { ops.orderBys.push([col, dir]); return this },
42
- limit: function (n: number) { ops.limits = n; return this },
43
- offset: function (n: number) { ops.offsets = n; return this },
44
- groupBy: function () { return this },
45
- modify: function (fn: (qb: any) => void) { if (typeof fn === 'function') fn(this); return this },
46
- clearSelect: function () { ops.selects = []; return this },
47
- clearOrder: function () { ops.orderBys = []; return this },
48
- clone: function () { return this },
49
- as: function (_alias: string) { return table },
50
- countDistinct: function () { ops.isCountDistinct = true; return this },
51
- count: function () { ops.isCount = true; return this },
52
- first: async function () {
53
- if (table === 'information_schema.tables') {
54
- return { table_name: config.baseTable }
55
- }
56
- if (table === 'entity_index_coverage') {
57
- if (!config.hasIndexAny) return undefined
58
- const requiresPositive = ops.wheres.some(
59
- (entry) =>
60
- Array.isArray(entry) &&
61
- entry.length >= 3 &&
62
- entry[0] === 'indexed_count' &&
63
- entry[1] === '>' &&
64
- Number(entry[2]) > 0,
65
- )
66
- if (requiresPositive && config.indexCount <= 0) return undefined
67
- return {
68
- base_count: String(config.baseCount),
69
- indexed_count: String(config.indexCount),
70
- refreshed_at: new Date(),
71
- }
72
- }
73
- if (table === 'entity_indexes' && !ops.isCountDistinct) {
74
- return config.hasIndexAny ? { entity_type: 'x' } : undefined
75
- }
76
- if (ops.isCountDistinct) {
77
- if (table === config.baseTable || ops.alias === 'b') return { count: String(config.baseCount) }
78
- if (table === 'entity_indexes' || ops.alias === 'ei') return { count: String(config.indexCount) }
79
- return { count: '0' }
80
- }
81
- if (ops.isCount) {
82
- return { count: String(config.baseCount) }
83
- }
84
- return undefined
85
- },
86
- then: function (resolve: any, reject?: any) {
87
- try {
88
- let result: any[] = []
89
- if (table === 'custom_field_defs') {
90
- const entityWhere = ops.wheres.find((entry) => Array.isArray(entry) && entry[0] === 'in' && entry[1] === 'entity_id')
91
- const requestedEntities: string[] = Array.isArray(entityWhere?.[2])
92
- ? (entityWhere![2] as any[]).map((id) => String(id))
93
- : Object.keys(customFieldKeys)
94
- result = requestedEntities.flatMap((entityId) => {
95
- const keys = customFieldKeys[entityId] ?? []
96
- return keys.map((key) => ({ entity_id: entityId, key, is_active: true }))
97
- })
98
- }
99
- return Promise.resolve(resolve(result))
100
- } catch (err) {
101
- if (reject) return Promise.resolve(reject(err))
102
- return Promise.reject(err)
103
- }
104
- },
105
- raw,
106
- }
107
- calls.push(b)
108
- return b
109
- }
110
- const fn: any = (t: any) => builderFor(t)
111
- fn.raw = raw
112
- fn.from = (t: any) => builderFor(t)
113
- fn._calls = calls
114
- return fn
115
- }
116
-
117
- describe('HybridQueryEngine', () => {
118
- const originalAutoReindex = process.env.QUERY_INDEX_AUTO_REINDEX
119
- const originalForcePartial = process.env.FORCE_QUERY_INDEX_ON_PARTIAL_INDEXES
120
-
121
- beforeEach(() => {
122
- delete process.env.QUERY_INDEX_AUTO_REINDEX
123
- delete process.env.FORCE_QUERY_INDEX_ON_PARTIAL_INDEXES
124
- })
125
-
126
- afterEach(() => {
127
- if (originalAutoReindex === undefined) delete process.env.QUERY_INDEX_AUTO_REINDEX
128
- else process.env.QUERY_INDEX_AUTO_REINDEX = originalAutoReindex
129
- if (originalForcePartial === undefined) delete process.env.FORCE_QUERY_INDEX_ON_PARTIAL_INDEXES
130
- else process.env.FORCE_QUERY_INDEX_ON_PARTIAL_INDEXES = originalForcePartial
131
- jest.clearAllMocks()
132
- })
133
-
134
- test('falls back when wantsCf but no index rows exist', async () => {
135
- const fakeKnex = createFakeKnex({ baseTable: 'todos', hasIndexAny: false, baseCount: 5, indexCount: 0 })
136
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
137
- const fallback = { query: jest.fn().mockResolvedValue({ items: [], page: 1, pageSize: 20, total: 0 }) }
138
- const emitEvent = jest.fn().mockResolvedValue(undefined)
139
- const engine = new HybridQueryEngine(em, fallback as any, () => ({ emitEvent }))
140
-
141
- await engine.query('example:todo', { fields: ['id', 'cf:priority'], includeCustomFields: true, organizationId: 'org1', tenantId: 't1' })
142
- expect(fallback.query).toHaveBeenCalled()
143
- expect(emitEvent).not.toHaveBeenCalled()
144
- })
145
-
146
- test('falls back and warns on partial coverage', async () => {
147
- process.env.FORCE_QUERY_INDEX_ON_PARTIAL_INDEXES = 'false'
148
- const fakeKnex = createFakeKnex({ baseTable: 'todos', hasIndexAny: true, baseCount: 10, indexCount: 1 })
149
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
150
- const fallback = { query: jest.fn().mockResolvedValue({ items: [], page: 1, pageSize: 20, total: 0 }) }
151
- const emitEvent = jest.fn().mockResolvedValue(undefined)
152
- const engine = new HybridQueryEngine(em, fallback as any, () => ({ emitEvent }))
153
- const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {})
154
-
155
- await engine.query('example:todo', { fields: ['id', 'cf:priority'], includeCustomFields: true, organizationId: 'org1', tenantId: 't1' })
156
- expect(fallback.query).toHaveBeenCalled()
157
- expect(warnSpy).toHaveBeenCalled()
158
- const msg = (warnSpy.mock.calls[0] || [])[0] as string
159
- expect(msg).toContain('Partial index coverage')
160
- expect(emitEvent).toHaveBeenCalledWith(
161
- 'query_index.reindex',
162
- expect.objectContaining({ entityType: 'example:todo', tenantId: 't1', organizationId: 'org1', force: false }),
163
- { persistent: true },
164
- )
165
- warnSpy.mockRestore()
166
- })
167
-
168
- test('skips partial coverage warning when entity has no custom fields', async () => {
169
- const fakeKnex = createFakeKnex({
170
- baseTable: 'todos',
171
- hasIndexAny: true,
172
- baseCount: 8,
173
- indexCount: 2,
174
- customFieldKeys: {},
175
- })
176
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
177
- const fallback = { query: jest.fn() }
178
- const emitEvent = jest.fn().mockResolvedValue(undefined)
179
- const engine = new HybridQueryEngine(em, fallback as any, () => ({ emitEvent }))
180
- const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {})
181
-
182
- const result = await engine.query('example:todo', {
183
- fields: ['id'],
184
- includeCustomFields: true,
185
- organizationId: 'org1',
186
- tenantId: 't1',
187
- })
188
-
189
- expect(fallback.query).not.toHaveBeenCalled()
190
- expect(result.meta?.partialIndexWarning).toBeUndefined()
191
- expect(warnSpy).not.toHaveBeenCalled()
192
-
193
- warnSpy.mockRestore()
194
- })
195
-
196
- test('emits partial coverage metadata when forcing query index usage', async () => {
197
- const fakeKnex = createFakeKnex({ baseTable: 'todos', hasIndexAny: true, baseCount: 10, indexCount: 4 })
198
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
199
- const fallback = { query: jest.fn() }
200
- const emitEvent = jest.fn().mockResolvedValue(undefined)
201
- const engine = new HybridQueryEngine(em, fallback as any, () => ({ emitEvent }))
202
- const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {})
203
-
204
- const result = await engine.query('example:todo', { fields: ['id', 'cf:priority'], includeCustomFields: true, organizationId: 'org1', tenantId: 't1' })
205
-
206
- expect(fallback.query).not.toHaveBeenCalled()
207
- expect(result.meta?.partialIndexWarning).toEqual(expect.objectContaining({ entity: 'example:todo' }))
208
- expect(warnSpy).toHaveBeenCalled()
209
- warnSpy.mockRestore()
210
- })
211
-
212
- test('emits partial coverage metadata when global scope is out of sync', async () => {
213
- const fakeKnex = createFakeKnex({ baseTable: 'todos', hasIndexAny: true, baseCount: 5, indexCount: 5 })
214
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
215
- const fallback = { query: jest.fn() }
216
- const emitEvent = jest.fn().mockResolvedValue(undefined)
217
- const engine = new HybridQueryEngine(em, fallback as any, () => ({ emitEvent }))
218
-
219
- const statsSpy = jest
220
- .spyOn(engine as any, 'indexCoverageStats')
221
- .mockImplementationOnce(async () => ({ baseCount: 5, indexedCount: 5 })) // scoped ok
222
- .mockImplementationOnce(async () => ({ baseCount: 10, indexedCount: 7 })) // global mismatch
223
-
224
- const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {})
225
-
226
- const result = await engine.query('example:todo', { fields: ['id', 'cf:priority'], includeCustomFields: true, organizationId: 'org1', tenantId: 't1' })
227
-
228
- expect(fallback.query).not.toHaveBeenCalled()
229
- expect(result.meta?.partialIndexWarning).toEqual(expect.objectContaining({ entity: 'example:todo', scope: 'global' }))
230
- expect(warnSpy).toHaveBeenCalled()
231
-
232
- statsSpy.mockRestore()
233
- warnSpy.mockRestore()
234
- })
235
-
236
- test('propagates partial coverage metadata from custom field sources', async () => {
237
- const fakeKnex = createFakeKnex({ baseTable: 'customer_entities', hasIndexAny: true, baseCount: 5, indexCount: 5 })
238
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
239
- const fallback = { query: jest.fn() }
240
- const emitEvent = jest.fn().mockResolvedValue(undefined)
241
- const engine = new HybridQueryEngine(em, fallback as any, () => ({ emitEvent }))
242
-
243
- const originalResolve = (engine as any).resolveCoverageGap.bind(engine)
244
- const gapSpy = jest
245
- .spyOn(engine as any, 'resolveCoverageGap')
246
- .mockImplementationOnce(originalResolve)
247
- .mockImplementationOnce(async () => ({ stats: { baseCount: 8, indexedCount: 6 }, scope: 'scoped' }))
248
- .mockImplementation(originalResolve)
249
-
250
- const result = await engine.query('customers:customer_entity', {
251
- tenantId: 't1',
252
- organizationId: 'org1',
253
- fields: ['id', 'cf:birthday'],
254
- includeCustomFields: ['birthday'],
255
- customFieldSources: [
256
- {
257
- entityId: 'customers:customer_person_profile',
258
- table: 'customer_people',
259
- alias: 'person_profile',
260
- recordIdColumn: 'id',
261
- join: { fromField: 'id', toField: 'entity_id' },
262
- },
263
- ],
264
- page: { page: 1, pageSize: 10 },
265
- })
266
-
267
- expect(result.meta?.partialIndexWarning).toEqual(expect.objectContaining({ entity: 'customers:customer_person_profile' }))
268
- expect(gapSpy).toHaveBeenCalled()
269
- gapSpy.mockRestore()
270
- })
271
-
272
- test('detects mismatch when index count exceeds base count', async () => {
273
- const fakeKnex = createFakeKnex({ baseTable: 'todos', hasIndexAny: true, baseCount: 10, indexCount: 12 })
274
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
275
- const fallback = { query: jest.fn() }
276
- const emitEvent = jest.fn().mockResolvedValue(undefined)
277
- const engine = new HybridQueryEngine(em, fallback as any, () => ({ emitEvent }))
278
- const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {})
279
-
280
- const result = await engine.query('example:todo', { fields: ['id', 'cf:priority'], includeCustomFields: true, organizationId: 'org1', tenantId: 't1' })
281
-
282
- expect(fallback.query).not.toHaveBeenCalled()
283
- expect(result.meta?.partialIndexWarning).toEqual(expect.objectContaining({ entity: 'example:todo' }))
284
- expect(warnSpy).toHaveBeenCalled()
285
- warnSpy.mockRestore()
286
- })
287
-
288
- test('uses hybrid path when coverage complete', async () => {
289
- const fakeKnex = createFakeKnex({ baseTable: 'todos', hasIndexAny: true, baseCount: 10, indexCount: 10 })
290
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
291
- const fallback = { query: jest.fn() }
292
- const emitEvent = jest.fn().mockResolvedValue(undefined)
293
- const engine = new HybridQueryEngine(em, fallback as any, () => ({ emitEvent }))
294
-
295
- await engine.query('example:todo', { fields: ['id', 'cf:priority'], includeCustomFields: true, organizationId: 'org1', tenantId: 't1', page: { page: 1, pageSize: 5 } })
296
- expect(fallback.query).not.toHaveBeenCalled()
297
- expect(emitEvent).not.toHaveBeenCalled()
298
- })
299
-
300
- test('joins entity index aliases for customFieldSources', async () => {
301
- const fakeKnex = createFakeKnex({ baseTable: 'customer_entities', hasIndexAny: true, baseCount: 5, indexCount: 5 })
302
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
303
- const fallback = { query: jest.fn() }
304
- const emitEvent = jest.fn().mockResolvedValue(undefined)
305
- const engine = new HybridQueryEngine(em, fallback as any, () => ({ emitEvent }))
306
-
307
- await engine.query('customers:customer_entity', {
308
- tenantId: 't1',
309
- fields: ['id', 'cf:birthday', 'cf:sector'],
310
- includeCustomFields: ['birthday', 'sector'],
311
- customFieldSources: [
312
- {
313
- entityId: 'customers:customer_person_profile',
314
- table: 'customer_people',
315
- alias: 'person_profile',
316
- recordIdColumn: 'id',
317
- join: { fromField: 'id', toField: 'entity_id' },
318
- },
319
- {
320
- entityId: 'customers:customer_company_profile',
321
- table: 'customer_companies',
322
- alias: 'company_profile',
323
- recordIdColumn: 'id',
324
- join: { fromField: 'id', toField: 'entity_id' },
325
- },
326
- ],
327
- page: { page: 1, pageSize: 10 },
328
- })
329
-
330
- expect(fallback.query).not.toHaveBeenCalled()
331
- const baseCall = fakeKnex._calls.find((call: any) => call._ops.alias === 'b')
332
- expect(baseCall).toBeTruthy()
333
- const summary = fakeKnex._calls.map((call: any) => ({
334
- alias: call._ops.alias,
335
- joinAliases: call._ops.joins.map((join: any) => Object.keys(join.aliasObj)[0]),
336
- }))
337
- expect(summary).toEqual(expect.arrayContaining([
338
- expect.objectContaining({
339
- alias: 'b',
340
- joinAliases: expect.arrayContaining([
341
- 'ei',
342
- 'person_profile',
343
- 'ei_person_profile',
344
- 'company_profile',
345
- 'ei_company_profile',
346
- ]),
347
- }),
348
- ]))
349
- expect(emitEvent).not.toHaveBeenCalled()
350
- })
351
-
352
- test('does not auto reindex when disabled via env', async () => {
353
- process.env.QUERY_INDEX_AUTO_REINDEX = 'false'
354
- const fakeKnex = createFakeKnex({ baseTable: 'todos', hasIndexAny: true, baseCount: 10, indexCount: 1 })
355
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
356
- const fallback = { query: jest.fn().mockResolvedValue({ items: [], page: 1, pageSize: 20, total: 0 }) }
357
- const emitEvent = jest.fn().mockResolvedValue(undefined)
358
- const engine = new HybridQueryEngine(em, fallback as any, () => ({ emitEvent }))
359
- const warnSpy = jest.spyOn(console, 'warn').mockImplementation(() => {})
360
-
361
- await engine.query('example:todo', { fields: ['id', 'cf:priority'], includeCustomFields: true, organizationId: 'org1', tenantId: 't1' })
362
- expect(emitEvent).not.toHaveBeenCalled()
363
- warnSpy.mockRestore()
364
- })
365
- })
@@ -1,175 +0,0 @@
1
- import { buildIndexDoc, upsertIndexRow, markDeleted } from '../../query_index/lib/indexer'
2
- import { resolveTenantEncryptionService } from '@open-mercato/shared/lib/encryption/customFieldValues'
3
-
4
- jest.mock('@open-mercato/shared/lib/encryption/customFieldValues', () => ({
5
- resolveTenantEncryptionService: jest.fn(),
6
- }))
7
-
8
- function createFakeKnex(data: {
9
- baseTable: string
10
- baseRows: any[]
11
- cfValues: any[]
12
- indexRows?: any[]
13
- }) {
14
- const calls: any[] = []
15
- const inserts: any[] = []
16
- const updates: any[] = []
17
- const deletes: any[] = []
18
- const indexRows = Array.isArray(data.indexRows) ? [...data.indexRows] : []
19
-
20
- function raw(sql: string, params?: any[]) { return { toString: () => sql, sql, params } }
21
-
22
- function builderFor(table: string) {
23
- const ops = { table, wheres: [] as any[], selects: [] as any[] }
24
- const b: any = {
25
- _ops: ops,
26
- select: function (...cols: any[]) { ops.selects.push(cols); return this },
27
- where: function (...args: any[]) { ops.wheres.push(args[0]); return this },
28
- andWhere: function (...args: any[]) { ops.wheres.push(args[0]); return this },
29
- andWhereRaw: function (sql: any, params?: any[]) { ops.wheres.push(['andWhereRaw', sql, params]); return this },
30
- orWhereNull: function (col: any) { ops.wheres.push(['orWhereNull', col]); return this },
31
- modify: function (fn: Function) {
32
- const qb: any = {
33
- andWhere: (cb: any) => {
34
- const inner: any = {
35
- where: (obj: any) => ({
36
- orWhereNull: (col: any) => { ops.wheres.push(['andWhereFn', obj, ['orWhereNull', col]]); return inner },
37
- }),
38
- }
39
- cb(inner)
40
- return qb
41
- },
42
- whereNull: (col: any) => { ops.wheres.push(['isNull', col]); return qb },
43
- }
44
- fn(qb)
45
- return this
46
- },
47
- first: async function () {
48
- if (table === data.baseTable) return data.baseRows[0]
49
- if (table === 'entity_indexes') return indexRows[0]
50
- return undefined
51
- },
52
- then: function (resolve: any) {
53
- if (table === 'custom_field_values') return Promise.resolve(resolve(data.cfValues))
54
- if (table === data.baseTable) return Promise.resolve(resolve(data.baseRows))
55
- return Promise.resolve(resolve([]))
56
- },
57
- insert: function (payload: any) {
58
- inserts.push({ table, payload })
59
- return {
60
- onConflict: (keys: string[]) => ({
61
- merge: (mergePayload: any) => { inserts[inserts.length - 1].conflict = keys; inserts[inserts.length - 1].merge = mergePayload; return Promise.resolve() },
62
- }),
63
- }
64
- },
65
- update: function (payload: any) { updates.push({ table, wheres: ops.wheres, payload }); return Promise.resolve(1) },
66
- delete: function () { deletes.push({ table, wheres: ops.wheres }); if (table === 'entity_indexes') indexRows.length = 0; return Promise.resolve(1) },
67
- del: function () { deletes.push({ table, wheres: ops.wheres }); if (table === 'entity_indexes') indexRows.length = 0; return Promise.resolve(1) },
68
- raw,
69
- }
70
- calls.push(b)
71
- return b
72
- }
73
- const fn: any = (t: any) => builderFor(t)
74
- fn._calls = calls
75
- fn._inserts = inserts
76
- fn._updates = updates
77
- fn._deletes = deletes
78
- fn.raw = raw
79
- fn.fn = { now: () => 'now()' }
80
- return fn
81
- }
82
-
83
- const resolveEncryptionMock = resolveTenantEncryptionService as jest.Mock
84
-
85
- describe('Indexer', () => {
86
- beforeEach(() => {
87
- resolveEncryptionMock.mockReset()
88
- })
89
-
90
- test('buildIndexDoc composes base row and custom fields (singleton and arrays)', async () => {
91
- const fakeKnex = createFakeKnex({
92
- baseTable: 'todos',
93
- baseRows: [{ id: '1', title: 'A', organization_id: 'org1', tenant_id: 't1' }],
94
- cfValues: [
95
- { field_key: 'vip', value_bool: true },
96
- { field_key: 'tags', value_text: 'a' },
97
- { field_key: 'tags', value_text: 'b' },
98
- ],
99
- })
100
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
101
- const doc = await buildIndexDoc(em, { entityType: 'example:todo', recordId: '1', organizationId: 'org1', tenantId: 't1' })
102
- expect(doc).toBeTruthy()
103
- expect(doc!.id).toBe('1')
104
- expect(doc!['cf:vip']).toBe(true)
105
- expect(doc!['cf:tags']).toEqual(['a','b'])
106
- })
107
-
108
- test('buildIndexDoc keeps encrypted payload (no decryption on write)', async () => {
109
- resolveEncryptionMock.mockReturnValue({
110
- isEnabled: () => true,
111
- decryptEntityPayload: async (_entityId: string, payload: Record<string, unknown>) => ({
112
- ...payload,
113
- title: 'Decrypted',
114
- }),
115
- })
116
- const fakeKnex = createFakeKnex({
117
- baseTable: 'todos',
118
- baseRows: [{ id: '1', title: 'Encrypted', organization_id: 'org1', tenant_id: 't1' }],
119
- cfValues: [{ field_key: 'secret', value_text: 'enc' }],
120
- })
121
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
122
- const doc = await buildIndexDoc(em, { entityType: 'example:todo', recordId: '1', organizationId: 'org1', tenantId: 't1' })
123
- expect(doc).toBeTruthy()
124
- expect(doc!.title).toBe('Encrypted')
125
- expect(doc!['cf:secret']).toBe('enc')
126
- })
127
-
128
- test('upsertIndexRow inserts or merges index row with built doc', async () => {
129
- const fakeKnex = createFakeKnex({
130
- baseTable: 'todos',
131
- baseRows: [{ id: '1', title: 'A' }],
132
- cfValues: [{ field_key: 'vip', value_bool: false }],
133
- })
134
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
135
- await upsertIndexRow(em, { entityType: 'example:todo', recordId: '1', organizationId: 'org1', tenantId: 't1' })
136
- const lastInsert = fakeKnex._inserts[fakeKnex._inserts.length - 1]
137
- expect(lastInsert.table).toBe('entity_indexes')
138
- expect(lastInsert.conflict).toEqual(['entity_type', 'entity_id', 'organization_id_coalesced'])
139
- expect(lastInsert.merge.entity_type).toBe('example:todo')
140
- expect(lastInsert.merge.entity_id).toBe('1')
141
- expect(lastInsert.merge.organization_id).toBe('org1')
142
- expect(lastInsert.merge.tenant_id).toBe('t1')
143
- expect(lastInsert.merge.doc['cf:vip']).toBe(false)
144
- })
145
-
146
- test('upsertIndexRow removes index row when base row missing', async () => {
147
- const fakeKnex = createFakeKnex({
148
- baseTable: 'todos',
149
- baseRows: [],
150
- cfValues: [],
151
- indexRows: [{ entity_type: 'example:todo', entity_id: 'x', organization_id: 'org1', deleted_at: null }],
152
- })
153
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
154
- await upsertIndexRow(em, { entityType: 'example:todo', recordId: 'x', organizationId: 'org1' })
155
- const lastDelete = fakeKnex._deletes[fakeKnex._deletes.length - 1]
156
- expect(lastDelete.table).toBe('entity_indexes')
157
- // Ensure where contains expected matching keys
158
- const whereObj = lastDelete.wheres.find((w: any) => typeof w === 'object')
159
- expect(whereObj.entity_type).toBe('example:todo')
160
- expect(whereObj.entity_id).toBe('x')
161
- })
162
-
163
- test('markDeleted removes index row', async () => {
164
- const fakeKnex = createFakeKnex({
165
- baseTable: 'todos',
166
- baseRows: [],
167
- cfValues: [],
168
- indexRows: [{ entity_type: 'example:todo', entity_id: '1', organization_id: 'org1', deleted_at: null }],
169
- })
170
- const em: any = { getConnection: () => ({ getKnex: () => fakeKnex }) }
171
- await markDeleted(em, { entityType: 'example:todo', recordId: '1', organizationId: 'org1' })
172
- const del = fakeKnex._deletes[fakeKnex._deletes.length - 1]
173
- expect(del.table).toBe('entity_indexes')
174
- })
175
- })
@@ -1,110 +0,0 @@
1
- import { expect, test } from "@playwright/test";
2
- import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
3
- import { getAuthToken } from "@open-mercato/core/modules/core/__integration__/helpers/api";
4
- import {
5
- createResourceFixture,
6
- deleteResourceIfExists,
7
- } from "./helpers/resourcesFixtures";
8
-
9
- export const integrationMeta = {
10
- dependsOnModules: ["resources", "audit_logs"],
11
- };
12
-
13
- const versionHistoryTitleRegex = /Version History/i;
14
- const resourceSubtitleRegex = /Resource profile and activity/i;
15
- const updateResourceActionRegex =
16
- /Update resource|resources\.resources\.update/i;
17
-
18
- /**
19
- * TC-INT-007: Resource Detail Header Pattern
20
- */
21
- test.describe("TC-INT-007: Resource Detail Header Pattern", () => {
22
- test("should render detail header with title, subtitle and back navigation", async ({
23
- page,
24
- request,
25
- }) => {
26
- let token: string | null = null;
27
- let resourceId: string | null = null;
28
- const stamp = Date.now();
29
- const resourceName = `QA TC-INT-007 Resource ${stamp}`;
30
-
31
- try {
32
- token = await getAuthToken(request, "admin");
33
- resourceId = await createResourceFixture(request, token, resourceName);
34
-
35
- await login(page, "admin");
36
- await page.goto(
37
- `/backend/resources/resources/${encodeURIComponent(resourceId)}`,
38
- );
39
-
40
- await expect(
41
- page.getByRole("heading", { name: resourceName }),
42
- ).toBeVisible();
43
- await expect(page.getByText(resourceSubtitleRegex)).toBeVisible();
44
- await expect(
45
- page.getByRole("link", { name: /Back to resources/i }),
46
- ).toBeVisible();
47
- const historyButton = page
48
- .getByRole("button", { name: versionHistoryTitleRegex })
49
- .first();
50
- await expect(historyButton).toBeVisible();
51
- } finally {
52
- await deleteResourceIfExists(request, token, resourceId);
53
- }
54
- });
55
-
56
- test("should show resource update in version history after editing details", async ({
57
- page,
58
- request,
59
- }) => {
60
- let token: string | null = null;
61
- let resourceId: string | null = null;
62
- const stamp = Date.now();
63
- const resourceName = `QA TC-INT-007 Resource ${stamp}`;
64
- const updatedResourceName = `${resourceName} Updated`;
65
-
66
- try {
67
- token = await getAuthToken(request, "admin");
68
- resourceId = await createResourceFixture(request, token, resourceName);
69
-
70
- await login(page, "admin");
71
- await page.goto(
72
- `/backend/resources/resources/${encodeURIComponent(resourceId)}`,
73
- );
74
- await expect(
75
- page.getByRole("heading", { name: resourceName }),
76
- ).toBeVisible();
77
-
78
- const nameInput = page
79
- .getByRole("textbox", { name: /Name|Nazwa|Nombre/i })
80
- .first();
81
- await expect(nameInput).toBeVisible();
82
- await nameInput.fill(updatedResourceName);
83
- await page
84
- .getByRole("button", { name: /^Save$/i })
85
- .first()
86
- .click();
87
-
88
- await expect(page).toHaveURL(/\/backend\/resources\/resources$/i);
89
- await page.goto(
90
- `/backend/resources/resources/${encodeURIComponent(resourceId)}`,
91
- );
92
-
93
- const historyButton = page
94
- .getByRole("button", { name: versionHistoryTitleRegex })
95
- .first();
96
- await expect(historyButton).toBeVisible();
97
- await historyButton.click();
98
-
99
- const historyDialog = page.getByRole("dialog", {
100
- name: versionHistoryTitleRegex,
101
- });
102
- await expect(historyDialog).toBeVisible();
103
- await expect(
104
- historyDialog.getByText(updateResourceActionRegex).first(),
105
- ).toBeVisible();
106
- } finally {
107
- await deleteResourceIfExists(request, token, resourceId);
108
- }
109
- });
110
- });