@nextsparkjs/theme-default 0.1.0-beta.17 → 0.1.0-beta.170

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 (332) hide show
  1. package/api/ai/chat/stream/route.ts +4 -1
  2. package/api/ai/orchestrator/route.ts +10 -3
  3. package/api/ai/single-agent/route.ts +10 -3
  4. package/api/ai/usage/route.ts +4 -1
  5. package/blocks/benefits/component.tsx +4 -4
  6. package/blocks/cta-section/component.tsx +4 -4
  7. package/blocks/faq-accordion/component.tsx +2 -2
  8. package/blocks/features-grid/component.tsx +5 -5
  9. package/blocks/hero/component.tsx +2 -2
  10. package/blocks/hero/fields.ts +1 -1
  11. package/blocks/hero-with-form/component.tsx +7 -7
  12. package/blocks/hero-with-form/fields.ts +1 -1
  13. package/blocks/jumbotron/component.tsx +7 -7
  14. package/blocks/jumbotron/fields.ts +1 -1
  15. package/blocks/logo-cloud/component.tsx +6 -6
  16. package/blocks/logo-cloud/fields.ts +1 -1
  17. package/blocks/post-content/component.tsx +2 -2
  18. package/blocks/pricing-table/component.tsx +5 -5
  19. package/blocks/split-content/component.tsx +5 -5
  20. package/blocks/split-content/fields.ts +1 -1
  21. package/blocks/stats-counter/component.tsx +9 -9
  22. package/blocks/testimonials/component.tsx +4 -4
  23. package/blocks/testimonials/fields.ts +1 -1
  24. package/blocks/text-content/component.tsx +12 -10
  25. package/blocks/timeline/component.tsx +12 -12
  26. package/blocks/video-hero/component.tsx +7 -7
  27. package/blocks/video-hero/fields.ts +1 -1
  28. package/components/ai-chat/ChatPanel.tsx +7 -7
  29. package/components/ai-chat/Message.tsx +2 -2
  30. package/components/ai-chat/MessageInput.tsx +3 -3
  31. package/components/ai-chat/MessageList.tsx +3 -3
  32. package/components/ai-chat/TypingIndicator.tsx +2 -2
  33. package/config/app.config.ts +90 -62
  34. package/config/billing.config.ts +5 -10
  35. package/config/dashboard.config.ts +14 -0
  36. package/config/features.config.ts +10 -0
  37. package/config/permissions.config.ts +22 -23
  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/emails/verify-email.ts +33 -0
  48. package/entities/customers/api/docs.md +107 -0
  49. package/entities/customers/api/presets.ts +80 -0
  50. package/entities/pages/api/docs.md +114 -0
  51. package/entities/pages/api/presets.ts +72 -0
  52. package/entities/posts/api/docs.md +120 -0
  53. package/entities/posts/api/presets.ts +74 -0
  54. package/entities/tasks/api/docs.md +126 -0
  55. package/entities/tasks/api/presets.ts +84 -0
  56. package/lib/selectors.ts +7 -4
  57. package/messages/de/admin.json +45 -0
  58. package/messages/en/admin.json +56 -0
  59. package/messages/en/navigation.json +2 -1
  60. package/messages/es/admin.json +56 -0
  61. package/messages/es/navigation.json +2 -1
  62. package/messages/fr/admin.json +45 -0
  63. package/messages/it/admin.json +45 -0
  64. package/messages/pt/admin.json +45 -0
  65. package/migrations/089_add_editor_team_role.sql +15 -23
  66. package/migrations/090_demo_users_teams.sql +11 -11
  67. package/migrations/091_greek_teams_billing.sql +15 -15
  68. package/migrations/093_pages_sample_data.sql +7 -7
  69. package/migrations/098_patterns_sample_data.sql +234 -0
  70. package/nextsparkjs-theme-default-0.1.0-beta.137.tgz +0 -0
  71. package/package.json +4 -3
  72. package/styles/globals.css +42 -0
  73. package/templates/(public)/page.tsx +1 -1
  74. package/tests/cypress/e2e/_utils/devtools/access.bdd.md +262 -0
  75. package/tests/cypress/e2e/_utils/devtools/access.cy.ts +171 -0
  76. package/tests/cypress/e2e/_utils/devtools/navigation.bdd.md +261 -0
  77. package/tests/cypress/e2e/_utils/devtools/navigation.cy.ts +157 -0
  78. package/tests/cypress/e2e/_utils/devtools/pages.bdd.md +303 -0
  79. package/tests/cypress/e2e/_utils/devtools/pages.cy.ts +184 -0
  80. package/tests/cypress/e2e/_utils/docs/README.md +215 -0
  81. package/tests/cypress/e2e/_utils/selectors/auth.bdd.md +354 -0
  82. package/tests/cypress/e2e/_utils/selectors/auth.cy.ts +310 -0
  83. package/tests/cypress/e2e/_utils/selectors/billing.bdd.md +276 -0
  84. package/tests/cypress/e2e/_utils/selectors/billing.cy.ts +182 -0
  85. package/tests/cypress/e2e/_utils/selectors/block-editor.bdd.md +615 -0
  86. package/tests/cypress/e2e/_utils/selectors/block-editor.cy.ts +783 -0
  87. package/tests/cypress/e2e/_utils/selectors/dashboard-container.cy.ts +52 -0
  88. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.bdd.md +205 -0
  89. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.cy.ts +137 -0
  90. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.bdd.md +147 -0
  91. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.cy.ts +114 -0
  92. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.bdd.md +76 -0
  93. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.cy.ts +68 -0
  94. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.bdd.md +326 -0
  95. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.cy.ts +177 -0
  96. package/tests/cypress/e2e/_utils/selectors/devtools.bdd.md +306 -0
  97. package/tests/cypress/e2e/_utils/selectors/devtools.cy.ts +273 -0
  98. package/tests/cypress/e2e/_utils/selectors/global-search.bdd.md +115 -0
  99. package/tests/cypress/e2e/_utils/selectors/global-search.cy.ts +93 -0
  100. package/tests/cypress/e2e/_utils/selectors/patterns.bdd.md +388 -0
  101. package/tests/cypress/e2e/_utils/selectors/patterns.cy.ts +559 -0
  102. package/tests/cypress/e2e/_utils/selectors/public.cy.ts +112 -0
  103. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.bdd.md +266 -0
  104. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.cy.ts +233 -0
  105. package/tests/cypress/e2e/_utils/selectors/settings-billing.bdd.md +78 -0
  106. package/tests/cypress/e2e/_utils/selectors/settings-billing.cy.ts +108 -0
  107. package/tests/cypress/e2e/_utils/selectors/settings-layout.bdd.md +129 -0
  108. package/tests/cypress/e2e/_utils/selectors/settings-layout.cy.ts +115 -0
  109. package/tests/cypress/e2e/_utils/selectors/settings-password.bdd.md +82 -0
  110. package/tests/cypress/e2e/_utils/selectors/settings-password.cy.ts +74 -0
  111. package/tests/cypress/e2e/_utils/selectors/settings-profile.bdd.md +77 -0
  112. package/tests/cypress/e2e/_utils/selectors/settings-profile.cy.ts +79 -0
  113. package/tests/cypress/e2e/_utils/selectors/settings-teams.bdd.md +130 -0
  114. package/tests/cypress/e2e/_utils/selectors/settings-teams.cy.ts +86 -0
  115. package/tests/cypress/e2e/_utils/selectors/superadmin.bdd.md +261 -0
  116. package/tests/cypress/e2e/_utils/selectors/superadmin.cy.ts +193 -0
  117. package/tests/cypress/e2e/_utils/selectors/tasks.bdd.md +593 -0
  118. package/tests/cypress/e2e/_utils/selectors/tasks.cy.ts +864 -0
  119. package/tests/cypress/e2e/_utils/selectors/taxonomies.cy.ts +126 -0
  120. package/tests/cypress/e2e/_utils/selectors/teams.bdd.md +278 -0
  121. package/tests/cypress/e2e/_utils/selectors/teams.cy.ts +195 -0
  122. package/tests/cypress/e2e/_utils/superadmin/all-teams.bdd.md +261 -0
  123. package/tests/cypress/e2e/_utils/superadmin/all-teams.cy.ts +177 -0
  124. package/tests/cypress/e2e/_utils/superadmin/all-users.bdd.md +406 -0
  125. package/tests/cypress/e2e/_utils/superadmin/all-users.cy.ts +294 -0
  126. package/tests/cypress/e2e/_utils/superadmin/dashboard.bdd.md +235 -0
  127. package/tests/cypress/e2e/_utils/superadmin/dashboard.cy.ts +149 -0
  128. package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.bdd.md +290 -0
  129. package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.cy.ts +194 -0
  130. package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
  131. package/tests/cypress/e2e/ai/chat-api.cy.ts +119 -0
  132. package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
  133. package/tests/cypress/e2e/api/_core/billing/BillingAPIController.js +319 -0
  134. package/tests/cypress/e2e/api/_core/billing/check-action.cy.ts +326 -0
  135. package/tests/cypress/e2e/api/_core/billing/checkout.cy.ts +358 -0
  136. package/tests/cypress/e2e/api/_core/billing/lifecycle.cy.ts +423 -0
  137. package/tests/cypress/e2e/api/_core/billing/plans/README.md +345 -0
  138. package/tests/cypress/e2e/api/_core/billing/plans/business.cy.ts +412 -0
  139. package/tests/cypress/e2e/api/_core/billing/plans/downgrade.cy.ts +510 -0
  140. package/tests/cypress/e2e/api/_core/billing/plans/fixtures/billing-plans.json +163 -0
  141. package/tests/cypress/e2e/api/_core/billing/plans/free.cy.ts +500 -0
  142. package/tests/cypress/e2e/api/_core/billing/plans/pro.cy.ts +497 -0
  143. package/tests/cypress/e2e/api/_core/billing/plans/starter.cy.ts +342 -0
  144. package/tests/cypress/e2e/api/_core/billing/portal.cy.ts +313 -0
  145. package/tests/cypress/e2e/api/_core/devtools/registries.bdd.md +300 -0
  146. package/tests/cypress/e2e/api/_core/devtools/registries.cy.ts +368 -0
  147. package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.bdd.md +375 -0
  148. package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.cy.ts +346 -0
  149. package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.bdd.md +451 -0
  150. package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.cy.ts +447 -0
  151. package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.bdd.md +649 -0
  152. package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.cy.ts +333 -0
  153. package/tests/cypress/e2e/api/_core/security/security-headers.cy.ts +601 -0
  154. package/tests/cypress/e2e/api/_core/settings/api-keys.crud.cy.ts +923 -0
  155. package/tests/cypress/e2e/api/_core/teams/teams-security.cy.ts +415 -0
  156. package/tests/cypress/e2e/api/_core/users/users-crud.cy.ts +469 -0
  157. package/tests/cypress/e2e/api/_core/users/users-metas.cy.ts +913 -0
  158. package/tests/cypress/e2e/api/_core/users/users-security.cy.ts +375 -0
  159. package/tests/cypress/e2e/api/entities/customers/customers-crud.cy.ts +648 -0
  160. package/tests/cypress/e2e/api/entities/customers/customers-metas.cy.ts +839 -0
  161. package/tests/cypress/e2e/api/entities/media/media-crud.cy.ts +600 -0
  162. package/tests/cypress/e2e/api/entities/media/media-role-permissions.cy.ts +617 -0
  163. package/tests/cypress/e2e/api/entities/media/media-team-isolation.cy.ts +464 -0
  164. package/tests/cypress/e2e/api/entities/pages/blocks-scope.cy.ts +396 -0
  165. package/tests/cypress/e2e/api/entities/pages/pages-crud.cy.ts +425 -0
  166. package/tests/cypress/e2e/api/entities/pages/pages-status.cy.ts +335 -0
  167. package/tests/cypress/e2e/api/entities/posts/post-categories-crud.cy.ts +610 -0
  168. package/tests/cypress/e2e/api/entities/posts/posts-crud.cy.ts +709 -0
  169. package/tests/cypress/e2e/api/entities/posts/posts-status.cy.ts +396 -0
  170. package/tests/cypress/e2e/api/entities/tasks/tasks-crud.cy.ts +602 -0
  171. package/tests/cypress/e2e/api/entities/tasks/tasks-metas.cy.ts +878 -0
  172. package/tests/cypress/e2e/patterns/patterns-in-pages.cy.ts +367 -0
  173. package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.bdd.md +231 -0
  174. package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.cy.ts +144 -0
  175. package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.bdd.md +118 -0
  176. package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.cy.ts +84 -0
  177. package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.bdd.md +288 -0
  178. package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.cy.ts +188 -0
  179. package/tests/cypress/e2e/uat/_core/auth/login-logout.bdd.md +160 -0
  180. package/tests/cypress/e2e/uat/_core/auth/login-logout.cy.ts +116 -0
  181. package/tests/cypress/e2e/uat/_core/auth/password-reset.bdd.md +289 -0
  182. package/tests/cypress/e2e/uat/_core/auth/password-reset.cy.ts +200 -0
  183. package/tests/cypress/e2e/uat/_core/auth/registration-control-invitation.cy.ts +176 -0
  184. package/tests/cypress/e2e/uat/_core/auth/registration-control-open.cy.ts +131 -0
  185. package/tests/cypress/e2e/uat/_core/auth/registration-control.cy.ts +140 -0
  186. package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.bdd.md +225 -0
  187. package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.cy.ts +148 -0
  188. package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.bdd.md +251 -0
  189. package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.cy.ts +163 -0
  190. package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.bdd.md +231 -0
  191. package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.cy.ts +141 -0
  192. package/tests/cypress/e2e/uat/_core/billing/extended.bdd.md +273 -0
  193. package/tests/cypress/e2e/uat/_core/billing/extended.cy.ts +209 -0
  194. package/tests/cypress/e2e/uat/_core/billing/feature-gates.bdd.md +407 -0
  195. package/tests/cypress/e2e/uat/_core/billing/feature-gates.cy.ts +307 -0
  196. package/tests/cypress/e2e/uat/_core/billing/page.bdd.md +329 -0
  197. package/tests/cypress/e2e/uat/_core/billing/page.cy.ts +250 -0
  198. package/tests/cypress/e2e/uat/_core/billing/status.bdd.md +190 -0
  199. package/tests/cypress/e2e/uat/_core/billing/status.cy.ts +145 -0
  200. package/tests/cypress/e2e/uat/_core/billing/team-switch.bdd.md +156 -0
  201. package/tests/cypress/e2e/uat/_core/billing/team-switch.cy.ts +122 -0
  202. package/tests/cypress/e2e/uat/_core/billing/usage.bdd.md +218 -0
  203. package/tests/cypress/e2e/uat/_core/billing/usage.cy.ts +176 -0
  204. package/tests/cypress/e2e/uat/_core/blocks/hero.bdd.md +124 -0
  205. package/tests/cypress/e2e/uat/_core/blocks/hero.cy.ts +56 -0
  206. package/tests/cypress/e2e/uat/_core/devtools/api-tester.cy.ts +390 -0
  207. package/tests/cypress/e2e/uat/_core/performance/suspense-loading.cy.ts +134 -0
  208. package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.bdd.md +736 -0
  209. package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.cy.ts +740 -0
  210. package/tests/cypress/e2e/uat/_core/teams/inline-edit.cy.ts +278 -0
  211. package/tests/cypress/e2e/uat/_core/teams/roles-matrix.bdd.md +553 -0
  212. package/tests/cypress/e2e/uat/_core/teams/roles-matrix.cy.ts +185 -0
  213. package/tests/cypress/e2e/uat/_core/teams/switcher.bdd.md +1151 -0
  214. package/tests/cypress/e2e/uat/_core/teams/switcher.cy.ts +497 -0
  215. package/tests/cypress/e2e/uat/_core/teams/team-switcher.md +198 -0
  216. package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
  217. package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
  218. package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
  219. package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
  220. package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
  221. package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
  222. package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
  223. package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
  224. package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
  225. package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
  226. package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
  227. package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
  228. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
  229. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
  230. package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
  231. package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
  232. package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
  233. package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
  234. package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
  235. package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
  236. package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
  237. package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
  238. package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
  239. package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
  240. package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
  241. package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
  242. package/tests/cypress/e2e/uat/features/roles/editor-role.bdd.md +552 -0
  243. package/tests/cypress/e2e/uat/features/roles/editor-role.cy.ts +210 -0
  244. package/tests/cypress/e2e/uat/features/roles/member-restrictions.bdd.md +450 -0
  245. package/tests/cypress/e2e/uat/features/roles/member-restrictions.cy.ts +189 -0
  246. package/tests/cypress/e2e/uat/features/roles/owner-full-crud.bdd.md +530 -0
  247. package/tests/cypress/e2e/uat/features/roles/owner-full-crud.cy.ts +247 -0
  248. package/tests/cypress/fixtures/blocks.json +218 -0
  249. package/tests/cypress/fixtures/entities.json +87 -0
  250. package/tests/cypress/fixtures/page-builder.json +21 -0
  251. package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
  252. package/tests/cypress/src/components/CustomersPOM.ts +439 -0
  253. package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
  254. package/tests/cypress/src/components/EntityForm.ts +375 -0
  255. package/tests/cypress/src/components/EntityList.ts +389 -0
  256. package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
  257. package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
  258. package/tests/cypress/src/components/PostsListPOM.ts +223 -0
  259. package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
  260. package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
  261. package/tests/cypress/src/components/TasksPOM.ts +272 -0
  262. package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
  263. package/tests/cypress/src/components/index.ts +21 -0
  264. package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
  265. package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
  266. package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
  267. package/tests/cypress/src/controllers/MediaAPIController.js +231 -0
  268. package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
  269. package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
  270. package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
  271. package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
  272. package/tests/cypress/src/controllers/index.js +25 -0
  273. package/tests/cypress/src/core/AuthPOM.ts +450 -0
  274. package/tests/cypress/src/core/BasePOM.ts +33 -0
  275. package/tests/cypress/src/core/BlockEditorBasePOM.ts +874 -0
  276. package/tests/cypress/src/core/DashboardEntityPOM.ts +41 -0
  277. package/tests/cypress/src/core/index.ts +14 -0
  278. package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
  279. package/tests/cypress/src/entities/PagesPOM.ts +137 -0
  280. package/tests/cypress/src/entities/PatternsPOM.ts +329 -0
  281. package/tests/cypress/src/entities/PostsPOM.ts +137 -0
  282. package/tests/cypress/src/entities/TasksPOM.ts +246 -0
  283. package/tests/cypress/src/entities/index.ts +16 -0
  284. package/tests/cypress/src/features/BillingPOM.ts +385 -0
  285. package/tests/cypress/src/features/DashboardPOM.ts +271 -0
  286. package/tests/cypress/src/features/DevtoolsPOM.ts +750 -0
  287. package/tests/cypress/src/features/PageBuilderPOM.ts +283 -0
  288. package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
  289. package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
  290. package/tests/cypress/src/features/SettingsPOM.ts +707 -0
  291. package/tests/cypress/src/features/SuperadminPOM.ts +851 -0
  292. package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
  293. package/tests/cypress/src/features/index.ts +28 -0
  294. package/tests/cypress/src/helpers/ApiInterceptor.ts +20 -0
  295. package/tests/cypress/src/index.ts +101 -0
  296. package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
  297. package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
  298. package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
  299. package/tests/cypress/src/pages/dashboard/index.js +6 -0
  300. package/tests/cypress/src/pages/index.js +5 -0
  301. package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
  302. package/tests/cypress/src/pages/public/LandingPage.js +69 -0
  303. package/tests/cypress/src/pages/public/PricingPage.js +33 -0
  304. package/tests/cypress/src/pages/public/index.js +6 -0
  305. package/tests/cypress/src/selectors.ts +46 -0
  306. package/tests/cypress/src/session-helpers.ts +518 -0
  307. package/tests/cypress/support/doc-commands.ts +260 -0
  308. package/tests/cypress/support/e2e.ts +90 -0
  309. package/tests/cypress.config.ts +178 -0
  310. package/tests/jest/__mocks__/@nextsparkjs/core/components/ui/badge.js +16 -0
  311. package/tests/jest/__mocks__/@nextsparkjs/core/lib/db.js +11 -0
  312. package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +160 -0
  313. package/tests/jest/__mocks__/@nextsparkjs/registries/theme-registry.ts +68 -0
  314. package/tests/jest/__mocks__/jose.js +22 -0
  315. package/tests/jest/__mocks__/next/image.js +15 -0
  316. package/tests/jest/__mocks__/next-server.js +56 -0
  317. package/tests/jest/components/post-header.test.tsx +377 -0
  318. package/tests/jest/jest.config.cjs +154 -0
  319. package/tests/jest/langchain/COVERAGE.md +372 -0
  320. package/tests/jest/langchain/guardrails.test.ts +465 -0
  321. package/tests/jest/langchain/streaming.test.ts +370 -0
  322. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  323. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  324. package/tests/jest/langchain/tracer.test.ts +823 -0
  325. package/tests/jest/services/tasks.service.test.ts +707 -0
  326. package/tests/jest/setup.ts +170 -0
  327. package/tests/jest/tsconfig.jest.json +6 -0
  328. package/tests/jest/validation/categories.test.ts +429 -0
  329. package/tests/jest/validation/posts.test.ts +546 -0
  330. package/tests/tsconfig.json +21 -0
  331. /package/docs/{02-features → public/02-features}/01-components.md +0 -0
  332. /package/docs/{02-features → public/02-features}/02-styling.md +0 -0
@@ -0,0 +1,354 @@
1
+ ---
2
+ feature: Auth UI Selectors Validation
3
+ priority: high
4
+ tags: [selectors, auth, ui-validation]
5
+ grepTags: [ui-selectors, auth, SEL_AUTH_001, SEL_AUTH_002, SEL_AUTH_003, SEL_AUTH_004, SEL_AUTH_005, SEL_AUTH_006, SEL_AUTH_007]
6
+ coverage: 7
7
+ ---
8
+
9
+ # Auth UI Selectors Validation
10
+
11
+ > Validates that authentication component selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality. Runs as Phase 12 sub-gate before functional tests.
12
+
13
+ ## @test SEL_AUTH_001: Login Card Structure
14
+
15
+ ### Metadata
16
+ - **Priority:** High
17
+ - **Type:** Selector Validation
18
+ - **Tags:** login, card, structure
19
+ - **Grep:** `@ui-selectors` `@SEL_AUTH_001`
20
+ - **Status:** Active - 6 tests
21
+
22
+ ```gherkin:en
23
+ Scenario: Login page has complete card structure
24
+
25
+ Given I navigate to the login page
26
+ And the login card is visible
27
+ Then I should find the login card element
28
+ And I should find the login header
29
+ And I should find the login footer
30
+ And I should find the signup link
31
+ And I should find the Google signin button
32
+ And I should find the show email button
33
+ ```
34
+
35
+ ```gherkin:es
36
+ Scenario: Pagina de login tiene estructura de card completa
37
+
38
+ Given navego a la pagina de login
39
+ And la card de login esta visible
40
+ Then deberia encontrar el elemento card de login
41
+ And deberia encontrar el header de login
42
+ And deberia encontrar el footer de login
43
+ And deberia encontrar el link de signup
44
+ And deberia encontrar el boton de Google signin
45
+ And deberia encontrar el boton de mostrar email
46
+ ```
47
+
48
+ ### Expected Results
49
+ - `auth.login.card` selector exists
50
+ - `auth.login.header` selector exists
51
+ - `auth.login.footer` selector exists
52
+ - `auth.login.signupLink` selector exists
53
+ - `auth.login.googleButton` selector exists
54
+ - `auth.login.showEmailButton` selector exists
55
+
56
+ ---
57
+
58
+ ## @test SEL_AUTH_002: Login Form Inputs
59
+
60
+ ### Metadata
61
+ - **Priority:** High
62
+ - **Type:** Selector Validation
63
+ - **Tags:** login, form, inputs
64
+ - **Grep:** `@ui-selectors` `@SEL_AUTH_002`
65
+ - **Status:** Active - 11 tests
66
+
67
+ ```gherkin:en
68
+ Scenario: Login form has all required input selectors
69
+
70
+ Given I navigate to the login page
71
+ And I click the show email button
72
+ And the login form is visible
73
+ Then I should find the login form element
74
+ And I should find the email input
75
+ And I should find the password input
76
+ And I should find the submit button
77
+ And I should find the forgot password link
78
+ And I should find the hide email button
79
+ And I should find the remember checkbox
80
+ When I click submit without filling fields
81
+ Then I should find the email error message
82
+ When I fill email and click submit
83
+ Then I should find the password error message
84
+ When I fill both fields with invalid credentials and submit
85
+ Then I should find the login error alert
86
+ ```
87
+
88
+ ```gherkin:es
89
+ Scenario: Formulario de login tiene todos los selectores de input requeridos
90
+
91
+ Given navego a la pagina de login
92
+ And hago clic en el boton de mostrar email
93
+ And el formulario de login esta visible
94
+ Then deberia encontrar el elemento formulario de login
95
+ And deberia encontrar el input de email
96
+ And deberia encontrar el input de password
97
+ And deberia encontrar el boton de submit
98
+ And deberia encontrar el link de olvide password
99
+ And deberia encontrar el boton de ocultar email
100
+ And deberia encontrar el checkbox de recordar
101
+ When hago clic en submit sin llenar campos
102
+ Then deberia encontrar el mensaje de error de email
103
+ When lleno email y hago clic en submit
104
+ Then deberia encontrar el mensaje de error de password
105
+ When lleno ambos campos con credenciales invalidas y envio
106
+ Then deberia encontrar la alerta de error de login
107
+ ```
108
+
109
+ ### Expected Results
110
+ - `auth.login.form` selector exists
111
+ - `auth.login.options` selector exists
112
+ - `auth.login.emailInput` selector exists
113
+ - `auth.login.passwordInput` selector exists
114
+ - `auth.login.submitButton` selector exists
115
+ - `auth.login.forgotPasswordLink` selector exists
116
+ - `auth.login.hideEmailButton` selector exists
117
+ - `auth.login.rememberCheckbox` selector exists
118
+ - `auth.login.emailError` selector appears on validation failure
119
+ - `auth.login.passwordError` selector appears on validation failure
120
+ - `auth.login.error` selector appears after failed login attempt
121
+
122
+ ---
123
+
124
+ ## @test SEL_AUTH_003: Signup Form
125
+
126
+ ### Metadata
127
+ - **Priority:** High
128
+ - **Type:** Selector Validation
129
+ - **Tags:** signup, form, inputs
130
+ - **Grep:** `@ui-selectors` `@SEL_AUTH_003`
131
+ - **Status:** Partial - 9 passing, 1 skipped (Google button)
132
+
133
+ ```gherkin:en
134
+ Scenario: Signup form has all required input selectors
135
+
136
+ Given I navigate to the signup page
137
+ And the signup form is visible
138
+ Then I should find the signup form element
139
+ And I should find the first name input
140
+ And I should find the last name input
141
+ And I should find the email input
142
+ And I should find the password input
143
+ And I should find the confirm password input
144
+ And I should find the submit button
145
+ And I should find the Google signup button
146
+ And I should find the login link
147
+ When I fill the form with an existing email and submit
148
+ Then I should find the signup error message
149
+ ```
150
+
151
+ ```gherkin:es
152
+ Scenario: Formulario de signup tiene todos los selectores de input requeridos
153
+
154
+ Given navego a la pagina de signup
155
+ And el formulario de signup esta visible
156
+ Then deberia encontrar el elemento formulario de signup
157
+ And deberia encontrar el input de nombre
158
+ And deberia encontrar el input de apellido
159
+ And deberia encontrar el input de email
160
+ And deberia encontrar el input de password
161
+ And deberia encontrar el input de confirmar password
162
+ And deberia encontrar el boton de submit
163
+ And deberia encontrar el boton de Google signup
164
+ And deberia encontrar el link de login
165
+ When lleno el formulario con un email existente y envio
166
+ Then deberia encontrar el mensaje de error de signup
167
+ ```
168
+
169
+ ### Expected Results
170
+ - `auth.signup.form` selector exists
171
+ - `auth.signup.firstNameInput` selector exists
172
+ - `auth.signup.lastNameInput` selector exists
173
+ - `auth.signup.emailInput` selector exists
174
+ - `auth.signup.passwordInput` selector exists
175
+ - `auth.signup.confirmPasswordInput` selector exists
176
+ - `auth.signup.submitButton` selector exists
177
+ - `auth.signup.googleButton` selector exists
178
+ - `auth.signup.loginLink` selector exists
179
+ - `auth.signup.error` selector appears when email already exists
180
+
181
+ ---
182
+
183
+ ## @test SEL_AUTH_004: Forgot Password
184
+
185
+ ### Metadata
186
+ - **Priority:** Medium
187
+ - **Type:** Selector Validation
188
+ - **Tags:** forgot-password, form
189
+ - **Grep:** `@ui-selectors` `@SEL_AUTH_004`
190
+ - **Status:** Partial - 4 passing, 4 skipped (require states)
191
+
192
+ ```gherkin:en
193
+ Scenario: Forgot password page has all required selectors
194
+
195
+ Given I navigate to the forgot password page
196
+ And the forgot password form is visible
197
+ Then I should find the forgot password form element
198
+ And I should find the email input
199
+ And I should find the submit button
200
+ And I should find the back to login link
201
+ ```
202
+
203
+ ```gherkin:es
204
+ Scenario: Pagina de olvide password tiene todos los selectores requeridos
205
+
206
+ Given navego a la pagina de olvide password
207
+ And el formulario de olvide password esta visible
208
+ Then deberia encontrar el elemento formulario de olvide password
209
+ And deberia encontrar el input de email
210
+ And deberia encontrar el boton de submit
211
+ And deberia encontrar el link de volver a login
212
+ ```
213
+
214
+ ### Expected Results
215
+ - `auth.forgotPassword.form` selector exists
216
+ - `auth.forgotPassword.emailInput` selector exists
217
+ - `auth.forgotPassword.submitButton` selector exists
218
+ - `auth.forgotPassword.backLink` selector exists
219
+
220
+ ### Skipped Tests (require specific states)
221
+ - `auth.forgotPassword.success` - requires successful email submission
222
+ - `auth.forgotPassword.successBackLink` - requires success state
223
+ - `auth.forgotPassword.retryButton` - requires success state
224
+ - `auth.forgotPassword.error` - requires server error
225
+
226
+ ---
227
+
228
+ ## @test SEL_AUTH_005: DevKeyring
229
+
230
+ ### Metadata
231
+ - **Priority:** Medium
232
+ - **Type:** Selector Validation
233
+ - **Tags:** devkeyring, development
234
+ - **Grep:** `@ui-selectors` `@SEL_AUTH_005`
235
+ - **Status:** Active - 4 tests
236
+
237
+ ```gherkin:en
238
+ Scenario: DevKeyring component has all required selectors
239
+
240
+ Given I navigate to the login page
241
+ And the login card is visible
242
+ Then I should find the devkeyring container
243
+ And I should find the devkeyring trigger
244
+ When I click the devkeyring trigger
245
+ Then I should find the devkeyring content
246
+ And I should find at least one devkeyring user option
247
+ ```
248
+
249
+ ```gherkin:es
250
+ Scenario: Componente DevKeyring tiene todos los selectores requeridos
251
+
252
+ Given navego a la pagina de login
253
+ And la card de login esta visible
254
+ Then deberia encontrar el contenedor de devkeyring
255
+ And deberia encontrar el trigger de devkeyring
256
+ When hago clic en el trigger de devkeyring
257
+ Then deberia encontrar el contenido de devkeyring
258
+ And deberia encontrar al menos una opcion de usuario de devkeyring
259
+ ```
260
+
261
+ ### Expected Results
262
+ - `auth.devKeyring.container` selector exists
263
+ - `auth.devKeyring.trigger` selector exists
264
+ - `auth.devKeyring.content` selector exists when opened
265
+ - `auth.devKeyring.user(0)` selector exists (at least one user)
266
+
267
+ ---
268
+
269
+ ## @test SEL_AUTH_006: Reset Password
270
+
271
+ ### Metadata
272
+ - **Priority:** Low
273
+ - **Type:** Selector Validation
274
+ - **Tags:** reset-password, form
275
+ - **Grep:** `@ui-selectors` `@SEL_AUTH_006`
276
+ - **Status:** Skipped - requires valid reset token
277
+
278
+ ```gherkin:en
279
+ Scenario: Reset password page has all required selectors
280
+
281
+ Given I have a valid password reset token
282
+ And I navigate to the reset password page with the token
283
+ Then I should find the reset password form element
284
+ And I should find the password input
285
+ And I should find the confirm password input
286
+ And I should find the submit button
287
+ ```
288
+
289
+ ```gherkin:es
290
+ Scenario: Pagina de reset password tiene todos los selectores requeridos
291
+
292
+ Given tengo un token valido de reset password
293
+ And navego a la pagina de reset password con el token
294
+ Then deberia encontrar el elemento formulario de reset password
295
+ And deberia encontrar el input de password
296
+ And deberia encontrar el input de confirmar password
297
+ And deberia encontrar el boton de submit
298
+ ```
299
+
300
+ ### Expected Results (when token is valid)
301
+ - `auth.resetPassword.form` selector exists
302
+ - `auth.resetPassword.password` selector exists
303
+ - `auth.resetPassword.confirmPassword` selector exists
304
+ - `auth.resetPassword.submitButton` selector exists
305
+ - `auth.resetPassword.error` selector appears on validation failure
306
+
307
+ ### Notes
308
+ All tests in this section are skipped because they require a valid reset token which cannot be generated in automated tests without email access.
309
+
310
+ ---
311
+
312
+ ## @test SEL_AUTH_007: Verify Email
313
+
314
+ ### Metadata
315
+ - **Priority:** Low
316
+ - **Type:** Selector Validation
317
+ - **Tags:** verify-email, email
318
+ - **Grep:** `@ui-selectors` `@SEL_AUTH_007`
319
+ - **Status:** Skipped - requires pending verification state
320
+
321
+ ```gherkin:en
322
+ Scenario: Verify email page has all required selectors
323
+
324
+ Given I have just signed up and need to verify email
325
+ And I am on the verify email page
326
+ Then I should find the verify email container
327
+ And I should find the resend button
328
+ When verification is complete
329
+ Then I should find the success message
330
+ When verification fails
331
+ Then I should find the error message
332
+ ```
333
+
334
+ ```gherkin:es
335
+ Scenario: Pagina de verificar email tiene todos los selectores requeridos
336
+
337
+ Given acabo de registrarme y necesito verificar email
338
+ And estoy en la pagina de verificar email
339
+ Then deberia encontrar el contenedor de verificar email
340
+ And deberia encontrar el boton de reenviar
341
+ When la verificacion se completa
342
+ Then deberia encontrar el mensaje de exito
343
+ When la verificacion falla
344
+ Then deberia encontrar el mensaje de error
345
+ ```
346
+
347
+ ### Expected Results (when in verification state)
348
+ - `auth.verifyEmail.container` selector exists
349
+ - `auth.verifyEmail.resendButton` selector exists
350
+ - `auth.verifyEmail.success` selector appears on successful verification
351
+ - `auth.verifyEmail.error` selector appears on verification failure
352
+
353
+ ### Notes
354
+ All tests in this section are skipped because they require a pending email verification state which cannot be reliably set up in automated tests.
@@ -0,0 +1,310 @@
1
+ /**
2
+ * UI Selectors Validation: Authentication
3
+ *
4
+ * This test validates that authentication component selectors exist in the DOM.
5
+ * This is a lightweight test that ONLY checks selector presence, not functionality.
6
+ *
7
+ * Purpose:
8
+ * - Validate AuthPOM selectors work correctly
9
+ * - Ensure all auth.* selectors from CORE_SELECTORS are implemented
10
+ * - Run as Phase 12 sub-gate before functional tests
11
+ *
12
+ * Scope:
13
+ * - Navigate to auth pages (NO login required - public pages)
14
+ * - Assert elements exist in DOM (no form submissions)
15
+ * - Fast execution (< 30 seconds per describe block)
16
+ *
17
+ * Test IDs:
18
+ * - SEL_AUTH_001: Login Card Structure
19
+ * - SEL_AUTH_002: Login Form Inputs
20
+ * - SEL_AUTH_003: Signup Form
21
+ * - SEL_AUTH_004: Forgot Password
22
+ * - SEL_AUTH_005: DevKeyring
23
+ * - SEL_AUTH_006: Reset Password (skipped - requires token)
24
+ * - SEL_AUTH_007: Verify Email (skipped - requires state)
25
+ */
26
+
27
+ import { AuthPOM } from '../../../src/core/AuthPOM'
28
+
29
+ describe('Auth Selectors Validation', { tags: ['@ui-selectors', '@auth'] }, () => {
30
+ const auth = AuthPOM.create()
31
+
32
+ // ============================================
33
+ // SEL_AUTH_001: LOGIN CARD STRUCTURE
34
+ // ============================================
35
+ describe('SEL_AUTH_001: Login Card Structure', { tags: '@SEL_AUTH_001' }, () => {
36
+ beforeEach(() => {
37
+ auth.visitLogin()
38
+ cy.get(auth.selectors.loginCard, { timeout: 10000 }).should('be.visible')
39
+ })
40
+
41
+ it('should find login card', () => {
42
+ cy.get(auth.selectors.loginCard).should('exist')
43
+ })
44
+
45
+ it('should find login header', () => {
46
+ cy.get(auth.selectors.loginHeader).should('exist')
47
+ })
48
+
49
+ it('should find login footer', () => {
50
+ cy.get(auth.selectors.loginFooter).should('exist')
51
+ })
52
+
53
+ it('should find signup link', () => {
54
+ cy.get(auth.selectors.loginSignupLink).should('exist')
55
+ })
56
+
57
+ it('should find Google signin button', () => {
58
+ cy.get(auth.selectors.loginGoogle).should('exist')
59
+ })
60
+
61
+ it('should find show email button', () => {
62
+ cy.get(auth.selectors.loginShowEmail).should('exist')
63
+ })
64
+
65
+ it.skip('should find invite banner (requires invite token)', () => {
66
+ cy.get(auth.selectors.loginInviteBanner).should('exist')
67
+ })
68
+ })
69
+
70
+ // ============================================
71
+ // SEL_AUTH_002: LOGIN FORM INPUTS
72
+ // ============================================
73
+ describe('SEL_AUTH_002: Login Form Inputs', { tags: '@SEL_AUTH_002' }, () => {
74
+ beforeEach(() => {
75
+ auth.visitLogin()
76
+ cy.get(auth.selectors.loginCard, { timeout: 10000 }).should('be.visible')
77
+ cy.get(auth.selectors.loginShowEmail).click()
78
+ cy.get(auth.selectors.loginForm, { timeout: 5000 }).should('be.visible')
79
+ })
80
+
81
+ it('should find login form', () => {
82
+ cy.get(auth.selectors.loginForm).should('exist')
83
+ })
84
+
85
+ it('should find login options', () => {
86
+ cy.get(auth.selectors.loginOptions).should('exist')
87
+ })
88
+
89
+ it('should find email input', () => {
90
+ cy.get(auth.selectors.loginEmail).should('exist')
91
+ })
92
+
93
+ it('should find password input', () => {
94
+ cy.get(auth.selectors.loginPassword).should('exist')
95
+ })
96
+
97
+ it('should find submit button', () => {
98
+ cy.get(auth.selectors.loginSubmit).should('exist')
99
+ })
100
+
101
+ it('should find forgot password link', () => {
102
+ cy.get(auth.selectors.loginForgotPassword).should('exist')
103
+ })
104
+
105
+ it('should find hide email button', () => {
106
+ cy.get(auth.selectors.loginHideEmail).should('exist')
107
+ })
108
+
109
+ it('should find remember checkbox', () => {
110
+ cy.get(auth.selectors.loginRememberCheckbox).should('exist')
111
+ })
112
+
113
+ it('should find email error when validation fails', () => {
114
+ cy.get(auth.selectors.loginSubmit).click()
115
+ cy.get(auth.selectors.loginEmailError).should('exist')
116
+ })
117
+
118
+ it('should find password error when validation fails', () => {
119
+ cy.get(auth.selectors.loginEmail).type('test@example.com')
120
+ cy.get(auth.selectors.loginSubmit).click()
121
+ cy.get(auth.selectors.loginPasswordError).should('exist')
122
+ })
123
+
124
+ it('should find error alert after failed login', () => {
125
+ cy.get(auth.selectors.loginEmail).type('nonexistent@example.com')
126
+ cy.get(auth.selectors.loginPassword).type('wrongpassword')
127
+ cy.get(auth.selectors.loginSubmit).click()
128
+ cy.get(auth.selectors.loginError, { timeout: 10000 }).should('exist')
129
+ })
130
+ })
131
+
132
+ // ============================================
133
+ // SEL_AUTH_003: SIGNUP FORM
134
+ // ============================================
135
+ describe('SEL_AUTH_003: Signup Form', { tags: '@SEL_AUTH_003' }, () => {
136
+ beforeEach(() => {
137
+ auth.visitSignup()
138
+ auth.waitForSignupForm()
139
+ })
140
+
141
+ it('should find signup form', () => {
142
+ cy.get(auth.selectors.signupForm).should('exist')
143
+ })
144
+
145
+ it('should find first name input', () => {
146
+ cy.get(auth.selectors.signupFirstName).should('exist')
147
+ })
148
+
149
+ it('should find last name input', () => {
150
+ cy.get(auth.selectors.signupLastName).should('exist')
151
+ })
152
+
153
+ it('should find email input', () => {
154
+ cy.get(auth.selectors.signupEmail).should('exist')
155
+ })
156
+
157
+ it('should find password input', () => {
158
+ cy.get(auth.selectors.signupPassword).should('exist')
159
+ })
160
+
161
+ it('should find confirm password input', () => {
162
+ cy.get(auth.selectors.signupConfirmPassword).should('exist')
163
+ })
164
+
165
+ it('should find submit button', () => {
166
+ cy.get(auth.selectors.signupSubmit).should('exist')
167
+ })
168
+
169
+ it('should find Google signup button', () => {
170
+ cy.get(auth.selectors.signupGoogle).should('exist')
171
+ })
172
+
173
+ it('should find login link', () => {
174
+ cy.get(auth.selectors.signupLoginLink).should('exist')
175
+ })
176
+
177
+ it.skip('should find invite banner (requires invite token)', () => {
178
+ cy.get(auth.selectors.signupInviteBanner).should('exist')
179
+ })
180
+
181
+ it('should find error message when email already exists', () => {
182
+ const existingEmail = Cypress.env('DEVELOPER_EMAIL') || 'developer@nextspark.dev'
183
+
184
+ cy.get(auth.selectors.signupFirstName).type('Test')
185
+ cy.get(auth.selectors.signupLastName).type('User')
186
+ cy.get(auth.selectors.signupEmail).type(existingEmail)
187
+ cy.get(auth.selectors.signupPassword).type('Test1234!')
188
+ cy.get(auth.selectors.signupConfirmPassword).type('Test1234!')
189
+ cy.get('[data-cy="signup-terms-checkbox"]').click()
190
+ cy.get(auth.selectors.signupSubmit).click()
191
+ cy.get(auth.selectors.signupError, { timeout: 10000 }).should('exist')
192
+ })
193
+ })
194
+
195
+ // ============================================
196
+ // SEL_AUTH_004: FORGOT PASSWORD
197
+ // ============================================
198
+ describe('SEL_AUTH_004: Forgot Password', { tags: '@SEL_AUTH_004' }, () => {
199
+ beforeEach(() => {
200
+ auth.visitForgotPassword()
201
+ cy.get(auth.selectors.forgotPasswordForm, { timeout: 10000 }).should('be.visible')
202
+ })
203
+
204
+ it('should find forgot password form', () => {
205
+ cy.get(auth.selectors.forgotPasswordForm).should('exist')
206
+ })
207
+
208
+ it('should find email input', () => {
209
+ cy.get(auth.selectors.forgotPasswordEmail).should('exist')
210
+ })
211
+
212
+ it('should find submit button', () => {
213
+ cy.get(auth.selectors.forgotPasswordSubmit).should('exist')
214
+ })
215
+
216
+ it('should find back to login link', () => {
217
+ cy.get(auth.selectors.forgotPasswordBack).should('exist')
218
+ })
219
+
220
+ it.skip('should find success message (requires successful submission)', () => {
221
+ cy.get(auth.selectors.forgotPasswordSuccess).should('exist')
222
+ })
223
+
224
+ it.skip('should find success back link (requires success state)', () => {
225
+ cy.get(auth.selectors.forgotPasswordSuccessBack).should('exist')
226
+ })
227
+
228
+ it.skip('should find retry button (requires success state)', () => {
229
+ cy.get(auth.selectors.forgotPasswordRetry).should('exist')
230
+ })
231
+
232
+ it.skip('should find error message (requires server error)', () => {
233
+ cy.get(auth.selectors.forgotPasswordError).should('exist')
234
+ })
235
+ })
236
+
237
+ // ============================================
238
+ // SEL_AUTH_005: DEVKEYRING
239
+ // ============================================
240
+ describe('SEL_AUTH_005: DevKeyring', { tags: '@SEL_AUTH_005' }, () => {
241
+ beforeEach(() => {
242
+ auth.visitLogin()
243
+ cy.get(auth.selectors.loginCard, { timeout: 10000 }).should('be.visible')
244
+ })
245
+
246
+ it('should find devkeyring container', () => {
247
+ cy.get(auth.selectors.devKeyring).should('exist')
248
+ })
249
+
250
+ it('should find devkeyring trigger', () => {
251
+ cy.get(auth.selectors.devKeyringTrigger).should('exist')
252
+ })
253
+
254
+ it('should find devkeyring content when opened', () => {
255
+ auth.openDevKeyring()
256
+ cy.get(auth.selectors.devKeyringContent).should('be.visible')
257
+ })
258
+
259
+ it('should find devkeyring user options', () => {
260
+ auth.openDevKeyring()
261
+ cy.get(auth.selectors.devKeyringUser(0)).should('exist')
262
+ })
263
+ })
264
+
265
+ // ============================================
266
+ // SEL_AUTH_006: RESET PASSWORD (skipped - requires token)
267
+ // ============================================
268
+ describe('SEL_AUTH_006: Reset Password', { tags: '@SEL_AUTH_006' }, () => {
269
+ it.skip('should find reset password form (requires valid token)', () => {
270
+ cy.get(auth.selectors.resetPasswordForm).should('exist')
271
+ })
272
+
273
+ it.skip('should find password input (requires valid token)', () => {
274
+ cy.get(auth.selectors.resetPasswordPassword).should('exist')
275
+ })
276
+
277
+ it.skip('should find confirm password input (requires valid token)', () => {
278
+ cy.get(auth.selectors.resetPasswordConfirm).should('exist')
279
+ })
280
+
281
+ it.skip('should find submit button (requires valid token)', () => {
282
+ cy.get(auth.selectors.resetPasswordSubmit).should('exist')
283
+ })
284
+
285
+ it.skip('should find error message (requires valid token)', () => {
286
+ cy.get(auth.selectors.resetPasswordError).should('exist')
287
+ })
288
+ })
289
+
290
+ // ============================================
291
+ // SEL_AUTH_007: VERIFY EMAIL (skipped - requires state)
292
+ // ============================================
293
+ describe('SEL_AUTH_007: Verify Email', { tags: '@SEL_AUTH_007' }, () => {
294
+ it.skip('should find verify email container (requires pending verification)', () => {
295
+ cy.get(auth.selectors.verifyEmailContainer).should('exist')
296
+ })
297
+
298
+ it.skip('should find resend button (requires pending verification)', () => {
299
+ cy.get(auth.selectors.verifyEmailResend).should('exist')
300
+ })
301
+
302
+ it.skip('should find success message (requires verification complete)', () => {
303
+ cy.get(auth.selectors.verifyEmailSuccess).should('exist')
304
+ })
305
+
306
+ it.skip('should find error message (requires verification failure)', () => {
307
+ cy.get(auth.selectors.verifyEmailError).should('exist')
308
+ })
309
+ })
310
+ })