@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,86 @@
1
+ /**
2
+ * UI Selectors Validation: Settings Teams
3
+ *
4
+ * This test validates that settings teams selectors exist in the DOM.
5
+ * This is a lightweight test that ONLY checks selector presence, not functionality.
6
+ *
7
+ * Purpose:
8
+ * - Validate SettingsPOM teams selectors work correctly
9
+ * - Ensure all settings.teams.* selectors are implemented
10
+ * - Run as Phase 12 sub-gate before functional tests
11
+ *
12
+ * Scope:
13
+ * - Navigate to teams settings page (requires login)
14
+ * - Assert elements exist in DOM (no form submissions)
15
+ * - Fast execution (< 30 seconds per describe block)
16
+ *
17
+ * Test IDs:
18
+ * - SEL_STMS_001: Teams Page Selectors
19
+ * - SEL_STMS_002: Create Team Dialog (documentation only)
20
+ */
21
+
22
+ import { SettingsPOM } from '../../../src/features/SettingsPOM'
23
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
24
+
25
+ describe('Settings Teams Selectors Validation', { tags: ['@ui-selectors', '@settings'] }, () => {
26
+ const settings = SettingsPOM.create()
27
+
28
+ beforeEach(() => {
29
+ loginAsDefaultDeveloper()
30
+ cy.visit('/dashboard/settings/teams', { timeout: 60000 })
31
+ // Wait for teams page to load - either main or loading should appear
32
+ cy.get('[data-cy="teams-settings-main"], [data-cy="teams-settings-loading"]', { timeout: 15000 }).should('exist')
33
+ })
34
+
35
+ // ============================================
36
+ // SEL_STMS_001: TEAMS PAGE SELECTORS
37
+ // ============================================
38
+ describe('SEL_STMS_001: Teams Page Selectors', { tags: '@SEL_STMS_001' }, () => {
39
+ it('should find teams main container', () => {
40
+ // Wait for loading to finish
41
+ cy.get('[data-cy="teams-settings-main"]', { timeout: 15000 }).should('exist')
42
+ })
43
+
44
+ it('should find teams header', () => {
45
+ cy.get('[data-cy="teams-settings-header"]', { timeout: 15000 }).should('exist')
46
+ })
47
+
48
+ it('should find teams list', () => {
49
+ cy.get('[data-cy="teams-settings-teams-list"]', { timeout: 15000 }).should('exist')
50
+ })
51
+
52
+ it('should find team item in list', () => {
53
+ cy.get('[data-cy^="team-item-"]', { timeout: 15000 }).should('have.length.at.least', 1)
54
+ })
55
+
56
+ it('should find team details section when team is selected', () => {
57
+ // Click on first team to select it
58
+ cy.get('[data-cy^="team-item-"]').first().click()
59
+ // Team details should appear
60
+ cy.get('[data-cy="teams-settings-team-details"]', { timeout: 15000 }).should('exist')
61
+ })
62
+
63
+ // Additional selectors implemented but not in CORE_SELECTORS.settings.teams
64
+ it('should find create team button', () => {
65
+ cy.get('[data-cy="create-team-button"]', { timeout: 15000 }).should('exist')
66
+ })
67
+ })
68
+
69
+ // ============================================
70
+ // SEL_STMS_002: CREATE TEAM DIALOG
71
+ // Tested in teams.cy.ts, documented here for reference
72
+ // ============================================
73
+ describe('SEL_STMS_002: Create Team Dialog Documentation', { tags: '@SEL_STMS_002' }, () => {
74
+ it('should document create team dialog selectors', () => {
75
+ cy.log('Create Team Dialog selectors are tested in teams.cy.ts')
76
+ cy.log('Dialog selectors:')
77
+ cy.log('- create-team-dialog')
78
+ cy.log('- team-name-input')
79
+ cy.log('- team-slug-input')
80
+ cy.log('- team-description-input')
81
+ cy.log('- cancel-create-team')
82
+ cy.log('- submit-create-team')
83
+ cy.wrap(true).should('be.true')
84
+ })
85
+ })
86
+ })
@@ -0,0 +1,261 @@
1
+ ---
2
+ feature: Superadmin UI Selectors Validation
3
+ priority: high
4
+ tags: [selectors, superadmin, ui-validation, admin-panel]
5
+ grepTags: [ui-selectors, superadmin, SEL_SADM_001, SEL_SADM_002, SEL_SADM_003, SEL_SADM_004, SEL_SADM_005, SEL_SADM_006]
6
+ coverage: 6
7
+ ---
8
+
9
+ # Superadmin UI Selectors Validation
10
+
11
+ > Validates that superadmin area 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_SADM_001: Superadmin Dashboard Selectors
14
+
15
+ ### Metadata
16
+ - **Priority:** High
17
+ - **Type:** Selector Validation
18
+ - **Tags:** superadmin, dashboard, container
19
+ - **Grep:** `@ui-selectors` `@SEL_SADM_001`
20
+ - **Status:** Active
21
+
22
+ ```gherkin:en
23
+ Scenario: Superadmin dashboard has required selectors
24
+
25
+ Given I am logged in as superadmin
26
+ And I navigate to the superadmin dashboard
27
+ Then I should find the superadmin container
28
+ And I should find the dashboard container
29
+ ```
30
+
31
+ ```gherkin:es
32
+ Scenario: El dashboard de superadmin tiene los selectores requeridos
33
+
34
+ Given estoy logueado como superadmin
35
+ And navego al dashboard de superadmin
36
+ Then deberia encontrar el contenedor de superadmin
37
+ And deberia encontrar el contenedor del dashboard
38
+ ```
39
+
40
+ ### Expected Results
41
+ - `superadmin.container` selector exists (superadmin-container)
42
+ - `superadmin.dashboard.container` selector exists (superadmin-dashboard)
43
+
44
+ ---
45
+
46
+ ## @test SEL_SADM_002: Superadmin Navigation Selectors
47
+
48
+ ### Metadata
49
+ - **Priority:** High
50
+ - **Type:** Selector Validation
51
+ - **Tags:** superadmin, navigation, sidebar
52
+ - **Grep:** `@ui-selectors` `@SEL_SADM_002`
53
+ - **Status:** Active
54
+
55
+ ```gherkin:en
56
+ Scenario: Superadmin navigation has all required links
57
+
58
+ Given I am logged in as superadmin
59
+ And I navigate to the superadmin area
60
+ Then I should find the dashboard nav link
61
+ And I should find the users nav link
62
+ And I should find the teams nav link
63
+ And I should find the team-roles nav link
64
+ And I should find the subscriptions nav link
65
+ And I should find the exit to dashboard link
66
+ ```
67
+
68
+ ```gherkin:es
69
+ Scenario: La navegacion de superadmin tiene todos los links requeridos
70
+
71
+ Given estoy logueado como superadmin
72
+ And navego al area de superadmin
73
+ Then deberia encontrar el link de navegacion a dashboard
74
+ And deberia encontrar el link de navegacion a users
75
+ And deberia encontrar el link de navegacion a teams
76
+ And deberia encontrar el link de navegacion a team-roles
77
+ And deberia encontrar el link de navegacion a subscriptions
78
+ And deberia encontrar el link de salir al dashboard
79
+ ```
80
+
81
+ ### Expected Results
82
+ - `superadmin.navigation.dashboard` selector exists (superadmin-nav-dashboard)
83
+ - `superadmin.navigation.users` selector exists (superadmin-nav-users)
84
+ - `superadmin.navigation.teams` selector exists (superadmin-nav-teams)
85
+ - `superadmin.navigation.teamRoles` selector exists (superadmin-nav-team-roles)
86
+ - `superadmin.navigation.subscriptions` selector exists (superadmin-nav-subscriptions)
87
+ - `superadmin.navigation.exitToDashboard` selector exists (superadmin-sidebar-exit-to-dashboard)
88
+
89
+ ---
90
+
91
+ ## @test SEL_SADM_003: Superadmin Users Page Selectors
92
+
93
+ ### Metadata
94
+ - **Priority:** High
95
+ - **Type:** Selector Validation
96
+ - **Tags:** superadmin, users, management
97
+ - **Grep:** `@ui-selectors` `@SEL_SADM_003`
98
+ - **Status:** Active
99
+
100
+ ```gherkin:en
101
+ Scenario: Superadmin users page has required selectors
102
+
103
+ Given I am logged in as superadmin
104
+ And I navigate to the superadmin users page
105
+ Then I should find the users container
106
+ And I should find the users table
107
+ And I should find the users search input
108
+ ```
109
+
110
+ ```gherkin:es
111
+ Scenario: La pagina de usuarios de superadmin tiene los selectores requeridos
112
+
113
+ Given estoy logueado como superadmin
114
+ And navego a la pagina de usuarios de superadmin
115
+ Then deberia encontrar el contenedor de usuarios
116
+ And deberia encontrar la tabla de usuarios
117
+ And deberia encontrar el input de busqueda de usuarios
118
+ ```
119
+
120
+ ### Expected Results
121
+ - `superadmin.users.container` selector exists (superadmin-users-container)
122
+ - `superadmin.users.table` selector exists (superadmin-users-table)
123
+ - `superadmin.users.search` selector exists (superadmin-users-search)
124
+
125
+ ---
126
+
127
+ ## @test SEL_SADM_004: Superadmin Teams Page Selectors
128
+
129
+ ### Metadata
130
+ - **Priority:** High
131
+ - **Type:** Selector Validation
132
+ - **Tags:** superadmin, teams, management
133
+ - **Grep:** `@ui-selectors` `@SEL_SADM_004`
134
+ - **Status:** Active
135
+
136
+ ```gherkin:en
137
+ Scenario: Superadmin teams page has required selectors
138
+
139
+ Given I am logged in as superadmin
140
+ And I navigate to the superadmin teams page
141
+ Then I should find the teams container
142
+ And I should find the teams table
143
+ And I should find the teams search input
144
+ ```
145
+
146
+ ```gherkin:es
147
+ Scenario: La pagina de equipos de superadmin tiene los selectores requeridos
148
+
149
+ Given estoy logueado como superadmin
150
+ And navego a la pagina de equipos de superadmin
151
+ Then deberia encontrar el contenedor de equipos
152
+ And deberia encontrar la tabla de equipos
153
+ And deberia encontrar el input de busqueda de equipos
154
+ ```
155
+
156
+ ### Expected Results
157
+ - `superadmin.teams.container` selector exists (superadmin-teams-container)
158
+ - `superadmin.teams.table` selector exists (superadmin-teams-table)
159
+ - `superadmin.teams.search` selector exists (superadmin-teams-search)
160
+
161
+ ---
162
+
163
+ ## @test SEL_SADM_005: Superadmin Subscriptions Page Selectors
164
+
165
+ ### Metadata
166
+ - **Priority:** High
167
+ - **Type:** Selector Validation
168
+ - **Tags:** superadmin, subscriptions, billing
169
+ - **Grep:** `@ui-selectors` `@SEL_SADM_005`
170
+ - **Status:** Active
171
+
172
+ ```gherkin:en
173
+ Scenario: Superadmin subscriptions page has required selectors
174
+
175
+ Given I am logged in as superadmin
176
+ And I navigate to the superadmin subscriptions page
177
+ Then I should find the subscriptions container
178
+ And I should find the MRR stat card
179
+ And I should find the plan distribution section
180
+ And I should find the active count stat card
181
+ ```
182
+
183
+ ```gherkin:es
184
+ Scenario: La pagina de suscripciones de superadmin tiene los selectores requeridos
185
+
186
+ Given estoy logueado como superadmin
187
+ And navego a la pagina de suscripciones de superadmin
188
+ Then deberia encontrar el contenedor de suscripciones
189
+ And deberia encontrar la tarjeta de estadisticas MRR
190
+ And deberia encontrar la seccion de distribucion de planes
191
+ And deberia encontrar la tarjeta de conteo activo
192
+ ```
193
+
194
+ ### Expected Results
195
+ - `superadmin.subscriptions.container` selector exists (superadmin-subscriptions-container)
196
+ - `superadmin.subscriptions.mrr` selector exists (superadmin-subscriptions-mrr)
197
+ - `superadmin.subscriptions.planDistribution` selector exists (superadmin-subscriptions-plan-distribution)
198
+ - `superadmin.subscriptions.activeCount` selector exists (superadmin-subscriptions-active-count)
199
+
200
+ ---
201
+
202
+ ## @test SEL_SADM_006: Dynamic Selectors (Pattern Validation)
203
+
204
+ ### Metadata
205
+ - **Priority:** Medium
206
+ - **Type:** Selector Validation
207
+ - **Tags:** superadmin, dynamic, patterns
208
+ - **Grep:** `@ui-selectors` `@SEL_SADM_006`
209
+ - **Status:** Active
210
+
211
+ ```gherkin:en
212
+ Scenario: Dynamic selectors return valid patterns
213
+
214
+ Given I am logged in as superadmin
215
+ And I navigate to the superadmin users page
216
+ Then the userRow selector should return a valid pattern
217
+ And the userView selector should return a valid pattern
218
+ And the teamRow selector should return a valid pattern
219
+ And the subscriptionsPlanCount selector should return a valid pattern
220
+ ```
221
+
222
+ ```gherkin:es
223
+ Scenario: Los selectores dinamicos retornan patrones validos
224
+
225
+ Given estoy logueado como superadmin
226
+ And navego a la pagina de usuarios de superadmin
227
+ Then el selector userRow deberia retornar un patron valido
228
+ And el selector userView deberia retornar un patron valido
229
+ And el selector teamRow deberia retornar un patron valido
230
+ And el selector subscriptionsPlanCount deberia retornar un patron valido
231
+ ```
232
+
233
+ ### Expected Results
234
+ - `superadmin.users.row` pattern includes 'superadmin-user-row'
235
+ - `superadmin.users.viewButton` pattern includes 'superadmin-user-view'
236
+ - `superadmin.teams.row` pattern includes 'superadmin-team-row'
237
+ - `superadmin.subscriptions.planCount` pattern includes 'superadmin-subscriptions-plan-count'
238
+
239
+ ### Notes
240
+ These tests validate that dynamic selector functions (those that accept parameters like `id` or `plan`) return correctly formatted selector strings. They do not test actual DOM elements.
241
+
242
+ ---
243
+
244
+ ## Related Components
245
+
246
+ | Component | File | Selectors |
247
+ |-----------|------|-----------|
248
+ | SuperadminLayout | `packages/core/templates/app/superadmin/layout.tsx` | superadmin-container |
249
+ | SuperadminSidebar | `packages/core/src/components/superadmin/layouts/SuperadminSidebar.tsx` | superadmin-nav-* |
250
+ | SuperadminDashboard | `packages/core/templates/app/superadmin/page.tsx` | superadmin-dashboard |
251
+ | UsersPage | `packages/core/templates/app/superadmin/users/page.tsx` | superadmin-users-* |
252
+ | TeamsPage | `packages/core/templates/app/superadmin/teams/page.tsx` | superadmin-teams-* |
253
+ | SubscriptionsPage | `packages/core/templates/app/superadmin/subscriptions/page.tsx` | superadmin-subscriptions-* |
254
+ | UsersTable | `packages/core/src/components/users/tables/UsersTable.tsx` | superadmin-users-table, superadmin-user-row-{id} |
255
+ | TeamsTable | `packages/core/src/components/superadmin/tables/TeamsTable.tsx` | superadmin-teams-table, superadmin-team-row-{id} |
256
+
257
+ ## Related POMs
258
+
259
+ | POM | File | Usage |
260
+ |-----|------|-------|
261
+ | SuperadminPOM | `themes/default/tests/cypress/src/features/SuperadminPOM.ts` | Superadmin area interactions and selectors |
@@ -0,0 +1,193 @@
1
+ /**
2
+ * UI Selectors Validation: Superadmin (Superadmin Area)
3
+ *
4
+ * This test validates that Superadmin selectors exist in the DOM.
5
+ * This is a lightweight test that ONLY checks selector presence, not functionality.
6
+ *
7
+ * Purpose:
8
+ * - Validate SuperadminPOM selectors work correctly
9
+ * - Ensure all superadmin.* selectors are implemented
10
+ * - Run as Phase 12 sub-gate before functional tests
11
+ *
12
+ * Scope:
13
+ * - Navigate to superadmin pages (requires superadmin login)
14
+ * - Assert elements exist in DOM (no form submissions)
15
+ * - Fast execution (< 30 seconds per describe block)
16
+ *
17
+ * Test IDs:
18
+ * - SEL_SADM_001: Superadmin Dashboard Selectors
19
+ * - SEL_SADM_002: Superadmin Navigation Selectors
20
+ * - SEL_SADM_003: Superadmin Users Page Selectors
21
+ * - SEL_SADM_004: Superadmin Teams Page Selectors
22
+ * - SEL_SADM_005: Superadmin Subscriptions Page Selectors
23
+ * - SEL_SADM_006: Dynamic Selectors (Pattern Validation)
24
+ *
25
+ * NOTE: Requires superadmin role to access /superadmin/* pages.
26
+ */
27
+
28
+ import { SuperadminPOM } from '../../../src/features/SuperadminPOM'
29
+ import { loginAsDefaultSuperadmin } from '../../../src/session-helpers'
30
+
31
+ describe('Superadmin Selectors Validation', { tags: ['@ui-selectors', '@superadmin'] }, () => {
32
+ const superadmin = SuperadminPOM.create()
33
+
34
+ // ============================================
35
+ // SEL_SADM_001: SUPERADMIN DASHBOARD
36
+ // ============================================
37
+ describe('SEL_SADM_001: Superadmin Dashboard', { tags: '@SEL_SADM_001' }, () => {
38
+ beforeEach(() => {
39
+ loginAsDefaultSuperadmin()
40
+ cy.visit('/superadmin', { timeout: 60000, failOnStatusCode: false })
41
+ cy.url().should('include', '/superadmin')
42
+ })
43
+
44
+ it('should find superadmin container', () => {
45
+ cy.get(superadmin.selectors.navContainer).should('exist')
46
+ })
47
+
48
+ it('should find dashboard container', () => {
49
+ cy.get(superadmin.selectors.dashboardContainer).should('exist')
50
+ })
51
+ })
52
+
53
+ // ============================================
54
+ // SEL_SADM_002: SUPERADMIN NAVIGATION
55
+ // ============================================
56
+ describe('SEL_SADM_002: Superadmin Navigation', { tags: '@SEL_SADM_002' }, () => {
57
+ beforeEach(() => {
58
+ loginAsDefaultSuperadmin()
59
+ cy.visit('/superadmin', { timeout: 60000, failOnStatusCode: false })
60
+ cy.url().should('include', '/superadmin')
61
+ })
62
+
63
+ it('should find nav dashboard link', () => {
64
+ cy.get(superadmin.selectors.navDashboard).should('exist')
65
+ })
66
+
67
+ it('should find nav users link', () => {
68
+ cy.get(superadmin.selectors.navUsers).should('exist')
69
+ })
70
+
71
+ it('should find nav teams link', () => {
72
+ cy.get(superadmin.selectors.navTeams).should('exist')
73
+ })
74
+
75
+ it('should find nav team-roles link', () => {
76
+ cy.get(superadmin.selectors.navTeamRoles).should('exist')
77
+ })
78
+
79
+ it('should find nav subscriptions link', () => {
80
+ cy.get(superadmin.selectors.navSubscriptions).should('exist')
81
+ })
82
+
83
+ it('should find exit to dashboard link', () => {
84
+ cy.get(superadmin.selectors.exitToDashboard).should('exist')
85
+ })
86
+ })
87
+
88
+ // ============================================
89
+ // SEL_SADM_003: SUPERADMIN USERS PAGE
90
+ // ============================================
91
+ describe('SEL_SADM_003: Superadmin Users Page', { tags: '@SEL_SADM_003' }, () => {
92
+ beforeEach(() => {
93
+ loginAsDefaultSuperadmin()
94
+ cy.visit('/superadmin/users', { timeout: 60000, failOnStatusCode: false })
95
+ cy.url().should('include', '/superadmin/users')
96
+ })
97
+
98
+ it('should find users container', () => {
99
+ cy.get(superadmin.selectors.usersContainer).should('exist')
100
+ })
101
+
102
+ it('should find users table', () => {
103
+ cy.get(superadmin.selectors.usersTable).should('exist')
104
+ })
105
+
106
+ it('should find users search input', () => {
107
+ cy.get(superadmin.selectors.usersSearch).should('exist')
108
+ })
109
+ })
110
+
111
+ // ============================================
112
+ // SEL_SADM_004: SUPERADMIN TEAMS PAGE
113
+ // ============================================
114
+ describe('SEL_SADM_004: Superadmin Teams Page', { tags: '@SEL_SADM_004' }, () => {
115
+ beforeEach(() => {
116
+ loginAsDefaultSuperadmin()
117
+ cy.visit('/superadmin/teams', { timeout: 60000, failOnStatusCode: false })
118
+ cy.url().should('include', '/superadmin/teams')
119
+ })
120
+
121
+ it('should find teams container', () => {
122
+ cy.get(superadmin.selectors.teamsContainer).should('exist')
123
+ })
124
+
125
+ it('should find teams table', () => {
126
+ cy.get(superadmin.selectors.teamsTable).should('exist')
127
+ })
128
+
129
+ it('should find teams search input', () => {
130
+ cy.get(superadmin.selectors.teamsSearch).should('exist')
131
+ })
132
+ })
133
+
134
+ // ============================================
135
+ // SEL_SADM_005: SUPERADMIN SUBSCRIPTIONS PAGE
136
+ // ============================================
137
+ describe('SEL_SADM_005: Superadmin Subscriptions Page', { tags: '@SEL_SADM_005' }, () => {
138
+ beforeEach(() => {
139
+ loginAsDefaultSuperadmin()
140
+ cy.visit('/superadmin/subscriptions', { timeout: 60000, failOnStatusCode: false })
141
+ cy.url().should('include', '/superadmin/subscriptions')
142
+ })
143
+
144
+ it('should find subscriptions container', () => {
145
+ cy.get(superadmin.selectors.subscriptionsContainer).should('exist')
146
+ })
147
+
148
+ it('should find MRR stat', () => {
149
+ cy.get(superadmin.selectors.subscriptionsMrr).should('exist')
150
+ })
151
+
152
+ it('should find plan distribution section', () => {
153
+ cy.get(superadmin.selectors.subscriptionsPlanDistribution).should('exist')
154
+ })
155
+
156
+ it('should find active count stat', () => {
157
+ cy.get(superadmin.selectors.subscriptionsActiveCount).should('exist')
158
+ })
159
+ })
160
+
161
+ // ============================================
162
+ // SEL_SADM_006: DYNAMIC SELECTORS (PATTERN VALIDATION)
163
+ // These test the selector pattern, not actual elements
164
+ // ============================================
165
+ describe('SEL_SADM_006: Dynamic Selectors (Pattern Validation)', { tags: '@SEL_SADM_006' }, () => {
166
+ beforeEach(() => {
167
+ loginAsDefaultSuperadmin()
168
+ cy.visit('/superadmin/users', { timeout: 60000, failOnStatusCode: false })
169
+ cy.url().should('include', '/superadmin/users')
170
+ })
171
+
172
+ it('should have valid userRow selector pattern', () => {
173
+ // Just verify the selector function returns a valid string
174
+ const selector = superadmin.selectors.userRow('test-id')
175
+ expect(selector).to.include('superadmin-user-row')
176
+ })
177
+
178
+ it('should have valid userView selector pattern', () => {
179
+ const selector = superadmin.selectors.userView('test-id')
180
+ expect(selector).to.include('superadmin-user-view')
181
+ })
182
+
183
+ it('should have valid teamRow selector pattern', () => {
184
+ const selector = superadmin.selectors.teamRow('test-id')
185
+ expect(selector).to.include('superadmin-team-row')
186
+ })
187
+
188
+ it('should have valid subscriptionsPlanCount selector pattern', () => {
189
+ const selector = superadmin.selectors.subscriptionsPlanCount('free')
190
+ expect(selector).to.include('superadmin-subscriptions-plan-count')
191
+ })
192
+ })
193
+ })