@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.
- 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,129 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: Settings Layout UI Selectors Validation
|
|
3
|
+
priority: high
|
|
4
|
+
tags: [selectors, settings, layout, sidebar, ui-validation]
|
|
5
|
+
grepTags: [ui-selectors, settings, SEL_LAY_001, SEL_LAY_002]
|
|
6
|
+
coverage: 2
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Settings Layout UI Selectors Validation
|
|
10
|
+
|
|
11
|
+
> Validates that settings layout and sidebar 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_LAY_001: Layout Selectors (sidebar.layout.*)
|
|
14
|
+
|
|
15
|
+
### Metadata
|
|
16
|
+
- **Priority:** High
|
|
17
|
+
- **Type:** Selector Validation
|
|
18
|
+
- **Tags:** settings, layout, container
|
|
19
|
+
- **Grep:** `@ui-selectors` `@SEL_LAY_001`
|
|
20
|
+
- **Status:** Active (6 passing, 0 skipped)
|
|
21
|
+
|
|
22
|
+
```gherkin:en
|
|
23
|
+
Scenario: Settings layout has required selectors
|
|
24
|
+
|
|
25
|
+
Given I am logged in as developer
|
|
26
|
+
And I navigate to the settings page
|
|
27
|
+
Then I should find the layout main container
|
|
28
|
+
And I should find the back to dashboard link
|
|
29
|
+
And I should find the layout header
|
|
30
|
+
And I should find the layout content area
|
|
31
|
+
And I should find the sidebar container
|
|
32
|
+
And I should find the layout page content
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```gherkin:es
|
|
36
|
+
Scenario: El layout de settings tiene los selectores requeridos
|
|
37
|
+
|
|
38
|
+
Given estoy logueado como developer
|
|
39
|
+
And navego a la pagina de settings
|
|
40
|
+
Then deberia encontrar el contenedor principal del layout
|
|
41
|
+
And deberia encontrar el link de volver al dashboard
|
|
42
|
+
And deberia encontrar el header del layout
|
|
43
|
+
And deberia encontrar el area de contenido del layout
|
|
44
|
+
And deberia encontrar el contenedor del sidebar
|
|
45
|
+
And deberia encontrar el contenido de la pagina del layout
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Expected Results
|
|
49
|
+
- `settings.sidebar.layout.main` selector exists (settings-layout-main)
|
|
50
|
+
- `settings.sidebar.backButton` selector exists (settings-back-to-dashboard)
|
|
51
|
+
- `settings.sidebar.layout.header` selector exists (settings-layout-header)
|
|
52
|
+
- `settings.sidebar.layout.contentArea` selector exists (settings-layout-content-area)
|
|
53
|
+
- `settings.sidebar.container` selector exists (settings-sidebar)
|
|
54
|
+
- `settings.sidebar.layout.pageContent` selector exists (settings-layout-page-content)
|
|
55
|
+
|
|
56
|
+
---
|
|
57
|
+
|
|
58
|
+
## @test SEL_LAY_002: Sidebar Selectors
|
|
59
|
+
|
|
60
|
+
### Metadata
|
|
61
|
+
- **Priority:** High
|
|
62
|
+
- **Type:** Selector Validation
|
|
63
|
+
- **Tags:** settings, sidebar, navigation
|
|
64
|
+
- **Grep:** `@ui-selectors` `@SEL_LAY_002`
|
|
65
|
+
- **Status:** Active (10 passing, 0 skipped)
|
|
66
|
+
|
|
67
|
+
```gherkin:en
|
|
68
|
+
Scenario: Settings sidebar has all navigation links
|
|
69
|
+
|
|
70
|
+
Given I am logged in as developer
|
|
71
|
+
And I navigate to the settings page
|
|
72
|
+
Then I should find the sidebar container
|
|
73
|
+
And I should find the sidebar header
|
|
74
|
+
And I should find the sidebar nav items container
|
|
75
|
+
And I should find the profile nav link
|
|
76
|
+
And I should find the security nav link
|
|
77
|
+
And I should find the password nav link
|
|
78
|
+
And I should find the notifications nav link
|
|
79
|
+
And I should find the api-keys nav link
|
|
80
|
+
And I should find the billing nav link
|
|
81
|
+
And I should find the teams nav link
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
```gherkin:es
|
|
85
|
+
Scenario: El sidebar de settings tiene todos los links de navegacion
|
|
86
|
+
|
|
87
|
+
Given estoy logueado como developer
|
|
88
|
+
And navego a la pagina de settings
|
|
89
|
+
Then deberia encontrar el contenedor del sidebar
|
|
90
|
+
And deberia encontrar el header del sidebar
|
|
91
|
+
And deberia encontrar el contenedor de items de navegacion
|
|
92
|
+
And deberia encontrar el link de navegacion a perfil
|
|
93
|
+
And deberia encontrar el link de navegacion a seguridad
|
|
94
|
+
And deberia encontrar el link de navegacion a password
|
|
95
|
+
And deberia encontrar el link de navegacion a notificaciones
|
|
96
|
+
And deberia encontrar el link de navegacion a api-keys
|
|
97
|
+
And deberia encontrar el link de navegacion a facturacion
|
|
98
|
+
And deberia encontrar el link de navegacion a equipos
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
### Expected Results
|
|
102
|
+
- `settings.sidebar.container` selector exists (settings-sidebar)
|
|
103
|
+
- `settings.sidebar.header` selector exists (settings-sidebar-header)
|
|
104
|
+
- `settings.sidebar.nav.items` selector exists (settings-sidebar-nav-items)
|
|
105
|
+
- `settings.sidebar.nav.item` with section=profile exists (settings-sidebar-nav-profile)
|
|
106
|
+
- `settings.sidebar.nav.item` with section=security exists (settings-sidebar-nav-security)
|
|
107
|
+
- `settings.sidebar.nav.item` with section=password exists (settings-sidebar-nav-password)
|
|
108
|
+
- `settings.sidebar.nav.item` with section=notifications exists (settings-sidebar-nav-notifications)
|
|
109
|
+
- `settings.sidebar.nav.item` with section=api-keys exists (settings-sidebar-nav-api-keys)
|
|
110
|
+
- `settings.sidebar.nav.item` with section=billing exists (settings-sidebar-nav-billing)
|
|
111
|
+
- `settings.sidebar.nav.item` with section=teams exists (settings-sidebar-nav-teams)
|
|
112
|
+
|
|
113
|
+
### Notes
|
|
114
|
+
Some sidebar items may not be visible depending on user permissions and theme configuration. The test validates selectors that are accessible to the developer role.
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Related Components
|
|
119
|
+
|
|
120
|
+
| Component | File | Selectors |
|
|
121
|
+
|-----------|------|-----------|
|
|
122
|
+
| SettingsLayout | `packages/core/src/components/settings/layouts/SettingsLayout.tsx` | settings-layout-main, settings-layout-header, settings-layout-content-area |
|
|
123
|
+
| SettingsSidebar | `packages/core/src/components/settings/layouts/SettingsSidebar.tsx` | settings-sidebar, settings-sidebar-header, settings-sidebar-nav-* |
|
|
124
|
+
|
|
125
|
+
## Related POMs
|
|
126
|
+
|
|
127
|
+
| POM | File | Usage |
|
|
128
|
+
|-----|------|-------|
|
|
129
|
+
| SettingsPOM | `themes/default/tests/cypress/src/features/SettingsPOM.ts` | Settings layout and sidebar selectors |
|
|
@@ -0,0 +1,115 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Selectors Validation: Settings Layout & Sidebar
|
|
3
|
+
*
|
|
4
|
+
* This test validates that settings layout and sidebar selectors exist in the DOM.
|
|
5
|
+
* This is a lightweight test that ONLY checks selector presence, not functionality.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Validate SettingsPOM layout and sidebar selectors work correctly
|
|
9
|
+
* - Ensure all settings.sidebar.* and settings.sidebar.layout.* selectors are implemented
|
|
10
|
+
* - Run as Phase 12 sub-gate before functional tests
|
|
11
|
+
*
|
|
12
|
+
* Scope:
|
|
13
|
+
* - Navigate to settings pages (requires login)
|
|
14
|
+
* - Assert elements exist in DOM (no form submissions)
|
|
15
|
+
* - Fast execution (< 30 seconds per describe block)
|
|
16
|
+
*
|
|
17
|
+
* Test IDs:
|
|
18
|
+
* - SEL_LAY_001: Layout Selectors (under sidebar.layout.*)
|
|
19
|
+
* - SEL_LAY_002: Sidebar Selectors
|
|
20
|
+
*/
|
|
21
|
+
|
|
22
|
+
import { SettingsPOM } from '../../../src/features/SettingsPOM'
|
|
23
|
+
import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
|
|
24
|
+
|
|
25
|
+
describe('Settings Layout Selectors Validation', { tags: ['@ui-selectors', '@settings'] }, () => {
|
|
26
|
+
const settings = SettingsPOM.create()
|
|
27
|
+
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
loginAsDefaultDeveloper()
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
// ============================================
|
|
33
|
+
// SEL_LAY_001: LAYOUT SELECTORS (sidebar.layout.*)
|
|
34
|
+
// ============================================
|
|
35
|
+
describe('SEL_LAY_001: Layout Selectors', { tags: '@SEL_LAY_001' }, () => {
|
|
36
|
+
beforeEach(() => {
|
|
37
|
+
settings.visitSettings()
|
|
38
|
+
settings.waitForSettings()
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('should find layout main container', () => {
|
|
42
|
+
cy.get(settings.selectors.layoutMain).should('exist')
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('should find back to dashboard link', () => {
|
|
46
|
+
cy.get(settings.selectors.sidebarBackButton).should('exist')
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it('should find layout header', () => {
|
|
50
|
+
cy.get(settings.selectors.layoutHeader).should('exist')
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it('should find layout content area', () => {
|
|
54
|
+
cy.get(settings.selectors.layoutContentArea).should('exist')
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('should find sidebar container', () => {
|
|
58
|
+
cy.get(settings.selectors.sidebarContainer).should('exist')
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
it('should find layout page content', () => {
|
|
62
|
+
cy.get(settings.selectors.layoutPageContent).should('exist')
|
|
63
|
+
})
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
// ============================================
|
|
67
|
+
// SEL_LAY_002: SIDEBAR SELECTORS
|
|
68
|
+
// ============================================
|
|
69
|
+
describe('SEL_LAY_002: Sidebar Selectors', { tags: '@SEL_LAY_002' }, () => {
|
|
70
|
+
beforeEach(() => {
|
|
71
|
+
settings.visitSettings()
|
|
72
|
+
settings.waitForSettings()
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it('should find sidebar container', () => {
|
|
76
|
+
cy.get(settings.selectors.sidebarContainer).should('exist')
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
it('should find sidebar header', () => {
|
|
80
|
+
cy.get(settings.selectors.sidebarHeader).should('exist')
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it('should find sidebar nav items container', () => {
|
|
84
|
+
cy.get(settings.selectors.sidebarNavItems).should('exist')
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
it('should find profile nav item', () => {
|
|
88
|
+
cy.get(settings.selectors.sidebarNavItem('profile')).should('exist')
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
it('should find security nav item', () => {
|
|
92
|
+
cy.get(settings.selectors.sidebarNavItem('security')).should('exist')
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
it('should find password nav item', () => {
|
|
96
|
+
cy.get(settings.selectors.sidebarNavItem('password')).should('exist')
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
it('should find notifications nav item', () => {
|
|
100
|
+
cy.get(settings.selectors.sidebarNavItem('notifications')).should('exist')
|
|
101
|
+
})
|
|
102
|
+
|
|
103
|
+
it('should find api-keys nav item', () => {
|
|
104
|
+
cy.get(settings.selectors.sidebarNavItem('api-keys')).should('exist')
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
it('should find billing nav item', () => {
|
|
108
|
+
cy.get(settings.selectors.sidebarNavItem('billing')).should('exist')
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
it('should find teams nav item', () => {
|
|
112
|
+
cy.get(settings.selectors.sidebarNavItem('teams')).should('exist')
|
|
113
|
+
})
|
|
114
|
+
})
|
|
115
|
+
})
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: Settings Password UI Selectors Validation
|
|
3
|
+
priority: high
|
|
4
|
+
tags: [selectors, settings, password, ui-validation]
|
|
5
|
+
grepTags: [ui-selectors, settings, SEL_PASS_001]
|
|
6
|
+
coverage: 1
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Settings Password UI Selectors Validation
|
|
10
|
+
|
|
11
|
+
> Validates that settings password 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_PASS_001: Password Page Selectors
|
|
14
|
+
|
|
15
|
+
### Metadata
|
|
16
|
+
- **Priority:** High
|
|
17
|
+
- **Type:** Selector Validation
|
|
18
|
+
- **Tags:** settings, password, form
|
|
19
|
+
- **Grep:** `@ui-selectors` `@SEL_PASS_001`
|
|
20
|
+
- **Status:** Active (2 passing, 5 skipped)
|
|
21
|
+
|
|
22
|
+
```gherkin:en
|
|
23
|
+
Scenario: Password page has required selectors
|
|
24
|
+
|
|
25
|
+
Given I am logged in as developer
|
|
26
|
+
And I navigate to the password settings page
|
|
27
|
+
Then I should find the password container
|
|
28
|
+
And I should find the password form
|
|
29
|
+
And I should find the current password input
|
|
30
|
+
And I should find the new password input
|
|
31
|
+
And I should find the confirm password input
|
|
32
|
+
And I should find the password submit button
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```gherkin:es
|
|
36
|
+
Scenario: La pagina de password tiene los selectores requeridos
|
|
37
|
+
|
|
38
|
+
Given estoy logueado como developer
|
|
39
|
+
And navego a la pagina de settings de password
|
|
40
|
+
Then deberia encontrar el contenedor de password
|
|
41
|
+
And deberia encontrar el formulario de password
|
|
42
|
+
And deberia encontrar el input de password actual
|
|
43
|
+
And deberia encontrar el input de nuevo password
|
|
44
|
+
And deberia encontrar el input de confirmar password
|
|
45
|
+
And deberia encontrar el boton de enviar password
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Expected Results
|
|
49
|
+
- `settings.password.container` selector exists (settings-password) - **SKIPPED: Mismatch**
|
|
50
|
+
- `settings.password.form` selector exists (password-form)
|
|
51
|
+
- `settings.password.current` selector exists (password-current) - **SKIPPED: Mismatch**
|
|
52
|
+
- `settings.password.new` selector exists (password-new) - **SKIPPED: Mismatch**
|
|
53
|
+
- `settings.password.confirm` selector exists (password-confirm) - **SKIPPED: Mismatch**
|
|
54
|
+
- `settings.password.submit` selector exists (password-submit)
|
|
55
|
+
|
|
56
|
+
### Notes
|
|
57
|
+
**Selector Mismatches Documented:**
|
|
58
|
+
|
|
59
|
+
| Expected (CORE_SELECTORS) | Actual (Component) | Issue |
|
|
60
|
+
|---------------------------|-------------------|-------|
|
|
61
|
+
| `settings-password` | `password-main` | Container uses different naming |
|
|
62
|
+
| `password-current` | `password-current-input` | Extra `-input` suffix |
|
|
63
|
+
| `password-new` | `password-new-input` | Extra `-input` suffix |
|
|
64
|
+
| `password-confirm` | `password-confirm-input` | Extra `-input` suffix |
|
|
65
|
+
|
|
66
|
+
Resolution options:
|
|
67
|
+
1. Update CORE_SELECTORS to match component naming
|
|
68
|
+
2. Update PasswordForm component to match CORE_SELECTORS
|
|
69
|
+
|
|
70
|
+
---
|
|
71
|
+
|
|
72
|
+
## Related Components
|
|
73
|
+
|
|
74
|
+
| Component | File | Selectors |
|
|
75
|
+
|-----------|------|-----------|
|
|
76
|
+
| PasswordForm | `packages/core/src/components/settings/PasswordForm.tsx` | password-main, password-form, password-current-input, password-new-input, password-confirm-input, password-submit |
|
|
77
|
+
|
|
78
|
+
## Related POMs
|
|
79
|
+
|
|
80
|
+
| POM | File | Usage |
|
|
81
|
+
|-----|------|-------|
|
|
82
|
+
| SettingsPOM | `themes/default/tests/cypress/src/features/SettingsPOM.ts` | Password page selectors |
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Selectors Validation: Settings Password
|
|
3
|
+
*
|
|
4
|
+
* This test validates that settings password selectors exist in the DOM.
|
|
5
|
+
* This is a lightweight test that ONLY checks selector presence, not functionality.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Validate SettingsPOM password selectors work correctly
|
|
9
|
+
* - Ensure all settings.password.* selectors are implemented
|
|
10
|
+
* - Run as Phase 12 sub-gate before functional tests
|
|
11
|
+
*
|
|
12
|
+
* Scope:
|
|
13
|
+
* - Navigate to password settings page (requires login)
|
|
14
|
+
* - Assert elements exist in DOM (no form submissions)
|
|
15
|
+
* - Fast execution (< 30 seconds per describe block)
|
|
16
|
+
*
|
|
17
|
+
* Test IDs:
|
|
18
|
+
* - SEL_PASS_001: Password Page Selectors
|
|
19
|
+
*
|
|
20
|
+
* NOTE: Password page only visible for users with password auth (not Google OAuth).
|
|
21
|
+
* Some selectors from CORE_SELECTORS have naming mismatches with implementation.
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { SettingsPOM } from '../../../src/features/SettingsPOM'
|
|
25
|
+
import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
|
|
26
|
+
|
|
27
|
+
describe('Settings Password Selectors Validation', { tags: ['@ui-selectors', '@settings'] }, () => {
|
|
28
|
+
const settings = SettingsPOM.create()
|
|
29
|
+
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
loginAsDefaultDeveloper()
|
|
32
|
+
settings.visitPassword()
|
|
33
|
+
// Wait for password page to load
|
|
34
|
+
cy.get(settings.selectors.passwordForm, { timeout: 15000 }).should('be.visible')
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
// ============================================
|
|
38
|
+
// SEL_PASS_001: PASSWORD PAGE SELECTORS
|
|
39
|
+
// ============================================
|
|
40
|
+
describe('SEL_PASS_001: Password Page Selectors', { tags: '@SEL_PASS_001' }, () => {
|
|
41
|
+
// NOTE: CORE_SELECTORS defines 'settings-password' but component uses 'password-main'
|
|
42
|
+
it.skip('should find password container (selector mismatch: CORE uses settings-password, component uses password-main)', () => {
|
|
43
|
+
cy.get(settings.selectors.passwordContainer).should('exist')
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('should find password form', () => {
|
|
47
|
+
cy.get(settings.selectors.passwordForm).should('exist')
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
// NOTE: CORE uses 'password-current' but component uses 'password-current-input'
|
|
51
|
+
it.skip('should find current password input (selector mismatch: CORE uses password-current, component uses password-current-input)', () => {
|
|
52
|
+
cy.get(settings.selectors.passwordCurrent).should('exist')
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
// NOTE: New password input doesn't have data-cy in component - uses PasswordField component
|
|
56
|
+
it.skip('should find new password input (not implemented in component)', () => {
|
|
57
|
+
cy.get(settings.selectors.passwordNew).should('exist')
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
// NOTE: Confirm password input doesn't have data-cy in component
|
|
61
|
+
it.skip('should find confirm password input (not implemented in component)', () => {
|
|
62
|
+
cy.get(settings.selectors.passwordConfirm).should('exist')
|
|
63
|
+
})
|
|
64
|
+
|
|
65
|
+
it('should find submit button', () => {
|
|
66
|
+
cy.get(settings.selectors.passwordSubmit).should('exist')
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
// Note: Success message only appears after successful form submission
|
|
70
|
+
it.skip('should find success message (requires successful submission)', () => {
|
|
71
|
+
cy.get(settings.selectors.passwordSuccess).should('exist')
|
|
72
|
+
})
|
|
73
|
+
})
|
|
74
|
+
})
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: Settings Profile UI Selectors Validation
|
|
3
|
+
priority: high
|
|
4
|
+
tags: [selectors, settings, profile, ui-validation]
|
|
5
|
+
grepTags: [ui-selectors, settings, SEL_PROF_001]
|
|
6
|
+
coverage: 1
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Settings Profile UI Selectors Validation
|
|
10
|
+
|
|
11
|
+
> Validates that settings profile 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_PROF_001: Profile Page Selectors
|
|
14
|
+
|
|
15
|
+
### Metadata
|
|
16
|
+
- **Priority:** High
|
|
17
|
+
- **Type:** Selector Validation
|
|
18
|
+
- **Tags:** settings, profile, form
|
|
19
|
+
- **Grep:** `@ui-selectors` `@SEL_PROF_001`
|
|
20
|
+
- **Status:** Active (6 passing, 3 skipped)
|
|
21
|
+
|
|
22
|
+
```gherkin:en
|
|
23
|
+
Scenario: Profile page has required selectors
|
|
24
|
+
|
|
25
|
+
Given I am logged in as developer
|
|
26
|
+
And I navigate to the profile settings page
|
|
27
|
+
Then I should find the profile container
|
|
28
|
+
And I should find the profile form
|
|
29
|
+
And I should find the first name input
|
|
30
|
+
And I should find the last name input
|
|
31
|
+
And I should find the email input
|
|
32
|
+
And I should find the profile submit button
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
```gherkin:es
|
|
36
|
+
Scenario: La pagina de perfil tiene los selectores requeridos
|
|
37
|
+
|
|
38
|
+
Given estoy logueado como developer
|
|
39
|
+
And navego a la pagina de settings de perfil
|
|
40
|
+
Then deberia encontrar el contenedor de perfil
|
|
41
|
+
And deberia encontrar el formulario de perfil
|
|
42
|
+
And deberia encontrar el input de nombre
|
|
43
|
+
And deberia encontrar el input de apellido
|
|
44
|
+
And deberia encontrar el input de email
|
|
45
|
+
And deberia encontrar el boton de enviar perfil
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Expected Results
|
|
49
|
+
- `settings.profile.container` selector exists (settings-profile) ✅
|
|
50
|
+
- `settings.profile.form` selector exists (profile-form) ✅
|
|
51
|
+
- `settings.profile.firstName` selector exists (profile-first-name) ✅
|
|
52
|
+
- `settings.profile.lastName` selector exists (profile-last-name) ✅
|
|
53
|
+
- `settings.profile.email` selector exists (profile-email) ✅
|
|
54
|
+
- `settings.profile.submit` selector exists (profile-submit) ✅
|
|
55
|
+
- `settings.profile.avatar` selector - **SKIPPED: Feature not implemented**
|
|
56
|
+
- `settings.profile.avatarUpload` selector - **SKIPPED: Feature not implemented**
|
|
57
|
+
- `settings.profile.successMessage` selector - **SKIPPED: Requires form submission (functional test)**
|
|
58
|
+
|
|
59
|
+
### Notes
|
|
60
|
+
**Skipped Tests (3):**
|
|
61
|
+
1. `profile-avatar` - Avatar feature not implemented in ProfilePage component
|
|
62
|
+
2. `profile-avatar-upload` - Avatar upload feature not implemented
|
|
63
|
+
3. `profile-success` - Success message only appears after form submission (functional test, not selector validation)
|
|
64
|
+
|
|
65
|
+
---
|
|
66
|
+
|
|
67
|
+
## Related Components
|
|
68
|
+
|
|
69
|
+
| Component | File | Selectors |
|
|
70
|
+
|-----------|------|-----------|
|
|
71
|
+
| ProfilePage | `apps/dev/app/dashboard/settings/profile/page.tsx` | settings-profile, profile-form, profile-first-name, profile-last-name, profile-email, profile-submit, profile-success |
|
|
72
|
+
|
|
73
|
+
## Related POMs
|
|
74
|
+
|
|
75
|
+
| POM | File | Usage |
|
|
76
|
+
|-----|------|-------|
|
|
77
|
+
| SettingsPOM | `themes/default/tests/cypress/src/features/SettingsPOM.ts` | Profile page selectors |
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Selectors Validation: Settings Profile
|
|
3
|
+
*
|
|
4
|
+
* This test validates that settings profile selectors exist in the DOM.
|
|
5
|
+
* This is a lightweight test that ONLY checks selector presence, not functionality.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Validate SettingsPOM profile selectors work correctly
|
|
9
|
+
* - Ensure all settings.profile.* selectors are implemented
|
|
10
|
+
* - Run as Phase 12 sub-gate before functional tests
|
|
11
|
+
*
|
|
12
|
+
* Scope:
|
|
13
|
+
* - Navigate to profile settings page (requires login)
|
|
14
|
+
* - Assert elements exist in DOM (no form submissions)
|
|
15
|
+
* - Fast execution (< 30 seconds per describe block)
|
|
16
|
+
*
|
|
17
|
+
* Test IDs:
|
|
18
|
+
* - SEL_PROF_001: Profile Page Selectors
|
|
19
|
+
*
|
|
20
|
+
* NOTE: Only 2 selectors are NOT implemented (feature doesn't exist):
|
|
21
|
+
* - profile-avatar, profile-avatar-upload (avatar feature not in current implementation)
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { SettingsPOM } from '../../../src/features/SettingsPOM'
|
|
25
|
+
import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
|
|
26
|
+
|
|
27
|
+
describe('Settings Profile Selectors Validation', { tags: ['@ui-selectors', '@settings'] }, () => {
|
|
28
|
+
const settings = SettingsPOM.create()
|
|
29
|
+
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
loginAsDefaultDeveloper()
|
|
32
|
+
settings.visitProfile()
|
|
33
|
+
// Wait for profile page to load - use profile form as indicator
|
|
34
|
+
cy.get(settings.selectors.profileForm, { timeout: 15000 }).should('be.visible')
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
// ============================================
|
|
38
|
+
// SEL_PROF_001: PROFILE PAGE SELECTORS
|
|
39
|
+
// ============================================
|
|
40
|
+
describe('SEL_PROF_001: Profile Page Selectors', { tags: '@SEL_PROF_001' }, () => {
|
|
41
|
+
it('should find profile container', () => {
|
|
42
|
+
cy.get(settings.selectors.profileContainer).should('exist')
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('should find profile form', () => {
|
|
46
|
+
cy.get(settings.selectors.profileForm).should('exist')
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
// NOTE: Avatar selectors not implemented in current ProfilePage component
|
|
50
|
+
it.skip('should find profile avatar (not implemented in component)', () => {
|
|
51
|
+
cy.get(settings.selectors.profileAvatar).should('exist')
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
it.skip('should find avatar upload button (not implemented in component)', () => {
|
|
55
|
+
cy.get(settings.selectors.profileAvatarUpload).should('exist')
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
it('should find first name input', () => {
|
|
59
|
+
cy.get(settings.selectors.profileFirstName).should('exist')
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
it('should find last name input', () => {
|
|
63
|
+
cy.get(settings.selectors.profileLastName).should('exist')
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
it('should find email input', () => {
|
|
67
|
+
cy.get(settings.selectors.profileEmail).should('exist')
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
it('should find submit button', () => {
|
|
71
|
+
cy.get(settings.selectors.profileSubmit).should('exist')
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
// Note: Success message only appears after successful form submission
|
|
75
|
+
it.skip('should find success message (requires successful submission)', () => {
|
|
76
|
+
cy.get(settings.selectors.profileSuccess).should('exist')
|
|
77
|
+
})
|
|
78
|
+
})
|
|
79
|
+
})
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: Settings Teams UI Selectors Validation
|
|
3
|
+
priority: high
|
|
4
|
+
tags: [selectors, settings, teams, ui-validation]
|
|
5
|
+
grepTags: [ui-selectors, settings, SEL_STMS_001, SEL_STMS_002]
|
|
6
|
+
coverage: 2
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Settings Teams UI Selectors Validation
|
|
10
|
+
|
|
11
|
+
> Validates that settings teams 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_STMS_001: Teams Page Selectors
|
|
14
|
+
|
|
15
|
+
### Metadata
|
|
16
|
+
- **Priority:** High
|
|
17
|
+
- **Type:** Selector Validation
|
|
18
|
+
- **Tags:** settings, teams, management
|
|
19
|
+
- **Grep:** `@ui-selectors` `@SEL_STMS_001`
|
|
20
|
+
- **Status:** Active (6 passing, 0 skipped)
|
|
21
|
+
|
|
22
|
+
```gherkin:en
|
|
23
|
+
Scenario: Teams settings page has required selectors
|
|
24
|
+
|
|
25
|
+
Given I am logged in as developer
|
|
26
|
+
And I navigate to the teams settings page
|
|
27
|
+
Then I should find the teams main container
|
|
28
|
+
And I should find the teams header
|
|
29
|
+
And I should find the teams list
|
|
30
|
+
And I should find at least one team item in the list
|
|
31
|
+
And I should find the create team button
|
|
32
|
+
When I click on a team item
|
|
33
|
+
Then I should find the team details section
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
```gherkin:es
|
|
37
|
+
Scenario: La pagina de settings de teams tiene los selectores requeridos
|
|
38
|
+
|
|
39
|
+
Given estoy logueado como developer
|
|
40
|
+
And navego a la pagina de settings de teams
|
|
41
|
+
Then deberia encontrar el contenedor principal de teams
|
|
42
|
+
And deberia encontrar el header de teams
|
|
43
|
+
And deberia encontrar la lista de teams
|
|
44
|
+
And deberia encontrar al menos un item de equipo en la lista
|
|
45
|
+
And deberia encontrar el boton de crear equipo
|
|
46
|
+
When hago click en un item de equipo
|
|
47
|
+
Then deberia encontrar la seccion de detalles del equipo
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Expected Results
|
|
51
|
+
- `teams-settings-main` selector exists ✅
|
|
52
|
+
- `teams-settings-header` selector exists ✅
|
|
53
|
+
- `teams-settings-teams-list` selector exists ✅
|
|
54
|
+
- `team-item-{id}` selector exists for team items ✅
|
|
55
|
+
- `teams-settings-team-details` selector exists when team selected ✅
|
|
56
|
+
- `create-team-button` selector exists ✅
|
|
57
|
+
|
|
58
|
+
---
|
|
59
|
+
|
|
60
|
+
## @test SEL_STMS_002: Create Team Dialog Documentation
|
|
61
|
+
|
|
62
|
+
### Metadata
|
|
63
|
+
- **Priority:** Medium
|
|
64
|
+
- **Type:** Documentation
|
|
65
|
+
- **Tags:** settings, teams, dialog
|
|
66
|
+
- **Grep:** `@ui-selectors` `@SEL_STMS_002`
|
|
67
|
+
- **Status:** Active (1 passing, 0 skipped)
|
|
68
|
+
|
|
69
|
+
```gherkin:en
|
|
70
|
+
Scenario: Create Team Dialog selectors are documented
|
|
71
|
+
|
|
72
|
+
Given the Create Team Dialog can be opened from teams settings
|
|
73
|
+
Then the following selectors are documented:
|
|
74
|
+
| Selector | Value |
|
|
75
|
+
| create-team-dialog | Dialog container |
|
|
76
|
+
| team-name-input | Name input field |
|
|
77
|
+
| team-slug-input | Slug input field |
|
|
78
|
+
| team-description-input | Description input |
|
|
79
|
+
| cancel-create-team | Cancel button |
|
|
80
|
+
| submit-create-team | Submit button |
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
```gherkin:es
|
|
84
|
+
Scenario: Los selectores del dialogo de crear equipo estan documentados
|
|
85
|
+
|
|
86
|
+
Given el dialogo de crear equipo puede abrirse desde settings de teams
|
|
87
|
+
Then los siguientes selectores estan documentados:
|
|
88
|
+
| Selector | Valor |
|
|
89
|
+
| create-team-dialog | Contenedor del dialogo |
|
|
90
|
+
| team-name-input | Campo de nombre |
|
|
91
|
+
| team-slug-input | Campo de slug |
|
|
92
|
+
| team-description-input | Campo de descripcion |
|
|
93
|
+
| cancel-create-team | Boton cancelar |
|
|
94
|
+
| submit-create-team | Boton enviar |
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Expected Results
|
|
98
|
+
- Create Team Dialog selectors are documented for reference ✅
|
|
99
|
+
- Actual dialog testing done in teams.cy.ts (SEL_TEAM_003)
|
|
100
|
+
|
|
101
|
+
### Notes
|
|
102
|
+
The Create Team Dialog selectors are shared between:
|
|
103
|
+
- Teams settings page (`/dashboard/settings/teams`)
|
|
104
|
+
- Team switcher create button
|
|
105
|
+
|
|
106
|
+
This test documents the selectors for cross-reference with teams.cy.ts.
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## Related Components
|
|
111
|
+
|
|
112
|
+
| Component | File | Selectors |
|
|
113
|
+
|-----------|------|-----------|
|
|
114
|
+
| TeamsSettings | `packages/core/templates/app/dashboard/settings/teams/page.tsx` | teams-settings-main, teams-settings-header, teams-settings-teams-list, teams-settings-team-details, team-item-{id} |
|
|
115
|
+
| CreateTeamDialog | `packages/core/src/components/teams/CreateTeamDialog.tsx` | create-team-dialog, cancel-create-team, submit-create-team |
|
|
116
|
+
|
|
117
|
+
## Related POMs
|
|
118
|
+
|
|
119
|
+
| POM | File | Usage |
|
|
120
|
+
|-----|------|-------|
|
|
121
|
+
| SettingsPOM | `themes/default/tests/cypress/src/features/SettingsPOM.ts` | Teams settings page selectors |
|
|
122
|
+
| TeamSwitcherPOM | `themes/default/tests/cypress/src/components/TeamSwitcherPOM.ts` | Create team dialog selectors |
|
|
123
|
+
|
|
124
|
+
## Test Summary
|
|
125
|
+
|
|
126
|
+
| Test ID | Description | Status | Tests |
|
|
127
|
+
|---------|-------------|--------|-------|
|
|
128
|
+
| SEL_STMS_001 | Teams Page Selectors | Active | 6 |
|
|
129
|
+
| SEL_STMS_002 | Create Team Dialog Documentation | Active | 1 |
|
|
130
|
+
| **Total** | | **All Active** | **7** |
|