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