@nextsparkjs/theme-default 0.1.0-beta.1 → 0.1.0-beta.101

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 (330) hide show
  1. package/LICENSE +21 -0
  2. package/api/ai/chat/stream/route.ts +4 -1
  3. package/api/ai/orchestrator/route.ts +10 -3
  4. package/api/ai/single-agent/route.ts +10 -3
  5. package/api/ai/usage/route.ts +4 -1
  6. package/blocks/benefits/component.tsx +4 -4
  7. package/blocks/cta-section/component.tsx +4 -4
  8. package/blocks/faq-accordion/component.tsx +2 -2
  9. package/blocks/features-grid/component.tsx +5 -5
  10. package/blocks/hero/component.tsx +2 -2
  11. package/blocks/hero/fields.ts +1 -1
  12. package/blocks/hero-with-form/component.tsx +7 -7
  13. package/blocks/hero-with-form/fields.ts +1 -1
  14. package/blocks/jumbotron/component.tsx +7 -7
  15. package/blocks/jumbotron/fields.ts +1 -1
  16. package/blocks/logo-cloud/component.tsx +6 -6
  17. package/blocks/logo-cloud/fields.ts +1 -1
  18. package/blocks/post-content/component.tsx +2 -2
  19. package/blocks/pricing-table/component.tsx +5 -5
  20. package/blocks/split-content/component.tsx +5 -5
  21. package/blocks/split-content/fields.ts +1 -1
  22. package/blocks/stats-counter/component.tsx +9 -9
  23. package/blocks/testimonials/component.tsx +4 -4
  24. package/blocks/testimonials/fields.ts +1 -1
  25. package/blocks/text-content/component.tsx +12 -10
  26. package/blocks/timeline/component.tsx +12 -12
  27. package/blocks/video-hero/component.tsx +7 -7
  28. package/blocks/video-hero/fields.ts +1 -1
  29. package/components/ai-chat/ChatPanel.tsx +7 -7
  30. package/components/ai-chat/Message.tsx +2 -2
  31. package/components/ai-chat/MessageInput.tsx +3 -3
  32. package/components/ai-chat/MessageList.tsx +3 -3
  33. package/components/ai-chat/TypingIndicator.tsx +2 -2
  34. package/config/app.config.ts +75 -62
  35. package/config/dashboard.config.ts +14 -0
  36. package/config/features.config.ts +10 -0
  37. package/config/permissions.config.ts +26 -1
  38. package/docs/{01-overview → public/01-overview}/01-introduction.md +5 -0
  39. package/docs/{01-overview → public/01-overview}/02-customization.md +5 -0
  40. package/docs/{02-features → public/02-features}/03-tasks-entity.md +5 -0
  41. package/docs/{03-ai → public/03-ai}/01-overview.md +5 -0
  42. package/docs/{03-ai → public/03-ai}/02-customization.md +5 -0
  43. package/docs/superadmin/01-setup/01-configuration.md +79 -0
  44. package/docs/superadmin/01-setup/02-deployment.md +82 -0
  45. package/docs/superadmin/02-management/01-users.md +83 -0
  46. package/docs/superadmin/03-integrations/01-langchain.md +139 -0
  47. package/entities/customers/api/docs.md +107 -0
  48. package/entities/customers/api/presets.ts +80 -0
  49. package/entities/pages/api/docs.md +114 -0
  50. package/entities/pages/api/presets.ts +72 -0
  51. package/entities/posts/api/docs.md +120 -0
  52. package/entities/posts/api/presets.ts +74 -0
  53. package/entities/tasks/api/docs.md +126 -0
  54. package/entities/tasks/api/presets.ts +84 -0
  55. package/lib/selectors.ts +7 -4
  56. package/messages/de/admin.json +45 -0
  57. package/messages/en/admin.json +56 -0
  58. package/messages/en/navigation.json +2 -1
  59. package/messages/es/admin.json +56 -0
  60. package/messages/es/navigation.json +2 -1
  61. package/messages/fr/admin.json +45 -0
  62. package/messages/it/admin.json +45 -0
  63. package/messages/pt/admin.json +45 -0
  64. package/migrations/090_demo_users_teams.sql +11 -11
  65. package/migrations/091_greek_teams_billing.sql +15 -15
  66. package/migrations/093_pages_sample_data.sql +7 -7
  67. package/migrations/098_patterns_sample_data.sql +234 -0
  68. package/package.json +8 -3
  69. package/styles/globals.css +42 -0
  70. package/templates/(public)/blog/[slug]/page.tsx +1 -1
  71. package/templates/(public)/page.tsx +1 -1
  72. package/tests/cypress/e2e/_utils/devtools/access.bdd.md +262 -0
  73. package/tests/cypress/e2e/_utils/devtools/access.cy.ts +171 -0
  74. package/tests/cypress/e2e/_utils/devtools/navigation.bdd.md +261 -0
  75. package/tests/cypress/e2e/_utils/devtools/navigation.cy.ts +157 -0
  76. package/tests/cypress/e2e/_utils/devtools/pages.bdd.md +303 -0
  77. package/tests/cypress/e2e/_utils/devtools/pages.cy.ts +184 -0
  78. package/tests/cypress/e2e/_utils/docs/README.md +215 -0
  79. package/tests/cypress/e2e/_utils/selectors/auth.bdd.md +354 -0
  80. package/tests/cypress/e2e/_utils/selectors/auth.cy.ts +310 -0
  81. package/tests/cypress/e2e/_utils/selectors/billing.bdd.md +276 -0
  82. package/tests/cypress/e2e/_utils/selectors/billing.cy.ts +182 -0
  83. package/tests/cypress/e2e/_utils/selectors/block-editor.bdd.md +615 -0
  84. package/tests/cypress/e2e/_utils/selectors/block-editor.cy.ts +783 -0
  85. package/tests/cypress/e2e/_utils/selectors/dashboard-container.cy.ts +52 -0
  86. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.bdd.md +205 -0
  87. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.cy.ts +137 -0
  88. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.bdd.md +147 -0
  89. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.cy.ts +114 -0
  90. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.bdd.md +76 -0
  91. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.cy.ts +68 -0
  92. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.bdd.md +326 -0
  93. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.cy.ts +177 -0
  94. package/tests/cypress/e2e/_utils/selectors/devtools.bdd.md +306 -0
  95. package/tests/cypress/e2e/_utils/selectors/devtools.cy.ts +273 -0
  96. package/tests/cypress/e2e/_utils/selectors/global-search.bdd.md +115 -0
  97. package/tests/cypress/e2e/_utils/selectors/global-search.cy.ts +93 -0
  98. package/tests/cypress/e2e/_utils/selectors/patterns.bdd.md +388 -0
  99. package/tests/cypress/e2e/_utils/selectors/patterns.cy.ts +559 -0
  100. package/tests/cypress/e2e/_utils/selectors/public.cy.ts +112 -0
  101. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.bdd.md +266 -0
  102. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.cy.ts +233 -0
  103. package/tests/cypress/e2e/_utils/selectors/settings-billing.bdd.md +78 -0
  104. package/tests/cypress/e2e/_utils/selectors/settings-billing.cy.ts +108 -0
  105. package/tests/cypress/e2e/_utils/selectors/settings-layout.bdd.md +129 -0
  106. package/tests/cypress/e2e/_utils/selectors/settings-layout.cy.ts +115 -0
  107. package/tests/cypress/e2e/_utils/selectors/settings-password.bdd.md +82 -0
  108. package/tests/cypress/e2e/_utils/selectors/settings-password.cy.ts +74 -0
  109. package/tests/cypress/e2e/_utils/selectors/settings-profile.bdd.md +77 -0
  110. package/tests/cypress/e2e/_utils/selectors/settings-profile.cy.ts +79 -0
  111. package/tests/cypress/e2e/_utils/selectors/settings-teams.bdd.md +130 -0
  112. package/tests/cypress/e2e/_utils/selectors/settings-teams.cy.ts +86 -0
  113. package/tests/cypress/e2e/_utils/selectors/superadmin.bdd.md +261 -0
  114. package/tests/cypress/e2e/_utils/selectors/superadmin.cy.ts +193 -0
  115. package/tests/cypress/e2e/_utils/selectors/tasks.bdd.md +593 -0
  116. package/tests/cypress/e2e/_utils/selectors/tasks.cy.ts +864 -0
  117. package/tests/cypress/e2e/_utils/selectors/taxonomies.cy.ts +126 -0
  118. package/tests/cypress/e2e/_utils/selectors/teams.bdd.md +278 -0
  119. package/tests/cypress/e2e/_utils/selectors/teams.cy.ts +195 -0
  120. package/tests/cypress/e2e/_utils/superadmin/all-teams.bdd.md +261 -0
  121. package/tests/cypress/e2e/_utils/superadmin/all-teams.cy.ts +177 -0
  122. package/tests/cypress/e2e/_utils/superadmin/all-users.bdd.md +406 -0
  123. package/tests/cypress/e2e/_utils/superadmin/all-users.cy.ts +294 -0
  124. package/tests/cypress/e2e/_utils/superadmin/dashboard.bdd.md +235 -0
  125. package/tests/cypress/e2e/_utils/superadmin/dashboard.cy.ts +149 -0
  126. package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.bdd.md +290 -0
  127. package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.cy.ts +194 -0
  128. package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
  129. package/tests/cypress/e2e/ai/chat-api.cy.ts +119 -0
  130. package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
  131. package/tests/cypress/e2e/api/_core/billing/BillingAPIController.js +319 -0
  132. package/tests/cypress/e2e/api/_core/billing/check-action.cy.ts +326 -0
  133. package/tests/cypress/e2e/api/_core/billing/checkout.cy.ts +358 -0
  134. package/tests/cypress/e2e/api/_core/billing/lifecycle.cy.ts +423 -0
  135. package/tests/cypress/e2e/api/_core/billing/plans/README.md +345 -0
  136. package/tests/cypress/e2e/api/_core/billing/plans/business.cy.ts +412 -0
  137. package/tests/cypress/e2e/api/_core/billing/plans/downgrade.cy.ts +510 -0
  138. package/tests/cypress/e2e/api/_core/billing/plans/fixtures/billing-plans.json +163 -0
  139. package/tests/cypress/e2e/api/_core/billing/plans/free.cy.ts +500 -0
  140. package/tests/cypress/e2e/api/_core/billing/plans/pro.cy.ts +497 -0
  141. package/tests/cypress/e2e/api/_core/billing/plans/starter.cy.ts +342 -0
  142. package/tests/cypress/e2e/api/_core/billing/portal.cy.ts +313 -0
  143. package/tests/cypress/e2e/api/_core/devtools/registries.bdd.md +300 -0
  144. package/tests/cypress/e2e/api/_core/devtools/registries.cy.ts +368 -0
  145. package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.bdd.md +375 -0
  146. package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.cy.ts +346 -0
  147. package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.bdd.md +451 -0
  148. package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.cy.ts +447 -0
  149. package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.bdd.md +649 -0
  150. package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.cy.ts +333 -0
  151. package/tests/cypress/e2e/api/_core/security/security-headers.cy.ts +601 -0
  152. package/tests/cypress/e2e/api/_core/settings/api-keys.crud.cy.ts +923 -0
  153. package/tests/cypress/e2e/api/_core/teams/teams-security.cy.ts +415 -0
  154. package/tests/cypress/e2e/api/_core/users/users-crud.cy.ts +469 -0
  155. package/tests/cypress/e2e/api/_core/users/users-metas.cy.ts +913 -0
  156. package/tests/cypress/e2e/api/_core/users/users-security.cy.ts +375 -0
  157. package/tests/cypress/e2e/api/entities/customers/customers-crud.cy.ts +648 -0
  158. package/tests/cypress/e2e/api/entities/customers/customers-metas.cy.ts +839 -0
  159. package/tests/cypress/e2e/api/entities/media/media-crud.cy.ts +600 -0
  160. package/tests/cypress/e2e/api/entities/media/media-role-permissions.cy.ts +617 -0
  161. package/tests/cypress/e2e/api/entities/media/media-team-isolation.cy.ts +464 -0
  162. package/tests/cypress/e2e/api/entities/pages/blocks-scope.cy.ts +396 -0
  163. package/tests/cypress/e2e/api/entities/pages/pages-crud.cy.ts +425 -0
  164. package/tests/cypress/e2e/api/entities/pages/pages-status.cy.ts +335 -0
  165. package/tests/cypress/e2e/api/entities/posts/post-categories-crud.cy.ts +610 -0
  166. package/tests/cypress/e2e/api/entities/posts/posts-crud.cy.ts +709 -0
  167. package/tests/cypress/e2e/api/entities/posts/posts-status.cy.ts +396 -0
  168. package/tests/cypress/e2e/api/entities/tasks/tasks-crud.cy.ts +602 -0
  169. package/tests/cypress/e2e/api/entities/tasks/tasks-metas.cy.ts +878 -0
  170. package/tests/cypress/e2e/patterns/patterns-in-pages.cy.ts +367 -0
  171. package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.bdd.md +231 -0
  172. package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.cy.ts +144 -0
  173. package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.bdd.md +118 -0
  174. package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.cy.ts +84 -0
  175. package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.bdd.md +288 -0
  176. package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.cy.ts +188 -0
  177. package/tests/cypress/e2e/uat/_core/auth/login-logout.bdd.md +160 -0
  178. package/tests/cypress/e2e/uat/_core/auth/login-logout.cy.ts +116 -0
  179. package/tests/cypress/e2e/uat/_core/auth/password-reset.bdd.md +289 -0
  180. package/tests/cypress/e2e/uat/_core/auth/password-reset.cy.ts +200 -0
  181. package/tests/cypress/e2e/uat/_core/auth/registration-control-invitation.cy.ts +176 -0
  182. package/tests/cypress/e2e/uat/_core/auth/registration-control-open.cy.ts +131 -0
  183. package/tests/cypress/e2e/uat/_core/auth/registration-control.cy.ts +140 -0
  184. package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.bdd.md +225 -0
  185. package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.cy.ts +148 -0
  186. package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.bdd.md +251 -0
  187. package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.cy.ts +163 -0
  188. package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.bdd.md +231 -0
  189. package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.cy.ts +141 -0
  190. package/tests/cypress/e2e/uat/_core/billing/extended.bdd.md +273 -0
  191. package/tests/cypress/e2e/uat/_core/billing/extended.cy.ts +209 -0
  192. package/tests/cypress/e2e/uat/_core/billing/feature-gates.bdd.md +407 -0
  193. package/tests/cypress/e2e/uat/_core/billing/feature-gates.cy.ts +307 -0
  194. package/tests/cypress/e2e/uat/_core/billing/page.bdd.md +329 -0
  195. package/tests/cypress/e2e/uat/_core/billing/page.cy.ts +250 -0
  196. package/tests/cypress/e2e/uat/_core/billing/status.bdd.md +190 -0
  197. package/tests/cypress/e2e/uat/_core/billing/status.cy.ts +145 -0
  198. package/tests/cypress/e2e/uat/_core/billing/team-switch.bdd.md +156 -0
  199. package/tests/cypress/e2e/uat/_core/billing/team-switch.cy.ts +122 -0
  200. package/tests/cypress/e2e/uat/_core/billing/usage.bdd.md +218 -0
  201. package/tests/cypress/e2e/uat/_core/billing/usage.cy.ts +176 -0
  202. package/tests/cypress/e2e/uat/_core/blocks/hero.bdd.md +124 -0
  203. package/tests/cypress/e2e/uat/_core/blocks/hero.cy.ts +56 -0
  204. package/tests/cypress/e2e/uat/_core/devtools/api-tester.cy.ts +390 -0
  205. package/tests/cypress/e2e/uat/_core/performance/suspense-loading.cy.ts +134 -0
  206. package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.bdd.md +736 -0
  207. package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.cy.ts +740 -0
  208. package/tests/cypress/e2e/uat/_core/teams/inline-edit.cy.ts +278 -0
  209. package/tests/cypress/e2e/uat/_core/teams/roles-matrix.bdd.md +553 -0
  210. package/tests/cypress/e2e/uat/_core/teams/roles-matrix.cy.ts +185 -0
  211. package/tests/cypress/e2e/uat/_core/teams/switcher.bdd.md +1151 -0
  212. package/tests/cypress/e2e/uat/_core/teams/switcher.cy.ts +497 -0
  213. package/tests/cypress/e2e/uat/_core/teams/team-switcher.md +198 -0
  214. package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
  215. package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
  216. package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
  217. package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
  218. package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
  219. package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
  220. package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
  221. package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
  222. package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
  223. package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
  224. package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
  225. package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
  226. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
  227. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
  228. package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
  229. package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
  230. package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
  231. package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
  232. package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
  233. package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
  234. package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
  235. package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
  236. package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
  237. package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
  238. package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
  239. package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
  240. package/tests/cypress/e2e/uat/features/roles/editor-role.bdd.md +552 -0
  241. package/tests/cypress/e2e/uat/features/roles/editor-role.cy.ts +210 -0
  242. package/tests/cypress/e2e/uat/features/roles/member-restrictions.bdd.md +450 -0
  243. package/tests/cypress/e2e/uat/features/roles/member-restrictions.cy.ts +189 -0
  244. package/tests/cypress/e2e/uat/features/roles/owner-full-crud.bdd.md +530 -0
  245. package/tests/cypress/e2e/uat/features/roles/owner-full-crud.cy.ts +247 -0
  246. package/tests/cypress/fixtures/blocks.json +218 -0
  247. package/tests/cypress/fixtures/entities.json +87 -0
  248. package/tests/cypress/fixtures/page-builder.json +21 -0
  249. package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
  250. package/tests/cypress/src/components/CustomersPOM.ts +439 -0
  251. package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
  252. package/tests/cypress/src/components/EntityForm.ts +375 -0
  253. package/tests/cypress/src/components/EntityList.ts +389 -0
  254. package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
  255. package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
  256. package/tests/cypress/src/components/PostsListPOM.ts +223 -0
  257. package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
  258. package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
  259. package/tests/cypress/src/components/TasksPOM.ts +272 -0
  260. package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
  261. package/tests/cypress/src/components/index.ts +21 -0
  262. package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
  263. package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
  264. package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
  265. package/tests/cypress/src/controllers/MediaAPIController.js +231 -0
  266. package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
  267. package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
  268. package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
  269. package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
  270. package/tests/cypress/src/controllers/index.js +25 -0
  271. package/tests/cypress/src/core/AuthPOM.ts +450 -0
  272. package/tests/cypress/src/core/BasePOM.ts +33 -0
  273. package/tests/cypress/src/core/BlockEditorBasePOM.ts +874 -0
  274. package/tests/cypress/src/core/DashboardEntityPOM.ts +41 -0
  275. package/tests/cypress/src/core/index.ts +14 -0
  276. package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
  277. package/tests/cypress/src/entities/PagesPOM.ts +137 -0
  278. package/tests/cypress/src/entities/PatternsPOM.ts +329 -0
  279. package/tests/cypress/src/entities/PostsPOM.ts +137 -0
  280. package/tests/cypress/src/entities/TasksPOM.ts +246 -0
  281. package/tests/cypress/src/entities/index.ts +16 -0
  282. package/tests/cypress/src/features/BillingPOM.ts +385 -0
  283. package/tests/cypress/src/features/DashboardPOM.ts +271 -0
  284. package/tests/cypress/src/features/DevtoolsPOM.ts +750 -0
  285. package/tests/cypress/src/features/PageBuilderPOM.ts +283 -0
  286. package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
  287. package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
  288. package/tests/cypress/src/features/SettingsPOM.ts +707 -0
  289. package/tests/cypress/src/features/SuperadminPOM.ts +851 -0
  290. package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
  291. package/tests/cypress/src/features/index.ts +28 -0
  292. package/tests/cypress/src/helpers/ApiInterceptor.ts +20 -0
  293. package/tests/cypress/src/index.ts +101 -0
  294. package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
  295. package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
  296. package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
  297. package/tests/cypress/src/pages/dashboard/index.js +6 -0
  298. package/tests/cypress/src/pages/index.js +5 -0
  299. package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
  300. package/tests/cypress/src/pages/public/LandingPage.js +69 -0
  301. package/tests/cypress/src/pages/public/PricingPage.js +33 -0
  302. package/tests/cypress/src/pages/public/index.js +6 -0
  303. package/tests/cypress/src/selectors.ts +46 -0
  304. package/tests/cypress/src/session-helpers.ts +518 -0
  305. package/tests/cypress/support/doc-commands.ts +260 -0
  306. package/tests/cypress/support/e2e.ts +90 -0
  307. package/tests/cypress.config.ts +178 -0
  308. package/tests/jest/__mocks__/@nextsparkjs/core/components/ui/badge.js +16 -0
  309. package/tests/jest/__mocks__/@nextsparkjs/core/lib/db.js +11 -0
  310. package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +160 -0
  311. package/tests/jest/__mocks__/@nextsparkjs/registries/theme-registry.ts +68 -0
  312. package/tests/jest/__mocks__/jose.js +22 -0
  313. package/tests/jest/__mocks__/next/image.js +15 -0
  314. package/tests/jest/__mocks__/next-server.js +56 -0
  315. package/tests/jest/components/post-header.test.tsx +377 -0
  316. package/tests/jest/jest.config.cjs +154 -0
  317. package/tests/jest/langchain/COVERAGE.md +372 -0
  318. package/tests/jest/langchain/guardrails.test.ts +465 -0
  319. package/tests/jest/langchain/streaming.test.ts +370 -0
  320. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  321. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  322. package/tests/jest/langchain/tracer.test.ts +823 -0
  323. package/tests/jest/services/tasks.service.test.ts +707 -0
  324. package/tests/jest/setup.ts +170 -0
  325. package/tests/jest/tsconfig.jest.json +6 -0
  326. package/tests/jest/validation/categories.test.ts +429 -0
  327. package/tests/jest/validation/posts.test.ts +546 -0
  328. package/tests/tsconfig.json +21 -0
  329. /package/docs/{02-features → public/02-features}/01-components.md +0 -0
  330. /package/docs/{02-features → public/02-features}/02-styling.md +0 -0
@@ -0,0 +1,275 @@
1
+ ---
2
+ feature: Customers Management - Member Role
3
+ priority: high
4
+ tags: [customers, member, permissions, read-only, security]
5
+ grepTags: [uat, feat-customers, role-member, security]
6
+ coverage: 7
7
+ ---
8
+
9
+ # Customers Management - Member Role (View Only - Restricted)
10
+
11
+ > Test suite for Member role customer permissions. Members can only READ customers - they CANNOT create, update, or delete. These tests verify proper UI restrictions for the Member role.
12
+
13
+ ## Background
14
+
15
+ ```gherkin:en
16
+ Given I am logged in as Member (member@nextspark.dev)
17
+ And I have navigated to the Customers dashboard
18
+ And the customers list has loaded successfully
19
+ ```
20
+
21
+ ```gherkin:es
22
+ Given estoy logueado como Member (member@nextspark.dev)
23
+ And he navegado al dashboard de Clientes
24
+ And la lista de clientes ha cargado exitosamente
25
+ ```
26
+
27
+ ---
28
+
29
+ ## @test CUST-MEMBER-001: View customer list
30
+
31
+ ### Metadata
32
+ - **Priority:** Critical
33
+ - **Type:** Smoke
34
+ - **Tags:** read, list, permissions
35
+ - **Grep:** `@smoke` `@critical`
36
+
37
+ ```gherkin:en
38
+ Scenario: Member can view the customers table
39
+
40
+ Given I am logged in as a Member
41
+ When I navigate to the Customers dashboard
42
+ Then the customers page should be visible
43
+ And the customers table should be displayed
44
+ ```
45
+
46
+ ```gherkin:es
47
+ Scenario: Member puede ver la tabla de clientes
48
+
49
+ Given estoy logueado como Member
50
+ When navego al dashboard de Clientes
51
+ Then la pagina de clientes deberia estar visible
52
+ And la tabla de clientes deberia mostrarse
53
+ ```
54
+
55
+ ### Expected Results
56
+ - Customers dashboard is accessible to Member role
57
+ - Customers table displays with data
58
+ - Read access is properly granted
59
+
60
+ ---
61
+
62
+ ## @test CUST-MEMBER-002: View customer details
63
+
64
+ ### Metadata
65
+ - **Priority:** High
66
+ - **Type:** Regression
67
+ - **Tags:** read, details, navigation
68
+
69
+ ```gherkin:en
70
+ Scenario: Member can view individual customer details
71
+
72
+ Given I am logged in as a Member
73
+ And there is at least one customer in the list
74
+ When I click on a customer row
75
+ Then I should be navigated to the customer detail page
76
+ And the URL should match /dashboard/customers/{id}
77
+ And the detail header should be visible
78
+ ```
79
+
80
+ ```gherkin:es
81
+ Scenario: Member puede ver detalles de un cliente
82
+
83
+ Given estoy logueado como Member
84
+ And existe al menos un cliente en la lista
85
+ When hago clic en una fila de cliente
86
+ Then deberia ser navegado a la pagina de detalle
87
+ And la URL deberia coincidir con /dashboard/customers/{id}
88
+ And el encabezado de detalle deberia estar visible
89
+ ```
90
+
91
+ ### Expected Results
92
+ - Customer rows are clickable for Members
93
+ - Detail page navigation works
94
+ - Customer information is visible
95
+ - Detail header displays correctly
96
+
97
+ ---
98
+
99
+ ## @test CUST-MEMBER-003: Edit button is hidden
100
+
101
+ ### Metadata
102
+ - **Priority:** High
103
+ - **Type:** Regression
104
+ - **Tags:** update, security, hidden-button
105
+ - **Grep:** `@security`
106
+
107
+ ```gherkin:en
108
+ Scenario: Edit button is hidden for Member role
109
+
110
+ Given I am logged in as a Member
111
+ And there is at least one customer in the list
112
+ When I click on a customer row to view details
113
+ Then I should see the customer information
114
+ But I should NOT see an "Edit" button
115
+ And the edit button should not exist in the DOM
116
+ ```
117
+
118
+ ```gherkin:es
119
+ Scenario: Boton editar oculto para rol Member
120
+
121
+ Given estoy logueado como Member
122
+ And existe al menos un cliente en la lista
123
+ When hago clic en una fila para ver detalles
124
+ Then deberia ver la informacion del cliente
125
+ But NO deberia ver un boton "Editar"
126
+ And el boton editar no deberia existir en el DOM
127
+ ```
128
+
129
+ ### Expected Results
130
+ - Customer information is visible
131
+ - Edit button is completely hidden (not just disabled)
132
+ - Edit button does not exist in DOM
133
+ - Security: No way to access edit functionality
134
+
135
+ ---
136
+
137
+ ## @test CUST-MEMBER-004: Create button is hidden
138
+
139
+ ### Metadata
140
+ - **Priority:** Critical
141
+ - **Type:** Smoke
142
+ - **Tags:** create, security, hidden-button
143
+ - **Grep:** `@smoke` `@critical` `@security`
144
+
145
+ ```gherkin:en
146
+ Scenario: Create button is hidden for Member role
147
+
148
+ Given I am logged in as a Member
149
+ When I navigate to the Customers list page
150
+ Then the customers page should be visible
151
+ But I should NOT see an "Add" button
152
+ And the create button should not exist in the DOM
153
+ ```
154
+
155
+ ```gherkin:es
156
+ Scenario: Boton crear oculto para rol Member
157
+
158
+ Given estoy logueado como Member
159
+ When navego a la pagina de lista de Clientes
160
+ Then la pagina de clientes deberia estar visible
161
+ But NO deberia ver un boton "Agregar"
162
+ And el boton crear no deberia existir en el DOM
163
+ ```
164
+
165
+ ### Expected Results
166
+ - Customers list page loads correctly
167
+ - Add/Create button is completely hidden
168
+ - Create button does not exist in DOM
169
+ - Security: No way to access create functionality
170
+
171
+ ---
172
+
173
+ ## @test CUST-MEMBER-005: No UI access to create form
174
+
175
+ ### Metadata
176
+ - **Priority:** Medium
177
+ - **Type:** Regression
178
+ - **Tags:** create, security, form-access
179
+
180
+ ```gherkin:en
181
+ Scenario: Member has no UI access to create form
182
+
183
+ Given I am logged in as a Member
184
+ When I am on the Customers list page
185
+ Then there should be no way to access the create form
186
+ And the "Add" button should not exist
187
+ ```
188
+
189
+ ```gherkin:es
190
+ Scenario: Member no tiene acceso UI al formulario de creacion
191
+
192
+ Given estoy logueado como Member
193
+ When estoy en la pagina de lista de Clientes
194
+ Then no deberia haber forma de acceder al formulario de creacion
195
+ And el boton "Agregar" no deberia existir
196
+ ```
197
+
198
+ ### Expected Results
199
+ - No UI element leads to create form
200
+ - Add button does not exist
201
+ - Create form is inaccessible through UI
202
+
203
+ ---
204
+
205
+ ## @test CUST-MEMBER-006: Delete buttons are hidden
206
+
207
+ ### Metadata
208
+ - **Priority:** Critical
209
+ - **Type:** Smoke
210
+ - **Tags:** delete, security, hidden-button
211
+ - **Grep:** `@smoke` `@critical` `@security`
212
+
213
+ ```gherkin:en
214
+ Scenario: Delete buttons are hidden in list view
215
+
216
+ Given I am logged in as a Member
217
+ When I am on the Customers list page
218
+ Then I should NOT see any delete action buttons
219
+ And no delete buttons should exist in table rows
220
+ ```
221
+
222
+ ```gherkin:es
223
+ Scenario: Botones eliminar ocultos en vista de lista
224
+
225
+ Given estoy logueado como Member
226
+ When estoy en la pagina de lista de Clientes
227
+ Then NO deberia ver ningun boton de accion eliminar
228
+ And no deberian existir botones eliminar en las filas
229
+ ```
230
+
231
+ ### Expected Results
232
+ - No delete buttons visible in list view
233
+ - Delete actions do not exist in table rows
234
+ - Security: No way to trigger delete from list
235
+
236
+ ---
237
+
238
+ ## @test CUST-MEMBER-007: No delete action in detail view
239
+
240
+ ### Metadata
241
+ - **Priority:** High
242
+ - **Type:** Regression
243
+ - **Tags:** delete, security, detail-view
244
+ - **Grep:** `@security`
245
+
246
+ ```gherkin:en
247
+ Scenario: Delete button is hidden in detail view
248
+
249
+ Given I am logged in as a Member
250
+ And there is at least one customer in the list
251
+ When I click on a customer row to view details
252
+ Then the detail page should load
253
+ And the detail header should be visible
254
+ But I should NOT see a "Delete" button
255
+ And the delete button should not exist in the DOM
256
+ ```
257
+
258
+ ```gherkin:es
259
+ Scenario: Boton eliminar oculto en vista de detalle
260
+
261
+ Given estoy logueado como Member
262
+ And existe al menos un cliente en la lista
263
+ When hago clic en una fila para ver detalles
264
+ Then la pagina de detalle deberia cargar
265
+ And el encabezado de detalle deberia estar visible
266
+ But NO deberia ver un boton "Eliminar"
267
+ And el boton eliminar no deberia existir en el DOM
268
+ ```
269
+
270
+ ### Expected Results
271
+ - Detail page loads correctly
272
+ - Detail header is visible
273
+ - Delete button is completely hidden
274
+ - Delete button does not exist in DOM
275
+ - Security: No way to trigger delete from detail view
@@ -0,0 +1,122 @@
1
+ /// <reference types="cypress" />
2
+
3
+ import * as allure from 'allure-cypress'
4
+
5
+ import { CustomersPOM } from '../../../../src/entities/CustomersPOM'
6
+ import { loginAsDefaultMember } from '../../../../src/session-helpers'
7
+
8
+ describe('Customers CRUD - Member Role (Restricted: View Only)', {
9
+ tags: ['@uat', '@feat-customers', '@crud', '@role-member', '@regression']
10
+ }, () => {
11
+ const customers = CustomersPOM.create()
12
+
13
+ beforeEach(() => {
14
+ allure.epic('UAT')
15
+ allure.feature('Customers')
16
+ allure.story('Member Permissions')
17
+
18
+ // Setup API intercepts BEFORE login and navigation
19
+ customers.setupApiIntercepts()
20
+ loginAsDefaultMember()
21
+ customers.visitList()
22
+ customers.api.waitForList()
23
+ customers.waitForList()
24
+ })
25
+
26
+ describe('READ - Member CAN view customers', { tags: '@smoke' }, () => {
27
+ it('CUST-MEMBER-001: should view customer list', { tags: '@smoke' }, () => {
28
+ allure.severity('critical')
29
+
30
+ cy.get(customers.selectors.page).should('be.visible')
31
+ customers.assertTableVisible()
32
+
33
+ cy.log('✅ Member can view customer list')
34
+ })
35
+
36
+ it('CUST-MEMBER-002: should view customer details', () => {
37
+ allure.severity('normal')
38
+
39
+ cy.get('body').then($body => {
40
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
41
+ cy.get(customers.selectors.rowGeneric).first().click()
42
+
43
+ // Wait for detail page URL (not using waitForDetail because edit button may not be visible for Member)
44
+ cy.url().should('match', new RegExp(`/dashboard/${customers.entitySlug}/[a-z0-9-]+`))
45
+ cy.get(customers.selectors.viewHeader, { timeout: 15000 }).should('be.visible')
46
+
47
+ cy.log('✅ Member can view customer details')
48
+ } else {
49
+ cy.log('⚠️ No customers available to view')
50
+ }
51
+ })
52
+ })
53
+ })
54
+
55
+ describe('UPDATE - Member CANNOT edit customers', () => {
56
+ it('CUST-MEMBER-003: edit button should be hidden', () => {
57
+ allure.severity('normal')
58
+
59
+ cy.get('body').then($body => {
60
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
61
+ // Navigate to detail page
62
+ cy.get(customers.selectors.rowGeneric).first().click()
63
+ cy.url().should('match', new RegExp(`/dashboard/${customers.entitySlug}/[a-z0-9-]+`))
64
+ cy.get(customers.selectors.viewHeader, { timeout: 15000 }).should('be.visible')
65
+
66
+ // Verify edit button does NOT exist for Member (Members cannot edit customers)
67
+ cy.get(customers.selectors.editButton).should('not.exist')
68
+
69
+ cy.log('✅ Edit button correctly hidden for Member')
70
+ } else {
71
+ cy.log('⚠️ No customers available to check edit button')
72
+ }
73
+ })
74
+ })
75
+ })
76
+
77
+ describe('CREATE - Member CANNOT create customers', () => {
78
+ it('CUST-MEMBER-004: create button should be hidden', { tags: '@smoke' }, () => {
79
+ allure.severity('critical')
80
+
81
+ cy.get(customers.selectors.addButton).should('not.exist')
82
+ cy.log('✅ Create button correctly hidden for Member')
83
+ })
84
+
85
+ it('CUST-MEMBER-005: should not access create form via UI', () => {
86
+ allure.severity('normal')
87
+
88
+ cy.get(customers.selectors.addButton).should('not.exist')
89
+ cy.log('✅ No UI access to create form for Member')
90
+ })
91
+ })
92
+
93
+ describe('DELETE - Member CANNOT delete customers', () => {
94
+ it('CUST-MEMBER-006: delete buttons should be hidden', { tags: '@smoke' }, () => {
95
+ allure.severity('critical')
96
+
97
+ // Delete action buttons should not exist for Member
98
+ cy.get(customers.selectors.rowActionDeleteGeneric).should('not.exist')
99
+ cy.log('✅ Delete buttons correctly hidden for Member')
100
+ })
101
+
102
+ it('CUST-MEMBER-007: should not see delete action in detail view', () => {
103
+ allure.severity('normal')
104
+
105
+ cy.get('body').then($body => {
106
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
107
+ cy.get(customers.selectors.rowGeneric).first().click()
108
+
109
+ // Wait for detail page (without checking for edit button)
110
+ cy.url().should('match', new RegExp(`/dashboard/${customers.entitySlug}/[a-z0-9-]+`))
111
+ cy.get(customers.selectors.viewHeader, { timeout: 15000 }).should('be.visible')
112
+
113
+ // Delete button should not exist on detail page for Member
114
+ cy.get(customers.selectors.deleteButton).should('not.exist')
115
+ cy.log('✅ No delete action visible in detail view for Member')
116
+ } else {
117
+ cy.log('⚠️ No customers available to check delete action')
118
+ }
119
+ })
120
+ })
121
+ })
122
+ })
@@ -0,0 +1,243 @@
1
+ ---
2
+ feature: Customers Management - Owner Role
3
+ priority: high
4
+ tags: [customers, owner, crud, dashboard]
5
+ grepTags: [uat, feat-customers, role-owner]
6
+ coverage: 5
7
+ ---
8
+
9
+ # Customers Management - Owner Role (Full CRUD Access)
10
+
11
+ > Test suite for Owner role managing customers through the dashboard UI. Covers full CRUD operations: create, view, update, and delete customer records.
12
+
13
+ ## Background
14
+
15
+ ```gherkin:en
16
+ Given I am logged in as Owner (owner@nextspark.dev)
17
+ And I have navigated to the Customers dashboard
18
+ And the customers list has loaded successfully
19
+ ```
20
+
21
+ ```gherkin:es
22
+ Given estoy logueado como Owner (owner@nextspark.dev)
23
+ And he navegado al dashboard de Clientes
24
+ And la lista de clientes ha cargado exitosamente
25
+ ```
26
+
27
+ ---
28
+
29
+ ## @test CUST-001: Create new customer with all required fields
30
+
31
+ ### Metadata
32
+ - **Priority:** Critical
33
+ - **Type:** Smoke
34
+ - **Tags:** create, customer, form
35
+ - **Grep:** `@smoke` `@critical`
36
+
37
+ ```gherkin:en
38
+ Scenario: Owner creates a new customer
39
+
40
+ Given I am logged in as an Owner
41
+ And I am on the Customers list page
42
+ When I click the "Add" button
43
+ Then the customer creation form should appear
44
+
45
+ When I fill in the following fields:
46
+ | Field | Value |
47
+ | Name | "Test Customer [timestamp]" |
48
+ | Account | "123456" |
49
+ | Office | "Main Office" |
50
+ And I click the "Save" button
51
+ Then the form should submit successfully
52
+ And I should be redirected to the customers list
53
+ And I should see "Test Customer" in the list
54
+ ```
55
+
56
+ ```gherkin:es
57
+ Scenario: Owner crea un nuevo cliente
58
+
59
+ Given estoy logueado como Owner
60
+ And estoy en la pagina de lista de Clientes
61
+ When hago clic en el boton "Agregar"
62
+ Then deberia aparecer el formulario de creacion
63
+
64
+ When completo los siguientes campos:
65
+ | Campo | Valor |
66
+ | Nombre | "Cliente de Prueba [timestamp]" |
67
+ | Cuenta | "123456" |
68
+ | Oficina | "Oficina Principal" |
69
+ And hago clic en el boton "Guardar"
70
+ Then el formulario deberia enviarse exitosamente
71
+ And deberia ser redirigido a la lista de clientes
72
+ And deberia ver "Cliente de Prueba" en la lista
73
+ ```
74
+
75
+ ### Expected Results
76
+ - Add button is visible and clickable
77
+ - Customer creation form displays all required fields
78
+ - Form validation works correctly
79
+ - Customer is created and appears in the list
80
+ - Redirect to customers list after successful creation
81
+
82
+ ---
83
+
84
+ ## @test CUST-002: View customer list
85
+
86
+ ### Metadata
87
+ - **Priority:** Critical
88
+ - **Type:** Smoke
89
+ - **Tags:** read, list, table
90
+ - **Grep:** `@smoke` `@critical`
91
+
92
+ ```gherkin:en
93
+ Scenario: Owner can view the customers table
94
+
95
+ Given I am logged in as an Owner
96
+ When I navigate to the Customers dashboard
97
+ Then the customers page should be visible
98
+ And the customers table should be displayed
99
+ ```
100
+
101
+ ```gherkin:es
102
+ Scenario: Owner puede ver la tabla de clientes
103
+
104
+ Given estoy logueado como Owner
105
+ When navego al dashboard de Clientes
106
+ Then la pagina de clientes deberia estar visible
107
+ And la tabla de clientes deberia mostrarse
108
+ ```
109
+
110
+ ### Expected Results
111
+ - Customers dashboard is accessible
112
+ - Customers table displays with data
113
+ - Table shows customer information columns
114
+
115
+ ---
116
+
117
+ ## @test CUST-003: View customer details
118
+
119
+ ### Metadata
120
+ - **Priority:** High
121
+ - **Type:** Regression
122
+ - **Tags:** read, details, navigation
123
+
124
+ ```gherkin:en
125
+ Scenario: Owner can view individual customer details
126
+
127
+ Given I am logged in as an Owner
128
+ And there is at least one customer in the list
129
+ When I click on a customer row
130
+ Then I should be navigated to the customer detail page
131
+ And the URL should match /dashboard/customers/{id}
132
+ ```
133
+
134
+ ```gherkin:es
135
+ Scenario: Owner puede ver detalles de un cliente
136
+
137
+ Given estoy logueado como Owner
138
+ And existe al menos un cliente en la lista
139
+ When hago clic en una fila de cliente
140
+ Then deberia ser navegado a la pagina de detalle
141
+ And la URL deberia coincidir con /dashboard/customers/{id}
142
+ ```
143
+
144
+ ### Expected Results
145
+ - Customer rows are clickable
146
+ - Navigation to detail page works
147
+ - URL contains customer ID
148
+ - Customer details are displayed
149
+
150
+ ---
151
+
152
+ ## @test CUST-004: Edit existing customer
153
+
154
+ ### Metadata
155
+ - **Priority:** High
156
+ - **Type:** Regression
157
+ - **Tags:** update, edit, form
158
+
159
+ ```gherkin:en
160
+ Scenario: Owner can modify customer information
161
+
162
+ Given I am logged in as an Owner
163
+ And there is at least one customer in the list
164
+ When I click on a customer row to view details
165
+ And I click the "Edit" button
166
+ Then the customer edit form should appear
167
+ And the form should be pre-filled with current data
168
+
169
+ When I change the Name to "Updated Customer [timestamp]"
170
+ And I click the "Save" button
171
+ Then the changes should be saved successfully
172
+ And I should see "Updated Customer" in the list
173
+ ```
174
+
175
+ ```gherkin:es
176
+ Scenario: Owner puede modificar informacion del cliente
177
+
178
+ Given estoy logueado como Owner
179
+ And existe al menos un cliente en la lista
180
+ When hago clic en una fila para ver detalles
181
+ And hago clic en el boton "Editar"
182
+ Then deberia aparecer el formulario de edicion
183
+ And el formulario deberia estar pre-llenado con datos actuales
184
+
185
+ When cambio el Nombre a "Cliente Actualizado [timestamp]"
186
+ And hago clic en el boton "Guardar"
187
+ Then los cambios deberian guardarse exitosamente
188
+ And deberia ver "Cliente Actualizado" en la lista
189
+ ```
190
+
191
+ ### Expected Results
192
+ - Edit button is accessible from detail page
193
+ - Edit form pre-fills with existing data
194
+ - Changes can be saved successfully
195
+ - Updated data reflects in the list
196
+
197
+ ---
198
+
199
+ ## @test CUST-005: Delete customer
200
+
201
+ ### Metadata
202
+ - **Priority:** High
203
+ - **Type:** Regression
204
+ - **Tags:** delete, confirmation, dialog
205
+
206
+ ```gherkin:en
207
+ Scenario: Owner can permanently delete a customer
208
+
209
+ Given I am logged in as an Owner
210
+ And I have created a customer called "Delete Test [timestamp]"
211
+ When I click on that customer to view details
212
+ And I click the "Delete" button
213
+ Then a confirmation dialog should appear
214
+
215
+ When I confirm the deletion
216
+ Then a second confirmation dialog should appear
217
+ When I confirm again
218
+ Then the customer should be deleted
219
+ And "Delete Test" should no longer appear in the list
220
+ ```
221
+
222
+ ```gherkin:es
223
+ Scenario: Owner puede eliminar permanentemente un cliente
224
+
225
+ Given estoy logueado como Owner
226
+ And he creado un cliente llamado "Prueba Eliminar [timestamp]"
227
+ When hago clic en ese cliente para ver detalles
228
+ And hago clic en el boton "Eliminar"
229
+ Then deberia aparecer un dialogo de confirmacion
230
+
231
+ When confirmo la eliminacion
232
+ Then deberia aparecer un segundo dialogo de confirmacion
233
+ When confirmo nuevamente
234
+ Then el cliente deberia ser eliminado
235
+ And "Prueba Eliminar" ya no deberia aparecer en la lista
236
+ ```
237
+
238
+ ### Expected Results
239
+ - Delete button is accessible from detail page
240
+ - First confirmation dialog appears
241
+ - Second confirmation dialog appears (2-step deletion)
242
+ - Customer is permanently removed
243
+ - Customer no longer appears in the list