@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,367 @@
1
+ /**
2
+ * Patterns in Pages - Functional E2E Tests
3
+ *
4
+ * Tests the integration of the patterns system with the page builder:
5
+ * - Patterns tab visibility and functionality
6
+ * - Pattern insertion into pages
7
+ * - Pattern reference rendering and interaction
8
+ * - Pattern nesting prevention (patterns tab hidden when editing patterns)
9
+ *
10
+ * Sample Patterns in DB (team-nextspark-001):
11
+ * - Newsletter CTA (slug: newsletter-cta, status: published)
12
+ * - Footer Links (slug: footer-links, status: published)
13
+ * - Hero Header (slug: hero-header, status: draft)
14
+ *
15
+ * Re-execution:
16
+ * pnpm tags @patterns # Run all patterns tests
17
+ * pnpm tags @TC_PAT_001 # Run specific test
18
+ * pnpm cy:run --spec "cypress/e2e/patterns/patterns-in-pages.cy.ts"
19
+ */
20
+
21
+ import { PageBuilderPOM } from '../../src/features/PageBuilderPOM'
22
+ import { loginAsDefaultDeveloper } from '../../src/session-helpers'
23
+
24
+ const DEVELOPER_TEAM_ID = 'team-nextspark-001'
25
+
26
+ describe('Patterns in Pages - Functional Tests', {
27
+ tags: ['@patterns', '@block-editor', '@functional']
28
+ }, () => {
29
+ const pom = PageBuilderPOM.create()
30
+
31
+ beforeEach(() => {
32
+ loginAsDefaultDeveloper()
33
+ cy.window().then((win) => {
34
+ win.localStorage.setItem('activeTeamId', DEVELOPER_TEAM_ID)
35
+ })
36
+ })
37
+
38
+ // ===========================================================================
39
+ // TC_PAT_001: Can switch to Patterns tab in block picker
40
+ // ===========================================================================
41
+ describe('TC_PAT_001: Switch to Patterns Tab', { tags: '@TC_PAT_001' }, () => {
42
+ it('should display patterns tab when editing pages', { tags: '@TC_PAT_001_01' }, () => {
43
+ pom.visitCreate()
44
+ pom.waitForEditor()
45
+
46
+ // Patterns tab should be visible
47
+ cy.get('[data-cy="block-picker-tab-patterns"]')
48
+ .should('exist')
49
+ .and('be.visible')
50
+ })
51
+
52
+ it('should switch to patterns tab on click', { tags: '@TC_PAT_001_02' }, () => {
53
+ pom.visitCreate()
54
+ pom.waitForEditor()
55
+
56
+ // Click patterns tab
57
+ cy.get('[data-cy="block-picker-tab-patterns"]').click()
58
+
59
+ // Patterns search and list should appear
60
+ cy.get('[data-cy="block-picker-patterns-search"]').should('be.visible')
61
+ cy.get('[data-cy="block-picker-patterns-list"]').should('be.visible')
62
+ })
63
+
64
+ it('should switch back to blocks tab', { tags: '@TC_PAT_001_03' }, () => {
65
+ pom.visitCreate()
66
+ pom.waitForEditor()
67
+
68
+ // Switch to patterns
69
+ cy.get('[data-cy="block-picker-tab-patterns"]').click()
70
+ cy.get('[data-cy="block-picker-patterns-list"]').should('be.visible')
71
+
72
+ // Switch back to blocks
73
+ cy.get('[data-cy="block-picker-tab-blocks"]').click()
74
+ cy.get('[data-cy="block-picker-list"]').should('be.visible')
75
+ })
76
+ })
77
+
78
+ // ===========================================================================
79
+ // TC_PAT_002: Patterns tab shows sample patterns
80
+ // ===========================================================================
81
+ describe('TC_PAT_002: Display Sample Patterns', { tags: '@TC_PAT_002' }, () => {
82
+ beforeEach(() => {
83
+ pom.visitCreate()
84
+ pom.waitForEditor()
85
+ cy.get('[data-cy="block-picker-tab-patterns"]').click()
86
+ cy.wait(500) // Wait for patterns to load
87
+ })
88
+
89
+ it('should display at least one published pattern', { tags: '@TC_PAT_002_01' }, () => {
90
+ // Check that at least one pattern card exists
91
+ cy.get('[data-cy^="block-picker-pattern-card-"]')
92
+ .should('have.length.at.least', 1)
93
+ })
94
+
95
+ it('should display pattern card with all elements', { tags: '@TC_PAT_002_02' }, () => {
96
+ // Get first pattern card
97
+ cy.get('[data-cy^="block-picker-pattern-card-"]').first().within(() => {
98
+ // Check for icon, title, description, insert button
99
+ cy.get('[data-cy^="block-picker-pattern-icon-"]').should('exist')
100
+ cy.get('[data-cy^="block-picker-pattern-title-"]').should('exist').and('not.be.empty')
101
+ cy.get('[data-cy^="block-picker-pattern-desc-"]').should('exist')
102
+ cy.get('[data-cy^="block-picker-pattern-insert-"]').should('exist').and('be.visible')
103
+ })
104
+ })
105
+
106
+ it('should filter patterns using search', { tags: '@TC_PAT_002_03' }, () => {
107
+ // Get initial count
108
+ cy.get('[data-cy^="block-picker-pattern-card-"]').then(($cards) => {
109
+ const initialCount = $cards.length
110
+
111
+ // Type search term
112
+ cy.get('[data-cy="block-picker-patterns-search"]').type('Newsletter')
113
+ cy.wait(300)
114
+
115
+ // Pattern list should be filtered
116
+ cy.get('[data-cy^="block-picker-pattern-card-"]').then(($filtered) => {
117
+ // Should have fewer or equal patterns after filtering
118
+ expect($filtered.length).to.be.at.most(initialCount)
119
+
120
+ // If newsletter pattern exists, it should be visible
121
+ if ($filtered.length > 0) {
122
+ cy.get('[data-cy^="block-picker-pattern-title-"]')
123
+ .first()
124
+ .should('contain.text', 'Newsletter')
125
+ }
126
+ })
127
+ })
128
+ })
129
+
130
+ it('should clear search filter', { tags: '@TC_PAT_002_04' }, () => {
131
+ // Search for something
132
+ cy.get('[data-cy="block-picker-patterns-search"]').type('Footer')
133
+ cy.wait(300)
134
+
135
+ // Clear search
136
+ cy.get('[data-cy="block-picker-patterns-search"]').clear()
137
+ cy.wait(300)
138
+
139
+ // All published patterns should be visible again
140
+ cy.get('[data-cy^="block-picker-pattern-card-"]')
141
+ .should('have.length.at.least', 1)
142
+ })
143
+ })
144
+
145
+ // ===========================================================================
146
+ // TC_PAT_003: Can insert a pattern into a page
147
+ // ===========================================================================
148
+ describe('TC_PAT_003: Insert Pattern into Page', { tags: '@TC_PAT_003' }, () => {
149
+ it('should insert pattern when clicking insert button', { tags: '@TC_PAT_003_01' }, () => {
150
+ pom.visitCreate()
151
+ pom.waitForEditor()
152
+ pom.switchToLayoutMode()
153
+
154
+ // Switch to patterns tab
155
+ cy.get('[data-cy="block-picker-tab-patterns"]').click()
156
+ cy.wait(500)
157
+
158
+ // Click insert on first pattern
159
+ cy.get('[data-cy^="block-picker-pattern-insert-"]').first().click()
160
+
161
+ // Pattern reference should appear in layout canvas
162
+ cy.wait(1000)
163
+ cy.get('[data-cy^="sortable-block-"]').should('have.length.at.least', 1)
164
+ })
165
+
166
+ it('should show pattern reference in sortable blocks list', { tags: '@TC_PAT_003_02' }, () => {
167
+ pom.visitCreate()
168
+ pom.waitForEditor()
169
+ pom.switchToLayoutMode()
170
+
171
+ // Insert pattern
172
+ cy.get('[data-cy="block-picker-tab-patterns"]').click()
173
+ cy.wait(500)
174
+ cy.get('[data-cy^="block-picker-pattern-insert-"]').first().click()
175
+ cy.wait(1000)
176
+
177
+ // Should see pattern reference block in layout canvas
178
+ // Pattern reference should have a distinct appearance (badge, etc.)
179
+ cy.get(pom.editorSelectors.sortableBlockGeneric)
180
+ .should('have.length.at.least', 1)
181
+ })
182
+
183
+ it('should allow inserting multiple patterns', { tags: '@TC_PAT_003_03' }, () => {
184
+ pom.visitCreate()
185
+ pom.waitForEditor()
186
+ pom.switchToLayoutMode()
187
+
188
+ cy.get('[data-cy="block-picker-tab-patterns"]').click()
189
+ cy.wait(500)
190
+
191
+ // Get count of available patterns
192
+ cy.get('[data-cy^="block-picker-pattern-insert-"]').then(($buttons) => {
193
+ const patternCount = Math.min($buttons.length, 2) // Insert max 2 patterns
194
+
195
+ // Insert first pattern
196
+ cy.get('[data-cy^="block-picker-pattern-insert-"]').eq(0).click()
197
+ cy.wait(500)
198
+
199
+ if (patternCount > 1) {
200
+ // Insert second pattern if available
201
+ cy.get('[data-cy^="block-picker-pattern-insert-"]').eq(1).click()
202
+ cy.wait(500)
203
+
204
+ // Should have 2 blocks
205
+ cy.get(pom.editorSelectors.sortableBlockGeneric)
206
+ .should('have.length.at.least', 2)
207
+ }
208
+ })
209
+ })
210
+ })
211
+
212
+ // ===========================================================================
213
+ // TC_PAT_004: Pattern reference displays correctly in preview
214
+ // ===========================================================================
215
+ describe('TC_PAT_004: Pattern Reference in Preview', { tags: '@TC_PAT_004' }, () => {
216
+ beforeEach(() => {
217
+ pom.visitCreate()
218
+ pom.waitForEditor()
219
+ pom.switchToLayoutMode()
220
+
221
+ // Insert a pattern
222
+ cy.get('[data-cy="block-picker-tab-patterns"]').click()
223
+ cy.wait(500)
224
+ cy.get('[data-cy^="block-picker-pattern-insert-"]').first().click()
225
+ cy.wait(1000)
226
+
227
+ // Switch to preview mode
228
+ pom.switchToPreviewMode()
229
+ cy.wait(500)
230
+ })
231
+
232
+ it('should render pattern reference container in preview', { tags: '@TC_PAT_004_01' }, () => {
233
+ // Pattern reference should be visible
234
+ cy.get('[data-cy^="pattern-reference-"]')
235
+ .should('exist')
236
+ .and('be.visible')
237
+ })
238
+
239
+ it('should display pattern reference badge', { tags: '@TC_PAT_004_02' }, () => {
240
+ // Badge should indicate this is a pattern reference
241
+ cy.get('[data-cy^="pattern-reference-badge-"]')
242
+ .should('exist')
243
+ })
244
+
245
+ it('should show pattern reference edit link', { tags: '@TC_PAT_004_03' }, () => {
246
+ // Edit link should allow navigating to pattern editor
247
+ cy.get('[data-cy^="pattern-reference-edit-link-"]')
248
+ .should('exist')
249
+ .and('be.visible')
250
+ })
251
+
252
+ it('should show remove button for pattern reference', { tags: '@TC_PAT_004_04' }, () => {
253
+ cy.get('[data-cy^="pattern-reference-remove-"]')
254
+ .should('exist')
255
+ })
256
+
257
+ it('should show locked state when pattern reference is selected', { tags: '@TC_PAT_004_05' }, () => {
258
+ // Click on pattern reference
259
+ cy.get('[data-cy^="pattern-reference-"]').first().click()
260
+ cy.wait(500)
261
+
262
+ // Locked indicator should appear
263
+ cy.get('[data-cy^="pattern-reference-locked-"]')
264
+ .should('exist')
265
+ })
266
+ })
267
+
268
+ // ===========================================================================
269
+ // TC_PAT_005: Can remove pattern reference from page
270
+ // ===========================================================================
271
+ describe('TC_PAT_005: Remove Pattern Reference', { tags: '@TC_PAT_005' }, () => {
272
+ it('should remove pattern reference when clicking remove button', { tags: '@TC_PAT_005_01' }, () => {
273
+ pom.visitCreate()
274
+ pom.waitForEditor()
275
+ pom.switchToLayoutMode()
276
+
277
+ // Insert pattern
278
+ cy.get('[data-cy="block-picker-tab-patterns"]').click()
279
+ cy.wait(500)
280
+ cy.get('[data-cy^="block-picker-pattern-insert-"]').first().click()
281
+ cy.wait(1000)
282
+
283
+ // Get initial count
284
+ cy.get(pom.editorSelectors.sortableBlockGeneric).then(($blocks) => {
285
+ const initialCount = $blocks.length
286
+
287
+ // Switch to preview to access remove button
288
+ pom.switchToPreviewMode()
289
+ cy.wait(500)
290
+
291
+ // Click remove button
292
+ cy.get('[data-cy^="pattern-reference-remove-"]').first().click()
293
+ cy.wait(500)
294
+
295
+ // Switch back to layout mode to verify
296
+ pom.switchToLayoutMode()
297
+ cy.wait(500)
298
+
299
+ // Block count should decrease
300
+ cy.get(pom.editorSelectors.sortableBlockGeneric).should('have.length', initialCount - 1)
301
+ })
302
+ })
303
+
304
+ it('should remove pattern reference from layout mode', { tags: '@TC_PAT_005_02' }, () => {
305
+ pom.visitCreate()
306
+ pom.waitForEditor()
307
+ pom.switchToLayoutMode()
308
+
309
+ // Insert pattern
310
+ cy.get('[data-cy="block-picker-tab-patterns"]').click()
311
+ cy.wait(500)
312
+ cy.get('[data-cy^="block-picker-pattern-insert-"]').first().click()
313
+ cy.wait(1000)
314
+
315
+ // In layout mode, use standard block remove button
316
+ cy.get(pom.editorSelectors.sortableBlockGeneric).first()
317
+ .invoke('attr', 'data-cy')
318
+ .then((dataCy) => {
319
+ const blockId = dataCy?.replace('sortable-block-', '') || ''
320
+ cy.get(pom.editorSelectors.removeBlock(blockId)).click()
321
+ cy.wait(500)
322
+
323
+ // Block should be removed
324
+ cy.get(pom.editorSelectors.sortableBlockGeneric).should('have.length', 0)
325
+ })
326
+ })
327
+ })
328
+
329
+ // ===========================================================================
330
+ // TC_PAT_006: Patterns tab is NOT shown when editing patterns entity
331
+ // ===========================================================================
332
+ describe('TC_PAT_006: Prevent Pattern Nesting', { tags: '@TC_PAT_006' }, () => {
333
+ it('should NOT show patterns tab when editing a pattern', { tags: '@TC_PAT_006_01' }, () => {
334
+ // Visit the patterns entity create page
335
+ cy.visit('/dashboard/patterns/create')
336
+ cy.wait(1000)
337
+
338
+ // Wait for editor to load
339
+ cy.get(pom.editorSelectors.container, { timeout: 15000 }).should('be.visible')
340
+
341
+ // Patterns tab should NOT exist (to prevent nesting patterns inside patterns)
342
+ cy.get('[data-cy="block-picker-tab-patterns"]').should('not.exist')
343
+ })
344
+
345
+ it('should only show blocks and config tabs when editing patterns', { tags: '@TC_PAT_006_02' }, () => {
346
+ cy.visit('/dashboard/patterns/create')
347
+ cy.wait(1000)
348
+ cy.get(pom.editorSelectors.container, { timeout: 15000 }).should('be.visible')
349
+
350
+ // Only Blocks and Config tabs should be visible
351
+ cy.get('[data-cy="block-picker-tab-blocks"]').should('exist').and('be.visible')
352
+ cy.get('[data-cy="block-picker-tab-config"]').should('exist').and('be.visible')
353
+ cy.get('[data-cy="block-picker-tab-patterns"]').should('not.exist')
354
+ })
355
+
356
+ it('should show patterns tab when editing pages (control test)', { tags: '@TC_PAT_006_03' }, () => {
357
+ // Visit pages create (should show patterns tab)
358
+ pom.visitCreate()
359
+ pom.waitForEditor()
360
+
361
+ // All three tabs should be visible
362
+ cy.get('[data-cy="block-picker-tab-blocks"]').should('exist').and('be.visible')
363
+ cy.get('[data-cy="block-picker-tab-patterns"]').should('exist').and('be.visible')
364
+ cy.get('[data-cy="block-picker-tab-config"]').should('exist').and('be.visible')
365
+ })
366
+ })
367
+ })
@@ -0,0 +1,231 @@
1
+ ---
2
+ feature: Developer App Role Authentication
3
+ priority: critical
4
+ tags: [auth, app-role, developer, dev-zone, security]
5
+ grepTags: [uat, feat-auth, app-role, developer]
6
+ coverage: 6
7
+ ---
8
+
9
+ # Developer App Role Authentication
10
+
11
+ > Tests for Developer app role login and specific access privileges. Developer is a global app role (not team-based) that grants access to the Dev Zone and inherits Sector7 access.
12
+
13
+ ## @test DEV-LOGIN-001: Developer Login and Dev Zone Access
14
+
15
+ ### Metadata
16
+ - **Priority:** Critical
17
+ - **Type:** Smoke
18
+ - **Tags:** developer, login, dev-zone
19
+ - **Grep:** `@smoke`
20
+
21
+ ```gherkin:en
22
+ Scenario: Developer can login and access Dev Zone
23
+
24
+ Given I am logged in as Developer (developer@nextspark.dev)
25
+ When I visit /dev
26
+ Then the URL should include /dev
27
+ And the Dev Zone home page should be visible
28
+ ```
29
+
30
+ ```gherkin:es
31
+ Scenario: Developer puede loguearse y acceder a Dev Zone
32
+
33
+ Given estoy logueado como Developer (developer@nextspark.dev)
34
+ When visito /dev
35
+ Then la URL deberia incluir /dev
36
+ And la pagina principal de Dev Zone deberia estar visible
37
+ ```
38
+
39
+ ### Expected Results
40
+ - Developer successfully logs in
41
+ - Access to /dev is granted
42
+ - Dev Zone home page renders correctly
43
+
44
+ ---
45
+
46
+ ## @test DEV-LOGIN-002: Developer Access to Style Gallery
47
+
48
+ ### Metadata
49
+ - **Priority:** Normal
50
+ - **Type:** Smoke
51
+ - **Tags:** developer, style-gallery
52
+ - **Grep:** `@smoke`
53
+
54
+ ```gherkin:en
55
+ Scenario: Developer can access Style Gallery
56
+
57
+ Given I am logged in as Developer (developer@nextspark.dev)
58
+ When I visit /dev/style
59
+ Then the URL should include /dev/style
60
+ And the Style Gallery page should be visible
61
+ ```
62
+
63
+ ```gherkin:es
64
+ Scenario: Developer puede acceder a Style Gallery
65
+
66
+ Given estoy logueado como Developer (developer@nextspark.dev)
67
+ When visito /dev/style
68
+ Then la URL deberia incluir /dev/style
69
+ And la pagina de Style Gallery deberia estar visible
70
+ ```
71
+
72
+ ### Expected Results
73
+ - Style Gallery page loads successfully
74
+ - All component sections available
75
+
76
+ ---
77
+
78
+ ## @test DEV-LOGIN-003: Developer Access to Test Cases
79
+
80
+ ### Metadata
81
+ - **Priority:** Normal
82
+ - **Type:** Smoke
83
+ - **Tags:** developer, test-cases
84
+ - **Grep:** `@smoke`
85
+
86
+ ```gherkin:en
87
+ Scenario: Developer can access Test Cases viewer
88
+
89
+ Given I am logged in as Developer (developer@nextspark.dev)
90
+ When I visit /dev/tests
91
+ Then the URL should include /dev/tests
92
+ And the Test Cases viewer should be visible
93
+ ```
94
+
95
+ ```gherkin:es
96
+ Scenario: Developer puede acceder al visor de Test Cases
97
+
98
+ Given estoy logueado como Developer (developer@nextspark.dev)
99
+ When visito /dev/tests
100
+ Then la URL deberia incluir /dev/tests
101
+ And el visor de Test Cases deberia estar visible
102
+ ```
103
+
104
+ ### Expected Results
105
+ - Test Cases viewer loads successfully
106
+ - File tree or empty state visible
107
+
108
+ ---
109
+
110
+ ## @test DEV-LOGIN-004: Developer Access to Config Viewer
111
+
112
+ ### Metadata
113
+ - **Priority:** Normal
114
+ - **Type:** Smoke
115
+ - **Tags:** developer, config-viewer
116
+ - **Grep:** `@smoke`
117
+
118
+ ```gherkin:en
119
+ Scenario: Developer can access Config Viewer
120
+
121
+ Given I am logged in as Developer (developer@nextspark.dev)
122
+ When I visit /dev/config
123
+ Then the URL should include /dev/config
124
+ And the Config Viewer page should be visible
125
+ ```
126
+
127
+ ```gherkin:es
128
+ Scenario: Developer puede acceder a Config Viewer
129
+
130
+ Given estoy logueado como Developer (developer@nextspark.dev)
131
+ When visito /dev/config
132
+ Then la URL deberia incluir /dev/config
133
+ And la pagina de Config Viewer deberia estar visible
134
+ ```
135
+
136
+ ### Expected Results
137
+ - Config Viewer loads successfully
138
+ - Theme and Entities tabs available
139
+
140
+ ---
141
+
142
+ ## @test DEV-LOGIN-005: Developer Inherited Sector7 Access
143
+
144
+ ### Metadata
145
+ - **Priority:** High
146
+ - **Type:** Regression
147
+ - **Tags:** developer, sector7, inherited
148
+
149
+ ```gherkin:en
150
+ Scenario: Developer can access Sector7 (inherited privilege)
151
+
152
+ Given I am logged in as Developer (developer@nextspark.dev)
153
+ When I visit /sector7
154
+ Then the URL should include /sector7
155
+ And the Sector7 container should be visible
156
+ ```
157
+
158
+ ```gherkin:es
159
+ Scenario: Developer puede acceder a Sector7 (privilegio heredado)
160
+
161
+ Given estoy logueado como Developer (developer@nextspark.dev)
162
+ When visito /sector7
163
+ Then la URL deberia incluir /sector7
164
+ And el contenedor de Sector7 deberia estar visible
165
+ ```
166
+
167
+ ### Expected Results
168
+ - Developer inherits superadmin privileges for Sector7
169
+ - Sector7 control panel accessible
170
+ - No access denied redirect
171
+
172
+ ---
173
+
174
+ ## @test DEV-LOGIN-006: Developer Logout Flow
175
+
176
+ ### Metadata
177
+ - **Priority:** Normal
178
+ - **Type:** Regression
179
+ - **Tags:** developer, logout
180
+
181
+ ```gherkin:en
182
+ Scenario: Developer can logout successfully
183
+
184
+ Given I am logged in as Developer (developer@nextspark.dev)
185
+ And I am on the dashboard
186
+ When I click on user menu
187
+ And I click on Sign Out
188
+ Then I should be redirected to /login
189
+ ```
190
+
191
+ ```gherkin:es
192
+ Scenario: Developer puede cerrar sesion correctamente
193
+
194
+ Given estoy logueado como Developer (developer@nextspark.dev)
195
+ And estoy en el dashboard
196
+ When hago click en el menu de usuario
197
+ And hago click en Sign Out
198
+ Then deberia ser redirigido a /login
199
+ ```
200
+
201
+ ### Expected Results
202
+ - User menu opens correctly
203
+ - Sign out action works
204
+ - Redirect to login page
205
+
206
+ ---
207
+
208
+ ## UI Elements
209
+
210
+ | Element | Selector | Description |
211
+ |---------|----------|-------------|
212
+ | Dev Home Page | `[data-cy="dev-home-page"]` | Dev Zone home page container |
213
+ | Dev Style Page | `[data-cy="dev-style-page"]` | Style Gallery page container |
214
+ | Dev Tests Page | `[data-cy="dev-tests-page"]` | Test Cases viewer container |
215
+ | Dev Config Page | `[data-cy="dev-config-page"]` | Config Viewer page container |
216
+ | Sector7 Container | `[data-cy="sector7-container"]` | Sector7 main container |
217
+ | User Menu Trigger | `[data-cy="topnav-user-menu-trigger"]` | User menu dropdown trigger |
218
+ | Sign Out Button | `[data-cy="topnav-menu-signOut"]` | Sign out menu item |
219
+
220
+ ---
221
+
222
+ ## Summary
223
+
224
+ | Test ID | Block | Description | Tags |
225
+ |---------|-------|-------------|------|
226
+ | DEV-LOGIN-001 | Login | Developer login + Dev Zone access | `@smoke` |
227
+ | DEV-LOGIN-002 | Access | Style Gallery access | `@smoke` |
228
+ | DEV-LOGIN-003 | Access | Test Cases viewer access | `@smoke` |
229
+ | DEV-LOGIN-004 | Access | Config Viewer access | `@smoke` |
230
+ | DEV-LOGIN-005 | Inherited | Sector7 access (inherited) | |
231
+ | DEV-LOGIN-006 | Logout | Developer logout flow | |