@nextsparkjs/theme-default 0.1.0-beta.1 → 0.1.0-beta.100
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/LICENSE +21 -0
- 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 +54 -62
- package/config/dashboard.config.ts +14 -0
- package/config/features.config.ts +10 -0
- package/config/permissions.config.ts +26 -1
- 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/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/093_pages_sample_data.sql +7 -7
- package/migrations/098_patterns_sample_data.sql +234 -0
- package/package.json +8 -3
- package/styles/globals.css +42 -0
- package/templates/(public)/blog/[slug]/page.tsx +1 -1
- 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/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,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Selectors Validation: Dashboard Container
|
|
3
|
+
*
|
|
4
|
+
* This test validates that the dashboard container selector exists in the DOM.
|
|
5
|
+
* This is a lightweight test that ONLY checks selector presence, not functionality.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Validate DashboardPOM container selector works correctly
|
|
9
|
+
* - Ensure dashboard.container selector is implemented
|
|
10
|
+
* - Run as Phase 12 sub-gate before functional tests
|
|
11
|
+
*
|
|
12
|
+
* Scope:
|
|
13
|
+
* - Navigate to dashboard (requires login)
|
|
14
|
+
* - Assert main container exists in DOM
|
|
15
|
+
* - Fast execution (< 10 seconds)
|
|
16
|
+
*
|
|
17
|
+
* Test IDs:
|
|
18
|
+
* - SEL_DCNT_001: Dashboard Container Structure (1 selector)
|
|
19
|
+
*
|
|
20
|
+
* Component: DashboardShell.tsx
|
|
21
|
+
* Selector: dashboard.container → 'dashboard-container'
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
import { DashboardPOM } from '../../../src/features/DashboardPOM'
|
|
25
|
+
import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
|
|
26
|
+
|
|
27
|
+
describe('Dashboard Container Selectors Validation', { tags: ['@ui-selectors', '@dashboard', '@container'] }, () => {
|
|
28
|
+
const dashboard = DashboardPOM.create()
|
|
29
|
+
|
|
30
|
+
beforeEach(() => {
|
|
31
|
+
loginAsDefaultDeveloper()
|
|
32
|
+
cy.visit('/dashboard', { timeout: 60000, failOnStatusCode: false })
|
|
33
|
+
cy.url().should('include', '/dashboard')
|
|
34
|
+
})
|
|
35
|
+
|
|
36
|
+
// ============================================
|
|
37
|
+
// SEL_DCNT_001: DASHBOARD CONTAINER (1 selector)
|
|
38
|
+
// ============================================
|
|
39
|
+
describe('SEL_DCNT_001: Dashboard Container', { tags: '@SEL_DCNT_001' }, () => {
|
|
40
|
+
it('should find dashboard main container', () => {
|
|
41
|
+
cy.get(dashboard.selectors.container).should('exist')
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
it('should have dashboard container visible', () => {
|
|
45
|
+
cy.get(dashboard.selectors.container).should('be.visible')
|
|
46
|
+
})
|
|
47
|
+
|
|
48
|
+
it('should have correct data-cy attribute value', () => {
|
|
49
|
+
cy.get('[data-cy="dashboard-container"]').should('exist')
|
|
50
|
+
})
|
|
51
|
+
})
|
|
52
|
+
})
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: Dashboard Mobile UI Selectors Validation
|
|
3
|
+
priority: medium
|
|
4
|
+
tags: [selectors, mobile, dashboard, ui-validation]
|
|
5
|
+
grepTags: [ui-selectors, mobile, SEL_DMOB_DOC, SEL_DMOB_001, SEL_DMOB_002, SEL_DMOB_003, SEL_DMOB_004]
|
|
6
|
+
coverage: 5
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Dashboard Mobile UI Selectors Validation
|
|
10
|
+
|
|
11
|
+
> Validates that dashboard mobile component selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality. All tests are skipped because they require mobile viewport (< 1024px).
|
|
12
|
+
|
|
13
|
+
**IMPORTANT:** Mobile selectors are ONLY visible on small viewports. Desktop tests will not find these elements. To test: add `cy.viewport('iphone-x')` or run with `--config viewportWidth=375,viewportHeight=812`.
|
|
14
|
+
|
|
15
|
+
## @test SEL_DMOB_DOC: Mobile Testing Documentation
|
|
16
|
+
|
|
17
|
+
### Metadata
|
|
18
|
+
- **Priority:** Low
|
|
19
|
+
- **Type:** Documentation
|
|
20
|
+
- **Tags:** mobile, documentation
|
|
21
|
+
- **Grep:** `@ui-selectors` `@SEL_DMOB_DOC`
|
|
22
|
+
- **Status:** Active
|
|
23
|
+
|
|
24
|
+
```gherkin:en
|
|
25
|
+
Scenario: Document all dashboard mobile selectors
|
|
26
|
+
|
|
27
|
+
Given the mobile selector tests are running
|
|
28
|
+
Then the test should log all mobile selectors
|
|
29
|
+
And document viewport requirements for each section
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
```gherkin:es
|
|
33
|
+
Scenario: Documentar todos los selectores mobile del dashboard
|
|
34
|
+
|
|
35
|
+
Given los tests de selectores mobile estan corriendo
|
|
36
|
+
Then el test deberia loguear todos los selectores mobile
|
|
37
|
+
And documentar los requisitos de viewport para cada seccion
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Expected Results
|
|
41
|
+
- Test logs all mobile selectors for reference
|
|
42
|
+
- Documents viewport requirements (<1024px)
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## @test SEL_DMOB_001: Mobile Topbar Selectors
|
|
47
|
+
|
|
48
|
+
### Metadata
|
|
49
|
+
- **Priority:** Medium
|
|
50
|
+
- **Type:** Selector Validation
|
|
51
|
+
- **Tags:** mobile, topbar, navigation
|
|
52
|
+
- **Grep:** `@ui-selectors` `@SEL_DMOB_001`
|
|
53
|
+
- **Status:** Skipped - requires mobile viewport
|
|
54
|
+
|
|
55
|
+
```gherkin:en
|
|
56
|
+
Scenario: Mobile topbar has all required selectors
|
|
57
|
+
|
|
58
|
+
Given I am viewing the dashboard on a mobile viewport
|
|
59
|
+
And I am logged in as a valid user
|
|
60
|
+
Then I should find the mobile topbar header
|
|
61
|
+
And I should find the user profile button
|
|
62
|
+
And I should find the notifications button
|
|
63
|
+
And I should find the theme toggle button
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```gherkin:es
|
|
67
|
+
Scenario: Topbar mobile tiene todos los selectores requeridos
|
|
68
|
+
|
|
69
|
+
Given estoy viendo el dashboard en viewport mobile
|
|
70
|
+
And estoy logueado como usuario valido
|
|
71
|
+
Then deberia encontrar el header del topbar mobile
|
|
72
|
+
And deberia encontrar el boton de perfil de usuario
|
|
73
|
+
And deberia encontrar el boton de notificaciones
|
|
74
|
+
And deberia encontrar el boton de cambio de tema
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Expected Results
|
|
78
|
+
- `mobile-topbar-header` selector exists
|
|
79
|
+
- `mobile-topbar-user-profile` selector exists
|
|
80
|
+
- `mobile-topbar-notifications` selector exists
|
|
81
|
+
- `mobile-topbar-theme-toggle` selector exists
|
|
82
|
+
|
|
83
|
+
### Notes
|
|
84
|
+
All selectors have `lg:hidden` CSS class - only visible on screens < 1024px.
|
|
85
|
+
|
|
86
|
+
---
|
|
87
|
+
|
|
88
|
+
## @test SEL_DMOB_002: Mobile Bottom Nav Selectors
|
|
89
|
+
|
|
90
|
+
### Metadata
|
|
91
|
+
- **Priority:** Medium
|
|
92
|
+
- **Type:** Selector Validation
|
|
93
|
+
- **Tags:** mobile, bottom-nav, navigation
|
|
94
|
+
- **Grep:** `@ui-selectors` `@SEL_DMOB_002`
|
|
95
|
+
- **Status:** Skipped - requires mobile viewport
|
|
96
|
+
|
|
97
|
+
```gherkin:en
|
|
98
|
+
Scenario: Mobile bottom navigation has all required selectors
|
|
99
|
+
|
|
100
|
+
Given I am viewing the dashboard on a mobile viewport
|
|
101
|
+
And I am logged in as a valid user
|
|
102
|
+
Then I should find the bottom navigation bar
|
|
103
|
+
And I should find bottom nav items for key sections
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
```gherkin:es
|
|
107
|
+
Scenario: Navegacion inferior mobile tiene todos los selectores requeridos
|
|
108
|
+
|
|
109
|
+
Given estoy viendo el dashboard en viewport mobile
|
|
110
|
+
And estoy logueado como usuario valido
|
|
111
|
+
Then deberia encontrar la barra de navegacion inferior
|
|
112
|
+
And deberia encontrar items de navegacion para secciones clave
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Expected Results
|
|
116
|
+
- `mobile-bottom-nav` selector exists
|
|
117
|
+
- `mobile-bottom-nav-item-{slug}` selectors exist (dashboard, entities, create, more)
|
|
118
|
+
|
|
119
|
+
### Notes
|
|
120
|
+
Bottom nav replaces sidebar on mobile. Shows 4 main navigation items.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## @test SEL_DMOB_003: Mobile More Sheet Selectors
|
|
125
|
+
|
|
126
|
+
### Metadata
|
|
127
|
+
- **Priority:** Medium
|
|
128
|
+
- **Type:** Selector Validation
|
|
129
|
+
- **Tags:** mobile, sheet, navigation
|
|
130
|
+
- **Grep:** `@ui-selectors` `@SEL_DMOB_003`
|
|
131
|
+
- **Status:** Skipped - requires mobile viewport
|
|
132
|
+
|
|
133
|
+
```gherkin:en
|
|
134
|
+
Scenario: Mobile more sheet has all required selectors
|
|
135
|
+
|
|
136
|
+
Given I am viewing the dashboard on a mobile viewport
|
|
137
|
+
And I am logged in as a valid user
|
|
138
|
+
And I tap on the "More" button in bottom nav
|
|
139
|
+
Then I should find the more sheet content
|
|
140
|
+
And I should find more sheet items for each section
|
|
141
|
+
And I should find the superadmin link (if permitted)
|
|
142
|
+
And I should find the team switcher
|
|
143
|
+
And I should find the signout button
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
```gherkin:es
|
|
147
|
+
Scenario: Sheet de mas opciones mobile tiene todos los selectores requeridos
|
|
148
|
+
|
|
149
|
+
Given estoy viendo el dashboard en viewport mobile
|
|
150
|
+
And estoy logueado como usuario valido
|
|
151
|
+
And toco el boton "Mas" en la navegacion inferior
|
|
152
|
+
Then deberia encontrar el contenido del sheet de mas opciones
|
|
153
|
+
And deberia encontrar items del sheet para cada seccion
|
|
154
|
+
And deberia encontrar el link de superadmin (si esta permitido)
|
|
155
|
+
And deberia encontrar el selector de equipo
|
|
156
|
+
And deberia encontrar el boton de cerrar sesion
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
### Expected Results
|
|
160
|
+
- `mobile-more-sheet-content` selector exists
|
|
161
|
+
- `mobile-more-sheet-item-{slug}` selectors exist
|
|
162
|
+
- `mobile-more-sheet-superadmin` selector exists
|
|
163
|
+
- `mobile-more-sheet-team-switcher` selector exists
|
|
164
|
+
- `mobile-more-sheet-signout` selector exists
|
|
165
|
+
|
|
166
|
+
### Notes
|
|
167
|
+
More sheet opens from bottom of screen as a sheet/drawer component.
|
|
168
|
+
|
|
169
|
+
---
|
|
170
|
+
|
|
171
|
+
## @test SEL_DMOB_004: Mobile Quick Create Selectors
|
|
172
|
+
|
|
173
|
+
### Metadata
|
|
174
|
+
- **Priority:** Medium
|
|
175
|
+
- **Type:** Selector Validation
|
|
176
|
+
- **Tags:** mobile, sheet, quick-create
|
|
177
|
+
- **Grep:** `@ui-selectors` `@SEL_DMOB_004`
|
|
178
|
+
- **Status:** Skipped - requires mobile viewport
|
|
179
|
+
|
|
180
|
+
```gherkin:en
|
|
181
|
+
Scenario: Mobile quick create sheet has all required selectors
|
|
182
|
+
|
|
183
|
+
Given I am viewing the dashboard on a mobile viewport
|
|
184
|
+
And I am logged in as a valid user
|
|
185
|
+
And I tap on the "Create" button in bottom nav
|
|
186
|
+
Then I should find the quick create sheet content
|
|
187
|
+
And I should find quick create items for each entity type
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
```gherkin:es
|
|
191
|
+
Scenario: Sheet de creacion rapida mobile tiene todos los selectores requeridos
|
|
192
|
+
|
|
193
|
+
Given estoy viendo el dashboard en viewport mobile
|
|
194
|
+
And estoy logueado como usuario valido
|
|
195
|
+
And toco el boton "Crear" en la navegacion inferior
|
|
196
|
+
Then deberia encontrar el contenido del sheet de creacion rapida
|
|
197
|
+
And deberia encontrar items de creacion rapida para cada tipo de entidad
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Expected Results
|
|
201
|
+
- `mobile-quick-create-content` selector exists
|
|
202
|
+
- `mobile-quick-create-item-{slug}` selectors exist (tasks, customers, posts, pages, etc.)
|
|
203
|
+
|
|
204
|
+
### Notes
|
|
205
|
+
Quick create sheet shows available entity types for fast creation on mobile.
|
|
@@ -0,0 +1,137 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Selectors Validation: Dashboard Mobile
|
|
3
|
+
*
|
|
4
|
+
* This test validates that dashboard mobile selectors exist in the DOM.
|
|
5
|
+
* This is a lightweight test that ONLY checks selector presence, not functionality.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Validate DashboardPOM mobile selectors work correctly
|
|
9
|
+
* - Ensure all dashboard.mobile.* 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
|
+
*
|
|
16
|
+
* Test IDs:
|
|
17
|
+
* - SEL_DMOB_DOC: Mobile Testing Documentation
|
|
18
|
+
* - SEL_DMOB_001: Mobile Topbar Selectors (skipped - requires mobile viewport)
|
|
19
|
+
* - SEL_DMOB_002: Mobile Bottom Nav Selectors (skipped - requires mobile viewport)
|
|
20
|
+
* - SEL_DMOB_003: Mobile More Sheet Selectors (skipped - requires mobile viewport)
|
|
21
|
+
* - SEL_DMOB_004: Mobile Quick Create Selectors (skipped - requires mobile viewport)
|
|
22
|
+
*
|
|
23
|
+
* IMPORTANT: Mobile selectors are ONLY visible on small viewports (< 1024px).
|
|
24
|
+
* All tests are marked as skip for desktop testing.
|
|
25
|
+
* To test mobile, use: cy.viewport('iphone-x') or similar.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { DashboardPOM } from '../../../src/features/DashboardPOM'
|
|
29
|
+
|
|
30
|
+
describe('Dashboard Mobile Selectors Validation', { tags: ['@ui-selectors', '@dashboard', '@mobile'] }, () => {
|
|
31
|
+
const dashboard = DashboardPOM.create()
|
|
32
|
+
|
|
33
|
+
// ============================================
|
|
34
|
+
// SEL_DMOB_DOC: DOCUMENTATION
|
|
35
|
+
// ============================================
|
|
36
|
+
describe('SEL_DMOB_DOC: Mobile Testing Documentation', { tags: '@SEL_DMOB_DOC' }, () => {
|
|
37
|
+
it('should document how to test mobile selectors', () => {
|
|
38
|
+
cy.log('=== DASHBOARD MOBILE SELECTORS ===')
|
|
39
|
+
cy.log('')
|
|
40
|
+
cy.log('IMPORTANT: Mobile selectors require viewport < 1024px')
|
|
41
|
+
cy.log('To test: Add cy.viewport("iphone-x") in beforeEach')
|
|
42
|
+
cy.log('Or run with: --config viewportWidth=375,viewportHeight=812')
|
|
43
|
+
cy.log('')
|
|
44
|
+
cy.log('Mobile Topbar (lg:hidden):')
|
|
45
|
+
cy.log('- mobile-topbar-header, mobile-topbar-user-profile')
|
|
46
|
+
cy.log('- mobile-topbar-notifications, mobile-topbar-theme-toggle')
|
|
47
|
+
cy.log('')
|
|
48
|
+
cy.log('Mobile Bottom Nav:')
|
|
49
|
+
cy.log('- mobile-bottom-nav, mobile-bottom-nav-item-{slug}')
|
|
50
|
+
cy.log('')
|
|
51
|
+
cy.log('Mobile More Sheet:')
|
|
52
|
+
cy.log('- mobile-more-sheet-content, mobile-more-sheet-item-{slug}')
|
|
53
|
+
cy.log('- mobile-more-sheet-superadmin, mobile-more-sheet-team-switcher')
|
|
54
|
+
cy.log('- mobile-more-sheet-signout')
|
|
55
|
+
cy.log('')
|
|
56
|
+
cy.log('Mobile Quick Create:')
|
|
57
|
+
cy.log('- mobile-quick-create-content, mobile-quick-create-item-{slug}')
|
|
58
|
+
cy.wrap(true).should('be.true')
|
|
59
|
+
})
|
|
60
|
+
})
|
|
61
|
+
|
|
62
|
+
// ============================================
|
|
63
|
+
// SEL_DMOB_001: MOBILE TOPBAR (4 selectors)
|
|
64
|
+
// NOTE: Only visible on mobile viewports
|
|
65
|
+
// ============================================
|
|
66
|
+
describe('SEL_DMOB_001: Mobile Topbar Selectors', { tags: '@SEL_DMOB_001' }, () => {
|
|
67
|
+
it.skip('should find mobile topbar container (requires mobile viewport)', () => {
|
|
68
|
+
// Requires: cy.viewport('iphone-x')
|
|
69
|
+
cy.get(dashboard.selectors.mobileTopbarContainer).should('exist')
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
it.skip('should find mobile user profile button (requires mobile viewport)', () => {
|
|
73
|
+
cy.get(dashboard.selectors.mobileTopbarUserProfile).should('exist')
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
it.skip('should find mobile notifications button (requires mobile viewport)', () => {
|
|
77
|
+
cy.get(dashboard.selectors.mobileTopbarNotifications).should('exist')
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
it.skip('should find mobile theme toggle (requires mobile viewport)', () => {
|
|
81
|
+
cy.get(dashboard.selectors.mobileTopbarThemeToggle).should('exist')
|
|
82
|
+
})
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
// ============================================
|
|
86
|
+
// SEL_DMOB_002: MOBILE BOTTOM NAV (2 selectors)
|
|
87
|
+
// ============================================
|
|
88
|
+
describe('SEL_DMOB_002: Mobile Bottom Nav Selectors', { tags: '@SEL_DMOB_002' }, () => {
|
|
89
|
+
it.skip('should find mobile bottom nav container (requires mobile viewport)', () => {
|
|
90
|
+
cy.get(dashboard.selectors.mobileBottomNavContainer).should('exist')
|
|
91
|
+
})
|
|
92
|
+
|
|
93
|
+
it.skip('should find mobile bottom nav item (requires mobile viewport)', () => {
|
|
94
|
+
// Example: dashboard, entities, create, more
|
|
95
|
+
cy.get(dashboard.selectors.mobileBottomNavItem('dashboard')).should('exist')
|
|
96
|
+
})
|
|
97
|
+
})
|
|
98
|
+
|
|
99
|
+
// ============================================
|
|
100
|
+
// SEL_DMOB_003: MOBILE MORE SHEET (5 selectors)
|
|
101
|
+
// ============================================
|
|
102
|
+
describe('SEL_DMOB_003: Mobile More Sheet Selectors', { tags: '@SEL_DMOB_003' }, () => {
|
|
103
|
+
it.skip('should find mobile more sheet container (requires mobile viewport)', () => {
|
|
104
|
+
cy.get(dashboard.selectors.mobileMoreSheetContainer).should('exist')
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
it.skip('should find mobile more sheet item (requires mobile viewport)', () => {
|
|
108
|
+
cy.get(dashboard.selectors.mobileMoreSheetItem('settings')).should('exist')
|
|
109
|
+
})
|
|
110
|
+
|
|
111
|
+
it.skip('should find mobile more sheet superadmin link (requires mobile viewport)', () => {
|
|
112
|
+
cy.get(dashboard.selectors.mobileMoreSheetSuperadminLink).should('exist')
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
it.skip('should find mobile more sheet team switcher (requires mobile viewport)', () => {
|
|
116
|
+
cy.get(dashboard.selectors.mobileMoreSheetTeamSwitcher).should('exist')
|
|
117
|
+
})
|
|
118
|
+
|
|
119
|
+
it.skip('should find mobile more sheet signout button (requires mobile viewport)', () => {
|
|
120
|
+
cy.get(dashboard.selectors.mobileMoreSheetSignoutButton).should('exist')
|
|
121
|
+
})
|
|
122
|
+
})
|
|
123
|
+
|
|
124
|
+
// ============================================
|
|
125
|
+
// SEL_DMOB_004: MOBILE QUICK CREATE SHEET (2 selectors)
|
|
126
|
+
// ============================================
|
|
127
|
+
describe('SEL_DMOB_004: Mobile Quick Create Selectors', { tags: '@SEL_DMOB_004' }, () => {
|
|
128
|
+
it.skip('should find mobile quick create sheet container (requires mobile viewport)', () => {
|
|
129
|
+
cy.get(dashboard.selectors.mobileQuickCreateSheetContainer).should('exist')
|
|
130
|
+
})
|
|
131
|
+
|
|
132
|
+
it.skip('should find mobile quick create sheet item (requires mobile viewport)', () => {
|
|
133
|
+
// Example: tasks, customers, posts, pages
|
|
134
|
+
cy.get(dashboard.selectors.mobileQuickCreateSheetItem('tasks')).should('exist')
|
|
135
|
+
})
|
|
136
|
+
})
|
|
137
|
+
})
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: Dashboard Navigation UI Selectors Validation
|
|
3
|
+
priority: high
|
|
4
|
+
tags: [selectors, dashboard, navigation, ui-validation]
|
|
5
|
+
grepTags: [ui-selectors, dashboard, SEL_DASH_001, SEL_DASH_002, SEL_DASH_003]
|
|
6
|
+
coverage: 3
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Dashboard Navigation UI Selectors Validation
|
|
10
|
+
|
|
11
|
+
> Validates that dashboard navigation 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_DASH_001: Navigation Structure
|
|
14
|
+
|
|
15
|
+
### Metadata
|
|
16
|
+
- **Priority:** High
|
|
17
|
+
- **Type:** Selector Validation
|
|
18
|
+
- **Tags:** navigation, structure, sidebar
|
|
19
|
+
- **Grep:** `@ui-selectors` `@SEL_DASH_001`
|
|
20
|
+
- **Status:** Active
|
|
21
|
+
|
|
22
|
+
```gherkin:en
|
|
23
|
+
Scenario: Dashboard navigation has complete structure
|
|
24
|
+
|
|
25
|
+
Given I am logged in as developer
|
|
26
|
+
And I navigate to the dashboard
|
|
27
|
+
Then I should find the main navigation container
|
|
28
|
+
And I should find the dashboard link
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
```gherkin:es
|
|
32
|
+
Scenario: Navegacion del dashboard tiene estructura completa
|
|
33
|
+
|
|
34
|
+
Given estoy logueado como developer
|
|
35
|
+
And navego al dashboard
|
|
36
|
+
Then deberia encontrar el contenedor principal de navegacion
|
|
37
|
+
And deberia encontrar el link de dashboard
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Expected Results
|
|
41
|
+
- `dashboard.navigation.main` selector exists (nav-main)
|
|
42
|
+
- `dashboard.navigation.dashboardLink` selector exists (nav-link-dashboard)
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## @test SEL_DASH_002: Entity Links
|
|
47
|
+
|
|
48
|
+
### Metadata
|
|
49
|
+
- **Priority:** High
|
|
50
|
+
- **Type:** Selector Validation
|
|
51
|
+
- **Tags:** navigation, entities, links
|
|
52
|
+
- **Grep:** `@ui-selectors` `@SEL_DASH_002`
|
|
53
|
+
- **Status:** Active
|
|
54
|
+
|
|
55
|
+
```gherkin:en
|
|
56
|
+
Scenario: Dashboard navigation has entity links
|
|
57
|
+
|
|
58
|
+
Given I am logged in as developer
|
|
59
|
+
And I navigate to the dashboard
|
|
60
|
+
Then I should find the tasks entity link
|
|
61
|
+
And I should find the customers entity link
|
|
62
|
+
And I should find the posts entity link
|
|
63
|
+
And I should find the pages entity link
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
```gherkin:es
|
|
67
|
+
Scenario: Navegacion del dashboard tiene links de entidades
|
|
68
|
+
|
|
69
|
+
Given estoy logueado como developer
|
|
70
|
+
And navego al dashboard
|
|
71
|
+
Then deberia encontrar el link de entidad tasks
|
|
72
|
+
And deberia encontrar el link de entidad customers
|
|
73
|
+
And deberia encontrar el link de entidad posts
|
|
74
|
+
And deberia encontrar el link de entidad pages
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Expected Results
|
|
78
|
+
- `dashboard.navigation.entityLink` with slug `tasks` exists (nav-link-entity-tasks)
|
|
79
|
+
- `dashboard.navigation.entityLink` with slug `customers` exists (nav-link-entity-customers)
|
|
80
|
+
- `dashboard.navigation.entityLink` with slug `posts` exists (nav-link-entity-posts)
|
|
81
|
+
- `dashboard.navigation.entityLink` with slug `pages` exists (nav-link-entity-pages)
|
|
82
|
+
|
|
83
|
+
### Notes
|
|
84
|
+
Entity links are dynamic based on:
|
|
85
|
+
- Entity configuration (enabled, showInMenu)
|
|
86
|
+
- User permissions
|
|
87
|
+
- Theme configuration
|
|
88
|
+
|
|
89
|
+
---
|
|
90
|
+
|
|
91
|
+
## @test SEL_DASH_003: Navigation Sections
|
|
92
|
+
|
|
93
|
+
### Metadata
|
|
94
|
+
- **Priority:** Medium
|
|
95
|
+
- **Type:** Selector Validation
|
|
96
|
+
- **Tags:** navigation, sections, dynamic
|
|
97
|
+
- **Grep:** `@ui-selectors` `@SEL_DASH_003`
|
|
98
|
+
- **Status:** Skipped - requires customSidebarSections in app.config.ts
|
|
99
|
+
|
|
100
|
+
```gherkin:en
|
|
101
|
+
Scenario: Dashboard navigation has section structure
|
|
102
|
+
|
|
103
|
+
Given I am logged in as developer
|
|
104
|
+
And I navigate to the dashboard
|
|
105
|
+
And the theme has custom sidebar sections configured
|
|
106
|
+
Then I should find section containers by ID
|
|
107
|
+
And I should find section labels
|
|
108
|
+
And I should find section items
|
|
109
|
+
```
|
|
110
|
+
|
|
111
|
+
```gherkin:es
|
|
112
|
+
Scenario: Navegacion del dashboard tiene estructura de secciones
|
|
113
|
+
|
|
114
|
+
Given estoy logueado como developer
|
|
115
|
+
And navego al dashboard
|
|
116
|
+
And el tema tiene secciones de sidebar personalizadas configuradas
|
|
117
|
+
Then deberia encontrar contenedores de seccion por ID
|
|
118
|
+
And deberia encontrar etiquetas de seccion
|
|
119
|
+
And deberia encontrar items de seccion
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### Expected Results (when sections are configured)
|
|
123
|
+
- `dashboard.navigation.section` with ID exists (nav-section-{id})
|
|
124
|
+
- `dashboard.navigation.sectionLabel` with ID exists (nav-section-label-{id})
|
|
125
|
+
- `dashboard.navigation.sectionItem` with IDs exists (nav-section-item-{sectionId}-{itemId})
|
|
126
|
+
|
|
127
|
+
### Notes
|
|
128
|
+
All tests in this section are skipped because:
|
|
129
|
+
- Requires `customSidebarSections` to be defined in `app.config.ts`
|
|
130
|
+
- **IMPORTANT:** Enabling `customSidebarSections` REPLACES the default entity-based navigation entirely
|
|
131
|
+
- The sidebar will only show items defined in the sections (no automatic entity links)
|
|
132
|
+
- Requires translation keys for each section and item (e.g., `navigation.content`, `navigation.posts`)
|
|
133
|
+
- For themes with custom sections (e.g., LMS themes), enable these tests with the actual section/item IDs
|
|
134
|
+
|
|
135
|
+
---
|
|
136
|
+
|
|
137
|
+
## Related Components
|
|
138
|
+
|
|
139
|
+
| Component | File | Selectors |
|
|
140
|
+
|-----------|------|-----------|
|
|
141
|
+
| DynamicNavigation | `packages/core/src/components/dashboard/navigation/DynamicNavigation.tsx` | nav-main, nav-link-dashboard, nav-link-entity-{slug}, nav-section-{id}, nav-section-label-{id}, nav-section-item-{sectionId}-{itemId} |
|
|
142
|
+
|
|
143
|
+
## Related POMs
|
|
144
|
+
|
|
145
|
+
| POM | File | Usage |
|
|
146
|
+
|-----|------|-------|
|
|
147
|
+
| DashboardPOM | `themes/default/tests/cypress/src/features/DashboardPOM.ts` | Navigation selectors and methods |
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Selectors Validation: Dashboard Navigation
|
|
3
|
+
*
|
|
4
|
+
* This test validates that dashboard navigation selectors exist in the DOM.
|
|
5
|
+
* This is a lightweight test that ONLY checks selector presence, not functionality.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Validate DashboardPOM navigation selectors work correctly
|
|
9
|
+
* - Ensure all dashboard.navigation.* 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_DASH_001: Navigation Structure
|
|
19
|
+
* - SEL_DASH_002: Entity Links
|
|
20
|
+
* - SEL_DASH_003: Navigation Sections (skipped - requires customSidebarSections which replaces default nav)
|
|
21
|
+
*
|
|
22
|
+
* NOTE: Entity links are dynamic based on permissions.
|
|
23
|
+
* Section selectors require knowing the exact section IDs from theme config.
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
import { DashboardPOM } from '../../../src/features/DashboardPOM'
|
|
27
|
+
import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
|
|
28
|
+
|
|
29
|
+
describe('Dashboard Navigation Selectors Validation', { tags: ['@ui-selectors', '@dashboard', '@navigation'] }, () => {
|
|
30
|
+
const dashboard = DashboardPOM.create()
|
|
31
|
+
|
|
32
|
+
beforeEach(() => {
|
|
33
|
+
loginAsDefaultDeveloper()
|
|
34
|
+
cy.visit('/dashboard', { timeout: 60000, failOnStatusCode: false })
|
|
35
|
+
cy.url().should('include', '/dashboard')
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
// ============================================
|
|
39
|
+
// SEL_DASH_001: NAVIGATION STRUCTURE
|
|
40
|
+
// ============================================
|
|
41
|
+
describe('SEL_DASH_001: Navigation Structure', { tags: '@SEL_DASH_001' }, () => {
|
|
42
|
+
it('should find nav container', () => {
|
|
43
|
+
cy.get(dashboard.selectors.navContainer).should('exist')
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
it('should find dashboard link', () => {
|
|
47
|
+
cy.get(dashboard.selectors.navDashboard).should('exist')
|
|
48
|
+
})
|
|
49
|
+
})
|
|
50
|
+
|
|
51
|
+
// ============================================
|
|
52
|
+
// SEL_DASH_002: ENTITY LINKS
|
|
53
|
+
// ============================================
|
|
54
|
+
describe('SEL_DASH_002: Entity Links', { tags: '@SEL_DASH_002' }, () => {
|
|
55
|
+
it('should find tasks entity link', () => {
|
|
56
|
+
cy.get(dashboard.selectors.navEntity('tasks')).should('exist')
|
|
57
|
+
})
|
|
58
|
+
|
|
59
|
+
it('should find customers entity link', () => {
|
|
60
|
+
cy.get(dashboard.selectors.navEntity('customers')).should('exist')
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
it('should find posts entity link', () => {
|
|
64
|
+
cy.get(dashboard.selectors.navEntity('posts')).should('exist')
|
|
65
|
+
})
|
|
66
|
+
|
|
67
|
+
it('should find pages entity link', () => {
|
|
68
|
+
cy.get(dashboard.selectors.navEntity('pages')).should('exist')
|
|
69
|
+
})
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
// ============================================
|
|
73
|
+
// SEL_DASH_003: NAVIGATION SECTIONS
|
|
74
|
+
// ============================================
|
|
75
|
+
/**
|
|
76
|
+
* SKIPPED: These tests require `customSidebarSections` in app.config.ts
|
|
77
|
+
*
|
|
78
|
+
* IMPORTANT: Enabling `customSidebarSections` REPLACES the default entity-based
|
|
79
|
+
* navigation entirely. The sidebar will only show what's defined in the sections.
|
|
80
|
+
*
|
|
81
|
+
* Requirements to enable these tests:
|
|
82
|
+
* 1. Add `customSidebarSections` array to app.config.ts
|
|
83
|
+
* 2. Add all required translation keys (navigation.{sectionId}, navigation.{itemId})
|
|
84
|
+
* 3. Update tests with the actual section/item IDs from your config
|
|
85
|
+
*
|
|
86
|
+
* Example config:
|
|
87
|
+
* ```
|
|
88
|
+
* customSidebarSections: [
|
|
89
|
+
* {
|
|
90
|
+
* id: 'content',
|
|
91
|
+
* labelKey: 'navigation.content',
|
|
92
|
+
* icon: 'FileText',
|
|
93
|
+
* order: 1,
|
|
94
|
+
* items: [
|
|
95
|
+
* { id: 'posts', labelKey: 'navigation.posts', href: '/dashboard/posts', icon: 'Newspaper' },
|
|
96
|
+
* ],
|
|
97
|
+
* },
|
|
98
|
+
* ]
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
describe('SEL_DASH_003: Navigation Sections', { tags: '@SEL_DASH_003' }, () => {
|
|
102
|
+
it.skip('should find section by ID (requires customSidebarSections in app.config.ts)', () => {
|
|
103
|
+
// cy.get(dashboard.selectors.navSection('content')).should('exist')
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
it.skip('should find section label (requires customSidebarSections in app.config.ts)', () => {
|
|
107
|
+
// cy.get(dashboard.selectors.navSectionLabel('content')).should('exist')
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
it.skip('should find section item (requires customSidebarSections in app.config.ts)', () => {
|
|
111
|
+
// cy.get(dashboard.selectors.navSectionItem('content', 'posts')).should('exist')
|
|
112
|
+
})
|
|
113
|
+
})
|
|
114
|
+
})
|