@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,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/modules/catalog/__integration__/TC-CAT-011.spec.ts"],
4
- "sourcesContent": ["import { expect, test } from '@playwright/test';\nimport { createProductFixture, deleteCatalogProductIfExists } from '@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures';\nimport { getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\n\n/**\n * TC-CAT-011: Configure Product Pricing\n * Source: .ai/qa/scenarios/TC-CAT-011-product-pricing-setup.md\n */\ntest.describe('TC-CAT-011: Configure Product Pricing', () => {\n test('should set variant sale and regular prices during variant creation', async ({ page, request }) => {\n const productName = `QA TC-CAT-011 ${Date.now()}`;\n const baseSku = `QA-CAT-011-BASE-${Date.now()}`;\n const variantName = `Priced Variant ${Date.now()}`;\n const variantSku = `QA-CAT-011-VAR-${Date.now()}`;\n let token: string | null = null;\n let productId: string | null = null;\n\n try {\n token = await getAuthToken(request);\n productId = await createProductFixture(request, token, { title: productName, sku: baseSku });\n\n await login(page, 'admin');\n await page.goto(`/backend/catalog/products/${productId}`);\n\n await page.getByRole('link', { name: 'Add variant' }).click();\n await expect(page).toHaveURL(/\\/variants\\/create$/);\n\n await page.getByRole('textbox', { name: 'e.g., Blue / Small' }).fill(variantName);\n await page.getByRole('textbox', { name: 'Unique identifier' }).fill(variantSku);\n\n const priceInputs = page.getByRole('textbox', { name: '0.00' });\n await priceInputs.nth(0).fill('19.99');\n await priceInputs.nth(1).fill('24.99');\n await page.getByRole('button', { name: 'Create variant' }).last().click();\n\n await expect(page).toHaveURL(/\\/backend\\/catalog\\/products\\/[0-9a-f-]{36}\\/variants\\/[0-9a-f-]{36}$/i);\n await expect(priceInputs.nth(0)).toHaveValue('19.9900');\n await expect(priceInputs.nth(1)).toHaveValue('24.9900');\n } finally {\n await deleteCatalogProductIfExists(request, token, productId);\n }\n });\n});\n"],
5
- "mappings": "AAAA,SAAS,QAAQ,YAAY;AAC7B,SAAS,sBAAsB,oCAAoC;AACnE,SAAS,oBAAoB;AAC7B,SAAS,aAAa;AAMtB,KAAK,SAAS,yCAAyC,MAAM;AAC3D,OAAK,sEAAsE,OAAO,EAAE,MAAM,QAAQ,MAAM;AACtG,UAAM,cAAc,iBAAiB,KAAK,IAAI,CAAC;AAC/C,UAAM,UAAU,mBAAmB,KAAK,IAAI,CAAC;AAC7C,UAAM,cAAc,kBAAkB,KAAK,IAAI,CAAC;AAChD,UAAM,aAAa,kBAAkB,KAAK,IAAI,CAAC;AAC/C,QAAI,QAAuB;AAC3B,QAAI,YAA2B;AAE/B,QAAI;AACF,cAAQ,MAAM,aAAa,OAAO;AAClC,kBAAY,MAAM,qBAAqB,SAAS,OAAO,EAAE,OAAO,aAAa,KAAK,QAAQ,CAAC;AAE3F,YAAM,MAAM,MAAM,OAAO;AACzB,YAAM,KAAK,KAAK,6BAA6B,SAAS,EAAE;AAExD,YAAM,KAAK,UAAU,QAAQ,EAAE,MAAM,cAAc,CAAC,EAAE,MAAM;AAC5D,YAAM,OAAO,IAAI,EAAE,UAAU,qBAAqB;AAElD,YAAM,KAAK,UAAU,WAAW,EAAE,MAAM,qBAAqB,CAAC,EAAE,KAAK,WAAW;AAChF,YAAM,KAAK,UAAU,WAAW,EAAE,MAAM,oBAAoB,CAAC,EAAE,KAAK,UAAU;AAE9E,YAAM,cAAc,KAAK,UAAU,WAAW,EAAE,MAAM,OAAO,CAAC;AAC9D,YAAM,YAAY,IAAI,CAAC,EAAE,KAAK,OAAO;AACrC,YAAM,YAAY,IAAI,CAAC,EAAE,KAAK,OAAO;AACrC,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,iBAAiB,CAAC,EAAE,KAAK,EAAE,MAAM;AAExE,YAAM,OAAO,IAAI,EAAE,UAAU,wEAAwE;AACrG,YAAM,OAAO,YAAY,IAAI,CAAC,CAAC,EAAE,YAAY,SAAS;AACtD,YAAM,OAAO,YAAY,IAAI,CAAC,CAAC,EAAE,YAAY,SAAS;AAAA,IACxD,UAAE;AACA,YAAM,6BAA6B,SAAS,OAAO,SAAS;AAAA,IAC9D;AAAA,EACF,CAAC;AACH,CAAC;",
6
- "names": []
7
- }
@@ -1,27 +0,0 @@
1
- import { expect, test } from "@playwright/test";
2
- import { createProductFixture, deleteCatalogProductIfExists } from "@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures";
3
- import { getAuthToken } from "@open-mercato/core/modules/core/__integration__/helpers/api";
4
- import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
5
- test.describe("TC-CAT-012: Product Search and Filter", () => {
6
- test("should search products by name and SKU", async ({ page, request }) => {
7
- const stamp = Date.now();
8
- const productName = `QA TC-CAT-012 ${stamp}`;
9
- const sku = `QA-CAT-012-${stamp}`;
10
- let token = null;
11
- let productId = null;
12
- try {
13
- token = await getAuthToken(request);
14
- productId = await createProductFixture(request, token, { title: productName, sku });
15
- await login(page, "admin");
16
- await page.goto("/backend/catalog/products");
17
- const search = page.getByRole("textbox", { name: "Search" });
18
- await search.fill(productName);
19
- await expect(page.getByText(productName).first()).toBeVisible({ timeout: 1e4 });
20
- await search.fill(sku);
21
- await expect(page.getByText(productName).first()).toBeVisible({ timeout: 1e4 });
22
- } finally {
23
- await deleteCatalogProductIfExists(request, token, productId);
24
- }
25
- });
26
- });
27
- //# sourceMappingURL=TC-CAT-012.spec.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../src/modules/catalog/__integration__/TC-CAT-012.spec.ts"],
4
- "sourcesContent": ["import { expect, test } from '@playwright/test';\nimport { createProductFixture, deleteCatalogProductIfExists } from '@open-mercato/core/modules/core/__integration__/helpers/catalogFixtures';\nimport { getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\n\n/**\n * TC-CAT-012: Product Search and Filter\n * Source: .ai/qa/scenarios/TC-CAT-012-product-search-filter.md\n */\ntest.describe('TC-CAT-012: Product Search and Filter', () => {\n test('should search products by name and SKU', async ({ page, request }) => {\n const stamp = Date.now();\n const productName = `QA TC-CAT-012 ${stamp}`;\n const sku = `QA-CAT-012-${stamp}`;\n let token: string | null = null;\n let productId: string | null = null;\n\n try {\n token = await getAuthToken(request);\n productId = await createProductFixture(request, token, { title: productName, sku });\n\n await login(page, 'admin');\n await page.goto('/backend/catalog/products');\n const search = page.getByRole('textbox', { name: 'Search' });\n\n await search.fill(productName);\n await expect(page.getByText(productName).first()).toBeVisible({ timeout: 10_000 });\n\n await search.fill(sku);\n await expect(page.getByText(productName).first()).toBeVisible({ timeout: 10_000 });\n } finally {\n await deleteCatalogProductIfExists(request, token, productId);\n }\n });\n});\n"],
5
- "mappings": "AAAA,SAAS,QAAQ,YAAY;AAC7B,SAAS,sBAAsB,oCAAoC;AACnE,SAAS,oBAAoB;AAC7B,SAAS,aAAa;AAMtB,KAAK,SAAS,yCAAyC,MAAM;AAC3D,OAAK,0CAA0C,OAAO,EAAE,MAAM,QAAQ,MAAM;AAC1E,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,cAAc,iBAAiB,KAAK;AAC1C,UAAM,MAAM,cAAc,KAAK;AAC/B,QAAI,QAAuB;AAC3B,QAAI,YAA2B;AAE/B,QAAI;AACF,cAAQ,MAAM,aAAa,OAAO;AAClC,kBAAY,MAAM,qBAAqB,SAAS,OAAO,EAAE,OAAO,aAAa,IAAI,CAAC;AAElF,YAAM,MAAM,MAAM,OAAO;AACzB,YAAM,KAAK,KAAK,2BAA2B;AAC3C,YAAM,SAAS,KAAK,UAAU,WAAW,EAAE,MAAM,SAAS,CAAC;AAE3D,YAAM,OAAO,KAAK,WAAW;AAC7B,YAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,SAAS,IAAO,CAAC;AAEjF,YAAM,OAAO,KAAK,GAAG;AACrB,YAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,CAAC,EAAE,YAAY,EAAE,SAAS,IAAO,CAAC;AAAA,IACnF,UAAE;AACA,YAAM,6BAA6B,SAAS,OAAO,SAAS;AAAA,IAC9D;AAAA,EACF,CAAC;AACH,CAAC;",
6
- "names": []
7
- }
@@ -1,44 +0,0 @@
1
- import { test, expect } from "@playwright/test";
2
- import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
3
- import { getAuthToken, apiRequest } from "@open-mercato/core/modules/core/__integration__/helpers/api";
4
- test.describe("TC-ADMIN-001: Create API Key", () => {
5
- test("should create an API key and show it in the list", async ({ page, request }) => {
6
- const keyName = `QA TC-ADMIN-001 ${Date.now()}`;
7
- let token = null;
8
- try {
9
- token = await getAuthToken(request);
10
- await login(page, "admin");
11
- await page.goto("/backend/api-keys");
12
- await expect(page.getByRole("heading", { name: "API Keys", level: 2 })).toBeVisible();
13
- await page.getByRole("link", { name: "Create" }).click();
14
- await expect(page).toHaveURL(/\/backend\/api-keys\/create$/);
15
- await expect(page.getByText("Create API Key")).toBeVisible();
16
- const nameField = page.locator("form").getByRole("textbox").first();
17
- await nameField.fill(keyName);
18
- await page.getByRole("button", { name: "Create" }).last().click();
19
- await expect(page.getByText("Keep this key safe")).toBeVisible({ timeout: 1e4 });
20
- await expect(page.getByText(/Prefix: omk_/)).toBeVisible();
21
- await page.getByRole("button", { name: "Close" }).click();
22
- await page.goto("/backend/api-keys");
23
- await page.getByText("Loading data...").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
24
- });
25
- await page.getByRole("textbox", { name: "Search" }).fill(keyName);
26
- await expect(page.getByText(keyName)).toBeVisible({ timeout: 5e3 });
27
- } finally {
28
- if (token) {
29
- const listResponse = await apiRequest(request, "GET", "/api/auth/api-keys", { token });
30
- const listData = await listResponse.json().catch(() => null);
31
- if (listData && Array.isArray(listData.items)) {
32
- const keyToDelete = listData.items.find(
33
- (item) => item.name === keyName
34
- );
35
- if (keyToDelete && typeof keyToDelete.id === "string") {
36
- await apiRequest(request, "DELETE", `/api/auth/api-keys?id=${keyToDelete.id}`, { token }).catch(() => {
37
- });
38
- }
39
- }
40
- }
41
- }
42
- });
43
- });
44
- //# sourceMappingURL=TC-ADMIN-001.spec.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-001.spec.ts"],
4
- "sourcesContent": ["import { test, expect } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\nimport { getAuthToken, apiRequest } from '@open-mercato/core/modules/core/__integration__/helpers/api';\n\n/**\n * TC-ADMIN-001: Create API Key\n * Source: .ai/qa/scenarios/TC-ADMIN-001-api-key-creation.md\n *\n * Verifies that API keys can be created from the create form,\n * that the generated key is shown once, and that the key appears\n * in the API keys list.\n *\n * Navigation: Settings \u2192 Auth \u2192 API Keys \u2192 Create\n */\ntest.describe('TC-ADMIN-001: Create API Key', () => {\n test('should create an API key and show it in the list', async ({ page, request }) => {\n const keyName = `QA TC-ADMIN-001 ${Date.now()}`;\n let token: string | null = null;\n\n try {\n token = await getAuthToken(request);\n await login(page, 'admin');\n\n // Navigate to API Keys via Settings\n await page.goto('/backend/api-keys');\n await expect(page.getByRole('heading', { name: 'API Keys', level: 2 })).toBeVisible();\n\n // Click Create\n await page.getByRole('link', { name: 'Create' }).click();\n await expect(page).toHaveURL(/\\/backend\\/api-keys\\/create$/);\n await expect(page.getByText('Create API Key')).toBeVisible();\n\n // Fill in the name\n const nameField = page.locator('form').getByRole('textbox').first();\n await nameField.fill(keyName);\n\n // Click Create button\n await page.getByRole('button', { name: 'Create' }).last().click();\n\n // After creation, a dialog shows the generated key (one-time view)\n await expect(page.getByText('Keep this key safe')).toBeVisible({ timeout: 10_000 });\n await expect(page.getByText(/Prefix: omk_/)).toBeVisible();\n\n // Close the key dialog\n await page.getByRole('button', { name: 'Close' }).click();\n\n // Navigate back to list\n await page.goto('/backend/api-keys');\n await page.getByText('Loading data...').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n // Search for the created key\n await page.getByRole('textbox', { name: 'Search' }).fill(keyName);\n await expect(page.getByText(keyName)).toBeVisible({ timeout: 5_000 });\n } finally {\n // Cleanup: try to delete the API key via API (best effort)\n if (token) {\n const listResponse = await apiRequest(request, 'GET', '/api/auth/api-keys', { token });\n const listData = await listResponse.json().catch(() => null);\n if (listData && Array.isArray(listData.items)) {\n const keyToDelete = listData.items.find((item: Record<string, unknown>) =>\n item.name === keyName,\n );\n if (keyToDelete && typeof keyToDelete.id === 'string') {\n await apiRequest(request, 'DELETE', `/api/auth/api-keys?id=${keyToDelete.id}`, { token }).catch(() => {});\n }\n }\n }\n }\n });\n});\n"],
5
- "mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,aAAa;AACtB,SAAS,cAAc,kBAAkB;AAYzC,KAAK,SAAS,gCAAgC,MAAM;AAClD,OAAK,oDAAoD,OAAO,EAAE,MAAM,QAAQ,MAAM;AACpF,UAAM,UAAU,mBAAmB,KAAK,IAAI,CAAC;AAC7C,QAAI,QAAuB;AAE3B,QAAI;AACF,cAAQ,MAAM,aAAa,OAAO;AAClC,YAAM,MAAM,MAAM,OAAO;AAGzB,YAAM,KAAK,KAAK,mBAAmB;AACnC,YAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,YAAY,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AAGpF,YAAM,KAAK,UAAU,QAAQ,EAAE,MAAM,SAAS,CAAC,EAAE,MAAM;AACvD,YAAM,OAAO,IAAI,EAAE,UAAU,8BAA8B;AAC3D,YAAM,OAAO,KAAK,UAAU,gBAAgB,CAAC,EAAE,YAAY;AAG3D,YAAM,YAAY,KAAK,QAAQ,MAAM,EAAE,UAAU,SAAS,EAAE,MAAM;AAClE,YAAM,UAAU,KAAK,OAAO;AAG5B,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM;AAGhE,YAAM,OAAO,KAAK,UAAU,oBAAoB,CAAC,EAAE,YAAY,EAAE,SAAS,IAAO,CAAC;AAClF,YAAM,OAAO,KAAK,UAAU,cAAc,CAAC,EAAE,YAAY;AAGzD,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,QAAQ,CAAC,EAAE,MAAM;AAGxD,YAAM,KAAK,KAAK,mBAAmB;AACnC,YAAM,KAAK,UAAU,iBAAiB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAGpG,YAAM,KAAK,UAAU,WAAW,EAAE,MAAM,SAAS,CAAC,EAAE,KAAK,OAAO;AAChE,YAAM,OAAO,KAAK,UAAU,OAAO,CAAC,EAAE,YAAY,EAAE,SAAS,IAAM,CAAC;AAAA,IACtE,UAAE;AAEA,UAAI,OAAO;AACT,cAAM,eAAe,MAAM,WAAW,SAAS,OAAO,sBAAsB,EAAE,MAAM,CAAC;AACrF,cAAM,WAAW,MAAM,aAAa,KAAK,EAAE,MAAM,MAAM,IAAI;AAC3D,YAAI,YAAY,MAAM,QAAQ,SAAS,KAAK,GAAG;AAC7C,gBAAM,cAAc,SAAS,MAAM;AAAA,YAAK,CAAC,SACvC,KAAK,SAAS;AAAA,UAChB;AACA,cAAI,eAAe,OAAO,YAAY,OAAO,UAAU;AACrD,kBAAM,WAAW,SAAS,UAAU,yBAAyB,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,MAAM;AAAA,YAAC,CAAC;AAAA,UAC1G;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;",
6
- "names": []
7
- }
@@ -1,53 +0,0 @@
1
- import { test, expect } from "@playwright/test";
2
- import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
3
- import { getAuthToken, apiRequest } from "@open-mercato/core/modules/core/__integration__/helpers/api";
4
- test.describe("TC-ADMIN-002: Revoke API Key", () => {
5
- test("should revoke an existing API key", async ({ page, request }) => {
6
- const keyName = `QA TC-ADMIN-002 ${Date.now()}`;
7
- let token = null;
8
- let keyId = null;
9
- try {
10
- token = await getAuthToken(request);
11
- await login(page, "admin");
12
- await page.goto("/backend/api-keys/create");
13
- const nameField = page.locator("form").getByRole("textbox").first();
14
- await nameField.fill(keyName);
15
- await page.getByRole("button", { name: "Create" }).last().click();
16
- await expect(page.getByText("Keep this key safe")).toBeVisible({ timeout: 1e4 });
17
- await page.getByRole("button", { name: "Close" }).click();
18
- await page.goto("/backend/api-keys");
19
- await page.getByText("Loading data...").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
20
- });
21
- await page.getByRole("textbox", { name: "Search" }).fill(keyName);
22
- await expect(page.getByText(keyName)).toBeVisible({ timeout: 5e3 });
23
- const keyRow = page.locator("table tbody tr").filter({ hasText: keyName }).first();
24
- await expect(keyRow).toBeVisible();
25
- const actionsButton = keyRow.getByRole("button").last();
26
- await actionsButton.click();
27
- const revokeButton = page.getByRole("menuitem", { name: /revoke|delete/i }).first();
28
- await expect(revokeButton).toBeVisible({ timeout: 3e3 });
29
- await revokeButton.click();
30
- const confirmButton = page.getByRole("button", { name: /confirm|revoke|delete|yes/i });
31
- if (await confirmButton.isVisible().catch(() => false)) {
32
- await confirmButton.click();
33
- }
34
- await page.waitForTimeout(1e3);
35
- await page.getByRole("textbox", { name: "Search" }).fill(keyName);
36
- } finally {
37
- if (token) {
38
- const listResponse = await apiRequest(request, "GET", "/api/auth/api-keys", { token });
39
- const listData = await listResponse.json().catch(() => null);
40
- if (listData && Array.isArray(listData.items)) {
41
- const keyToDelete = listData.items.find(
42
- (item) => item.name === keyName
43
- );
44
- if (keyToDelete && typeof keyToDelete.id === "string") {
45
- await apiRequest(request, "DELETE", `/api/auth/api-keys?id=${keyToDelete.id}`, { token }).catch(() => {
46
- });
47
- }
48
- }
49
- }
50
- }
51
- });
52
- });
53
- //# sourceMappingURL=TC-ADMIN-002.spec.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-002.spec.ts"],
4
- "sourcesContent": ["import { test, expect } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\nimport { getAuthToken, apiRequest } from '@open-mercato/core/modules/core/__integration__/helpers/api';\n\n/**\n * TC-ADMIN-002: Revoke API Key\n * Source: .ai/qa/scenarios/TC-ADMIN-002-api-key-revocation.md\n *\n * Verifies that an existing API key can be revoked.\n * Creates a key via API, then revokes it through the UI.\n *\n * Navigation: Settings \u2192 Auth \u2192 API Keys\n */\ntest.describe('TC-ADMIN-002: Revoke API Key', () => {\n test('should revoke an existing API key', async ({ page, request }) => {\n const keyName = `QA TC-ADMIN-002 ${Date.now()}`;\n let token: string | null = null;\n let keyId: string | null = null;\n\n try {\n token = await getAuthToken(request);\n\n // Create an API key via the UI first\n await login(page, 'admin');\n await page.goto('/backend/api-keys/create');\n\n const nameField = page.locator('form').getByRole('textbox').first();\n await nameField.fill(keyName);\n await page.getByRole('button', { name: 'Create' }).last().click();\n\n // Wait for the key dialog\n await expect(page.getByText('Keep this key safe')).toBeVisible({ timeout: 10_000 });\n await page.getByRole('button', { name: 'Close' }).click();\n\n // Navigate to API keys list\n await page.goto('/backend/api-keys');\n await page.getByText('Loading data...').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n // Search for the key\n await page.getByRole('textbox', { name: 'Search' }).fill(keyName);\n await expect(page.getByText(keyName)).toBeVisible({ timeout: 5_000 });\n\n // Find and click the row actions for this key \u2014 look for a revoke/delete button\n const keyRow = page.locator('table tbody tr').filter({ hasText: keyName }).first();\n await expect(keyRow).toBeVisible();\n\n // Click the actions button on the row\n const actionsButton = keyRow.getByRole('button').last();\n await actionsButton.click();\n\n // Look for a Revoke or Delete option in the dropdown menu\n const revokeButton = page.getByRole('menuitem', { name: /revoke|delete/i }).first();\n await expect(revokeButton).toBeVisible({ timeout: 3_000 });\n await revokeButton.click();\n\n // Handle confirmation dialog if present\n const confirmButton = page.getByRole('button', { name: /confirm|revoke|delete|yes/i });\n if (await confirmButton.isVisible().catch(() => false)) {\n await confirmButton.click();\n }\n\n // Verify the key is revoked or removed\n await page.waitForTimeout(1_000);\n await page.getByRole('textbox', { name: 'Search' }).fill(keyName);\n // Key should either show as revoked or be removed from list\n // We verify at least that no error occurred\n } finally {\n // Cleanup via API\n if (token) {\n const listResponse = await apiRequest(request, 'GET', '/api/auth/api-keys', { token });\n const listData = await listResponse.json().catch(() => null);\n if (listData && Array.isArray(listData.items)) {\n const keyToDelete = listData.items.find((item: Record<string, unknown>) =>\n item.name === keyName,\n );\n if (keyToDelete && typeof keyToDelete.id === 'string') {\n await apiRequest(request, 'DELETE', `/api/auth/api-keys?id=${keyToDelete.id}`, { token }).catch(() => {});\n }\n }\n }\n }\n });\n});\n"],
5
- "mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,aAAa;AACtB,SAAS,cAAc,kBAAkB;AAWzC,KAAK,SAAS,gCAAgC,MAAM;AAClD,OAAK,qCAAqC,OAAO,EAAE,MAAM,QAAQ,MAAM;AACrE,UAAM,UAAU,mBAAmB,KAAK,IAAI,CAAC;AAC7C,QAAI,QAAuB;AAC3B,QAAI,QAAuB;AAE3B,QAAI;AACF,cAAQ,MAAM,aAAa,OAAO;AAGlC,YAAM,MAAM,MAAM,OAAO;AACzB,YAAM,KAAK,KAAK,0BAA0B;AAE1C,YAAM,YAAY,KAAK,QAAQ,MAAM,EAAE,UAAU,SAAS,EAAE,MAAM;AAClE,YAAM,UAAU,KAAK,OAAO;AAC5B,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,SAAS,CAAC,EAAE,KAAK,EAAE,MAAM;AAGhE,YAAM,OAAO,KAAK,UAAU,oBAAoB,CAAC,EAAE,YAAY,EAAE,SAAS,IAAO,CAAC;AAClF,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,QAAQ,CAAC,EAAE,MAAM;AAGxD,YAAM,KAAK,KAAK,mBAAmB;AACnC,YAAM,KAAK,UAAU,iBAAiB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAGpG,YAAM,KAAK,UAAU,WAAW,EAAE,MAAM,SAAS,CAAC,EAAE,KAAK,OAAO;AAChE,YAAM,OAAO,KAAK,UAAU,OAAO,CAAC,EAAE,YAAY,EAAE,SAAS,IAAM,CAAC;AAGpE,YAAM,SAAS,KAAK,QAAQ,gBAAgB,EAAE,OAAO,EAAE,SAAS,QAAQ,CAAC,EAAE,MAAM;AACjF,YAAM,OAAO,MAAM,EAAE,YAAY;AAGjC,YAAM,gBAAgB,OAAO,UAAU,QAAQ,EAAE,KAAK;AACtD,YAAM,cAAc,MAAM;AAG1B,YAAM,eAAe,KAAK,UAAU,YAAY,EAAE,MAAM,iBAAiB,CAAC,EAAE,MAAM;AAClF,YAAM,OAAO,YAAY,EAAE,YAAY,EAAE,SAAS,IAAM,CAAC;AACzD,YAAM,aAAa,MAAM;AAGzB,YAAM,gBAAgB,KAAK,UAAU,UAAU,EAAE,MAAM,6BAA6B,CAAC;AACrF,UAAI,MAAM,cAAc,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AACtD,cAAM,cAAc,MAAM;AAAA,MAC5B;AAGA,YAAM,KAAK,eAAe,GAAK;AAC/B,YAAM,KAAK,UAAU,WAAW,EAAE,MAAM,SAAS,CAAC,EAAE,KAAK,OAAO;AAAA,IAGlE,UAAE;AAEA,UAAI,OAAO;AACT,cAAM,eAAe,MAAM,WAAW,SAAS,OAAO,sBAAsB,EAAE,MAAM,CAAC;AACrF,cAAM,WAAW,MAAM,aAAa,KAAK,EAAE,MAAM,MAAM,IAAI;AAC3D,YAAI,YAAY,MAAM,QAAQ,SAAS,KAAK,GAAG;AAC7C,gBAAM,cAAc,SAAS,MAAM;AAAA,YAAK,CAAC,SACvC,KAAK,SAAS;AAAA,UAChB;AACA,cAAI,eAAe,OAAO,YAAY,OAAO,UAAU;AACrD,kBAAM,WAAW,SAAS,UAAU,yBAAyB,YAAY,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,MAAM;AAAA,YAAC,CAAC;AAAA,UAC1G;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;",
6
- "names": []
7
- }
@@ -1,26 +0,0 @@
1
- import { test, expect } from "@playwright/test";
2
- import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
3
- test.describe("TC-ADMIN-003: View and Filter Audit Logs", () => {
4
- test("should display audit log tabs with action log entries", async ({ page }) => {
5
- await login(page, "admin");
6
- await page.goto("/backend/audit-logs");
7
- const actionLogTab = page.getByRole("tab", { name: "Action Log" });
8
- await expect(actionLogTab).toBeVisible();
9
- await expect(actionLogTab).toHaveAttribute("aria-selected", "true");
10
- await expect(page.getByRole("tab", { name: "Access Log" })).toBeVisible();
11
- await expect(page.getByRole("heading", { name: "Action Log", level: 2 })).toBeVisible();
12
- await expect(page.getByRole("checkbox", { name: "Undoable only" })).toBeVisible();
13
- await page.getByText("Loading data...").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
14
- });
15
- await expect(page.getByRole("columnheader", { name: "Action" })).toBeVisible();
16
- await expect(page.getByRole("columnheader", { name: "Resource" })).toBeVisible();
17
- await expect(page.getByRole("columnheader", { name: "User" })).toBeVisible();
18
- await expect(page.getByRole("columnheader", { name: "When" })).toBeVisible();
19
- await expect(page.getByRole("columnheader", { name: "Status" })).toBeVisible();
20
- const rows = page.locator("table tbody tr");
21
- await expect(rows.first()).toBeVisible();
22
- await page.getByRole("tab", { name: "Access Log" }).click();
23
- await expect(page.getByRole("heading", { name: "Access Log", level: 2 })).toBeVisible();
24
- });
25
- });
26
- //# sourceMappingURL=TC-ADMIN-003.spec.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-003.spec.ts"],
4
- "sourcesContent": ["import { test, expect } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\n\n/**\n * TC-ADMIN-003: View and Filter Audit Logs\n * Source: .ai/qa/scenarios/TC-ADMIN-003-audit-log-viewing.md\n *\n * Verifies that audit logs are accessible via the Security sidebar section,\n * display action and access log tabs, and show log entries with details.\n *\n * Navigation: Main sidebar \u2192 Security \u2192 Audit Logs\n */\ntest.describe('TC-ADMIN-003: View and Filter Audit Logs', () => {\n test('should display audit log tabs with action log entries', async ({ page }) => {\n await login(page, 'admin');\n await page.goto('/backend/audit-logs');\n\n // Verify Action Log tab is selected by default\n const actionLogTab = page.getByRole('tab', { name: 'Action Log' });\n await expect(actionLogTab).toBeVisible();\n await expect(actionLogTab).toHaveAttribute('aria-selected', 'true');\n\n // Verify Access Log tab exists\n await expect(page.getByRole('tab', { name: 'Access Log' })).toBeVisible();\n\n // Verify Action Log heading\n await expect(page.getByRole('heading', { name: 'Action Log', level: 2 })).toBeVisible();\n\n // Verify the undoable only filter\n await expect(page.getByRole('checkbox', { name: 'Undoable only' })).toBeVisible();\n\n // Wait for table to load\n await page.getByText('Loading data...').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n // Verify table columns\n await expect(page.getByRole('columnheader', { name: 'Action' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Resource' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'User' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'When' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Status' })).toBeVisible();\n\n // Verify audit log entries exist (since we just logged in, there should be entries)\n const rows = page.locator('table tbody tr');\n await expect(rows.first()).toBeVisible();\n\n // Switch to Access Log tab\n await page.getByRole('tab', { name: 'Access Log' }).click();\n await expect(page.getByRole('heading', { name: 'Access Log', level: 2 })).toBeVisible();\n });\n});\n"],
5
- "mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,aAAa;AAWtB,KAAK,SAAS,4CAA4C,MAAM;AAC9D,OAAK,yDAAyD,OAAO,EAAE,KAAK,MAAM;AAChF,UAAM,MAAM,MAAM,OAAO;AACzB,UAAM,KAAK,KAAK,qBAAqB;AAGrC,UAAM,eAAe,KAAK,UAAU,OAAO,EAAE,MAAM,aAAa,CAAC;AACjE,UAAM,OAAO,YAAY,EAAE,YAAY;AACvC,UAAM,OAAO,YAAY,EAAE,gBAAgB,iBAAiB,MAAM;AAGlE,UAAM,OAAO,KAAK,UAAU,OAAO,EAAE,MAAM,aAAa,CAAC,CAAC,EAAE,YAAY;AAGxE,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,cAAc,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AAGtF,UAAM,OAAO,KAAK,UAAU,YAAY,EAAE,MAAM,gBAAgB,CAAC,CAAC,EAAE,YAAY;AAGhF,UAAM,KAAK,UAAU,iBAAiB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAGpG,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAC7E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,WAAW,CAAC,CAAC,EAAE,YAAY;AAC/E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,YAAY;AAC3E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,YAAY;AAC3E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAG7E,UAAM,OAAO,KAAK,QAAQ,gBAAgB;AAC1C,UAAM,OAAO,KAAK,MAAM,CAAC,EAAE,YAAY;AAGvC,UAAM,KAAK,UAAU,OAAO,EAAE,MAAM,aAAa,CAAC,EAAE,MAAM;AAC1D,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,cAAc,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AAAA,EACxF,CAAC;AACH,CAAC;",
6
- "names": []
7
- }
@@ -1,47 +0,0 @@
1
- import { test, expect } from "@playwright/test";
2
- import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
3
- import { apiRequest, getAuthToken } from "@open-mercato/core/modules/core/__integration__/helpers/api";
4
- test.describe("TC-ADMIN-004: Dictionary Management", () => {
5
- test("should display dictionaries and allow creating a new one", async ({ page, request }) => {
6
- let token = null;
7
- let dictionaryId = null;
8
- let dictionaryKey = null;
9
- try {
10
- token = await getAuthToken(request);
11
- await login(page, "admin");
12
- await page.goto("/backend/config/dictionaries");
13
- await expect(page.getByRole("heading", { name: "Dictionaries", level: 2 })).toBeVisible();
14
- await page.getByText("Loading dictionaries").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
15
- });
16
- await expect(page.getByRole("button", { name: "New dictionary" })).toBeVisible();
17
- await expect(page.getByText("Manage reusable values and appearance")).toBeVisible({ timeout: 5e3 });
18
- await expect(page.getByRole("button", { name: "Refresh" })).toBeVisible();
19
- await expect(page.getByRole("button", { name: "Add entry" })).toBeVisible();
20
- await expect(page.getByRole("columnheader", { name: "Value" })).toBeVisible();
21
- await expect(page.getByRole("columnheader", { name: "Label" })).toBeVisible();
22
- await page.getByRole("button", { name: "New dictionary" }).click();
23
- await expect(page.getByRole("heading", { name: "Create dictionary", level: 2 })).toBeVisible({ timeout: 5e3 });
24
- const timestamp = Date.now();
25
- const dictKey = `qa_tc_admin_004_${timestamp}`;
26
- const dictName = `QA TC-ADMIN-004 ${timestamp}`;
27
- dictionaryKey = dictKey;
28
- await page.getByRole("textbox", { name: "slug_name" }).fill(dictKey);
29
- await page.getByRole("textbox", { name: "Display name" }).fill(dictName);
30
- await page.getByRole("button", { name: "Save" }).click();
31
- await expect(page.getByText(dictName)).toBeVisible({ timeout: 5e3 });
32
- } finally {
33
- if (token && dictionaryKey) {
34
- const listResponse = await apiRequest(request, "GET", "/api/dictionaries", { token }).catch(() => null);
35
- if (listResponse && listResponse.ok()) {
36
- const listData = await listResponse.json().catch(() => null);
37
- dictionaryId = listData?.items?.find((item) => item.key === dictionaryKey)?.id ?? null;
38
- }
39
- }
40
- if (token && dictionaryId) {
41
- await apiRequest(request, "DELETE", `/api/dictionaries/${encodeURIComponent(dictionaryId)}`, { token }).catch(() => {
42
- });
43
- }
44
- }
45
- });
46
- });
47
- //# sourceMappingURL=TC-ADMIN-004.spec.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-004.spec.ts"],
4
- "sourcesContent": ["import { test, expect } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\nimport { apiRequest, getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api';\n\n/**\n * TC-ADMIN-004: Manage Dictionary Entries\n * Source: .ai/qa/scenarios/TC-ADMIN-004-dictionary-management.md\n *\n * Verifies that the dictionaries page loads, shows existing dictionaries\n * with their entries, and allows creating a new dictionary.\n *\n * Navigation: Settings \u2192 Module Configuration \u2192 Dictionaries\n */\ntest.describe('TC-ADMIN-004: Dictionary Management', () => {\n test('should display dictionaries and allow creating a new one', async ({ page, request }) => {\n let token: string | null = null;\n let dictionaryId: string | null = null;\n let dictionaryKey: string | null = null;\n\n try {\n token = await getAuthToken(request);\n await login(page, 'admin');\n await page.goto('/backend/config/dictionaries');\n\n // Verify page heading\n await expect(page.getByRole('heading', { name: 'Dictionaries', level: 2 })).toBeVisible();\n\n // Wait for loading\n await page.getByText('Loading dictionaries').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n // Verify the \"New dictionary\" button is available\n await expect(page.getByRole('button', { name: 'New dictionary' })).toBeVisible();\n\n // The first dictionary should be auto-selected \u2014 verify its details panel\n await expect(page.getByText('Manage reusable values and appearance')).toBeVisible({ timeout: 5_000 });\n await expect(page.getByRole('button', { name: 'Refresh' })).toBeVisible();\n await expect(page.getByRole('button', { name: 'Add entry' })).toBeVisible();\n\n // Verify the entries table columns\n await expect(page.getByRole('columnheader', { name: 'Value' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Label' })).toBeVisible();\n\n // Create a new dictionary\n await page.getByRole('button', { name: 'New dictionary' }).click();\n\n // Verify the dialog appears\n await expect(page.getByRole('heading', { name: 'Create dictionary', level: 2 })).toBeVisible({ timeout: 5_000 });\n\n // Fill in the Key field (slug)\n const timestamp = Date.now();\n const dictKey = `qa_tc_admin_004_${timestamp}`;\n const dictName = `QA TC-ADMIN-004 ${timestamp}`;\n dictionaryKey = dictKey;\n await page.getByRole('textbox', { name: 'slug_name' }).fill(dictKey);\n\n // Fill in the Name field\n await page.getByRole('textbox', { name: 'Display name' }).fill(dictName);\n\n // Submit\n await page.getByRole('button', { name: 'Save' }).click();\n\n // Verify the new dictionary appears in the sidebar list\n await expect(page.getByText(dictName)).toBeVisible({ timeout: 5_000 });\n } finally {\n if (token && dictionaryKey) {\n const listResponse = await apiRequest(request, 'GET', '/api/dictionaries', { token }).catch(() => null);\n if (listResponse && listResponse.ok()) {\n const listData = (await listResponse.json().catch(() => null)) as { items?: Array<{ id?: string; key?: string }> } | null;\n dictionaryId = listData?.items?.find((item) => item.key === dictionaryKey)?.id ?? null;\n }\n }\n if (token && dictionaryId) {\n await apiRequest(request, 'DELETE', `/api/dictionaries/${encodeURIComponent(dictionaryId)}`, { token }).catch(() => {});\n }\n }\n });\n});\n"],
5
- "mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,aAAa;AACtB,SAAS,YAAY,oBAAoB;AAWzC,KAAK,SAAS,uCAAuC,MAAM;AACzD,OAAK,4DAA4D,OAAO,EAAE,MAAM,QAAQ,MAAM;AAC5F,QAAI,QAAuB;AAC3B,QAAI,eAA8B;AAClC,QAAI,gBAA+B;AAEnC,QAAI;AACF,cAAQ,MAAM,aAAa,OAAO;AAClC,YAAM,MAAM,MAAM,OAAO;AACzB,YAAM,KAAK,KAAK,8BAA8B;AAG9C,YAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,gBAAgB,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AAGxF,YAAM,KAAK,UAAU,sBAAsB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAGzG,YAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,iBAAiB,CAAC,CAAC,EAAE,YAAY;AAG/E,YAAM,OAAO,KAAK,UAAU,uCAAuC,CAAC,EAAE,YAAY,EAAE,SAAS,IAAM,CAAC;AACpG,YAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,UAAU,CAAC,CAAC,EAAE,YAAY;AACxE,YAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,YAAY,CAAC,CAAC,EAAE,YAAY;AAG1E,YAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,QAAQ,CAAC,CAAC,EAAE,YAAY;AAC5E,YAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,QAAQ,CAAC,CAAC,EAAE,YAAY;AAG5E,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,iBAAiB,CAAC,EAAE,MAAM;AAGjE,YAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,qBAAqB,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY,EAAE,SAAS,IAAM,CAAC;AAG/G,YAAM,YAAY,KAAK,IAAI;AAC3B,YAAM,UAAU,mBAAmB,SAAS;AAC5C,YAAM,WAAW,mBAAmB,SAAS;AAC7C,sBAAgB;AAChB,YAAM,KAAK,UAAU,WAAW,EAAE,MAAM,YAAY,CAAC,EAAE,KAAK,OAAO;AAGnE,YAAM,KAAK,UAAU,WAAW,EAAE,MAAM,eAAe,CAAC,EAAE,KAAK,QAAQ;AAGvE,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,OAAO,CAAC,EAAE,MAAM;AAGvD,YAAM,OAAO,KAAK,UAAU,QAAQ,CAAC,EAAE,YAAY,EAAE,SAAS,IAAM,CAAC;AAAA,IACvE,UAAE;AACA,UAAI,SAAS,eAAe;AAC1B,cAAM,eAAe,MAAM,WAAW,SAAS,OAAO,qBAAqB,EAAE,MAAM,CAAC,EAAE,MAAM,MAAM,IAAI;AACtG,YAAI,gBAAgB,aAAa,GAAG,GAAG;AACrC,gBAAM,WAAY,MAAM,aAAa,KAAK,EAAE,MAAM,MAAM,IAAI;AAC5D,yBAAe,UAAU,OAAO,KAAK,CAAC,SAAS,KAAK,QAAQ,aAAa,GAAG,MAAM;AAAA,QACpF;AAAA,MACF;AACA,UAAI,SAAS,cAAc;AACzB,cAAM,WAAW,SAAS,UAAU,qBAAqB,mBAAmB,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACxH;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;",
6
- "names": []
7
- }
@@ -1,33 +0,0 @@
1
- import { test, expect } from "@playwright/test";
2
- import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
3
- test.describe("TC-ADMIN-005: Feature Toggles Management", () => {
4
- test("should display feature toggles list and create form for superadmin", async ({ page }) => {
5
- await login(page, "superadmin");
6
- await page.goto("/backend/feature-toggles/global");
7
- await expect(page.getByRole("heading", { name: /Feature Toggles/i })).toBeVisible();
8
- await page.getByText("Loading data...").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
9
- });
10
- await expect(page.getByRole("columnheader", { name: "Category" })).toBeVisible();
11
- await expect(page.getByRole("columnheader", { name: "Identifier" })).toBeVisible();
12
- await expect(page.getByRole("columnheader", { name: "Name" })).toBeVisible();
13
- await expect(page.getByRole("columnheader", { name: "Type" })).toBeVisible();
14
- const createLink = page.getByRole("link", { name: /^Create$/i }).first();
15
- if (await createLink.isVisible().catch(() => false)) {
16
- await createLink.click();
17
- } else {
18
- await page.getByRole("button", { name: /^Create$/i }).first().click();
19
- }
20
- await expect(page).toHaveURL(/\/backend\/feature-toggles\/global\/create(?:\?.*)?$/);
21
- await expect(page.locator("main").getByText("Create Feature Toggle", { exact: true })).toBeVisible();
22
- await expect(page.getByText("Basic Information")).toBeVisible();
23
- await expect(page.getByText("Type Configuration")).toBeVisible();
24
- await expect(page.getByText("Default Value", { exact: true })).toBeVisible();
25
- const textboxes = page.locator("main").getByRole("textbox");
26
- expect(await textboxes.count()).toBeGreaterThanOrEqual(3);
27
- const comboboxes = page.locator("main").getByRole("combobox");
28
- expect(await comboboxes.count()).toBeGreaterThan(0);
29
- await expect(page.getByRole("button", { name: "Save" }).first()).toBeVisible();
30
- await expect(page.getByRole("link", { name: /Back/i }).first()).toBeVisible();
31
- });
32
- });
33
- //# sourceMappingURL=TC-ADMIN-005.spec.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-005.spec.ts"],
4
- "sourcesContent": ["import { test, expect } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\n\n/**\n * TC-ADMIN-005: Feature Toggles Management\n * Source: .ai/qa/scenarios/TC-ADMIN-005-feature-toggle-create.md\n *\n * Verifies that the feature toggles page is accessible to superadmins,\n * displays existing toggles with proper columns, and has a working\n * create form with all expected fields.\n *\n * Navigation: Settings \u2192 Feature Toggles \u2192 Global\n */\ntest.describe('TC-ADMIN-005: Feature Toggles Management', () => {\n test('should display feature toggles list and create form for superadmin', async ({ page }) => {\n await login(page, 'superadmin');\n\n await page.goto('/backend/feature-toggles/global');\n await expect(page.getByRole('heading', { name: /Feature Toggles/i })).toBeVisible();\n await page.getByText('Loading data...').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n await expect(page.getByRole('columnheader', { name: 'Category' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Identifier' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Name' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Type' })).toBeVisible();\n\n const createLink = page.getByRole('link', { name: /^Create$/i }).first();\n if (await createLink.isVisible().catch(() => false)) {\n await createLink.click();\n } else {\n await page.getByRole('button', { name: /^Create$/i }).first().click();\n }\n await expect(page).toHaveURL(/\\/backend\\/feature-toggles\\/global\\/create(?:\\?.*)?$/);\n await expect(page.locator('main').getByText('Create Feature Toggle', { exact: true })).toBeVisible();\n\n await expect(page.getByText('Basic Information')).toBeVisible();\n await expect(page.getByText('Type Configuration')).toBeVisible();\n await expect(page.getByText('Default Value', { exact: true })).toBeVisible();\n\n const textboxes = page.locator('main').getByRole('textbox');\n expect(await textboxes.count()).toBeGreaterThanOrEqual(3);\n\n const comboboxes = page.locator('main').getByRole('combobox');\n expect(await comboboxes.count()).toBeGreaterThan(0);\n\n await expect(page.getByRole('button', { name: 'Save' }).first()).toBeVisible();\n await expect(page.getByRole('link', { name: /Back/i }).first()).toBeVisible();\n });\n});\n"],
5
- "mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,aAAa;AAYtB,KAAK,SAAS,4CAA4C,MAAM;AAC9D,OAAK,sEAAsE,OAAO,EAAE,KAAK,MAAM;AAC7F,UAAM,MAAM,MAAM,YAAY;AAE9B,UAAM,KAAK,KAAK,iCAAiC;AACjD,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,mBAAmB,CAAC,CAAC,EAAE,YAAY;AAClF,UAAM,KAAK,UAAU,iBAAiB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAEpG,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,WAAW,CAAC,CAAC,EAAE,YAAY;AAC/E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,aAAa,CAAC,CAAC,EAAE,YAAY;AACjF,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,YAAY;AAC3E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,YAAY;AAE3E,UAAM,aAAa,KAAK,UAAU,QAAQ,EAAE,MAAM,YAAY,CAAC,EAAE,MAAM;AACvE,QAAI,MAAM,WAAW,UAAU,EAAE,MAAM,MAAM,KAAK,GAAG;AACnD,YAAM,WAAW,MAAM;AAAA,IACzB,OAAO;AACL,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,YAAY,CAAC,EAAE,MAAM,EAAE,MAAM;AAAA,IACtE;AACA,UAAM,OAAO,IAAI,EAAE,UAAU,sDAAsD;AACnF,UAAM,OAAO,KAAK,QAAQ,MAAM,EAAE,UAAU,yBAAyB,EAAE,OAAO,KAAK,CAAC,CAAC,EAAE,YAAY;AAEnG,UAAM,OAAO,KAAK,UAAU,mBAAmB,CAAC,EAAE,YAAY;AAC9D,UAAM,OAAO,KAAK,UAAU,oBAAoB,CAAC,EAAE,YAAY;AAC/D,UAAM,OAAO,KAAK,UAAU,iBAAiB,EAAE,OAAO,KAAK,CAAC,CAAC,EAAE,YAAY;AAE3E,UAAM,YAAY,KAAK,QAAQ,MAAM,EAAE,UAAU,SAAS;AAC1D,WAAO,MAAM,UAAU,MAAM,CAAC,EAAE,uBAAuB,CAAC;AAExD,UAAM,aAAa,KAAK,QAAQ,MAAM,EAAE,UAAU,UAAU;AAC5D,WAAO,MAAM,WAAW,MAAM,CAAC,EAAE,gBAAgB,CAAC;AAElD,UAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,OAAO,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY;AAC7E,UAAM,OAAO,KAAK,UAAU,QAAQ,EAAE,MAAM,QAAQ,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY;AAAA,EAC9E,CAAC;AACH,CAAC;",
6
- "names": []
7
- }
@@ -1,30 +0,0 @@
1
- import { test, expect } from "@playwright/test";
2
- import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
3
- test.describe("TC-ADMIN-006: Feature Toggle Overrides", () => {
4
- test("should display overrides list and allow viewing override details", async ({ page }) => {
5
- await login(page, "superadmin");
6
- await page.goto("/backend/feature-toggles/overrides");
7
- await expect(page.getByRole("heading", { name: "Feature Toggle Overrides", level: 2 })).toBeVisible();
8
- await page.getByText("Loading data...").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
9
- });
10
- await expect(page.getByRole("columnheader", { name: "Tenant" })).toBeVisible();
11
- await expect(page.getByRole("columnheader", { name: "Identifier" })).toBeVisible();
12
- await expect(page.getByRole("columnheader", { name: "Name" })).toBeVisible();
13
- await expect(page.getByRole("columnheader", { name: "Category" })).toBeVisible();
14
- await expect(page.getByRole("columnheader", { name: "Override State" })).toBeVisible();
15
- await expect(page.getByRole("button", { name: "Refresh" })).toBeVisible();
16
- const rows = page.locator("table tbody tr");
17
- await expect(rows.first()).toBeVisible();
18
- await rows.first().click();
19
- await expect(page.getByRole("heading", { name: "Details", level: 2 })).toBeVisible();
20
- await expect(page.getByRole("heading", { name: "Description", level: 2 })).toBeVisible();
21
- await expect(page.getByRole("heading", { name: "Default Value", level: 2 })).toBeVisible();
22
- await expect(page.getByText("Override", { exact: true })).toBeVisible();
23
- await expect(page.getByText("Override Mode")).toBeVisible();
24
- await expect(page.getByRole("checkbox", { name: "Enable Override" })).toBeVisible();
25
- await expect(page.getByRole("button", { name: "Save Override" })).toBeVisible();
26
- await expect(page.getByText("Name")).toBeVisible();
27
- await expect(page.getByText("Identifier")).toBeVisible();
28
- });
29
- });
30
- //# sourceMappingURL=TC-ADMIN-006.spec.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-006.spec.ts"],
4
- "sourcesContent": ["import { test, expect } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\n\n/**\n * TC-ADMIN-006: Feature Toggle Overrides\n * Source: .ai/qa/scenarios/TC-ADMIN-006-feature-toggle-override.md\n *\n * Verifies that the feature toggle overrides page displays per-tenant\n * overrides with proper columns, and that clicking an override shows\n * the detail view with enable/disable controls.\n *\n * Navigation: Settings \u2192 Feature Toggles \u2192 Overrides\n */\ntest.describe('TC-ADMIN-006: Feature Toggle Overrides', () => {\n test('should display overrides list and allow viewing override details', async ({ page }) => {\n await login(page, 'superadmin');\n\n // Navigate to overrides page\n await page.goto('/backend/feature-toggles/overrides');\n await expect(page.getByRole('heading', { name: 'Feature Toggle Overrides', level: 2 })).toBeVisible();\n await page.getByText('Loading data...').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n // Verify table columns\n await expect(page.getByRole('columnheader', { name: 'Tenant' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Identifier' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Name' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Category' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Override State' })).toBeVisible();\n\n // Verify Refresh button\n await expect(page.getByRole('button', { name: 'Refresh' })).toBeVisible();\n\n // Verify at least one override row exists\n const rows = page.locator('table tbody tr');\n await expect(rows.first()).toBeVisible();\n\n // Click the first override row to see detail view\n await rows.first().click();\n\n // Verify detail page loads with expected sections\n await expect(page.getByRole('heading', { name: 'Details', level: 2 })).toBeVisible();\n await expect(page.getByRole('heading', { name: 'Description', level: 2 })).toBeVisible();\n await expect(page.getByRole('heading', { name: 'Default Value', level: 2 })).toBeVisible();\n\n // Verify override section\n await expect(page.getByText('Override', { exact: true })).toBeVisible();\n await expect(page.getByText('Override Mode')).toBeVisible();\n\n // Verify Enable Override checkbox\n await expect(page.getByRole('checkbox', { name: 'Enable Override' })).toBeVisible();\n\n // Verify Save Override button\n await expect(page.getByRole('button', { name: 'Save Override' })).toBeVisible();\n\n // Verify toggle detail fields\n await expect(page.getByText('Name')).toBeVisible();\n await expect(page.getByText('Identifier')).toBeVisible();\n });\n});\n"],
5
- "mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,aAAa;AAYtB,KAAK,SAAS,0CAA0C,MAAM;AAC5D,OAAK,oEAAoE,OAAO,EAAE,KAAK,MAAM;AAC3F,UAAM,MAAM,MAAM,YAAY;AAG9B,UAAM,KAAK,KAAK,oCAAoC;AACpD,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,4BAA4B,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AACpG,UAAM,KAAK,UAAU,iBAAiB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAGpG,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAC7E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,aAAa,CAAC,CAAC,EAAE,YAAY;AACjF,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,YAAY;AAC3E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,WAAW,CAAC,CAAC,EAAE,YAAY;AAC/E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,iBAAiB,CAAC,CAAC,EAAE,YAAY;AAGrF,UAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,UAAU,CAAC,CAAC,EAAE,YAAY;AAGxE,UAAM,OAAO,KAAK,QAAQ,gBAAgB;AAC1C,UAAM,OAAO,KAAK,MAAM,CAAC,EAAE,YAAY;AAGvC,UAAM,KAAK,MAAM,EAAE,MAAM;AAGzB,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,WAAW,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AACnF,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,eAAe,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AACvF,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,iBAAiB,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AAGzF,UAAM,OAAO,KAAK,UAAU,YAAY,EAAE,OAAO,KAAK,CAAC,CAAC,EAAE,YAAY;AACtE,UAAM,OAAO,KAAK,UAAU,eAAe,CAAC,EAAE,YAAY;AAG1D,UAAM,OAAO,KAAK,UAAU,YAAY,EAAE,MAAM,kBAAkB,CAAC,CAAC,EAAE,YAAY;AAGlF,UAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,gBAAgB,CAAC,CAAC,EAAE,YAAY;AAG9E,UAAM,OAAO,KAAK,UAAU,MAAM,CAAC,EAAE,YAAY;AACjD,UAAM,OAAO,KAAK,UAAU,YAAY,CAAC,EAAE,YAAY;AAAA,EACzD,CAAC;AACH,CAAC;",
6
- "names": []
7
- }
@@ -1,36 +0,0 @@
1
- import { test, expect } from "@playwright/test";
2
- import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
3
- test.describe("TC-ADMIN-007: Custom Entity Creation", () => {
4
- test("should display user entities list and create form", async ({ page }) => {
5
- await login(page, "superadmin");
6
- await page.goto("/backend/entities/user");
7
- await expect(page.getByRole("heading", { name: "User Entities", level: 2 })).toBeVisible();
8
- await page.getByText("Loading data...").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
9
- });
10
- await expect(page.getByRole("columnheader", { name: /Entity/ })).toBeVisible();
11
- await expect(page.getByRole("columnheader", { name: "Label" })).toBeVisible();
12
- await expect(page.getByRole("columnheader", { name: "Source" })).toBeVisible();
13
- await expect(page.getByRole("columnheader", { name: "Fields" })).toBeVisible();
14
- await expect(page.getByRole("columnheader", { name: "In Sidebar" })).toBeVisible();
15
- const rows = page.locator("table tbody tr");
16
- await expect(rows.first()).toBeVisible();
17
- await expect(page.getByRole("button", { name: "Export" })).toBeVisible();
18
- await expect(page.getByRole("link", { name: "Create" })).toBeVisible();
19
- await expect(page.getByRole("textbox", { name: "Search" })).toBeVisible();
20
- await page.getByRole("link", { name: "Create" }).click();
21
- await expect(page).toHaveURL(/\/backend\/entities\/user\/create$/);
22
- await expect(page.getByText("Create Entity")).toBeVisible();
23
- await expect(page.getByText("Entity ID", { exact: false })).toBeVisible();
24
- await expect(page.getByText("Label", { exact: false })).toBeVisible();
25
- await expect(page.getByText("Description")).toBeVisible();
26
- const entityIdField = page.getByRole("textbox", { name: "module_name:entity_id" });
27
- await expect(entityIdField).toBeVisible();
28
- await expect(entityIdField).toHaveValue("user:your_entity");
29
- await expect(page.locator("main").getByRole("combobox")).toBeVisible();
30
- await expect(page.getByRole("checkbox", { name: "Show in sidebar" })).toBeVisible();
31
- await expect(page.getByRole("button", { name: "Create" }).first()).toBeVisible();
32
- await expect(page.getByRole("link", { name: "Cancel" }).first()).toBeVisible();
33
- await expect(page.getByRole("link", { name: "\u2190 Back" })).toBeVisible();
34
- });
35
- });
36
- //# sourceMappingURL=TC-ADMIN-007.spec.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-007.spec.ts"],
4
- "sourcesContent": ["import { test, expect } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\n\n/**\n * TC-ADMIN-007: Custom Entity Creation\n * Source: .ai/qa/scenarios/TC-ADMIN-007-custom-entity-creation.md\n *\n * Verifies that the User Entities page displays existing entities,\n * and that the create form has all expected fields.\n *\n * Navigation: Settings \u2192 Data Designer \u2192 User Entities\n */\ntest.describe('TC-ADMIN-007: Custom Entity Creation', () => {\n test('should display user entities list and create form', async ({ page }) => {\n await login(page, 'superadmin');\n\n // Navigate to User Entities\n await page.goto('/backend/entities/user');\n await expect(page.getByRole('heading', { name: 'User Entities', level: 2 })).toBeVisible();\n await page.getByText('Loading data...').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n // Verify table columns\n await expect(page.getByRole('columnheader', { name: /Entity/ })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Label' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Source' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'Fields' })).toBeVisible();\n await expect(page.getByRole('columnheader', { name: 'In Sidebar' })).toBeVisible();\n\n // Verify at least one entity row exists\n const rows = page.locator('table tbody tr');\n await expect(rows.first()).toBeVisible();\n\n // Verify Export and Create buttons\n await expect(page.getByRole('button', { name: 'Export' })).toBeVisible();\n await expect(page.getByRole('link', { name: 'Create' })).toBeVisible();\n\n // Verify Search box\n await expect(page.getByRole('textbox', { name: 'Search' })).toBeVisible();\n\n // Navigate to Create form\n await page.getByRole('link', { name: 'Create' }).click();\n await expect(page).toHaveURL(/\\/backend\\/entities\\/user\\/create$/);\n await expect(page.getByText('Create Entity')).toBeVisible();\n\n // Verify form fields\n await expect(page.getByText('Entity ID', { exact: false })).toBeVisible();\n await expect(page.getByText('Label', { exact: false })).toBeVisible();\n await expect(page.getByText('Description')).toBeVisible();\n\n // Verify Entity ID default placeholder value\n const entityIdField = page.getByRole('textbox', { name: 'module_name:entity_id' });\n await expect(entityIdField).toBeVisible();\n await expect(entityIdField).toHaveValue('user:your_entity');\n\n // Verify Default Editor combobox\n await expect(page.locator('main').getByRole('combobox')).toBeVisible();\n\n // Verify Show in sidebar checkbox\n await expect(page.getByRole('checkbox', { name: 'Show in sidebar' })).toBeVisible();\n\n // Verify Create and Cancel buttons\n await expect(page.getByRole('button', { name: 'Create' }).first()).toBeVisible();\n await expect(page.getByRole('link', { name: 'Cancel' }).first()).toBeVisible();\n\n // Verify Back link\n await expect(page.getByRole('link', { name: '\u2190 Back' })).toBeVisible();\n });\n});\n"],
5
- "mappings": "AAAA,SAAS,MAAM,cAAc;AAC7B,SAAS,aAAa;AAWtB,KAAK,SAAS,wCAAwC,MAAM;AAC1D,OAAK,qDAAqD,OAAO,EAAE,KAAK,MAAM;AAC5E,UAAM,MAAM,MAAM,YAAY;AAG9B,UAAM,KAAK,KAAK,wBAAwB;AACxC,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,iBAAiB,OAAO,EAAE,CAAC,CAAC,EAAE,YAAY;AACzF,UAAM,KAAK,UAAU,iBAAiB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,IAAC,CAAC;AAGpG,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAC7E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,QAAQ,CAAC,CAAC,EAAE,YAAY;AAC5E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAC7E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAC7E,UAAM,OAAO,KAAK,UAAU,gBAAgB,EAAE,MAAM,aAAa,CAAC,CAAC,EAAE,YAAY;AAGjF,UAAM,OAAO,KAAK,QAAQ,gBAAgB;AAC1C,UAAM,OAAO,KAAK,MAAM,CAAC,EAAE,YAAY;AAGvC,UAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AACvE,UAAM,OAAO,KAAK,UAAU,QAAQ,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAGrE,UAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,SAAS,CAAC,CAAC,EAAE,YAAY;AAGxE,UAAM,KAAK,UAAU,QAAQ,EAAE,MAAM,SAAS,CAAC,EAAE,MAAM;AACvD,UAAM,OAAO,IAAI,EAAE,UAAU,oCAAoC;AACjE,UAAM,OAAO,KAAK,UAAU,eAAe,CAAC,EAAE,YAAY;AAG1D,UAAM,OAAO,KAAK,UAAU,aAAa,EAAE,OAAO,MAAM,CAAC,CAAC,EAAE,YAAY;AACxE,UAAM,OAAO,KAAK,UAAU,SAAS,EAAE,OAAO,MAAM,CAAC,CAAC,EAAE,YAAY;AACpE,UAAM,OAAO,KAAK,UAAU,aAAa,CAAC,EAAE,YAAY;AAGxD,UAAM,gBAAgB,KAAK,UAAU,WAAW,EAAE,MAAM,wBAAwB,CAAC;AACjF,UAAM,OAAO,aAAa,EAAE,YAAY;AACxC,UAAM,OAAO,aAAa,EAAE,YAAY,kBAAkB;AAG1D,UAAM,OAAO,KAAK,QAAQ,MAAM,EAAE,UAAU,UAAU,CAAC,EAAE,YAAY;AAGrE,UAAM,OAAO,KAAK,UAAU,YAAY,EAAE,MAAM,kBAAkB,CAAC,CAAC,EAAE,YAAY;AAGlF,UAAM,OAAO,KAAK,UAAU,UAAU,EAAE,MAAM,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY;AAC/E,UAAM,OAAO,KAAK,UAAU,QAAQ,EAAE,MAAM,SAAS,CAAC,EAAE,MAAM,CAAC,EAAE,YAAY;AAG7E,UAAM,OAAO,KAAK,UAAU,QAAQ,EAAE,MAAM,cAAS,CAAC,CAAC,EAAE,YAAY;AAAA,EACvE,CAAC;AACH,CAAC;",
6
- "names": []
7
- }
@@ -1,113 +0,0 @@
1
- import { expect, test } from "@playwright/test";
2
- import { login } from "@open-mercato/core/modules/core/__integration__/helpers/auth";
3
- import { apiRequest, getAuthToken } from "@open-mercato/core/modules/core/__integration__/helpers/api";
4
- function escapeRegExp(value) {
5
- return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
6
- }
7
- test.describe("TC-ADMIN-008: Create Custom Entity Record", () => {
8
- test("should create and edit a record for a custom entity", async ({ page, request }) => {
9
- const stamp = Date.now();
10
- const entityId = `user:qa_admin_008_${stamp}`;
11
- const location = `QA Location ${stamp}`;
12
- const title = `QA Title ${stamp}`;
13
- const updatedTitle = `${title} Updated`;
14
- let token = null;
15
- let recordId = null;
16
- const fillField = async (label, fallbackIndex, value) => {
17
- const namedInput = page.getByRole("textbox", { name: new RegExp(`^${escapeRegExp(label)}$`, "i") }).first();
18
- if (await namedInput.count() > 0) {
19
- await namedInput.fill(value);
20
- return;
21
- }
22
- const textboxes = page.locator("main").getByRole("textbox");
23
- await expect(textboxes.nth(fallbackIndex)).toBeVisible();
24
- await textboxes.nth(fallbackIndex).fill(value);
25
- };
26
- try {
27
- token = await getAuthToken(request, "superadmin");
28
- const entityCreateResponse = await apiRequest(request, "POST", "/api/entities/entities", {
29
- token,
30
- data: {
31
- entityId,
32
- label: `QA Admin 008 ${stamp}`,
33
- description: "Temporary QA entity",
34
- showInSidebar: false
35
- }
36
- });
37
- expect(entityCreateResponse.ok()).toBeTruthy();
38
- const fieldDefinitions = [
39
- { key: "location", label: "Location" },
40
- { key: "title", label: "Title" },
41
- { key: "event_date", label: "Event Date" }
42
- ];
43
- for (const field of fieldDefinitions) {
44
- const definitionResponse = await apiRequest(request, "POST", "/api/entities/definitions", {
45
- token,
46
- data: {
47
- entityId,
48
- key: field.key,
49
- kind: "text",
50
- configJson: {
51
- label: field.label,
52
- priority: 10
53
- }
54
- }
55
- });
56
- expect(definitionResponse.ok()).toBeTruthy();
57
- }
58
- await login(page, "superadmin");
59
- await page.goto(`/backend/entities/user/${encodeURIComponent(entityId)}/records`);
60
- await page.getByText("Loading data...").waitFor({ state: "hidden", timeout: 1e4 }).catch(() => {
61
- });
62
- await expect(page.getByRole("heading", { name: new RegExp(`Records:\\s*${entityId}`, "i") })).toBeVisible();
63
- await page.getByRole("link", { name: "Create" }).click();
64
- await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records/create$`, "i"));
65
- await fillField("Location", 0, location);
66
- await fillField("Title", 1, title);
67
- await fillField("Event Date", 2, "2026-02-14");
68
- await page.getByRole("button", { name: "Save" }).first().click();
69
- await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records$`, "i"));
70
- await expect(page.getByRole("row", { name: new RegExp(location, "i") })).toBeVisible();
71
- await page.getByRole("row", { name: new RegExp(location, "i") }).click();
72
- await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records/[^/]+$`, "i"));
73
- recordId = page.url().match(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records/([^/?#]+)$`, "i"))?.[1] ?? null;
74
- await fillField("Title", 1, updatedTitle);
75
- await page.getByRole("button", { name: "Save" }).first().click();
76
- await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records$`, "i"));
77
- await expect(page.getByRole("row", { name: new RegExp(updatedTitle, "i") })).toBeVisible();
78
- } finally {
79
- if (token && recordId) {
80
- await apiRequest(
81
- request,
82
- "DELETE",
83
- `/api/entities/records?entityId=${encodeURIComponent(entityId)}&recordId=${encodeURIComponent(recordId)}`,
84
- { token }
85
- ).catch(() => {
86
- });
87
- }
88
- if (token) {
89
- await apiRequest(request, "DELETE", "/api/entities/definitions", {
90
- token,
91
- data: { entityId, key: "event_date" }
92
- }).catch(() => {
93
- });
94
- await apiRequest(request, "DELETE", "/api/entities/definitions", {
95
- token,
96
- data: { entityId, key: "title" }
97
- }).catch(() => {
98
- });
99
- await apiRequest(request, "DELETE", "/api/entities/definitions", {
100
- token,
101
- data: { entityId, key: "location" }
102
- }).catch(() => {
103
- });
104
- await apiRequest(request, "DELETE", "/api/entities/entities", {
105
- token,
106
- data: { entityId }
107
- }).catch(() => {
108
- });
109
- }
110
- }
111
- });
112
- });
113
- //# sourceMappingURL=TC-ADMIN-008.spec.js.map
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../../../../src/modules/core/__integration__/admin/TC-ADMIN-008.spec.ts"],
4
- "sourcesContent": ["import { expect, test } from '@playwright/test';\nimport { login } from '@open-mercato/core/modules/core/__integration__/helpers/auth';\nimport { apiRequest, getAuthToken } from '@open-mercato/core/modules/core/__integration__/helpers/api';\n\nfunction escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\n/**\n * TC-ADMIN-008: Create Custom Entity Record\n * Source: .ai/qa/scenarios/TC-ADMIN-008-custom-entity-record.md\n */\ntest.describe('TC-ADMIN-008: Create Custom Entity Record', () => {\n test('should create and edit a record for a custom entity', async ({ page, request }) => {\n const stamp = Date.now();\n const entityId = `user:qa_admin_008_${stamp}`;\n const location = `QA Location ${stamp}`;\n const title = `QA Title ${stamp}`;\n const updatedTitle = `${title} Updated`;\n let token: string | null = null;\n let recordId: string | null = null;\n\n const fillField = async (label: string, fallbackIndex: number, value: string): Promise<void> => {\n const namedInput = page\n .getByRole('textbox', { name: new RegExp(`^${escapeRegExp(label)}$`, 'i') })\n .first();\n if ((await namedInput.count()) > 0) {\n await namedInput.fill(value);\n return;\n }\n\n const textboxes = page.locator('main').getByRole('textbox');\n await expect(textboxes.nth(fallbackIndex)).toBeVisible();\n await textboxes.nth(fallbackIndex).fill(value);\n };\n\n try {\n token = await getAuthToken(request, 'superadmin');\n const entityCreateResponse = await apiRequest(request, 'POST', '/api/entities/entities', {\n token,\n data: {\n entityId,\n label: `QA Admin 008 ${stamp}`,\n description: 'Temporary QA entity',\n showInSidebar: false,\n },\n });\n expect(entityCreateResponse.ok()).toBeTruthy();\n\n const fieldDefinitions = [\n { key: 'location', label: 'Location' },\n { key: 'title', label: 'Title' },\n { key: 'event_date', label: 'Event Date' },\n ];\n for (const field of fieldDefinitions) {\n const definitionResponse = await apiRequest(request, 'POST', '/api/entities/definitions', {\n token,\n data: {\n entityId,\n key: field.key,\n kind: 'text',\n configJson: {\n label: field.label,\n priority: 10,\n },\n },\n });\n expect(definitionResponse.ok()).toBeTruthy();\n }\n\n await login(page, 'superadmin');\n await page.goto(`/backend/entities/user/${encodeURIComponent(entityId)}/records`);\n await page.getByText('Loading data...').waitFor({ state: 'hidden', timeout: 10_000 }).catch(() => {});\n\n await expect(page.getByRole('heading', { name: new RegExp(`Records:\\\\s*${entityId}`, 'i') })).toBeVisible();\n await page.getByRole('link', { name: 'Create' }).click();\n\n await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records/create$`, 'i'));\n await fillField('Location', 0, location);\n await fillField('Title', 1, title);\n await fillField('Event Date', 2, '2026-02-14');\n await page.getByRole('button', { name: 'Save' }).first().click();\n\n await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records$`, 'i'));\n await expect(page.getByRole('row', { name: new RegExp(location, 'i') })).toBeVisible();\n\n await page.getByRole('row', { name: new RegExp(location, 'i') }).click();\n await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records/[^/]+$`, 'i'));\n recordId =\n page.url().match(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records/([^/?#]+)$`, 'i'))?.[1] ??\n null;\n\n await fillField('Title', 1, updatedTitle);\n await page.getByRole('button', { name: 'Save' }).first().click();\n\n await expect(page).toHaveURL(new RegExp(`/backend/entities/user/${encodeURIComponent(entityId)}/records$`, 'i'));\n await expect(page.getByRole('row', { name: new RegExp(updatedTitle, 'i') })).toBeVisible();\n } finally {\n if (token && recordId) {\n await apiRequest(\n request,\n 'DELETE',\n `/api/entities/records?entityId=${encodeURIComponent(entityId)}&recordId=${encodeURIComponent(recordId)}`,\n { token },\n ).catch(() => {});\n }\n if (token) {\n await apiRequest(request, 'DELETE', '/api/entities/definitions', {\n token,\n data: { entityId, key: 'event_date' },\n }).catch(() => {});\n await apiRequest(request, 'DELETE', '/api/entities/definitions', {\n token,\n data: { entityId, key: 'title' },\n }).catch(() => {});\n await apiRequest(request, 'DELETE', '/api/entities/definitions', {\n token,\n data: { entityId, key: 'location' },\n }).catch(() => {});\n await apiRequest(request, 'DELETE', '/api/entities/entities', {\n token,\n data: { entityId },\n }).catch(() => {});\n }\n }\n });\n});\n"],
5
- "mappings": "AAAA,SAAS,QAAQ,YAAY;AAC7B,SAAS,aAAa;AACtB,SAAS,YAAY,oBAAoB;AAEzC,SAAS,aAAa,OAAuB;AAC3C,SAAO,MAAM,QAAQ,uBAAuB,MAAM;AACpD;AAMA,KAAK,SAAS,6CAA6C,MAAM;AAC/D,OAAK,uDAAuD,OAAO,EAAE,MAAM,QAAQ,MAAM;AACvF,UAAM,QAAQ,KAAK,IAAI;AACvB,UAAM,WAAW,qBAAqB,KAAK;AAC3C,UAAM,WAAW,eAAe,KAAK;AACrC,UAAM,QAAQ,YAAY,KAAK;AAC/B,UAAM,eAAe,GAAG,KAAK;AAC7B,QAAI,QAAuB;AAC3B,QAAI,WAA0B;AAE9B,UAAM,YAAY,OAAO,OAAe,eAAuB,UAAiC;AAC9F,YAAM,aAAa,KAChB,UAAU,WAAW,EAAE,MAAM,IAAI,OAAO,IAAI,aAAa,KAAK,CAAC,KAAK,GAAG,EAAE,CAAC,EAC1E,MAAM;AACT,UAAK,MAAM,WAAW,MAAM,IAAK,GAAG;AAClC,cAAM,WAAW,KAAK,KAAK;AAC3B;AAAA,MACF;AAEA,YAAM,YAAY,KAAK,QAAQ,MAAM,EAAE,UAAU,SAAS;AAC1D,YAAM,OAAO,UAAU,IAAI,aAAa,CAAC,EAAE,YAAY;AACvD,YAAM,UAAU,IAAI,aAAa,EAAE,KAAK,KAAK;AAAA,IAC/C;AAEA,QAAI;AACF,cAAQ,MAAM,aAAa,SAAS,YAAY;AAChD,YAAM,uBAAuB,MAAM,WAAW,SAAS,QAAQ,0BAA0B;AAAA,QACvF;AAAA,QACA,MAAM;AAAA,UACJ;AAAA,UACA,OAAO,gBAAgB,KAAK;AAAA,UAC5B,aAAa;AAAA,UACb,eAAe;AAAA,QACjB;AAAA,MACF,CAAC;AACD,aAAO,qBAAqB,GAAG,CAAC,EAAE,WAAW;AAE7C,YAAM,mBAAmB;AAAA,QACvB,EAAE,KAAK,YAAY,OAAO,WAAW;AAAA,QACrC,EAAE,KAAK,SAAS,OAAO,QAAQ;AAAA,QAC/B,EAAE,KAAK,cAAc,OAAO,aAAa;AAAA,MAC3C;AACA,iBAAW,SAAS,kBAAkB;AACpC,cAAM,qBAAqB,MAAM,WAAW,SAAS,QAAQ,6BAA6B;AAAA,UACxF;AAAA,UACA,MAAM;AAAA,YACJ;AAAA,YACA,KAAK,MAAM;AAAA,YACX,MAAM;AAAA,YACN,YAAY;AAAA,cACV,OAAO,MAAM;AAAA,cACb,UAAU;AAAA,YACZ;AAAA,UACF;AAAA,QACF,CAAC;AACD,eAAO,mBAAmB,GAAG,CAAC,EAAE,WAAW;AAAA,MAC7C;AAEA,YAAM,MAAM,MAAM,YAAY;AAC9B,YAAM,KAAK,KAAK,0BAA0B,mBAAmB,QAAQ,CAAC,UAAU;AAChF,YAAM,KAAK,UAAU,iBAAiB,EAAE,QAAQ,EAAE,OAAO,UAAU,SAAS,IAAO,CAAC,EAAE,MAAM,MAAM;AAAA,MAAC,CAAC;AAEpG,YAAM,OAAO,KAAK,UAAU,WAAW,EAAE,MAAM,IAAI,OAAO,eAAe,QAAQ,IAAI,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY;AAC1G,YAAM,KAAK,UAAU,QAAQ,EAAE,MAAM,SAAS,CAAC,EAAE,MAAM;AAEvD,YAAM,OAAO,IAAI,EAAE,UAAU,IAAI,OAAO,0BAA0B,mBAAmB,QAAQ,CAAC,oBAAoB,GAAG,CAAC;AACtH,YAAM,UAAU,YAAY,GAAG,QAAQ;AACvC,YAAM,UAAU,SAAS,GAAG,KAAK;AACjC,YAAM,UAAU,cAAc,GAAG,YAAY;AAC7C,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM;AAE/D,YAAM,OAAO,IAAI,EAAE,UAAU,IAAI,OAAO,0BAA0B,mBAAmB,QAAQ,CAAC,aAAa,GAAG,CAAC;AAC/G,YAAM,OAAO,KAAK,UAAU,OAAO,EAAE,MAAM,IAAI,OAAO,UAAU,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY;AAErF,YAAM,KAAK,UAAU,OAAO,EAAE,MAAM,IAAI,OAAO,UAAU,GAAG,EAAE,CAAC,EAAE,MAAM;AACvE,YAAM,OAAO,IAAI,EAAE,UAAU,IAAI,OAAO,0BAA0B,mBAAmB,QAAQ,CAAC,mBAAmB,GAAG,CAAC;AACrH,iBACE,KAAK,IAAI,EAAE,MAAM,IAAI,OAAO,0BAA0B,mBAAmB,QAAQ,CAAC,uBAAuB,GAAG,CAAC,IAAI,CAAC,KAClH;AAEF,YAAM,UAAU,SAAS,GAAG,YAAY;AACxC,YAAM,KAAK,UAAU,UAAU,EAAE,MAAM,OAAO,CAAC,EAAE,MAAM,EAAE,MAAM;AAE/D,YAAM,OAAO,IAAI,EAAE,UAAU,IAAI,OAAO,0BAA0B,mBAAmB,QAAQ,CAAC,aAAa,GAAG,CAAC;AAC/G,YAAM,OAAO,KAAK,UAAU,OAAO,EAAE,MAAM,IAAI,OAAO,cAAc,GAAG,EAAE,CAAC,CAAC,EAAE,YAAY;AAAA,IAC3F,UAAE;AACA,UAAI,SAAS,UAAU;AACrB,cAAM;AAAA,UACJ;AAAA,UACA;AAAA,UACA,kCAAkC,mBAAmB,QAAQ,CAAC,aAAa,mBAAmB,QAAQ,CAAC;AAAA,UACvG,EAAE,MAAM;AAAA,QACV,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MAClB;AACA,UAAI,OAAO;AACT,cAAM,WAAW,SAAS,UAAU,6BAA6B;AAAA,UAC/D;AAAA,UACA,MAAM,EAAE,UAAU,KAAK,aAAa;AAAA,QACtC,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACjB,cAAM,WAAW,SAAS,UAAU,6BAA6B;AAAA,UAC/D;AAAA,UACA,MAAM,EAAE,UAAU,KAAK,QAAQ;AAAA,QACjC,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACjB,cAAM,WAAW,SAAS,UAAU,6BAA6B;AAAA,UAC/D;AAAA,UACA,MAAM,EAAE,UAAU,KAAK,WAAW;AAAA,QACpC,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AACjB,cAAM,WAAW,SAAS,UAAU,0BAA0B;AAAA,UAC5D;AAAA,UACA,MAAM,EAAE,SAAS;AAAA,QACnB,CAAC,EAAE,MAAM,MAAM;AAAA,QAAC,CAAC;AAAA,MACnB;AAAA,IACF;AAAA,EACF,CAAC;AACH,CAAC;",
6
- "names": []
7
- }