@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,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: Dashboard Sidebar UI Selectors Validation
|
|
3
|
+
priority: medium
|
|
4
|
+
tags: [selectors, sidebar, dashboard, ui-validation]
|
|
5
|
+
grepTags: [ui-selectors, dashboard, sidebar, SEL_DBAR_001]
|
|
6
|
+
coverage: 1
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Dashboard Sidebar UI Selectors Validation
|
|
10
|
+
|
|
11
|
+
> Validates that dashboard sidebar 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
|
+
**IMPORTANT:** Sidebar is only visible on desktop viewports (>= 1024px) when authenticated.
|
|
14
|
+
|
|
15
|
+
**Login:** Uses Developer via `loginAsDefaultDeveloper()`.
|
|
16
|
+
|
|
17
|
+
## @test SEL_DBAR_001: Sidebar Structure
|
|
18
|
+
|
|
19
|
+
### Metadata
|
|
20
|
+
- **Priority:** High
|
|
21
|
+
- **Type:** Selector Validation
|
|
22
|
+
- **Tags:** sidebar, structure, desktop
|
|
23
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@sidebar` `@SEL_DBAR_001`
|
|
24
|
+
- **Status:** Active (4 passing, 1 skipped)
|
|
25
|
+
|
|
26
|
+
```gherkin:en
|
|
27
|
+
Scenario: Dashboard sidebar has required structure selectors
|
|
28
|
+
|
|
29
|
+
Given I am logged in as a developer user
|
|
30
|
+
And I am viewing the dashboard on desktop viewport
|
|
31
|
+
Then I should find the sidebar container
|
|
32
|
+
And I should find the sidebar header
|
|
33
|
+
And I should find the sidebar logo
|
|
34
|
+
And I should find the sidebar content
|
|
35
|
+
And I should find the sidebar footer (not implemented in component)
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
```gherkin:es
|
|
39
|
+
Scenario: Sidebar del dashboard tiene selectores de estructura requeridos
|
|
40
|
+
|
|
41
|
+
Given estoy logueado como usuario developer
|
|
42
|
+
And estoy viendo el dashboard en viewport desktop
|
|
43
|
+
Then deberia encontrar el contenedor del sidebar
|
|
44
|
+
And deberia encontrar el header del sidebar
|
|
45
|
+
And deberia encontrar el logo del sidebar
|
|
46
|
+
And deberia encontrar el contenido del sidebar
|
|
47
|
+
And deberia encontrar el footer del sidebar (no implementado en componente)
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Expected Results
|
|
51
|
+
| Selector Path | POM Accessor | data-cy Value | Status |
|
|
52
|
+
|---------------|--------------|---------------|--------|
|
|
53
|
+
| dashboard.sidebar.container | dashboard.selectors.sidebarContainer | sidebar-main | Implemented |
|
|
54
|
+
| dashboard.sidebar.header | dashboard.selectors.sidebarHeader | sidebar-header | Implemented |
|
|
55
|
+
| dashboard.sidebar.logo | dashboard.selectors.sidebarLogo | sidebar-logo | Implemented |
|
|
56
|
+
| dashboard.sidebar.content | dashboard.selectors.sidebarContent | sidebar-content | Implemented |
|
|
57
|
+
| dashboard.sidebar.footer | dashboard.selectors.sidebarFooter | sidebar-footer | **NOT IMPLEMENTED** |
|
|
58
|
+
|
|
59
|
+
### Notes
|
|
60
|
+
- The sidebar footer selector is not currently implemented in Sidebar.tsx component
|
|
61
|
+
- Sidebar is only visible on desktop viewports when authenticated
|
|
62
|
+
- Component file: `packages/core/src/components/dashboard/Sidebar.tsx`
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
|
|
66
|
+
## Related Components
|
|
67
|
+
|
|
68
|
+
| Component | File | Selectors |
|
|
69
|
+
|-----------|------|-----------|
|
|
70
|
+
| Sidebar | `packages/core/src/components/dashboard/Sidebar.tsx` | sidebar-main, sidebar-header, sidebar-logo, sidebar-content |
|
|
71
|
+
|
|
72
|
+
## Related POMs
|
|
73
|
+
|
|
74
|
+
| POM | File | Usage |
|
|
75
|
+
|-----|------|-------|
|
|
76
|
+
| DashboardPOM | `themes/default/tests/cypress/src/features/DashboardPOM.ts` | Sidebar selectors and methods |
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Selectors Validation: Dashboard Sidebar
|
|
3
|
+
*
|
|
4
|
+
* This test validates that dashboard sidebar selectors exist in the DOM.
|
|
5
|
+
* This is a lightweight test that ONLY checks selector presence, not functionality.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Validate DashboardPOM sidebar selectors work correctly
|
|
9
|
+
* - Ensure all dashboard.sidebar.* selectors are implemented
|
|
10
|
+
* - Run as Phase 12 sub-gate before functional tests
|
|
11
|
+
*
|
|
12
|
+
* Scope:
|
|
13
|
+
* - Navigate to dashboard (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_DBAR_001: Sidebar Structure (4 selectors)
|
|
19
|
+
*
|
|
20
|
+
* Component: Sidebar.tsx
|
|
21
|
+
* Selectors:
|
|
22
|
+
* - dashboard.sidebar.container → 'sidebar-main'
|
|
23
|
+
* - dashboard.sidebar.header → 'sidebar-header'
|
|
24
|
+
* - dashboard.sidebar.logo → 'sidebar-logo'
|
|
25
|
+
* - dashboard.sidebar.content → 'sidebar-content'
|
|
26
|
+
* - dashboard.sidebar.footer → 'sidebar-footer' (not implemented in component)
|
|
27
|
+
*
|
|
28
|
+
* NOTE: Sidebar is only visible on desktop viewports when authenticated.
|
|
29
|
+
*/
|
|
30
|
+
|
|
31
|
+
import { DashboardPOM } from '../../../src/features/DashboardPOM'
|
|
32
|
+
import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
|
|
33
|
+
|
|
34
|
+
describe('Dashboard Sidebar Selectors Validation', { tags: ['@ui-selectors', '@dashboard', '@sidebar'] }, () => {
|
|
35
|
+
const dashboard = DashboardPOM.create()
|
|
36
|
+
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
loginAsDefaultDeveloper()
|
|
39
|
+
cy.visit('/dashboard', { timeout: 60000, failOnStatusCode: false })
|
|
40
|
+
cy.url().should('include', '/dashboard')
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
// ============================================
|
|
44
|
+
// SEL_DBAR_001: SIDEBAR STRUCTURE (4 selectors)
|
|
45
|
+
// ============================================
|
|
46
|
+
describe('SEL_DBAR_001: Sidebar Structure', { tags: '@SEL_DBAR_001' }, () => {
|
|
47
|
+
it('should find sidebar container', () => {
|
|
48
|
+
cy.get(dashboard.selectors.sidebarContainer).should('exist')
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
it('should find sidebar header', () => {
|
|
52
|
+
cy.get(dashboard.selectors.sidebarHeader).should('exist')
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('should find sidebar logo', () => {
|
|
56
|
+
cy.get(dashboard.selectors.sidebarLogo).should('exist')
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('should find sidebar content', () => {
|
|
60
|
+
cy.get(dashboard.selectors.sidebarContent).should('exist')
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
// Not implemented in Sidebar.tsx component
|
|
64
|
+
it.skip('should find sidebar footer (not implemented in component)', () => {
|
|
65
|
+
cy.get(dashboard.selectors.sidebarFooter).should('exist')
|
|
66
|
+
})
|
|
67
|
+
})
|
|
68
|
+
})
|
|
@@ -0,0 +1,326 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: Dashboard Topnav UI Selectors Validation
|
|
3
|
+
priority: high
|
|
4
|
+
tags: [selectors, topnav, dashboard, ui-validation]
|
|
5
|
+
grepTags: [ui-selectors, dashboard, topnav, SEL_TNAV_001, SEL_TNAV_002, SEL_TNAV_003, SEL_TNAV_004, SEL_TNAV_005, SEL_TNAV_006, SEL_TNAV_007]
|
|
6
|
+
coverage: 7
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Dashboard Topnav UI Selectors Validation
|
|
10
|
+
|
|
11
|
+
> Validates that dashboard topnav component selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality. Uses `loginAsDefaultDeveloper()` which has access to superadmin and devtools links.
|
|
12
|
+
|
|
13
|
+
**NOTE:** Public navbar tests (logo, signin, signup) are in `public.cy.ts`.
|
|
14
|
+
|
|
15
|
+
**Login:** Uses Developer via `loginAsDefaultDeveloper()`.
|
|
16
|
+
|
|
17
|
+
## @test SEL_TNAV_001: Topnav Structure
|
|
18
|
+
|
|
19
|
+
### Metadata
|
|
20
|
+
- **Priority:** High
|
|
21
|
+
- **Type:** Selector Validation
|
|
22
|
+
- **Tags:** topnav, structure, desktop
|
|
23
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_001`
|
|
24
|
+
- **Status:** Active (3 passing, 0 skipped)
|
|
25
|
+
|
|
26
|
+
```gherkin:en
|
|
27
|
+
Scenario: Dashboard topnav has complete structure
|
|
28
|
+
|
|
29
|
+
Given I am logged in as a developer user
|
|
30
|
+
And I navigate to the dashboard
|
|
31
|
+
Then I should find the topnav container
|
|
32
|
+
And I should find the topnav actions container
|
|
33
|
+
And I should find the topnav search container
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
```gherkin:es
|
|
37
|
+
Scenario: Topnav del dashboard tiene estructura completa
|
|
38
|
+
|
|
39
|
+
Given estoy logueado como usuario developer
|
|
40
|
+
And navego al dashboard
|
|
41
|
+
Then deberia encontrar el contenedor del topnav
|
|
42
|
+
And deberia encontrar el contenedor de acciones del topnav
|
|
43
|
+
And deberia encontrar el contenedor de busqueda del topnav
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Expected Results
|
|
47
|
+
| Selector Path | POM Accessor | data-cy Value | Status |
|
|
48
|
+
|---------------|--------------|---------------|--------|
|
|
49
|
+
| dashboard.topnav.container | dashboard.selectors.topnavContainer | topnav-header | Implemented |
|
|
50
|
+
| dashboard.topnav.actions | dashboard.selectors.topnavActions | topnav-actions | Implemented |
|
|
51
|
+
| dashboard.topnav.searchContainer | dashboard.selectors.topnavSearchContainer | topnav-search-section | Implemented |
|
|
52
|
+
|
|
53
|
+
---
|
|
54
|
+
|
|
55
|
+
## @test SEL_TNAV_002: Topnav Actions
|
|
56
|
+
|
|
57
|
+
### Metadata
|
|
58
|
+
- **Priority:** High
|
|
59
|
+
- **Type:** Selector Validation
|
|
60
|
+
- **Tags:** topnav, actions, buttons
|
|
61
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_002`
|
|
62
|
+
- **Status:** Active (4 passing, 0 skipped)
|
|
63
|
+
|
|
64
|
+
```gherkin:en
|
|
65
|
+
Scenario: Dashboard topnav has all action buttons
|
|
66
|
+
|
|
67
|
+
Given I am logged in as a valid user
|
|
68
|
+
And I navigate to the dashboard
|
|
69
|
+
Then I should find the sidebar toggle button
|
|
70
|
+
And I should find the notifications trigger
|
|
71
|
+
And I should find the help button
|
|
72
|
+
And I should find the theme toggle button
|
|
73
|
+
```
|
|
74
|
+
|
|
75
|
+
```gherkin:es
|
|
76
|
+
Scenario: Topnav del dashboard tiene todos los botones de accion
|
|
77
|
+
|
|
78
|
+
Given estoy logueado como usuario valido
|
|
79
|
+
And navego al dashboard
|
|
80
|
+
Then deberia encontrar el boton de toggle del sidebar
|
|
81
|
+
And deberia encontrar el trigger de notificaciones
|
|
82
|
+
And deberia encontrar el boton de ayuda
|
|
83
|
+
And deberia encontrar el boton de cambio de tema
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
### Expected Results
|
|
87
|
+
| Selector Path | POM Accessor | data-cy Value | Status |
|
|
88
|
+
|---------------|--------------|---------------|--------|
|
|
89
|
+
| dashboard.topnav.sidebarToggle | dashboard.selectors.topnavSidebarToggle | topnav-sidebar-toggle | Implemented |
|
|
90
|
+
| dashboard.topnav.notificationsTrigger | dashboard.selectors.topnavNotificationsTrigger | topnav-notifications | Implemented |
|
|
91
|
+
| dashboard.topnav.help | dashboard.selectors.topnavHelp | topnav-help | Implemented |
|
|
92
|
+
| dashboard.topnav.themeToggle | dashboard.selectors.topnavThemeToggle | topnav-theme-toggle | Implemented |
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## @test SEL_TNAV_003: Topnav Admin Links
|
|
97
|
+
|
|
98
|
+
### Metadata
|
|
99
|
+
- **Priority:** Medium
|
|
100
|
+
- **Type:** Selector Validation
|
|
101
|
+
- **Tags:** topnav, admin, superadmin, devtools
|
|
102
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_003`
|
|
103
|
+
- **Status:** Active (2 passing, 0 skipped)
|
|
104
|
+
|
|
105
|
+
```gherkin:en
|
|
106
|
+
Scenario: Topnav shows admin links for developer users
|
|
107
|
+
|
|
108
|
+
Given I am logged in as a developer user
|
|
109
|
+
And superadminAccess.showToDevelopers is enabled (default: true)
|
|
110
|
+
And devtoolsAccess is enabled (default: true)
|
|
111
|
+
And I navigate to the dashboard
|
|
112
|
+
Then I should find the superadmin link
|
|
113
|
+
And I should find the devtools link
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```gherkin:es
|
|
117
|
+
Scenario: Topnav muestra links de admin para usuarios developer
|
|
118
|
+
|
|
119
|
+
Given estoy logueado como usuario developer
|
|
120
|
+
And superadminAccess.showToDevelopers esta habilitado (default: true)
|
|
121
|
+
And devtoolsAccess esta habilitado (default: true)
|
|
122
|
+
And navego al dashboard
|
|
123
|
+
Then deberia encontrar el link de superadmin
|
|
124
|
+
And deberia encontrar el link de devtools
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Expected Results
|
|
128
|
+
| Selector Path | POM Accessor | data-cy Value | Status |
|
|
129
|
+
|---------------|--------------|---------------|--------|
|
|
130
|
+
| dashboard.topnav.superadmin | dashboard.selectors.topnavSuperadmin | topnav-superadmin | Implemented |
|
|
131
|
+
| dashboard.topnav.devtools | dashboard.selectors.topnavDevtools | topnav-devtools | Implemented |
|
|
132
|
+
|
|
133
|
+
### Notes
|
|
134
|
+
- Superadmin link: `superadminAccess.enabled && (isSuperAdmin || (isDeveloper && showToDevelopers))`
|
|
135
|
+
- Devtools link: `devtoolsAccess.enabled && isDeveloper`
|
|
136
|
+
|
|
137
|
+
---
|
|
138
|
+
|
|
139
|
+
## @test SEL_TNAV_004: User Menu
|
|
140
|
+
|
|
141
|
+
### Metadata
|
|
142
|
+
- **Priority:** High
|
|
143
|
+
- **Type:** Selector Validation
|
|
144
|
+
- **Tags:** topnav, user-menu, dropdown
|
|
145
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_004`
|
|
146
|
+
- **Status:** Active (5 passing, 0 skipped)
|
|
147
|
+
|
|
148
|
+
```gherkin:en
|
|
149
|
+
Scenario: User menu opens and shows all items
|
|
150
|
+
|
|
151
|
+
Given I am logged in as a valid user
|
|
152
|
+
And I navigate to the dashboard
|
|
153
|
+
Then I should find the user menu trigger
|
|
154
|
+
When I click on the user menu trigger
|
|
155
|
+
Then I should see the user menu content
|
|
156
|
+
And I should find the profile menu item (user)
|
|
157
|
+
And I should find the settings menu item
|
|
158
|
+
And I should find the signOut action
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
```gherkin:es
|
|
162
|
+
Scenario: Menu de usuario se abre y muestra todos los items
|
|
163
|
+
|
|
164
|
+
Given estoy logueado como usuario valido
|
|
165
|
+
And navego al dashboard
|
|
166
|
+
Then deberia encontrar el trigger del menu de usuario
|
|
167
|
+
When hago click en el trigger del menu de usuario
|
|
168
|
+
Then deberia ver el contenido del menu de usuario
|
|
169
|
+
And deberia encontrar el item de menu de perfil (user)
|
|
170
|
+
And deberia encontrar el item de menu de configuracion
|
|
171
|
+
And deberia encontrar la accion de cerrar sesion
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Expected Results
|
|
175
|
+
| Selector Path | POM Accessor | data-cy Value | Status |
|
|
176
|
+
|---------------|--------------|---------------|--------|
|
|
177
|
+
| dashboard.topnav.userMenuTrigger | dashboard.selectors.topnavUserMenuTrigger | topnav-user-menu-trigger | Implemented |
|
|
178
|
+
| dashboard.topnav.userMenuContent | dashboard.selectors.topnavUserMenuContent | topnav-user-menu | Implemented |
|
|
179
|
+
| dashboard.topnav.userMenuItem(item) | dashboard.selectors.topnavUserMenuItem('user') | topnav-menu-item-user | Implemented |
|
|
180
|
+
| dashboard.topnav.userMenuItem(item) | dashboard.selectors.topnavUserMenuItem('settings') | topnav-menu-item-settings | Implemented |
|
|
181
|
+
| dashboard.topnav.userMenuAction(action) | dashboard.selectors.topnavUserMenuAction('signOut') | topnav-menu-action-signOut | Implemented |
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## @test SEL_TNAV_005: Quick Create
|
|
186
|
+
|
|
187
|
+
### Metadata
|
|
188
|
+
- **Priority:** Medium
|
|
189
|
+
- **Type:** Selector Validation
|
|
190
|
+
- **Tags:** topnav, quick-create, dropdown
|
|
191
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_005`
|
|
192
|
+
- **Status:** Skipped (3 tests) - requires entity with create permission
|
|
193
|
+
|
|
194
|
+
```gherkin:en
|
|
195
|
+
Scenario: Quick create dropdown shows entity options
|
|
196
|
+
|
|
197
|
+
Given I am logged in as a user with create permissions
|
|
198
|
+
And I navigate to the dashboard
|
|
199
|
+
Then I should find the quick create trigger
|
|
200
|
+
When I click on the quick create trigger
|
|
201
|
+
Then I should see the quick create content
|
|
202
|
+
And I should find quick create links for entities (e.g., customers)
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
```gherkin:es
|
|
206
|
+
Scenario: Dropdown de creacion rapida muestra opciones de entidad
|
|
207
|
+
|
|
208
|
+
Given estoy logueado como usuario con permisos de crear
|
|
209
|
+
And navego al dashboard
|
|
210
|
+
Then deberia encontrar el trigger de creacion rapida
|
|
211
|
+
When hago click en el trigger de creacion rapida
|
|
212
|
+
Then deberia ver el contenido de creacion rapida
|
|
213
|
+
And deberia encontrar links de creacion rapida para entidades (ej. customers)
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Expected Results
|
|
217
|
+
| Selector Path | POM Accessor | data-cy Value | Status |
|
|
218
|
+
|---------------|--------------|---------------|--------|
|
|
219
|
+
| dashboard.topnav.quickCreateTrigger | dashboard.selectors.topnavQuickCreateTrigger | topnav-quick-create-trigger | **Skipped** |
|
|
220
|
+
| dashboard.topnav.quickCreateContent | dashboard.selectors.topnavQuickCreateContent | topnav-quick-create-content | **Skipped** |
|
|
221
|
+
| dashboard.topnav.quickCreateLink(entity) | dashboard.selectors.topnavQuickCreateLink('customers') | topnav-quick-create-customers | **Skipped** |
|
|
222
|
+
|
|
223
|
+
### Notes
|
|
224
|
+
- Component renders null if user has no create permissions on any entity
|
|
225
|
+
- Developer role may not have quickCreate entities configured
|
|
226
|
+
- Tests skipped because they require entity with create permission
|
|
227
|
+
|
|
228
|
+
---
|
|
229
|
+
|
|
230
|
+
## @test SEL_TNAV_006: Loading State
|
|
231
|
+
|
|
232
|
+
### Metadata
|
|
233
|
+
- **Priority:** Low
|
|
234
|
+
- **Type:** Selector Validation
|
|
235
|
+
- **Tags:** topnav, loading, skeleton
|
|
236
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_006`
|
|
237
|
+
- **Status:** Skipped (1 test) - transient state cannot be reliably tested
|
|
238
|
+
|
|
239
|
+
```gherkin:en
|
|
240
|
+
Scenario: Topnav shows loading state during auth
|
|
241
|
+
|
|
242
|
+
Given the authentication state is loading
|
|
243
|
+
And I navigate to the dashboard
|
|
244
|
+
Then I should find the user loading state indicator
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
```gherkin:es
|
|
248
|
+
Scenario: Topnav muestra estado de carga durante autenticacion
|
|
249
|
+
|
|
250
|
+
Given el estado de autenticacion esta cargando
|
|
251
|
+
And navego al dashboard
|
|
252
|
+
Then deberia encontrar el indicador de estado de carga del usuario
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Expected Results
|
|
256
|
+
| Selector Path | POM Accessor | data-cy Value | Status |
|
|
257
|
+
|---------------|--------------|---------------|--------|
|
|
258
|
+
| dashboard.topnav.userLoading | dashboard.selectors.topnavUserLoading | topnav-user-loading | **Skipped** |
|
|
259
|
+
|
|
260
|
+
### Notes
|
|
261
|
+
- This transient state is only visible during auth loading
|
|
262
|
+
- Difficult to test reliably in normal flow
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## @test SEL_TNAV_007: Settings Menu
|
|
267
|
+
|
|
268
|
+
### Metadata
|
|
269
|
+
- **Priority:** Medium
|
|
270
|
+
- **Type:** Selector Validation
|
|
271
|
+
- **Tags:** topnav, settings-menu, dropdown
|
|
272
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_007`
|
|
273
|
+
- **Status:** Active (3 passing, 0 skipped)
|
|
274
|
+
|
|
275
|
+
```gherkin:en
|
|
276
|
+
Scenario: Settings menu opens and shows links
|
|
277
|
+
|
|
278
|
+
Given I am logged in as a developer user
|
|
279
|
+
And the settings menu is enabled in theme config
|
|
280
|
+
And I navigate to the dashboard
|
|
281
|
+
Then I should find the settings menu trigger
|
|
282
|
+
When I click on the settings menu trigger
|
|
283
|
+
Then I should see the settings menu content
|
|
284
|
+
And I should find settings menu links (e.g., patterns)
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
```gherkin:es
|
|
288
|
+
Scenario: Menu de configuracion se abre y muestra links
|
|
289
|
+
|
|
290
|
+
Given estoy logueado como usuario developer
|
|
291
|
+
And el menu de configuracion esta habilitado en la config del tema
|
|
292
|
+
And navego al dashboard
|
|
293
|
+
Then deberia encontrar el trigger del menu de configuracion
|
|
294
|
+
When hago click en el trigger del menu de configuracion
|
|
295
|
+
Then deberia ver el contenido del menu de configuracion
|
|
296
|
+
And deberia encontrar links del menu de configuracion (ej. patrones)
|
|
297
|
+
```
|
|
298
|
+
|
|
299
|
+
### Expected Results
|
|
300
|
+
| Test ID | Selector Path | POM Accessor | data-cy Value | Status |
|
|
301
|
+
|---------|---------------|--------------|---------------|--------|
|
|
302
|
+
| SEL_TNAV_007_01 | dashboard.topnav.settingsMenu.trigger | dashboard.selectors.topnavSettingsMenuTrigger | topnav-settings-menu-trigger | Implemented |
|
|
303
|
+
| SEL_TNAV_007_02 | dashboard.topnav.settingsMenu.content | dashboard.selectors.topnavSettingsMenuContent | topnav-settings-menu | Implemented |
|
|
304
|
+
| SEL_TNAV_007_03 | dashboard.topnav.settingsMenu.link(index) | dashboard.selectors.topnavSettingsMenuLink(0) | topnav-settings-link-0 | Implemented |
|
|
305
|
+
|
|
306
|
+
### Notes
|
|
307
|
+
- Settings menu must be enabled in theme config (TOPBAR_CONFIG.settingsMenu)
|
|
308
|
+
- Links are dynamically generated from config
|
|
309
|
+
- Common links include: Patterns
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## Related Components
|
|
314
|
+
|
|
315
|
+
| Component | File | Selectors |
|
|
316
|
+
|-----------|------|-----------|
|
|
317
|
+
| Topnav | `packages/core/src/components/dashboard/Topnav.tsx` | topnav-header, topnav-actions, topnav-search-section |
|
|
318
|
+
| TopnavActions | `packages/core/src/components/dashboard/TopnavActions.tsx` | topnav-sidebar-toggle, topnav-notifications, topnav-help, topnav-theme-toggle |
|
|
319
|
+
| TopnavUserMenu | `packages/core/src/components/dashboard/TopnavUserMenu.tsx` | topnav-user-menu-trigger, topnav-user-menu, topnav-menu-item-*, topnav-menu-action-* |
|
|
320
|
+
| TopnavQuickCreate | `packages/core/src/components/dashboard/TopnavQuickCreate.tsx` | topnav-quick-create-trigger, topnav-quick-create-content, topnav-quick-create-* |
|
|
321
|
+
|
|
322
|
+
## Related POMs
|
|
323
|
+
|
|
324
|
+
| POM | File | Usage |
|
|
325
|
+
|-----|------|-------|
|
|
326
|
+
| DashboardPOM | `themes/default/tests/cypress/src/features/DashboardPOM.ts` | Topnav selectors and methods |
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Selectors Validation: Dashboard Topnav
|
|
3
|
+
*
|
|
4
|
+
* This test validates that dashboard topnav selectors exist in the DOM.
|
|
5
|
+
* This is a lightweight test that ONLY checks selector presence, not functionality.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Validate DashboardPOM topnav selectors work correctly
|
|
9
|
+
* - Ensure all dashboard.topnav.* selectors are implemented
|
|
10
|
+
* - Run as Phase 12 sub-gate before functional tests
|
|
11
|
+
*
|
|
12
|
+
* Scope:
|
|
13
|
+
* - Navigate to dashboard (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_TNAV_001: Topnav Structure (3 selectors)
|
|
19
|
+
* - SEL_TNAV_002: Topnav Actions (4 selectors)
|
|
20
|
+
* - SEL_TNAV_003: Topnav Admin Links (2 selectors - developer has access)
|
|
21
|
+
* - SEL_TNAV_004: User Menu (5 selectors)
|
|
22
|
+
* - SEL_TNAV_005: Quick Create (3 selectors)
|
|
23
|
+
* - SEL_TNAV_006: Loading State (1 skipped - transient state)
|
|
24
|
+
* - SEL_TNAV_007: Settings Menu (3 selectors)
|
|
25
|
+
*
|
|
26
|
+
* NOTE: Public navbar tests (logo, signin, signup) are in public.cy.ts
|
|
27
|
+
*/
|
|
28
|
+
|
|
29
|
+
import { DashboardPOM } from '../../../src/features/DashboardPOM'
|
|
30
|
+
import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
|
|
31
|
+
|
|
32
|
+
describe('Dashboard Topnav Selectors Validation', { tags: ['@ui-selectors', '@dashboard', '@topnav'] }, () => {
|
|
33
|
+
const dashboard = DashboardPOM.create()
|
|
34
|
+
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
loginAsDefaultDeveloper()
|
|
37
|
+
cy.visit('/dashboard', { timeout: 60000, failOnStatusCode: false })
|
|
38
|
+
cy.url().should('include', '/dashboard')
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
// ============================================
|
|
42
|
+
// SEL_TNAV_001: TOPNAV STRUCTURE (3 selectors)
|
|
43
|
+
// NOTE: Logo test moved to public.cy.ts (only visible when not logged in)
|
|
44
|
+
// ============================================
|
|
45
|
+
describe('SEL_TNAV_001: Topnav Structure', { tags: '@SEL_TNAV_001' }, () => {
|
|
46
|
+
it('should find topnav container', () => {
|
|
47
|
+
cy.get(dashboard.selectors.topnavContainer).should('exist')
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
it('should find topnav actions container', () => {
|
|
51
|
+
cy.get(dashboard.selectors.topnavActions).should('exist')
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
it('should find topnav search container', () => {
|
|
55
|
+
cy.get(dashboard.selectors.topnavSearchContainer).should('exist')
|
|
56
|
+
})
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
// ============================================
|
|
60
|
+
// SEL_TNAV_002: TOPNAV ACTIONS (4 selectors)
|
|
61
|
+
// ============================================
|
|
62
|
+
describe('SEL_TNAV_002: Topnav Actions', { tags: '@SEL_TNAV_002' }, () => {
|
|
63
|
+
it('should find sidebar toggle button', () => {
|
|
64
|
+
cy.get(dashboard.selectors.topnavSidebarToggle).should('exist')
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it('should find notifications trigger', () => {
|
|
68
|
+
cy.get(dashboard.selectors.topnavNotificationsTrigger).should('exist')
|
|
69
|
+
})
|
|
70
|
+
|
|
71
|
+
it('should find help button', () => {
|
|
72
|
+
cy.get(dashboard.selectors.topnavHelp).should('exist')
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it('should find theme toggle button', () => {
|
|
76
|
+
cy.get(dashboard.selectors.topnavThemeToggle).should('exist')
|
|
77
|
+
})
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
// ============================================
|
|
81
|
+
// SEL_TNAV_003: TOPNAV ADMIN LINKS (2 selectors)
|
|
82
|
+
// NOTE: Developer user has access (showToDevelopers: true by default)
|
|
83
|
+
// ============================================
|
|
84
|
+
describe('SEL_TNAV_003: Topnav Admin Links', { tags: '@SEL_TNAV_003' }, () => {
|
|
85
|
+
it('should find superadmin link (developer sees with showToDevelopers)', () => {
|
|
86
|
+
// Config: superadminAccess.enabled && (isSuperAdmin || (isDeveloper && showToDevelopers))
|
|
87
|
+
cy.get(dashboard.selectors.topnavSuperadmin).should('exist')
|
|
88
|
+
})
|
|
89
|
+
|
|
90
|
+
it('should find devtools link (developer role)', () => {
|
|
91
|
+
// Config: devtoolsAccess.enabled && isDeveloper
|
|
92
|
+
cy.get(dashboard.selectors.topnavDevtools).should('exist')
|
|
93
|
+
})
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
// ============================================
|
|
97
|
+
// SEL_TNAV_004: USER MENU (4+ selectors)
|
|
98
|
+
// ============================================
|
|
99
|
+
describe('SEL_TNAV_004: User Menu', { tags: '@SEL_TNAV_004' }, () => {
|
|
100
|
+
it('should find user menu trigger', () => {
|
|
101
|
+
cy.get(dashboard.selectors.topnavUserMenuTrigger).should('exist')
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
it('should find user menu content when opened', () => {
|
|
105
|
+
cy.get(dashboard.selectors.topnavUserMenuTrigger).click()
|
|
106
|
+
cy.get(dashboard.selectors.topnavUserMenuContent).should('be.visible')
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
it('should find profile menu item when opened', () => {
|
|
110
|
+
cy.get(dashboard.selectors.topnavUserMenuTrigger).click()
|
|
111
|
+
cy.get(dashboard.selectors.topnavUserMenuItem('user')).should('exist')
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
it('should find settings menu item when opened', () => {
|
|
115
|
+
cy.get(dashboard.selectors.topnavUserMenuTrigger).click()
|
|
116
|
+
cy.get(dashboard.selectors.topnavUserMenuItem('settings')).should('exist')
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
it('should find signOut action when opened', () => {
|
|
120
|
+
cy.get(dashboard.selectors.topnavUserMenuTrigger).click()
|
|
121
|
+
// Action is 'signOut' per dashboard.config.ts
|
|
122
|
+
cy.get(dashboard.selectors.topnavUserMenuAction('signOut')).should('exist')
|
|
123
|
+
})
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
// ============================================
|
|
127
|
+
// SEL_TNAV_005: QUICK CREATE (3 selectors)
|
|
128
|
+
// NOTE: Component renders null if user has no create permissions on any entity.
|
|
129
|
+
// Developer role may not have quickCreate entities configured.
|
|
130
|
+
// ============================================
|
|
131
|
+
describe('SEL_TNAV_005: Quick Create', { tags: '@SEL_TNAV_005' }, () => {
|
|
132
|
+
it.skip('should find quick create trigger (requires entity with create permission)', () => {
|
|
133
|
+
cy.get(dashboard.selectors.topnavQuickCreateTrigger).should('exist')
|
|
134
|
+
})
|
|
135
|
+
|
|
136
|
+
it.skip('should find quick create content when opened (requires entity with create permission)', () => {
|
|
137
|
+
cy.get(dashboard.selectors.topnavQuickCreateTrigger).click()
|
|
138
|
+
cy.get(dashboard.selectors.topnavQuickCreateContent).should('be.visible')
|
|
139
|
+
})
|
|
140
|
+
|
|
141
|
+
it.skip('should find quick create link for entity when opened (requires entity with create permission)', () => {
|
|
142
|
+
cy.get(dashboard.selectors.topnavQuickCreateTrigger).click()
|
|
143
|
+
// Test with 'customers' entity (common in default theme)
|
|
144
|
+
cy.get(dashboard.selectors.topnavQuickCreateLink('customers')).should('exist')
|
|
145
|
+
})
|
|
146
|
+
})
|
|
147
|
+
|
|
148
|
+
// ============================================
|
|
149
|
+
// SEL_TNAV_006: LOADING STATE SELECTOR (1 selector)
|
|
150
|
+
// NOTE: Only visible during auth loading - transient state
|
|
151
|
+
// ============================================
|
|
152
|
+
describe('SEL_TNAV_006: Loading State', { tags: '@SEL_TNAV_006' }, () => {
|
|
153
|
+
it.skip('SEL_TNAV_006_01: should find user loading state (only visible during auth loading)', { tags: '@SEL_TNAV_006_01' }, () => {
|
|
154
|
+
cy.get(dashboard.selectors.topnavUserLoading).should('exist')
|
|
155
|
+
})
|
|
156
|
+
})
|
|
157
|
+
|
|
158
|
+
// ============================================
|
|
159
|
+
// SEL_TNAV_007: SETTINGS MENU (3 selectors)
|
|
160
|
+
// NOTE: settingsMenu must be enabled in theme config
|
|
161
|
+
// ============================================
|
|
162
|
+
describe('SEL_TNAV_007: Settings Menu', { tags: '@SEL_TNAV_007' }, () => {
|
|
163
|
+
it('SEL_TNAV_007_01: should find settings menu trigger', { tags: '@SEL_TNAV_007_01' }, () => {
|
|
164
|
+
cy.get(dashboard.selectors.topnavSettingsMenuTrigger).should('exist')
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
it('SEL_TNAV_007_02: should find settings menu content when opened', { tags: '@SEL_TNAV_007_02' }, () => {
|
|
168
|
+
cy.get(dashboard.selectors.topnavSettingsMenuTrigger).click()
|
|
169
|
+
cy.get(dashboard.selectors.topnavSettingsMenuContent).should('be.visible')
|
|
170
|
+
})
|
|
171
|
+
|
|
172
|
+
it('SEL_TNAV_007_03: should find settings menu link when opened', { tags: '@SEL_TNAV_007_03' }, () => {
|
|
173
|
+
cy.get(dashboard.selectors.topnavSettingsMenuTrigger).click()
|
|
174
|
+
cy.get(dashboard.selectors.topnavSettingsMenuLink(0)).should('exist')
|
|
175
|
+
})
|
|
176
|
+
})
|
|
177
|
+
})
|