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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (332) hide show
  1. package/api/ai/chat/stream/route.ts +4 -1
  2. package/api/ai/orchestrator/route.ts +10 -3
  3. package/api/ai/single-agent/route.ts +10 -3
  4. package/api/ai/usage/route.ts +4 -1
  5. package/blocks/benefits/component.tsx +4 -4
  6. package/blocks/cta-section/component.tsx +4 -4
  7. package/blocks/faq-accordion/component.tsx +2 -2
  8. package/blocks/features-grid/component.tsx +5 -5
  9. package/blocks/hero/component.tsx +2 -2
  10. package/blocks/hero/fields.ts +1 -1
  11. package/blocks/hero-with-form/component.tsx +7 -7
  12. package/blocks/hero-with-form/fields.ts +1 -1
  13. package/blocks/jumbotron/component.tsx +7 -7
  14. package/blocks/jumbotron/fields.ts +1 -1
  15. package/blocks/logo-cloud/component.tsx +6 -6
  16. package/blocks/logo-cloud/fields.ts +1 -1
  17. package/blocks/post-content/component.tsx +2 -2
  18. package/blocks/pricing-table/component.tsx +5 -5
  19. package/blocks/split-content/component.tsx +5 -5
  20. package/blocks/split-content/fields.ts +1 -1
  21. package/blocks/stats-counter/component.tsx +9 -9
  22. package/blocks/testimonials/component.tsx +4 -4
  23. package/blocks/testimonials/fields.ts +1 -1
  24. package/blocks/text-content/component.tsx +12 -10
  25. package/blocks/timeline/component.tsx +12 -12
  26. package/blocks/video-hero/component.tsx +7 -7
  27. package/blocks/video-hero/fields.ts +1 -1
  28. package/components/ai-chat/ChatPanel.tsx +7 -7
  29. package/components/ai-chat/Message.tsx +2 -2
  30. package/components/ai-chat/MessageInput.tsx +3 -3
  31. package/components/ai-chat/MessageList.tsx +3 -3
  32. package/components/ai-chat/TypingIndicator.tsx +2 -2
  33. package/config/app.config.ts +90 -62
  34. package/config/billing.config.ts +5 -10
  35. package/config/dashboard.config.ts +14 -0
  36. package/config/features.config.ts +10 -0
  37. package/config/permissions.config.ts +22 -23
  38. package/docs/{01-overview → public/01-overview}/01-introduction.md +5 -0
  39. package/docs/{01-overview → public/01-overview}/02-customization.md +5 -0
  40. package/docs/{02-features → public/02-features}/03-tasks-entity.md +5 -0
  41. package/docs/{03-ai → public/03-ai}/01-overview.md +5 -0
  42. package/docs/{03-ai → public/03-ai}/02-customization.md +5 -0
  43. package/docs/superadmin/01-setup/01-configuration.md +79 -0
  44. package/docs/superadmin/01-setup/02-deployment.md +82 -0
  45. package/docs/superadmin/02-management/01-users.md +83 -0
  46. package/docs/superadmin/03-integrations/01-langchain.md +139 -0
  47. package/emails/verify-email.ts +33 -0
  48. package/entities/customers/api/docs.md +107 -0
  49. package/entities/customers/api/presets.ts +80 -0
  50. package/entities/pages/api/docs.md +114 -0
  51. package/entities/pages/api/presets.ts +72 -0
  52. package/entities/posts/api/docs.md +120 -0
  53. package/entities/posts/api/presets.ts +74 -0
  54. package/entities/tasks/api/docs.md +126 -0
  55. package/entities/tasks/api/presets.ts +84 -0
  56. package/lib/selectors.ts +7 -4
  57. package/messages/de/admin.json +45 -0
  58. package/messages/en/admin.json +56 -0
  59. package/messages/en/navigation.json +2 -1
  60. package/messages/es/admin.json +56 -0
  61. package/messages/es/navigation.json +2 -1
  62. package/messages/fr/admin.json +45 -0
  63. package/messages/it/admin.json +45 -0
  64. package/messages/pt/admin.json +45 -0
  65. package/migrations/089_add_editor_team_role.sql +15 -23
  66. package/migrations/090_demo_users_teams.sql +11 -11
  67. package/migrations/091_greek_teams_billing.sql +15 -15
  68. package/migrations/093_pages_sample_data.sql +7 -7
  69. package/migrations/098_patterns_sample_data.sql +234 -0
  70. package/nextsparkjs-theme-default-0.1.0-beta.137.tgz +0 -0
  71. package/package.json +4 -3
  72. package/styles/globals.css +42 -0
  73. package/templates/(public)/page.tsx +1 -1
  74. package/tests/cypress/e2e/_utils/devtools/access.bdd.md +262 -0
  75. package/tests/cypress/e2e/_utils/devtools/access.cy.ts +171 -0
  76. package/tests/cypress/e2e/_utils/devtools/navigation.bdd.md +261 -0
  77. package/tests/cypress/e2e/_utils/devtools/navigation.cy.ts +157 -0
  78. package/tests/cypress/e2e/_utils/devtools/pages.bdd.md +303 -0
  79. package/tests/cypress/e2e/_utils/devtools/pages.cy.ts +184 -0
  80. package/tests/cypress/e2e/_utils/docs/README.md +215 -0
  81. package/tests/cypress/e2e/_utils/selectors/auth.bdd.md +354 -0
  82. package/tests/cypress/e2e/_utils/selectors/auth.cy.ts +310 -0
  83. package/tests/cypress/e2e/_utils/selectors/billing.bdd.md +276 -0
  84. package/tests/cypress/e2e/_utils/selectors/billing.cy.ts +182 -0
  85. package/tests/cypress/e2e/_utils/selectors/block-editor.bdd.md +615 -0
  86. package/tests/cypress/e2e/_utils/selectors/block-editor.cy.ts +783 -0
  87. package/tests/cypress/e2e/_utils/selectors/dashboard-container.cy.ts +52 -0
  88. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.bdd.md +205 -0
  89. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.cy.ts +137 -0
  90. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.bdd.md +147 -0
  91. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.cy.ts +114 -0
  92. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.bdd.md +76 -0
  93. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.cy.ts +68 -0
  94. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.bdd.md +326 -0
  95. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.cy.ts +177 -0
  96. package/tests/cypress/e2e/_utils/selectors/devtools.bdd.md +306 -0
  97. package/tests/cypress/e2e/_utils/selectors/devtools.cy.ts +273 -0
  98. package/tests/cypress/e2e/_utils/selectors/global-search.bdd.md +115 -0
  99. package/tests/cypress/e2e/_utils/selectors/global-search.cy.ts +93 -0
  100. package/tests/cypress/e2e/_utils/selectors/patterns.bdd.md +388 -0
  101. package/tests/cypress/e2e/_utils/selectors/patterns.cy.ts +559 -0
  102. package/tests/cypress/e2e/_utils/selectors/public.cy.ts +112 -0
  103. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.bdd.md +266 -0
  104. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.cy.ts +233 -0
  105. package/tests/cypress/e2e/_utils/selectors/settings-billing.bdd.md +78 -0
  106. package/tests/cypress/e2e/_utils/selectors/settings-billing.cy.ts +108 -0
  107. package/tests/cypress/e2e/_utils/selectors/settings-layout.bdd.md +129 -0
  108. package/tests/cypress/e2e/_utils/selectors/settings-layout.cy.ts +115 -0
  109. package/tests/cypress/e2e/_utils/selectors/settings-password.bdd.md +82 -0
  110. package/tests/cypress/e2e/_utils/selectors/settings-password.cy.ts +74 -0
  111. package/tests/cypress/e2e/_utils/selectors/settings-profile.bdd.md +77 -0
  112. package/tests/cypress/e2e/_utils/selectors/settings-profile.cy.ts +79 -0
  113. package/tests/cypress/e2e/_utils/selectors/settings-teams.bdd.md +130 -0
  114. package/tests/cypress/e2e/_utils/selectors/settings-teams.cy.ts +86 -0
  115. package/tests/cypress/e2e/_utils/selectors/superadmin.bdd.md +261 -0
  116. package/tests/cypress/e2e/_utils/selectors/superadmin.cy.ts +193 -0
  117. package/tests/cypress/e2e/_utils/selectors/tasks.bdd.md +593 -0
  118. package/tests/cypress/e2e/_utils/selectors/tasks.cy.ts +864 -0
  119. package/tests/cypress/e2e/_utils/selectors/taxonomies.cy.ts +126 -0
  120. package/tests/cypress/e2e/_utils/selectors/teams.bdd.md +278 -0
  121. package/tests/cypress/e2e/_utils/selectors/teams.cy.ts +195 -0
  122. package/tests/cypress/e2e/_utils/superadmin/all-teams.bdd.md +261 -0
  123. package/tests/cypress/e2e/_utils/superadmin/all-teams.cy.ts +177 -0
  124. package/tests/cypress/e2e/_utils/superadmin/all-users.bdd.md +406 -0
  125. package/tests/cypress/e2e/_utils/superadmin/all-users.cy.ts +294 -0
  126. package/tests/cypress/e2e/_utils/superadmin/dashboard.bdd.md +235 -0
  127. package/tests/cypress/e2e/_utils/superadmin/dashboard.cy.ts +149 -0
  128. package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.bdd.md +290 -0
  129. package/tests/cypress/e2e/_utils/superadmin/subscriptions-overview.cy.ts +194 -0
  130. package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
  131. package/tests/cypress/e2e/ai/chat-api.cy.ts +119 -0
  132. package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
  133. package/tests/cypress/e2e/api/_core/billing/BillingAPIController.js +319 -0
  134. package/tests/cypress/e2e/api/_core/billing/check-action.cy.ts +326 -0
  135. package/tests/cypress/e2e/api/_core/billing/checkout.cy.ts +358 -0
  136. package/tests/cypress/e2e/api/_core/billing/lifecycle.cy.ts +423 -0
  137. package/tests/cypress/e2e/api/_core/billing/plans/README.md +345 -0
  138. package/tests/cypress/e2e/api/_core/billing/plans/business.cy.ts +412 -0
  139. package/tests/cypress/e2e/api/_core/billing/plans/downgrade.cy.ts +510 -0
  140. package/tests/cypress/e2e/api/_core/billing/plans/fixtures/billing-plans.json +163 -0
  141. package/tests/cypress/e2e/api/_core/billing/plans/free.cy.ts +500 -0
  142. package/tests/cypress/e2e/api/_core/billing/plans/pro.cy.ts +497 -0
  143. package/tests/cypress/e2e/api/_core/billing/plans/starter.cy.ts +342 -0
  144. package/tests/cypress/e2e/api/_core/billing/portal.cy.ts +313 -0
  145. package/tests/cypress/e2e/api/_core/devtools/registries.bdd.md +300 -0
  146. package/tests/cypress/e2e/api/_core/devtools/registries.cy.ts +368 -0
  147. package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.bdd.md +375 -0
  148. package/tests/cypress/e2e/api/_core/scheduled-actions/cron-endpoint.cy.ts +346 -0
  149. package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.bdd.md +451 -0
  150. package/tests/cypress/e2e/api/_core/scheduled-actions/devtools-endpoint.cy.ts +447 -0
  151. package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.bdd.md +649 -0
  152. package/tests/cypress/e2e/api/_core/scheduled-actions/scheduling.cy.ts +333 -0
  153. package/tests/cypress/e2e/api/_core/security/security-headers.cy.ts +601 -0
  154. package/tests/cypress/e2e/api/_core/settings/api-keys.crud.cy.ts +923 -0
  155. package/tests/cypress/e2e/api/_core/teams/teams-security.cy.ts +415 -0
  156. package/tests/cypress/e2e/api/_core/users/users-crud.cy.ts +469 -0
  157. package/tests/cypress/e2e/api/_core/users/users-metas.cy.ts +913 -0
  158. package/tests/cypress/e2e/api/_core/users/users-security.cy.ts +375 -0
  159. package/tests/cypress/e2e/api/entities/customers/customers-crud.cy.ts +648 -0
  160. package/tests/cypress/e2e/api/entities/customers/customers-metas.cy.ts +839 -0
  161. package/tests/cypress/e2e/api/entities/media/media-crud.cy.ts +600 -0
  162. package/tests/cypress/e2e/api/entities/media/media-role-permissions.cy.ts +617 -0
  163. package/tests/cypress/e2e/api/entities/media/media-team-isolation.cy.ts +464 -0
  164. package/tests/cypress/e2e/api/entities/pages/blocks-scope.cy.ts +396 -0
  165. package/tests/cypress/e2e/api/entities/pages/pages-crud.cy.ts +425 -0
  166. package/tests/cypress/e2e/api/entities/pages/pages-status.cy.ts +335 -0
  167. package/tests/cypress/e2e/api/entities/posts/post-categories-crud.cy.ts +610 -0
  168. package/tests/cypress/e2e/api/entities/posts/posts-crud.cy.ts +709 -0
  169. package/tests/cypress/e2e/api/entities/posts/posts-status.cy.ts +396 -0
  170. package/tests/cypress/e2e/api/entities/tasks/tasks-crud.cy.ts +602 -0
  171. package/tests/cypress/e2e/api/entities/tasks/tasks-metas.cy.ts +878 -0
  172. package/tests/cypress/e2e/patterns/patterns-in-pages.cy.ts +367 -0
  173. package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.bdd.md +231 -0
  174. package/tests/cypress/e2e/uat/_core/auth/app-roles/developer-login.cy.ts +144 -0
  175. package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.bdd.md +118 -0
  176. package/tests/cypress/e2e/uat/_core/auth/app-roles/superadmin-login.cy.ts +84 -0
  177. package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.bdd.md +288 -0
  178. package/tests/cypress/e2e/uat/_core/auth/custom-roles/editor-login.cy.ts +188 -0
  179. package/tests/cypress/e2e/uat/_core/auth/login-logout.bdd.md +160 -0
  180. package/tests/cypress/e2e/uat/_core/auth/login-logout.cy.ts +116 -0
  181. package/tests/cypress/e2e/uat/_core/auth/password-reset.bdd.md +289 -0
  182. package/tests/cypress/e2e/uat/_core/auth/password-reset.cy.ts +200 -0
  183. package/tests/cypress/e2e/uat/_core/auth/registration-control-invitation.cy.ts +176 -0
  184. package/tests/cypress/e2e/uat/_core/auth/registration-control-open.cy.ts +131 -0
  185. package/tests/cypress/e2e/uat/_core/auth/registration-control.cy.ts +140 -0
  186. package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.bdd.md +225 -0
  187. package/tests/cypress/e2e/uat/_core/auth/team-roles/admin-login.cy.ts +148 -0
  188. package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.bdd.md +251 -0
  189. package/tests/cypress/e2e/uat/_core/auth/team-roles/member-login.cy.ts +163 -0
  190. package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.bdd.md +231 -0
  191. package/tests/cypress/e2e/uat/_core/auth/team-roles/owner-login.cy.ts +141 -0
  192. package/tests/cypress/e2e/uat/_core/billing/extended.bdd.md +273 -0
  193. package/tests/cypress/e2e/uat/_core/billing/extended.cy.ts +209 -0
  194. package/tests/cypress/e2e/uat/_core/billing/feature-gates.bdd.md +407 -0
  195. package/tests/cypress/e2e/uat/_core/billing/feature-gates.cy.ts +307 -0
  196. package/tests/cypress/e2e/uat/_core/billing/page.bdd.md +329 -0
  197. package/tests/cypress/e2e/uat/_core/billing/page.cy.ts +250 -0
  198. package/tests/cypress/e2e/uat/_core/billing/status.bdd.md +190 -0
  199. package/tests/cypress/e2e/uat/_core/billing/status.cy.ts +145 -0
  200. package/tests/cypress/e2e/uat/_core/billing/team-switch.bdd.md +156 -0
  201. package/tests/cypress/e2e/uat/_core/billing/team-switch.cy.ts +122 -0
  202. package/tests/cypress/e2e/uat/_core/billing/usage.bdd.md +218 -0
  203. package/tests/cypress/e2e/uat/_core/billing/usage.cy.ts +176 -0
  204. package/tests/cypress/e2e/uat/_core/blocks/hero.bdd.md +124 -0
  205. package/tests/cypress/e2e/uat/_core/blocks/hero.cy.ts +56 -0
  206. package/tests/cypress/e2e/uat/_core/devtools/api-tester.cy.ts +390 -0
  207. package/tests/cypress/e2e/uat/_core/performance/suspense-loading.cy.ts +134 -0
  208. package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.bdd.md +736 -0
  209. package/tests/cypress/e2e/uat/_core/scheduled-actions/devtools-ui.cy.ts +740 -0
  210. package/tests/cypress/e2e/uat/_core/teams/inline-edit.cy.ts +278 -0
  211. package/tests/cypress/e2e/uat/_core/teams/roles-matrix.bdd.md +553 -0
  212. package/tests/cypress/e2e/uat/_core/teams/roles-matrix.cy.ts +185 -0
  213. package/tests/cypress/e2e/uat/_core/teams/switcher.bdd.md +1151 -0
  214. package/tests/cypress/e2e/uat/_core/teams/switcher.cy.ts +497 -0
  215. package/tests/cypress/e2e/uat/_core/teams/team-switcher.md +198 -0
  216. package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
  217. package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
  218. package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
  219. package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
  220. package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
  221. package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
  222. package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
  223. package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
  224. package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
  225. package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
  226. package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
  227. package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
  228. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
  229. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
  230. package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
  231. package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
  232. package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
  233. package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
  234. package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
  235. package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
  236. package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
  237. package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
  238. package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
  239. package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
  240. package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
  241. package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
  242. package/tests/cypress/e2e/uat/features/roles/editor-role.bdd.md +552 -0
  243. package/tests/cypress/e2e/uat/features/roles/editor-role.cy.ts +210 -0
  244. package/tests/cypress/e2e/uat/features/roles/member-restrictions.bdd.md +450 -0
  245. package/tests/cypress/e2e/uat/features/roles/member-restrictions.cy.ts +189 -0
  246. package/tests/cypress/e2e/uat/features/roles/owner-full-crud.bdd.md +530 -0
  247. package/tests/cypress/e2e/uat/features/roles/owner-full-crud.cy.ts +247 -0
  248. package/tests/cypress/fixtures/blocks.json +218 -0
  249. package/tests/cypress/fixtures/entities.json +87 -0
  250. package/tests/cypress/fixtures/page-builder.json +21 -0
  251. package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
  252. package/tests/cypress/src/components/CustomersPOM.ts +439 -0
  253. package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
  254. package/tests/cypress/src/components/EntityForm.ts +375 -0
  255. package/tests/cypress/src/components/EntityList.ts +389 -0
  256. package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
  257. package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
  258. package/tests/cypress/src/components/PostsListPOM.ts +223 -0
  259. package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
  260. package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
  261. package/tests/cypress/src/components/TasksPOM.ts +272 -0
  262. package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
  263. package/tests/cypress/src/components/index.ts +21 -0
  264. package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
  265. package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
  266. package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
  267. package/tests/cypress/src/controllers/MediaAPIController.js +231 -0
  268. package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
  269. package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
  270. package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
  271. package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
  272. package/tests/cypress/src/controllers/index.js +25 -0
  273. package/tests/cypress/src/core/AuthPOM.ts +450 -0
  274. package/tests/cypress/src/core/BasePOM.ts +33 -0
  275. package/tests/cypress/src/core/BlockEditorBasePOM.ts +874 -0
  276. package/tests/cypress/src/core/DashboardEntityPOM.ts +41 -0
  277. package/tests/cypress/src/core/index.ts +14 -0
  278. package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
  279. package/tests/cypress/src/entities/PagesPOM.ts +137 -0
  280. package/tests/cypress/src/entities/PatternsPOM.ts +329 -0
  281. package/tests/cypress/src/entities/PostsPOM.ts +137 -0
  282. package/tests/cypress/src/entities/TasksPOM.ts +246 -0
  283. package/tests/cypress/src/entities/index.ts +16 -0
  284. package/tests/cypress/src/features/BillingPOM.ts +385 -0
  285. package/tests/cypress/src/features/DashboardPOM.ts +271 -0
  286. package/tests/cypress/src/features/DevtoolsPOM.ts +750 -0
  287. package/tests/cypress/src/features/PageBuilderPOM.ts +283 -0
  288. package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
  289. package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
  290. package/tests/cypress/src/features/SettingsPOM.ts +707 -0
  291. package/tests/cypress/src/features/SuperadminPOM.ts +851 -0
  292. package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
  293. package/tests/cypress/src/features/index.ts +28 -0
  294. package/tests/cypress/src/helpers/ApiInterceptor.ts +20 -0
  295. package/tests/cypress/src/index.ts +101 -0
  296. package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
  297. package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
  298. package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
  299. package/tests/cypress/src/pages/dashboard/index.js +6 -0
  300. package/tests/cypress/src/pages/index.js +5 -0
  301. package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
  302. package/tests/cypress/src/pages/public/LandingPage.js +69 -0
  303. package/tests/cypress/src/pages/public/PricingPage.js +33 -0
  304. package/tests/cypress/src/pages/public/index.js +6 -0
  305. package/tests/cypress/src/selectors.ts +46 -0
  306. package/tests/cypress/src/session-helpers.ts +518 -0
  307. package/tests/cypress/support/doc-commands.ts +260 -0
  308. package/tests/cypress/support/e2e.ts +90 -0
  309. package/tests/cypress.config.ts +178 -0
  310. package/tests/jest/__mocks__/@nextsparkjs/core/components/ui/badge.js +16 -0
  311. package/tests/jest/__mocks__/@nextsparkjs/core/lib/db.js +11 -0
  312. package/tests/jest/__mocks__/@nextsparkjs/registries/permissions-registry.ts +160 -0
  313. package/tests/jest/__mocks__/@nextsparkjs/registries/theme-registry.ts +68 -0
  314. package/tests/jest/__mocks__/jose.js +22 -0
  315. package/tests/jest/__mocks__/next/image.js +15 -0
  316. package/tests/jest/__mocks__/next-server.js +56 -0
  317. package/tests/jest/components/post-header.test.tsx +377 -0
  318. package/tests/jest/jest.config.cjs +154 -0
  319. package/tests/jest/langchain/COVERAGE.md +372 -0
  320. package/tests/jest/langchain/guardrails.test.ts +465 -0
  321. package/tests/jest/langchain/streaming.test.ts +370 -0
  322. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  323. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  324. package/tests/jest/langchain/tracer.test.ts +823 -0
  325. package/tests/jest/services/tasks.service.test.ts +707 -0
  326. package/tests/jest/setup.ts +170 -0
  327. package/tests/jest/tsconfig.jest.json +6 -0
  328. package/tests/jest/validation/categories.test.ts +429 -0
  329. package/tests/jest/validation/posts.test.ts +546 -0
  330. package/tests/tsconfig.json +21 -0
  331. /package/docs/{02-features → public/02-features}/01-components.md +0 -0
  332. /package/docs/{02-features → public/02-features}/02-styling.md +0 -0
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Theme Selectors for Cypress Tests
3
+ *
4
+ * This file re-exports from the main selectors in lib/.
5
+ * The lib/selectors.ts is the source of truth, placed there so
6
+ * block components can import it (tests/ is excluded from TypeScript).
7
+ *
8
+ * Architecture:
9
+ * - Core selectors: `core/lib/test/core-selectors.ts`
10
+ * - Theme selectors (source): `lib/selectors.ts`
11
+ * - Theme selectors (tests): This file (re-exports)
12
+ *
13
+ * @example POM usage:
14
+ * ```typescript
15
+ * import { cySelector, sel, SELECTORS } from '../selectors'
16
+ *
17
+ * class MyPOM extends BasePOM {
18
+ * get elements() {
19
+ * return {
20
+ * loginForm: cySelector('auth.login.form'),
21
+ * submitButton: cySelector('auth.login.submit'),
22
+ * heroBlock: cySelector('blocks.hero.container'),
23
+ * }
24
+ * }
25
+ * }
26
+ * ```
27
+ */
28
+
29
+ // Re-export everything from the lib selectors
30
+ export {
31
+ BLOCK_SELECTORS,
32
+ THEME_SELECTORS,
33
+ SELECTORS,
34
+ sel,
35
+ s,
36
+ selDev,
37
+ cySelector,
38
+ entitySelectors,
39
+ CORE_SELECTORS,
40
+ } from '../../../lib/selectors'
41
+
42
+ export type {
43
+ ThemeSelectorsType,
44
+ BlockSelectorsType,
45
+ Replacements,
46
+ } from '../../../lib/selectors'
@@ -0,0 +1,518 @@
1
+ /**
2
+ * Default Theme Session Helpers
3
+ *
4
+ * Direct login functions for Default theme tests using theme-specific users.
5
+ * These helpers don't depend on ACTIVE_THEME environment variable.
6
+ *
7
+ * EXPERIMENTAL: Uses API-based login instead of UI login.
8
+ * Hypothesis: API login is faster and more stable than DevKeyring UI login,
9
+ * especially with slow dev servers (Turbopack on-demand compilation).
10
+ *
11
+ * Test file: cypress/e2e/_experimental/api-login-test.cy.ts
12
+ * Fallback: If API fails, falls back to UI login with DevKeyring.
13
+ *
14
+ * IMPORTANT: After login, this helper sets activeTeamId in localStorage.
15
+ * This is required because all entity API calls include x-team-id header
16
+ * which is read from localStorage.activeTeamId (see core/lib/api/entities.ts).
17
+ * Without this, API calls return 400 "Team context required".
18
+ */
19
+
20
+ import { DevKeyringPOM as DevKeyring } from './components/DevKeyringPOM'
21
+
22
+ /**
23
+ * Environment-based Test Credentials
24
+ *
25
+ * These can be overridden via Cypress env variables (cypress.config.ts or CLI):
26
+ * - CYPRESS_DEVELOPER_EMAIL / CYPRESS_DEVELOPER_PASSWORD - Developer user
27
+ * - CYPRESS_SUPERADMIN_EMAIL / CYPRESS_SUPERADMIN_PASSWORD - Superadmin user
28
+ * - CYPRESS_OWNER_EMAIL, CYPRESS_ADMIN_EMAIL, etc. - Demo theme users
29
+ *
30
+ * Fallback values are the default users from core and theme sample data.
31
+ */
32
+
33
+ // Core system user credentials (configurable via env)
34
+ const DEVELOPER_EMAIL = Cypress.env('DEVELOPER_EMAIL') || 'developer@nextspark.dev'
35
+ const DEVELOPER_PASSWORD = Cypress.env('DEVELOPER_PASSWORD') || 'Pandora1234'
36
+ const SUPERADMIN_PASSWORD = Cypress.env('SUPERADMIN_PASSWORD') || 'Pandora1234'
37
+
38
+ // Demo user password (configurable via env)
39
+ const TEST_PASSWORD = Cypress.env('TEST_PASSWORD') || 'Test1234'
40
+
41
+ /**
42
+ * Default Theme Test Users
43
+ * Teams: Everpoint Labs, Ironvale Global, Riverstone Ventures
44
+ *
45
+ * Note: These are fallback demo users. For selector tests, use CORE_USER (developer).
46
+ */
47
+ export const DEFAULT_THEME_USERS = {
48
+ OWNER: Cypress.env('OWNER_EMAIL') || 'carlos.mendoza@nextspark.dev',
49
+ ADMIN: Cypress.env('ADMIN_EMAIL') || 'james.wilson@nextspark.dev',
50
+ MEMBER: Cypress.env('MEMBER_EMAIL') || 'emily.johnson@nextspark.dev',
51
+ EDITOR: Cypress.env('EDITOR_EMAIL') || 'diego.ramirez@nextspark.dev',
52
+ VIEWER: Cypress.env('VIEWER_EMAIL') || 'sarah.davis@nextspark.dev',
53
+ } as const
54
+
55
+ /**
56
+ * Core System Users (from core/migrations/090_sample_data.sql)
57
+ * These users have special global roles, not team-based roles
58
+ *
59
+ * IMPORTANT: DEVELOPER is the recommended user for most tests.
60
+ * Configurable via CYPRESS_DEVELOPER_EMAIL env variable.
61
+ */
62
+ export const CORE_USERS = {
63
+ SUPERADMIN: Cypress.env('SUPERADMIN_EMAIL') || 'superadmin@nextspark.dev',
64
+ DEVELOPER: DEVELOPER_EMAIL,
65
+ } as const
66
+
67
+ // Extended timeout for dev server compilation (60s for slow cold starts)
68
+ const API_TIMEOUT = 60000
69
+
70
+ /**
71
+ * Sets up team context after login (requires page to be loaded for localStorage access)
72
+ *
73
+ * This is CRITICAL for entity API calls to work:
74
+ * 1. Fetches user's teams from /api/v1/teams
75
+ * 2. Sets activeTeamId in localStorage (used by frontend to add x-team-id header)
76
+ * 3. Calls /api/v1/teams/switch to set server-side team cookie
77
+ *
78
+ * Without this, all entity API calls return 400 "Team context required"
79
+ *
80
+ * @param preferredRole - Optional role to filter teams by (e.g., 'member' to select team where user is member)
81
+ */
82
+ function setupTeamContext(preferredRole?: string) {
83
+ cy.request({
84
+ method: 'GET',
85
+ url: '/api/v1/teams',
86
+ timeout: API_TIMEOUT,
87
+ failOnStatusCode: false
88
+ }).then((teamsResponse) => {
89
+ if (teamsResponse.status === 200 && teamsResponse.body?.data?.length > 0) {
90
+ const teams = teamsResponse.body.data
91
+
92
+ // If preferredRole specified, find team where user has that role
93
+ let selectedTeam = teams[0]
94
+ if (preferredRole) {
95
+ const teamWithRole = teams.find((t: { role: string }) => t.role === preferredRole)
96
+ if (teamWithRole) {
97
+ selectedTeam = teamWithRole
98
+ cy.log(`✅ Found team with role "${preferredRole}": ${selectedTeam.name}`)
99
+ } else {
100
+ cy.log(`⚠️ No team found with role "${preferredRole}", using first team`)
101
+ }
102
+ }
103
+
104
+ const teamId = selectedTeam.id
105
+
106
+ cy.log(`✅ Setting active team: ${selectedTeam.name} (${teamId}) - role: ${selectedTeam.role}`)
107
+
108
+ // Set in localStorage (used by frontend buildHeaders() to add x-team-id)
109
+ cy.window().then((win) => {
110
+ win.localStorage.setItem('activeTeamId', teamId)
111
+ })
112
+
113
+ // Call teams/switch to set server-side cookie (for SSR/layouts)
114
+ cy.request({
115
+ method: 'POST',
116
+ url: '/api/v1/teams/switch',
117
+ body: { teamId },
118
+ timeout: API_TIMEOUT,
119
+ failOnStatusCode: false
120
+ })
121
+ } else {
122
+ cy.log(`⚠️ No teams found for user, API calls requiring team context will fail`)
123
+ }
124
+ })
125
+ }
126
+
127
+ /**
128
+ * Login via API (faster and more stable than UI)
129
+ * Returns true if API login succeeded, false if fallback to UI was needed.
130
+ *
131
+ * @param email - User email to login
132
+ * @param password - Optional password (defaults to TEST_PASSWORD for demo users)
133
+ */
134
+ function apiLogin(email: string, password: string = TEST_PASSWORD): Cypress.Chainable<boolean> {
135
+ return cy.request({
136
+ method: 'POST',
137
+ url: '/api/auth/sign-in/email',
138
+ body: { email, password },
139
+ timeout: API_TIMEOUT,
140
+ failOnStatusCode: false
141
+ }).then((response) => {
142
+ if (response.status === 200) {
143
+ return true
144
+ } else {
145
+ cy.log(`⚠️ API login failed with status ${response.status}, falling back to UI login`)
146
+ // Fallback to UI login if API fails
147
+ cy.visit('/login', { timeout: 60000 })
148
+ const devKeyring = new DevKeyring()
149
+ devKeyring.validateVisible()
150
+ devKeyring.quickLoginByEmail(email)
151
+ return false
152
+ }
153
+ })
154
+ }
155
+
156
+ /**
157
+ * Login as Default Theme Owner
158
+ * Session is cached and reused across tests
159
+ *
160
+ * Flow:
161
+ * 1. API login (or UI fallback)
162
+ * 2. Visit dashboard to load page context
163
+ * 3. Setup team context (sets localStorage.activeTeamId)
164
+ */
165
+ export function loginAsDefaultOwner() {
166
+ cy.session('default-owner-session', () => {
167
+ apiLogin(DEFAULT_THEME_USERS.OWNER).then((apiLoginSucceeded) => {
168
+ // If API login succeeded, we need to visit a page before setting localStorage
169
+ if (apiLoginSucceeded) {
170
+ cy.visit('/dashboard', { timeout: 60000 })
171
+ }
172
+ // URL assertion to ensure page loaded
173
+ cy.url().should('include', '/dashboard')
174
+ // Setup team context (requires page to be loaded for localStorage)
175
+ setupTeamContext()
176
+ })
177
+ }, {
178
+ validate: () => {
179
+ // Validate auth session exists
180
+ cy.request({
181
+ url: '/api/auth/get-session',
182
+ timeout: API_TIMEOUT,
183
+ failOnStatusCode: false
184
+ }).its('status').should('eq', 200)
185
+
186
+ // Validate team context exists in localStorage
187
+ // This ensures API calls will have x-team-id header
188
+ cy.window().then((win) => {
189
+ const teamId = win.localStorage.getItem('activeTeamId')
190
+ expect(teamId, 'activeTeamId should exist in localStorage').to.not.be.null
191
+ expect(teamId, 'activeTeamId should not be empty').to.not.be.empty
192
+ })
193
+ }
194
+ })
195
+ }
196
+
197
+ /**
198
+ * Login as Default Theme Admin
199
+ * Session is cached and reused across tests
200
+ */
201
+ export function loginAsDefaultAdmin() {
202
+ cy.session('default-admin-session', () => {
203
+ apiLogin(DEFAULT_THEME_USERS.ADMIN).then((apiLoginSucceeded) => {
204
+ if (apiLoginSucceeded) {
205
+ cy.visit('/dashboard', { timeout: 60000 })
206
+ }
207
+ cy.url().should('include', '/dashboard')
208
+ setupTeamContext()
209
+ })
210
+ }, {
211
+ validate: () => {
212
+ cy.request({
213
+ url: '/api/auth/get-session',
214
+ timeout: API_TIMEOUT,
215
+ failOnStatusCode: false
216
+ }).its('status').should('eq', 200)
217
+ }
218
+ })
219
+ }
220
+
221
+ /**
222
+ * Login as Default Theme Member
223
+ * Session is cached and reused across tests
224
+ *
225
+ * Note: Emily Johnson is member of Everpoint but admin of Riverstone.
226
+ * We explicitly select the team where she has 'member' role.
227
+ */
228
+ export function loginAsDefaultMember() {
229
+ cy.session('default-member-session', () => {
230
+ apiLogin(DEFAULT_THEME_USERS.MEMBER).then((apiLoginSucceeded) => {
231
+ if (apiLoginSucceeded) {
232
+ cy.visit('/dashboard', { timeout: 60000 })
233
+ }
234
+ cy.url().should('include', '/dashboard')
235
+ // Explicitly select team where user is member (not admin)
236
+ setupTeamContext('member')
237
+ })
238
+ }, {
239
+ validate: () => {
240
+ cy.request({
241
+ url: '/api/auth/get-session',
242
+ timeout: API_TIMEOUT,
243
+ failOnStatusCode: false
244
+ }).its('status').should('eq', 200)
245
+ }
246
+ })
247
+ }
248
+
249
+ /**
250
+ * Login as Default Theme Viewer
251
+ * Session is cached and reused across tests
252
+ */
253
+ export function loginAsDefaultViewer() {
254
+ cy.session('default-viewer-session', () => {
255
+ apiLogin(DEFAULT_THEME_USERS.VIEWER).then((apiLoginSucceeded) => {
256
+ if (apiLoginSucceeded) {
257
+ cy.visit('/dashboard', { timeout: 60000 })
258
+ }
259
+ cy.url().should('include', '/dashboard')
260
+ setupTeamContext()
261
+ })
262
+ }, {
263
+ validate: () => {
264
+ cy.request({
265
+ url: '/api/auth/get-session',
266
+ timeout: API_TIMEOUT,
267
+ failOnStatusCode: false
268
+ }).its('status').should('eq', 200)
269
+ }
270
+ })
271
+ }
272
+
273
+ /**
274
+ * Login as Default Theme Editor
275
+ * Session is cached and reused across tests
276
+ *
277
+ * Editor is a custom role with limited permissions:
278
+ * - Can view/list customers but cannot create/update/delete
279
+ * - Cannot access Admin or Dev Zone
280
+ */
281
+ export function loginAsDefaultEditor() {
282
+ cy.session('default-editor-session', () => {
283
+ apiLogin(DEFAULT_THEME_USERS.EDITOR).then((apiLoginSucceeded) => {
284
+ if (apiLoginSucceeded) {
285
+ cy.visit('/dashboard', { timeout: 60000 })
286
+ }
287
+ cy.url().should('include', '/dashboard')
288
+ setupTeamContext()
289
+ })
290
+ }, {
291
+ validate: () => {
292
+ cy.request({
293
+ url: '/api/auth/get-session',
294
+ timeout: API_TIMEOUT,
295
+ failOnStatusCode: false
296
+ }).its('status').should('eq', 200)
297
+ }
298
+ })
299
+ }
300
+
301
+ /**
302
+ * Login as Superadmin (core system user)
303
+ * Session is cached and reused across tests
304
+ *
305
+ * Superadmin has global access:
306
+ * - Full Admin access
307
+ * - Not team-based (no setupTeamContext needed)
308
+ */
309
+ export function loginAsDefaultSuperadmin() {
310
+ cy.session('default-superadmin-session', () => {
311
+ apiLogin(CORE_USERS.SUPERADMIN, SUPERADMIN_PASSWORD).then((apiLoginSucceeded) => {
312
+ if (apiLoginSucceeded) {
313
+ cy.visit('/superadmin', { timeout: 60000 })
314
+ }
315
+ // Superadmin should land on superadmin panel or dashboard
316
+ cy.url().should('satisfy', (url: string) => {
317
+ return url.includes('/superadmin') || url.includes('/dashboard')
318
+ })
319
+ })
320
+ }, {
321
+ validate: () => {
322
+ cy.request({
323
+ url: '/api/auth/get-session',
324
+ timeout: API_TIMEOUT,
325
+ failOnStatusCode: false
326
+ }).its('status').should('eq', 200)
327
+ }
328
+ })
329
+ }
330
+
331
+ /**
332
+ * Login as Developer (core system user)
333
+ * Session is cached and reused across tests
334
+ *
335
+ * Developer has:
336
+ * - Dev Zone access
337
+ * - Not team-based (no setupTeamContext needed)
338
+ */
339
+ export function loginAsDefaultDeveloper() {
340
+ cy.session('default-developer-session', () => {
341
+ apiLogin(CORE_USERS.DEVELOPER, DEVELOPER_PASSWORD).then((apiLoginSucceeded) => {
342
+ if (apiLoginSucceeded) {
343
+ cy.visit('/devtools', { timeout: 60000 })
344
+ }
345
+ // Developer should land on devtools or dashboard
346
+ cy.url().should('satisfy', (url: string) => {
347
+ return url.includes('/devtools') || url.includes('/dashboard')
348
+ })
349
+ })
350
+ }, {
351
+ validate: () => {
352
+ cy.request({
353
+ url: '/api/auth/get-session',
354
+ timeout: API_TIMEOUT,
355
+ failOnStatusCode: false
356
+ }).its('status').should('eq', 200)
357
+ }
358
+ })
359
+ }
360
+
361
+ // Aliases for convenience
362
+ export const loginAsOwner = loginAsDefaultOwner
363
+ export const loginAsMember = loginAsDefaultMember
364
+ export const loginAsAdmin = loginAsDefaultAdmin
365
+ export const loginAsEditor = loginAsDefaultEditor
366
+ export const loginAsViewer = loginAsDefaultViewer
367
+ export const loginAsSuperadmin = loginAsDefaultSuperadmin
368
+ export const loginAsDeveloper = loginAsDefaultDeveloper
369
+
370
+ /**
371
+ * Returns theme users for backwards compatibility with external helper pattern.
372
+ * Used by tests that import { getThemeUsers } from session-helpers.
373
+ */
374
+ export function getThemeUsers() {
375
+ return DEFAULT_THEME_USERS
376
+ }
377
+
378
+ // ============================================================
379
+ // BILLING TEST USERS
380
+ // ============================================================
381
+
382
+ /**
383
+ * Billing Test Users - Teams with different subscription plans
384
+ *
385
+ * These users/teams are used to test billing features from different plan perspectives:
386
+ * - Free Plan: Carlos's personal team (team-personal-carlos-001)
387
+ * - Pro Plan: Everpoint Labs (team-everpoint-001)
388
+ * - Enterprise Plan: Ironvale Global (team-ironvale-002)
389
+ */
390
+ export const BILLING_TEAMS = {
391
+ FREE: {
392
+ teamId: 'team-personal-carlos-001',
393
+ name: 'Carlos Personal',
394
+ planSlug: 'free',
395
+ owner: 'carlos.mendoza@nextspark.dev'
396
+ },
397
+ PRO: {
398
+ teamId: 'team-everpoint-001',
399
+ name: 'Everpoint Labs',
400
+ planSlug: 'pro',
401
+ owner: 'carlos.mendoza@nextspark.dev'
402
+ },
403
+ ENTERPRISE: {
404
+ teamId: 'team-ironvale-002',
405
+ name: 'Ironvale Global',
406
+ planSlug: 'enterprise',
407
+ owner: 'ana.garcia@nextspark.dev'
408
+ }
409
+ } as const
410
+
411
+ /**
412
+ * Switch to a specific team after login
413
+ * @param teamId - Team ID to switch to
414
+ */
415
+ function switchToTeam(teamId: string) {
416
+ cy.window().then((win) => {
417
+ win.localStorage.setItem('activeTeamId', teamId)
418
+ })
419
+
420
+ cy.request({
421
+ method: 'POST',
422
+ url: '/api/v1/teams/switch',
423
+ body: { teamId },
424
+ timeout: API_TIMEOUT,
425
+ failOnStatusCode: false
426
+ })
427
+ }
428
+
429
+ /**
430
+ * Login as Carlos and switch to Free plan team
431
+ * Used for testing Free plan restrictions
432
+ */
433
+ export function loginAsFreePlanUser() {
434
+ cy.session('billing-free-plan-session', () => {
435
+ apiLogin(BILLING_TEAMS.FREE.owner).then((apiLoginSucceeded) => {
436
+ if (apiLoginSucceeded) {
437
+ cy.visit('/dashboard', { timeout: 60000, failOnStatusCode: false })
438
+ }
439
+ cy.url().should('include', '/dashboard')
440
+ // Switch to the Free team
441
+ switchToTeam(BILLING_TEAMS.FREE.teamId)
442
+ })
443
+ }, {
444
+ validate: () => {
445
+ cy.request({
446
+ url: '/api/auth/get-session',
447
+ timeout: API_TIMEOUT,
448
+ failOnStatusCode: false
449
+ }).its('status').should('eq', 200)
450
+
451
+ cy.window().then((win) => {
452
+ const teamId = win.localStorage.getItem('activeTeamId')
453
+ expect(teamId).to.eq(BILLING_TEAMS.FREE.teamId)
454
+ })
455
+ }
456
+ })
457
+ }
458
+
459
+ /**
460
+ * Login as Carlos and switch to Pro plan team (Everpoint)
461
+ * Used for testing Pro plan features
462
+ */
463
+ export function loginAsProPlanUser() {
464
+ cy.session('billing-pro-plan-session', () => {
465
+ apiLogin(BILLING_TEAMS.PRO.owner).then((apiLoginSucceeded) => {
466
+ if (apiLoginSucceeded) {
467
+ cy.visit('/dashboard', { timeout: 60000, failOnStatusCode: false })
468
+ }
469
+ cy.url().should('include', '/dashboard')
470
+ // Switch to the Pro team
471
+ switchToTeam(BILLING_TEAMS.PRO.teamId)
472
+ })
473
+ }, {
474
+ validate: () => {
475
+ cy.request({
476
+ url: '/api/auth/get-session',
477
+ timeout: API_TIMEOUT,
478
+ failOnStatusCode: false
479
+ }).its('status').should('eq', 200)
480
+
481
+ cy.window().then((win) => {
482
+ const teamId = win.localStorage.getItem('activeTeamId')
483
+ expect(teamId).to.eq(BILLING_TEAMS.PRO.teamId)
484
+ })
485
+ }
486
+ })
487
+ }
488
+
489
+ /**
490
+ * Login as Ana and switch to Enterprise plan team (Ironvale)
491
+ * Used for testing Enterprise plan features
492
+ */
493
+ export function loginAsEnterprisePlanUser() {
494
+ cy.session('billing-enterprise-plan-session', () => {
495
+ // Ana is owner of Ironvale
496
+ apiLogin(BILLING_TEAMS.ENTERPRISE.owner).then((apiLoginSucceeded) => {
497
+ if (apiLoginSucceeded) {
498
+ cy.visit('/dashboard', { timeout: 60000, failOnStatusCode: false })
499
+ }
500
+ cy.url().should('include', '/dashboard')
501
+ // Switch to the Enterprise team
502
+ switchToTeam(BILLING_TEAMS.ENTERPRISE.teamId)
503
+ })
504
+ }, {
505
+ validate: () => {
506
+ cy.request({
507
+ url: '/api/auth/get-session',
508
+ timeout: API_TIMEOUT,
509
+ failOnStatusCode: false
510
+ }).its('status').should('eq', 200)
511
+
512
+ cy.window().then((win) => {
513
+ const teamId = win.localStorage.getItem('activeTeamId')
514
+ expect(teamId).to.eq(BILLING_TEAMS.ENTERPRISE.teamId)
515
+ })
516
+ }
517
+ })
518
+ }