@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,131 @@
1
+ /// <reference types="cypress" />
2
+
3
+ import * as allure from 'allure-cypress'
4
+
5
+ /**
6
+ * Registration Control Tests - Open Mode
7
+ *
8
+ * Verifies registration mode enforcement when mode is 'open'.
9
+ * Tests: signup accessibility, login page elements, API signup allowed.
10
+ *
11
+ * These tests detect the current registration mode and skip if not 'open'.
12
+ */
13
+ describe('Registration Control - Open Mode', {
14
+ tags: ['@uat', '@feat-auth', '@security', '@regression']
15
+ }, () => {
16
+ const TEST_PASSWORD = Cypress.env('TEST_PASSWORD') || 'Test1234'
17
+
18
+ before(() => {
19
+ // Detect registration mode by checking if /signup is accessible (not redirected)
20
+ cy.request({
21
+ url: '/signup',
22
+ followRedirect: false,
23
+ failOnStatusCode: false,
24
+ }).then((response) => {
25
+ // In open mode, /signup returns 200 (not a redirect)
26
+ // In domain-restricted or invitation-only (with existing team), it redirects (307/308)
27
+ if (response.status >= 300 && response.status < 400) {
28
+ // Not open mode — skip all tests in this suite
29
+ Cypress.runner.stop()
30
+ }
31
+ // Additionally verify that the login page shows a signup link (confirms open mode)
32
+ })
33
+ })
34
+
35
+ beforeEach(() => {
36
+ allure.epic('UAT')
37
+ allure.feature('Registration Control')
38
+ cy.clearCookies()
39
+ cy.clearLocalStorage()
40
+ })
41
+
42
+ describe('REG_OPEN_001: Signup page is accessible in open mode', () => {
43
+ it('should show the signup form without redirecting', () => {
44
+ allure.story('Signup Accessibility')
45
+ allure.severity('critical')
46
+
47
+ cy.log('1. Visit /signup')
48
+ cy.visit('/signup')
49
+
50
+ cy.log('2. Should stay on /signup (no redirect)')
51
+ cy.url().should('include', '/signup')
52
+
53
+ cy.log('3. Signup form should be visible')
54
+ cy.get('form').should('exist')
55
+ })
56
+ })
57
+
58
+ describe('REG_OPEN_002: Login page shows email login and signup link', () => {
59
+ it('should show email login form and signup link', () => {
60
+ allure.story('Login Page Visibility')
61
+ allure.severity('critical')
62
+
63
+ cy.log('1. Visit /login')
64
+ cy.visit('/login')
65
+
66
+ cy.log('2. Email login should be available')
67
+ // Either the form is visible directly, or a "show email" toggle exists
68
+ cy.get('body').then(($body) => {
69
+ if ($body.find('[data-cy="auth.login.showEmail"]').length) {
70
+ cy.get('[data-cy="auth.login.showEmail"]').click()
71
+ }
72
+ })
73
+ cy.get('[data-cy="auth.login.form"]').should('exist')
74
+
75
+ cy.log('3. Signup link should be visible')
76
+ cy.get('[data-cy="auth.login.signupLink"]').should('be.visible')
77
+ })
78
+ })
79
+
80
+ describe('REG_OPEN_003: API allows email signup in open mode', () => {
81
+ it('should allow new user registration via email', () => {
82
+ allure.story('API Signup Allowed')
83
+ allure.severity('critical')
84
+
85
+ const uniqueEmail = `test-open-${Date.now()}@test-cypress.dev`
86
+
87
+ cy.log(`1. POST /api/auth/sign-up/email with new user: ${uniqueEmail}`)
88
+ cy.request({
89
+ method: 'POST',
90
+ url: '/api/auth/sign-up/email',
91
+ body: {
92
+ name: 'Test Open Mode User',
93
+ email: uniqueEmail,
94
+ password: TEST_PASSWORD,
95
+ },
96
+ failOnStatusCode: false,
97
+ }).then((response) => {
98
+ cy.log(`Response status: ${response.status}`)
99
+ // Open mode should allow signup (200) or require email verification (200 with token)
100
+ // Should NOT be 403 (blocked)
101
+ expect(response.status).to.not.eq(403)
102
+ expect(response.status).to.be.oneOf([200, 201])
103
+ })
104
+ })
105
+ })
106
+
107
+ describe('REG_OPEN_004: Existing user can login with email+password', () => {
108
+ it('should allow existing user to sign in via API', () => {
109
+ allure.story('Existing User Login')
110
+ allure.severity('critical')
111
+
112
+ cy.log('1. POST /api/auth/sign-in/email with existing user')
113
+ cy.request({
114
+ method: 'POST',
115
+ url: '/api/auth/sign-in/email',
116
+ body: {
117
+ email: Cypress.env('OWNER_EMAIL') || 'carlos.mendoza@nextspark.dev',
118
+ password: TEST_PASSWORD,
119
+ },
120
+ failOnStatusCode: false,
121
+ }).then((response) => {
122
+ cy.log(`Response status: ${response.status}`)
123
+ expect(response.status).to.eq(200)
124
+ })
125
+ })
126
+ })
127
+
128
+ after(() => {
129
+ cy.log('Registration control (open mode) tests completed')
130
+ })
131
+ })
@@ -0,0 +1,140 @@
1
+ /// <reference types="cypress" />
2
+
3
+ import * as allure from 'allure-cypress'
4
+
5
+ import { DEFAULT_THEME_USERS } from '../../../../src/session-helpers'
6
+
7
+ /**
8
+ * Registration Control Tests
9
+ *
10
+ * Verifies registration mode enforcement in domain-restricted mode (default theme).
11
+ * Tests: signup redirect, login page visibility, API blocking, existing user login.
12
+ */
13
+ describe('Registration Control - Domain Restricted Mode', {
14
+ tags: ['@uat', '@feat-auth', '@security', '@regression']
15
+ }, () => {
16
+ const TEST_PASSWORD = Cypress.env('TEST_PASSWORD') || 'Test1234'
17
+
18
+ beforeEach(() => {
19
+ allure.epic('UAT')
20
+ allure.feature('Registration Control')
21
+ cy.clearCookies()
22
+ cy.clearLocalStorage()
23
+ })
24
+
25
+ describe('REG_001: Signup page redirects in domain-restricted mode', () => {
26
+ it('should redirect /signup to /login', () => {
27
+ allure.story('Signup Redirect')
28
+ allure.severity('critical')
29
+
30
+ cy.log('1. Visit /signup')
31
+ cy.visit('/signup', { failOnStatusCode: false })
32
+
33
+ cy.log('2. Should redirect to /login')
34
+ cy.url().should('include', '/login')
35
+ })
36
+ })
37
+
38
+ describe('REG_002: Login page hides email login in domain-restricted mode', () => {
39
+ it('should show Google button but hide email login options', () => {
40
+ allure.story('Login Page Visibility')
41
+ allure.severity('critical')
42
+
43
+ cy.log('1. Visit /login')
44
+ cy.visit('/login')
45
+
46
+ cy.log('2. Google sign-in button should be visible')
47
+ cy.get('[data-cy="auth.login.googleSignin"]').should('be.visible')
48
+
49
+ cy.log('3. "Show email" link should NOT exist')
50
+ cy.get('[data-cy="auth.login.showEmail"]').should('not.exist')
51
+
52
+ cy.log('4. Email form should NOT exist')
53
+ cy.get('[data-cy="auth.login.form"]').should('not.exist')
54
+
55
+ cy.log('5. Signup link should NOT exist')
56
+ cy.get('[data-cy="auth.login.signupLink"]').should('not.exist')
57
+ })
58
+ })
59
+
60
+ describe('REG_003: API blocks email signup in domain-restricted mode', () => {
61
+ it('should return 403 for email signup attempt', () => {
62
+ allure.story('API Signup Blocking')
63
+ allure.severity('critical')
64
+
65
+ cy.log('1. POST /api/auth/sign-up/email with new user data')
66
+ cy.request({
67
+ method: 'POST',
68
+ url: '/api/auth/sign-up/email',
69
+ body: {
70
+ name: 'Test New User',
71
+ email: 'newuser@unauthorized-domain.com',
72
+ password: 'TestPassword123',
73
+ },
74
+ failOnStatusCode: false,
75
+ }).then((response) => {
76
+ cy.log(`Response status: ${response.status}`)
77
+ expect(response.status).to.eq(403)
78
+ })
79
+ })
80
+ })
81
+
82
+ describe('REG_004: API blocks alternative signup endpoints', () => {
83
+ it('should block signup via alternative endpoints', () => {
84
+ allure.story('API Signup Blocking')
85
+ allure.severity('normal')
86
+
87
+ const signupPayload = {
88
+ name: 'Test New User',
89
+ email: 'newuser@unauthorized-domain.com',
90
+ password: 'TestPassword123',
91
+ }
92
+
93
+ const endpoints = [
94
+ '/api/auth/sign-up/email',
95
+ '/api/auth/sign-up/credentials',
96
+ ]
97
+
98
+ endpoints.forEach((endpoint) => {
99
+ cy.log(`Testing: POST ${endpoint}`)
100
+ cy.request({
101
+ method: 'POST',
102
+ url: endpoint,
103
+ body: signupPayload,
104
+ failOnStatusCode: false,
105
+ }).then((response) => {
106
+ cy.log(`${endpoint} → ${response.status}`)
107
+ // Should be blocked (403 or 404 for non-existent endpoints)
108
+ expect(response.status).to.be.oneOf([403, 404, 422])
109
+ })
110
+ })
111
+ })
112
+ })
113
+
114
+ describe('REG_005: Existing user can still login with email+password', () => {
115
+ it('should allow existing user to sign in via API', () => {
116
+ allure.story('Existing User Login')
117
+ allure.severity('critical')
118
+
119
+ const existingUser = DEFAULT_THEME_USERS.OWNER
120
+
121
+ cy.log(`1. POST /api/auth/sign-in/email with existing user: ${existingUser}`)
122
+ cy.request({
123
+ method: 'POST',
124
+ url: '/api/auth/sign-in/email',
125
+ body: {
126
+ email: existingUser,
127
+ password: TEST_PASSWORD,
128
+ },
129
+ failOnStatusCode: false,
130
+ }).then((response) => {
131
+ cy.log(`Response status: ${response.status}`)
132
+ expect(response.status).to.eq(200)
133
+ })
134
+ })
135
+ })
136
+
137
+ after(() => {
138
+ cy.log('Registration control tests completed')
139
+ })
140
+ })
@@ -0,0 +1,225 @@
1
+ ---
2
+ feature: Admin Team Role Permissions
3
+ priority: critical
4
+ tags: [auth, team-role, admin, permissions, security]
5
+ grepTags: [uat, feat-auth, team-role, admin]
6
+ coverage: 6
7
+ ---
8
+
9
+ # Admin Team Role Permissions
10
+
11
+ > Tests for Admin team role permissions and access control. Admin has full CRUD access to entities but limited team settings and no billing management. Cannot access app-role areas.
12
+
13
+ ## @test ADMIN-PERM-001: Admin Dashboard Access
14
+
15
+ ### Metadata
16
+ - **Priority:** Critical
17
+ - **Type:** Smoke
18
+ - **Tags:** admin, dashboard, navigation
19
+ - **Grep:** `@smoke`
20
+
21
+ ```gherkin:en
22
+ Scenario: Admin can access dashboard with full navigation
23
+
24
+ Given I am logged in as Admin (james.wilson@nextspark.dev)
25
+ When I visit /dashboard
26
+ Then the dashboard container should be visible
27
+ And I should see navigation for customers
28
+ And I should see navigation for tasks
29
+ ```
30
+
31
+ ```gherkin:es
32
+ Scenario: Admin puede acceder al dashboard con navegacion completa
33
+
34
+ Given estoy logueado como Admin (james.wilson@nextspark.dev)
35
+ When visito /dashboard
36
+ Then el contenedor del dashboard deberia estar visible
37
+ And deberia ver navegacion a customers
38
+ And deberia ver navegacion a tasks
39
+ ```
40
+
41
+ ### Expected Results
42
+ - Dashboard loads correctly
43
+ - Navigation items visible
44
+ - No entity restrictions
45
+
46
+ ---
47
+
48
+ ## @test ADMIN-PERM-002: Admin Full Entity Access
49
+
50
+ ### Metadata
51
+ - **Priority:** Critical
52
+ - **Type:** Smoke
53
+ - **Tags:** admin, customers, crud
54
+ - **Grep:** `@smoke`
55
+
56
+ ```gherkin:en
57
+ Scenario: Admin has full CRUD access to customers
58
+
59
+ Given I am logged in as Admin (james.wilson@nextspark.dev)
60
+ When I visit /customers
61
+ Then the create button should be visible
62
+ And the entity list should be visible
63
+ ```
64
+
65
+ ```gherkin:es
66
+ Scenario: Admin tiene acceso CRUD completo a customers
67
+
68
+ Given estoy logueado como Admin (james.wilson@nextspark.dev)
69
+ When visito /customers
70
+ Then el boton de crear deberia estar visible
71
+ And la lista de entidades deberia estar visible
72
+ ```
73
+
74
+ ### Expected Results
75
+ - Full CRUD access to entities
76
+ - Create button visible
77
+ - Edit/Delete available
78
+
79
+ ---
80
+
81
+ ## @test ADMIN-PERM-003: Admin Settings Access
82
+
83
+ ### Metadata
84
+ - **Priority:** High
85
+ - **Type:** Regression
86
+ - **Tags:** admin, settings
87
+
88
+ ```gherkin:en
89
+ Scenario: Admin can access settings with limited options
90
+
91
+ Given I am logged in as Admin (james.wilson@nextspark.dev)
92
+ When I visit /settings
93
+ Then the settings container should be visible
94
+ And the profile tab should be visible
95
+ ```
96
+
97
+ ```gherkin:es
98
+ Scenario: Admin puede acceder a settings con opciones limitadas
99
+
100
+ Given estoy logueado como Admin (james.wilson@nextspark.dev)
101
+ When visito /settings
102
+ Then el contenedor de settings deberia estar visible
103
+ And la pestana de perfil deberia estar visible
104
+ ```
105
+
106
+ ### Expected Results
107
+ - Settings accessible
108
+ - Profile management available
109
+ - Some team settings may be restricted
110
+
111
+ ---
112
+
113
+ ## @test ADMIN-PERM-004: Admin Billing Restricted Access
114
+
115
+ ### Metadata
116
+ - **Priority:** High
117
+ - **Type:** Regression
118
+ - **Tags:** admin, billing, restricted
119
+
120
+ ```gherkin:en
121
+ Scenario: Admin has view-only or no access to billing
122
+
123
+ Given I am logged in as Admin (james.wilson@nextspark.dev)
124
+ When I visit /billing
125
+ Then I should have view-only access or be redirected
126
+ ```
127
+
128
+ ```gherkin:es
129
+ Scenario: Admin tiene acceso solo lectura o sin acceso a billing
130
+
131
+ Given estoy logueado como Admin (james.wilson@nextspark.dev)
132
+ When visito /billing
133
+ Then deberia tener acceso solo lectura o ser redirigido
134
+ ```
135
+
136
+ ### Expected Results
137
+ - Either view-only billing access
138
+ - Or redirect to dashboard
139
+ - No upgrade/payment buttons if accessible
140
+
141
+ ---
142
+
143
+ ## @test ADMIN-PERM-005: Admin Cannot Access Sector7
144
+
145
+ ### Metadata
146
+ - **Priority:** High
147
+ - **Type:** Security
148
+ - **Tags:** admin, sector7, blocked
149
+
150
+ ```gherkin:en
151
+ Scenario: Admin is blocked from Sector7
152
+
153
+ Given I am logged in as Admin (james.wilson@nextspark.dev)
154
+ When I attempt to visit /sector7
155
+ Then I should be redirected away from /sector7
156
+ ```
157
+
158
+ ```gherkin:es
159
+ Scenario: Admin no puede acceder a Sector7
160
+
161
+ Given estoy logueado como Admin (james.wilson@nextspark.dev)
162
+ When intento visitar /sector7
163
+ Then deberia ser redirigido fuera de /sector7
164
+ ```
165
+
166
+ ### Expected Results
167
+ - Access denied to Sector7
168
+ - Redirect to dashboard
169
+
170
+ ---
171
+
172
+ ## @test ADMIN-PERM-006: Admin Cannot Access Dev Zone
173
+
174
+ ### Metadata
175
+ - **Priority:** High
176
+ - **Type:** Security
177
+ - **Tags:** admin, dev-zone, blocked
178
+
179
+ ```gherkin:en
180
+ Scenario: Admin is blocked from Dev Zone
181
+
182
+ Given I am logged in as Admin (james.wilson@nextspark.dev)
183
+ When I attempt to visit /dev
184
+ Then I should be redirected away from /dev
185
+ ```
186
+
187
+ ```gherkin:es
188
+ Scenario: Admin no puede acceder a Dev Zone
189
+
190
+ Given estoy logueado como Admin (james.wilson@nextspark.dev)
191
+ When intento visitar /dev
192
+ Then deberia ser redirigido fuera de /dev
193
+ ```
194
+
195
+ ### Expected Results
196
+ - Access denied to Dev Zone
197
+ - Redirect to dashboard
198
+
199
+ ---
200
+
201
+ ## UI Elements
202
+
203
+ | Element | Selector | Description |
204
+ |---------|----------|-------------|
205
+ | Dashboard Container | `[data-cy="dashboard-container"]` | Main dashboard container |
206
+ | Customers Nav | `[data-cy="sidebar-nav-customers"]` | Customers navigation item |
207
+ | Tasks Nav | `[data-cy="sidebar-nav-tasks"]` | Tasks navigation item |
208
+ | Create Button | `[data-cy="entity-create-button"]` | Entity create button |
209
+ | Entity List | `[data-cy="entity-list-container"]` | Entity list container |
210
+ | Settings Container | `[data-cy="settings-container"]` | Settings page container |
211
+ | Profile Tab | `[data-cy="settings-tab-profile"]` | Profile settings tab |
212
+ | Billing Container | `[data-cy="billing-container"]` | Billing page container |
213
+
214
+ ---
215
+
216
+ ## Summary
217
+
218
+ | Test ID | Block | Description | Tags |
219
+ |---------|-------|-------------|------|
220
+ | ADMIN-PERM-001 | Access | Dashboard with navigation | `@smoke` |
221
+ | ADMIN-PERM-002 | Access | Full CRUD to customers | `@smoke` |
222
+ | ADMIN-PERM-003 | Access | Settings with limits | |
223
+ | ADMIN-PERM-004 | Restricted | View-only billing | |
224
+ | ADMIN-PERM-005 | Blocked | Cannot access Sector7 | |
225
+ | ADMIN-PERM-006 | Blocked | Cannot access Dev Zone | |
@@ -0,0 +1,148 @@
1
+ /// <reference types="cypress" />
2
+
3
+ /**
4
+ * Admin Team Role Login Tests
5
+ *
6
+ * Tests the Admin team role login and specific permissions:
7
+ * - Full CRUD access to entities
8
+ * - Limited team settings access (cannot delete team)
9
+ * - No billing access (owner only)
10
+ * - Member management (limited)
11
+ * - Cannot access /dev or /superadmin (app roles only)
12
+ *
13
+ * Note: Basic login is tested in login-logout.cy.ts
14
+ * This file focuses on Admin-specific permissions and restrictions.
15
+ *
16
+ * Tags: @uat, @feat-auth, @team-role, @admin
17
+ */
18
+
19
+ import * as allure from 'allure-cypress'
20
+
21
+ import { loginAsDefaultAdmin, DEFAULT_THEME_USERS } from '../../../../src/session-helpers'
22
+ import { DashboardPOM } from '../../../../src/features/DashboardPOM'
23
+ import { SettingsPOM } from '../../../../src/features/SettingsPOM'
24
+ import { BillingPOM } from '../../../../src/features/BillingPOM'
25
+ import { SuperadminPOM } from '../../../../src/features/SuperadminPOM'
26
+ import { DevAreaPOM } from '../../../../src/features/DevAreaPOM'
27
+
28
+ describe('Authentication - Admin Team Role Permissions', {
29
+ tags: ['@uat', '@feat-auth', '@team-role', '@admin']
30
+ }, () => {
31
+ const dashboard = DashboardPOM.create()
32
+ const settings = SettingsPOM.create()
33
+ const billing = BillingPOM.create()
34
+ const sector7 = SuperadminPOM.create()
35
+ const devArea = DevAreaPOM.create()
36
+
37
+ beforeEach(() => {
38
+ allure.epic('Authentication')
39
+ allure.feature('Team Roles')
40
+ allure.story('Admin Permissions')
41
+ loginAsDefaultAdmin()
42
+ })
43
+
44
+ describe('ADMIN-PERM-001: Admin Dashboard Access', { tags: '@smoke' }, () => {
45
+ it('should access dashboard with full navigation', { tags: '@smoke' }, () => {
46
+ allure.severity('critical')
47
+
48
+ // 1. Visit dashboard and wait for it to load
49
+ dashboard.visitDashboard()
50
+ dashboard.waitForDashboard()
51
+
52
+ // 2. Validate sidebar navigation items
53
+ dashboard.assertEntityNavVisible('customers')
54
+ dashboard.assertEntityNavVisible('tasks')
55
+
56
+ cy.log(`✅ Admin dashboard access verified (${DEFAULT_THEME_USERS.ADMIN})`)
57
+ })
58
+ })
59
+
60
+ describe('ADMIN-PERM-002: Admin Full Entity Access', { tags: '@smoke' }, () => {
61
+ it('should have full CRUD access to customers', { tags: '@smoke' }, () => {
62
+ allure.severity('critical')
63
+
64
+ // 1. Navigate to customers
65
+ dashboard.visitEntity('customers')
66
+ dashboard.waitForEntityPage('customers')
67
+
68
+ // 2. Validate create button is visible (Admin can create)
69
+ dashboard.assertEntityAddButtonVisible('customers')
70
+
71
+ // 3. Validate table is visible
72
+ dashboard.assertEntityPageVisible('customers')
73
+
74
+ cy.log('✅ Admin has full CRUD access to customers')
75
+ })
76
+ })
77
+
78
+ describe('ADMIN-PERM-003: Admin Settings Access', () => {
79
+ it('should access settings page with limited options', () => {
80
+ allure.severity('high')
81
+
82
+ // 1. Navigate to settings
83
+ settings.visitSettings()
84
+ settings.waitForSettings()
85
+
86
+ // 2. Validate settings page is accessible
87
+ settings.assertSettingsVisible()
88
+
89
+ // 3. Validate profile nav is visible
90
+ settings.assertNavItemVisible('profile')
91
+
92
+ cy.log('✅ Admin can access settings')
93
+ })
94
+ })
95
+
96
+ describe('ADMIN-PERM-004: Admin Billing Restricted Access', () => {
97
+ it('should have view-only or no access to billing', () => {
98
+ allure.severity('high')
99
+
100
+ // 1. Navigate to billing
101
+ billing.visitBilling()
102
+
103
+ // 2. Check access - Admin may have view-only or redirected
104
+ cy.url().then((url) => {
105
+ if (url.includes('/billing')) {
106
+ // If accessible, billing container should be visible
107
+ billing.getBillingMain().should('be.visible')
108
+ cy.log('✅ Admin has view-only billing access')
109
+ } else {
110
+ // If redirected, that's also valid
111
+ cy.log('✅ Admin correctly redirected from billing')
112
+ }
113
+ })
114
+ })
115
+ })
116
+
117
+ describe('ADMIN-PERM-005: Admin Cannot Access Superadmin', () => {
118
+ it('should be redirected when trying to access /superadmin', () => {
119
+ allure.severity('high')
120
+
121
+ // 1. Attempt to visit Superadmin
122
+ cy.visit('/superadmin', { timeout: 60000, failOnStatusCode: false })
123
+
124
+ // 2. Should be redirected
125
+ sector7.assertAccessDenied()
126
+
127
+ cy.log('✅ Admin correctly blocked from Superadmin')
128
+ })
129
+ })
130
+
131
+ describe('ADMIN-PERM-006: Admin Cannot Access Dev Zone', () => {
132
+ it('should be redirected when trying to access /dev', () => {
133
+ allure.severity('high')
134
+
135
+ // 1. Attempt to visit Dev Zone
136
+ devArea.attemptToVisitDev()
137
+
138
+ // 2. Should be redirected
139
+ devArea.assertRedirectedToDashboard()
140
+
141
+ cy.log('✅ Admin correctly blocked from Dev Zone')
142
+ })
143
+ })
144
+
145
+ after(() => {
146
+ cy.log('✅ Admin team role tests completed')
147
+ })
148
+ })