@nextsparkjs/theme-default 0.1.0-beta.1 → 0.1.0-beta.101
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 +75 -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/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/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/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,131 @@
|
|
|
1
|
+
/// <reference types="cypress" />
|
|
2
|
+
|
|
3
|
+
import * as allure from 'allure-cypress'
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Registration Control Tests - Open Mode
|
|
7
|
+
*
|
|
8
|
+
* Verifies registration mode enforcement when mode is 'open'.
|
|
9
|
+
* Tests: signup accessibility, login page elements, API signup allowed.
|
|
10
|
+
*
|
|
11
|
+
* These tests detect the current registration mode and skip if not 'open'.
|
|
12
|
+
*/
|
|
13
|
+
describe('Registration Control - Open Mode', {
|
|
14
|
+
tags: ['@uat', '@feat-auth', '@security', '@regression']
|
|
15
|
+
}, () => {
|
|
16
|
+
const TEST_PASSWORD = Cypress.env('TEST_PASSWORD') || 'Test1234'
|
|
17
|
+
|
|
18
|
+
before(() => {
|
|
19
|
+
// Detect registration mode by checking if /signup is accessible (not redirected)
|
|
20
|
+
cy.request({
|
|
21
|
+
url: '/signup',
|
|
22
|
+
followRedirect: false,
|
|
23
|
+
failOnStatusCode: false,
|
|
24
|
+
}).then((response) => {
|
|
25
|
+
// In open mode, /signup returns 200 (not a redirect)
|
|
26
|
+
// In domain-restricted or invitation-only (with existing team), it redirects (307/308)
|
|
27
|
+
if (response.status >= 300 && response.status < 400) {
|
|
28
|
+
// Not open mode — skip all tests in this suite
|
|
29
|
+
Cypress.runner.stop()
|
|
30
|
+
}
|
|
31
|
+
// Additionally verify that the login page shows a signup link (confirms open mode)
|
|
32
|
+
})
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
beforeEach(() => {
|
|
36
|
+
allure.epic('UAT')
|
|
37
|
+
allure.feature('Registration Control')
|
|
38
|
+
cy.clearCookies()
|
|
39
|
+
cy.clearLocalStorage()
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
describe('REG_OPEN_001: Signup page is accessible in open mode', () => {
|
|
43
|
+
it('should show the signup form without redirecting', () => {
|
|
44
|
+
allure.story('Signup Accessibility')
|
|
45
|
+
allure.severity('critical')
|
|
46
|
+
|
|
47
|
+
cy.log('1. Visit /signup')
|
|
48
|
+
cy.visit('/signup')
|
|
49
|
+
|
|
50
|
+
cy.log('2. Should stay on /signup (no redirect)')
|
|
51
|
+
cy.url().should('include', '/signup')
|
|
52
|
+
|
|
53
|
+
cy.log('3. Signup form should be visible')
|
|
54
|
+
cy.get('form').should('exist')
|
|
55
|
+
})
|
|
56
|
+
})
|
|
57
|
+
|
|
58
|
+
describe('REG_OPEN_002: Login page shows email login and signup link', () => {
|
|
59
|
+
it('should show email login form and signup link', () => {
|
|
60
|
+
allure.story('Login Page Visibility')
|
|
61
|
+
allure.severity('critical')
|
|
62
|
+
|
|
63
|
+
cy.log('1. Visit /login')
|
|
64
|
+
cy.visit('/login')
|
|
65
|
+
|
|
66
|
+
cy.log('2. Email login should be available')
|
|
67
|
+
// Either the form is visible directly, or a "show email" toggle exists
|
|
68
|
+
cy.get('body').then(($body) => {
|
|
69
|
+
if ($body.find('[data-cy="auth.login.showEmail"]').length) {
|
|
70
|
+
cy.get('[data-cy="auth.login.showEmail"]').click()
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
cy.get('[data-cy="auth.login.form"]').should('exist')
|
|
74
|
+
|
|
75
|
+
cy.log('3. Signup link should be visible')
|
|
76
|
+
cy.get('[data-cy="auth.login.signupLink"]').should('be.visible')
|
|
77
|
+
})
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
describe('REG_OPEN_003: API allows email signup in open mode', () => {
|
|
81
|
+
it('should allow new user registration via email', () => {
|
|
82
|
+
allure.story('API Signup Allowed')
|
|
83
|
+
allure.severity('critical')
|
|
84
|
+
|
|
85
|
+
const uniqueEmail = `test-open-${Date.now()}@test-cypress.dev`
|
|
86
|
+
|
|
87
|
+
cy.log(`1. POST /api/auth/sign-up/email with new user: ${uniqueEmail}`)
|
|
88
|
+
cy.request({
|
|
89
|
+
method: 'POST',
|
|
90
|
+
url: '/api/auth/sign-up/email',
|
|
91
|
+
body: {
|
|
92
|
+
name: 'Test Open Mode User',
|
|
93
|
+
email: uniqueEmail,
|
|
94
|
+
password: TEST_PASSWORD,
|
|
95
|
+
},
|
|
96
|
+
failOnStatusCode: false,
|
|
97
|
+
}).then((response) => {
|
|
98
|
+
cy.log(`Response status: ${response.status}`)
|
|
99
|
+
// Open mode should allow signup (200) or require email verification (200 with token)
|
|
100
|
+
// Should NOT be 403 (blocked)
|
|
101
|
+
expect(response.status).to.not.eq(403)
|
|
102
|
+
expect(response.status).to.be.oneOf([200, 201])
|
|
103
|
+
})
|
|
104
|
+
})
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
describe('REG_OPEN_004: Existing user can login with email+password', () => {
|
|
108
|
+
it('should allow existing user to sign in via API', () => {
|
|
109
|
+
allure.story('Existing User Login')
|
|
110
|
+
allure.severity('critical')
|
|
111
|
+
|
|
112
|
+
cy.log('1. POST /api/auth/sign-in/email with existing user')
|
|
113
|
+
cy.request({
|
|
114
|
+
method: 'POST',
|
|
115
|
+
url: '/api/auth/sign-in/email',
|
|
116
|
+
body: {
|
|
117
|
+
email: Cypress.env('OWNER_EMAIL') || 'carlos.mendoza@nextspark.dev',
|
|
118
|
+
password: TEST_PASSWORD,
|
|
119
|
+
},
|
|
120
|
+
failOnStatusCode: false,
|
|
121
|
+
}).then((response) => {
|
|
122
|
+
cy.log(`Response status: ${response.status}`)
|
|
123
|
+
expect(response.status).to.eq(200)
|
|
124
|
+
})
|
|
125
|
+
})
|
|
126
|
+
})
|
|
127
|
+
|
|
128
|
+
after(() => {
|
|
129
|
+
cy.log('Registration control (open mode) tests completed')
|
|
130
|
+
})
|
|
131
|
+
})
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
/// <reference types="cypress" />
|
|
2
|
+
|
|
3
|
+
import * as allure from 'allure-cypress'
|
|
4
|
+
|
|
5
|
+
import { DEFAULT_THEME_USERS } from '../../../../src/session-helpers'
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* Registration Control Tests
|
|
9
|
+
*
|
|
10
|
+
* Verifies registration mode enforcement in domain-restricted mode (default theme).
|
|
11
|
+
* Tests: signup redirect, login page visibility, API blocking, existing user login.
|
|
12
|
+
*/
|
|
13
|
+
describe('Registration Control - Domain Restricted Mode', {
|
|
14
|
+
tags: ['@uat', '@feat-auth', '@security', '@regression']
|
|
15
|
+
}, () => {
|
|
16
|
+
const TEST_PASSWORD = Cypress.env('TEST_PASSWORD') || 'Test1234'
|
|
17
|
+
|
|
18
|
+
beforeEach(() => {
|
|
19
|
+
allure.epic('UAT')
|
|
20
|
+
allure.feature('Registration Control')
|
|
21
|
+
cy.clearCookies()
|
|
22
|
+
cy.clearLocalStorage()
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
describe('REG_001: Signup page redirects in domain-restricted mode', () => {
|
|
26
|
+
it('should redirect /signup to /login', () => {
|
|
27
|
+
allure.story('Signup Redirect')
|
|
28
|
+
allure.severity('critical')
|
|
29
|
+
|
|
30
|
+
cy.log('1. Visit /signup')
|
|
31
|
+
cy.visit('/signup', { failOnStatusCode: false })
|
|
32
|
+
|
|
33
|
+
cy.log('2. Should redirect to /login')
|
|
34
|
+
cy.url().should('include', '/login')
|
|
35
|
+
})
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
describe('REG_002: Login page hides email login in domain-restricted mode', () => {
|
|
39
|
+
it('should show Google button but hide email login options', () => {
|
|
40
|
+
allure.story('Login Page Visibility')
|
|
41
|
+
allure.severity('critical')
|
|
42
|
+
|
|
43
|
+
cy.log('1. Visit /login')
|
|
44
|
+
cy.visit('/login')
|
|
45
|
+
|
|
46
|
+
cy.log('2. Google sign-in button should be visible')
|
|
47
|
+
cy.get('[data-cy="auth.login.googleSignin"]').should('be.visible')
|
|
48
|
+
|
|
49
|
+
cy.log('3. "Show email" link should NOT exist')
|
|
50
|
+
cy.get('[data-cy="auth.login.showEmail"]').should('not.exist')
|
|
51
|
+
|
|
52
|
+
cy.log('4. Email form should NOT exist')
|
|
53
|
+
cy.get('[data-cy="auth.login.form"]').should('not.exist')
|
|
54
|
+
|
|
55
|
+
cy.log('5. Signup link should NOT exist')
|
|
56
|
+
cy.get('[data-cy="auth.login.signupLink"]').should('not.exist')
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
describe('REG_003: API blocks email signup in domain-restricted mode', () => {
|
|
61
|
+
it('should return 403 for email signup attempt', () => {
|
|
62
|
+
allure.story('API Signup Blocking')
|
|
63
|
+
allure.severity('critical')
|
|
64
|
+
|
|
65
|
+
cy.log('1. POST /api/auth/sign-up/email with new user data')
|
|
66
|
+
cy.request({
|
|
67
|
+
method: 'POST',
|
|
68
|
+
url: '/api/auth/sign-up/email',
|
|
69
|
+
body: {
|
|
70
|
+
name: 'Test New User',
|
|
71
|
+
email: 'newuser@unauthorized-domain.com',
|
|
72
|
+
password: 'TestPassword123',
|
|
73
|
+
},
|
|
74
|
+
failOnStatusCode: false,
|
|
75
|
+
}).then((response) => {
|
|
76
|
+
cy.log(`Response status: ${response.status}`)
|
|
77
|
+
expect(response.status).to.eq(403)
|
|
78
|
+
})
|
|
79
|
+
})
|
|
80
|
+
})
|
|
81
|
+
|
|
82
|
+
describe('REG_004: API blocks alternative signup endpoints', () => {
|
|
83
|
+
it('should block signup via alternative endpoints', () => {
|
|
84
|
+
allure.story('API Signup Blocking')
|
|
85
|
+
allure.severity('normal')
|
|
86
|
+
|
|
87
|
+
const signupPayload = {
|
|
88
|
+
name: 'Test New User',
|
|
89
|
+
email: 'newuser@unauthorized-domain.com',
|
|
90
|
+
password: 'TestPassword123',
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
const endpoints = [
|
|
94
|
+
'/api/auth/sign-up/email',
|
|
95
|
+
'/api/auth/sign-up/credentials',
|
|
96
|
+
]
|
|
97
|
+
|
|
98
|
+
endpoints.forEach((endpoint) => {
|
|
99
|
+
cy.log(`Testing: POST ${endpoint}`)
|
|
100
|
+
cy.request({
|
|
101
|
+
method: 'POST',
|
|
102
|
+
url: endpoint,
|
|
103
|
+
body: signupPayload,
|
|
104
|
+
failOnStatusCode: false,
|
|
105
|
+
}).then((response) => {
|
|
106
|
+
cy.log(`${endpoint} → ${response.status}`)
|
|
107
|
+
// Should be blocked (403 or 404 for non-existent endpoints)
|
|
108
|
+
expect(response.status).to.be.oneOf([403, 404, 422])
|
|
109
|
+
})
|
|
110
|
+
})
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
describe('REG_005: Existing user can still login with email+password', () => {
|
|
115
|
+
it('should allow existing user to sign in via API', () => {
|
|
116
|
+
allure.story('Existing User Login')
|
|
117
|
+
allure.severity('critical')
|
|
118
|
+
|
|
119
|
+
const existingUser = DEFAULT_THEME_USERS.OWNER
|
|
120
|
+
|
|
121
|
+
cy.log(`1. POST /api/auth/sign-in/email with existing user: ${existingUser}`)
|
|
122
|
+
cy.request({
|
|
123
|
+
method: 'POST',
|
|
124
|
+
url: '/api/auth/sign-in/email',
|
|
125
|
+
body: {
|
|
126
|
+
email: existingUser,
|
|
127
|
+
password: TEST_PASSWORD,
|
|
128
|
+
},
|
|
129
|
+
failOnStatusCode: false,
|
|
130
|
+
}).then((response) => {
|
|
131
|
+
cy.log(`Response status: ${response.status}`)
|
|
132
|
+
expect(response.status).to.eq(200)
|
|
133
|
+
})
|
|
134
|
+
})
|
|
135
|
+
})
|
|
136
|
+
|
|
137
|
+
after(() => {
|
|
138
|
+
cy.log('Registration control tests completed')
|
|
139
|
+
})
|
|
140
|
+
})
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: Admin Team Role Permissions
|
|
3
|
+
priority: critical
|
|
4
|
+
tags: [auth, team-role, admin, permissions, security]
|
|
5
|
+
grepTags: [uat, feat-auth, team-role, admin]
|
|
6
|
+
coverage: 6
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Admin Team Role Permissions
|
|
10
|
+
|
|
11
|
+
> Tests for Admin team role permissions and access control. Admin has full CRUD access to entities but limited team settings and no billing management. Cannot access app-role areas.
|
|
12
|
+
|
|
13
|
+
## @test ADMIN-PERM-001: Admin Dashboard Access
|
|
14
|
+
|
|
15
|
+
### Metadata
|
|
16
|
+
- **Priority:** Critical
|
|
17
|
+
- **Type:** Smoke
|
|
18
|
+
- **Tags:** admin, dashboard, navigation
|
|
19
|
+
- **Grep:** `@smoke`
|
|
20
|
+
|
|
21
|
+
```gherkin:en
|
|
22
|
+
Scenario: Admin can access dashboard with full navigation
|
|
23
|
+
|
|
24
|
+
Given I am logged in as Admin (james.wilson@nextspark.dev)
|
|
25
|
+
When I visit /dashboard
|
|
26
|
+
Then the dashboard container should be visible
|
|
27
|
+
And I should see navigation for customers
|
|
28
|
+
And I should see navigation for tasks
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
```gherkin:es
|
|
32
|
+
Scenario: Admin puede acceder al dashboard con navegacion completa
|
|
33
|
+
|
|
34
|
+
Given estoy logueado como Admin (james.wilson@nextspark.dev)
|
|
35
|
+
When visito /dashboard
|
|
36
|
+
Then el contenedor del dashboard deberia estar visible
|
|
37
|
+
And deberia ver navegacion a customers
|
|
38
|
+
And deberia ver navegacion a tasks
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
### Expected Results
|
|
42
|
+
- Dashboard loads correctly
|
|
43
|
+
- Navigation items visible
|
|
44
|
+
- No entity restrictions
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## @test ADMIN-PERM-002: Admin Full Entity Access
|
|
49
|
+
|
|
50
|
+
### Metadata
|
|
51
|
+
- **Priority:** Critical
|
|
52
|
+
- **Type:** Smoke
|
|
53
|
+
- **Tags:** admin, customers, crud
|
|
54
|
+
- **Grep:** `@smoke`
|
|
55
|
+
|
|
56
|
+
```gherkin:en
|
|
57
|
+
Scenario: Admin has full CRUD access to customers
|
|
58
|
+
|
|
59
|
+
Given I am logged in as Admin (james.wilson@nextspark.dev)
|
|
60
|
+
When I visit /customers
|
|
61
|
+
Then the create button should be visible
|
|
62
|
+
And the entity list should be visible
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
```gherkin:es
|
|
66
|
+
Scenario: Admin tiene acceso CRUD completo a customers
|
|
67
|
+
|
|
68
|
+
Given estoy logueado como Admin (james.wilson@nextspark.dev)
|
|
69
|
+
When visito /customers
|
|
70
|
+
Then el boton de crear deberia estar visible
|
|
71
|
+
And la lista de entidades deberia estar visible
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
### Expected Results
|
|
75
|
+
- Full CRUD access to entities
|
|
76
|
+
- Create button visible
|
|
77
|
+
- Edit/Delete available
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
|
|
81
|
+
## @test ADMIN-PERM-003: Admin Settings Access
|
|
82
|
+
|
|
83
|
+
### Metadata
|
|
84
|
+
- **Priority:** High
|
|
85
|
+
- **Type:** Regression
|
|
86
|
+
- **Tags:** admin, settings
|
|
87
|
+
|
|
88
|
+
```gherkin:en
|
|
89
|
+
Scenario: Admin can access settings with limited options
|
|
90
|
+
|
|
91
|
+
Given I am logged in as Admin (james.wilson@nextspark.dev)
|
|
92
|
+
When I visit /settings
|
|
93
|
+
Then the settings container should be visible
|
|
94
|
+
And the profile tab should be visible
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
```gherkin:es
|
|
98
|
+
Scenario: Admin puede acceder a settings con opciones limitadas
|
|
99
|
+
|
|
100
|
+
Given estoy logueado como Admin (james.wilson@nextspark.dev)
|
|
101
|
+
When visito /settings
|
|
102
|
+
Then el contenedor de settings deberia estar visible
|
|
103
|
+
And la pestana de perfil deberia estar visible
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
### Expected Results
|
|
107
|
+
- Settings accessible
|
|
108
|
+
- Profile management available
|
|
109
|
+
- Some team settings may be restricted
|
|
110
|
+
|
|
111
|
+
---
|
|
112
|
+
|
|
113
|
+
## @test ADMIN-PERM-004: Admin Billing Restricted Access
|
|
114
|
+
|
|
115
|
+
### Metadata
|
|
116
|
+
- **Priority:** High
|
|
117
|
+
- **Type:** Regression
|
|
118
|
+
- **Tags:** admin, billing, restricted
|
|
119
|
+
|
|
120
|
+
```gherkin:en
|
|
121
|
+
Scenario: Admin has view-only or no access to billing
|
|
122
|
+
|
|
123
|
+
Given I am logged in as Admin (james.wilson@nextspark.dev)
|
|
124
|
+
When I visit /billing
|
|
125
|
+
Then I should have view-only access or be redirected
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
```gherkin:es
|
|
129
|
+
Scenario: Admin tiene acceso solo lectura o sin acceso a billing
|
|
130
|
+
|
|
131
|
+
Given estoy logueado como Admin (james.wilson@nextspark.dev)
|
|
132
|
+
When visito /billing
|
|
133
|
+
Then deberia tener acceso solo lectura o ser redirigido
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Expected Results
|
|
137
|
+
- Either view-only billing access
|
|
138
|
+
- Or redirect to dashboard
|
|
139
|
+
- No upgrade/payment buttons if accessible
|
|
140
|
+
|
|
141
|
+
---
|
|
142
|
+
|
|
143
|
+
## @test ADMIN-PERM-005: Admin Cannot Access Sector7
|
|
144
|
+
|
|
145
|
+
### Metadata
|
|
146
|
+
- **Priority:** High
|
|
147
|
+
- **Type:** Security
|
|
148
|
+
- **Tags:** admin, sector7, blocked
|
|
149
|
+
|
|
150
|
+
```gherkin:en
|
|
151
|
+
Scenario: Admin is blocked from Sector7
|
|
152
|
+
|
|
153
|
+
Given I am logged in as Admin (james.wilson@nextspark.dev)
|
|
154
|
+
When I attempt to visit /sector7
|
|
155
|
+
Then I should be redirected away from /sector7
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
```gherkin:es
|
|
159
|
+
Scenario: Admin no puede acceder a Sector7
|
|
160
|
+
|
|
161
|
+
Given estoy logueado como Admin (james.wilson@nextspark.dev)
|
|
162
|
+
When intento visitar /sector7
|
|
163
|
+
Then deberia ser redirigido fuera de /sector7
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Expected Results
|
|
167
|
+
- Access denied to Sector7
|
|
168
|
+
- Redirect to dashboard
|
|
169
|
+
|
|
170
|
+
---
|
|
171
|
+
|
|
172
|
+
## @test ADMIN-PERM-006: Admin Cannot Access Dev Zone
|
|
173
|
+
|
|
174
|
+
### Metadata
|
|
175
|
+
- **Priority:** High
|
|
176
|
+
- **Type:** Security
|
|
177
|
+
- **Tags:** admin, dev-zone, blocked
|
|
178
|
+
|
|
179
|
+
```gherkin:en
|
|
180
|
+
Scenario: Admin is blocked from Dev Zone
|
|
181
|
+
|
|
182
|
+
Given I am logged in as Admin (james.wilson@nextspark.dev)
|
|
183
|
+
When I attempt to visit /dev
|
|
184
|
+
Then I should be redirected away from /dev
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
```gherkin:es
|
|
188
|
+
Scenario: Admin no puede acceder a Dev Zone
|
|
189
|
+
|
|
190
|
+
Given estoy logueado como Admin (james.wilson@nextspark.dev)
|
|
191
|
+
When intento visitar /dev
|
|
192
|
+
Then deberia ser redirigido fuera de /dev
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
### Expected Results
|
|
196
|
+
- Access denied to Dev Zone
|
|
197
|
+
- Redirect to dashboard
|
|
198
|
+
|
|
199
|
+
---
|
|
200
|
+
|
|
201
|
+
## UI Elements
|
|
202
|
+
|
|
203
|
+
| Element | Selector | Description |
|
|
204
|
+
|---------|----------|-------------|
|
|
205
|
+
| Dashboard Container | `[data-cy="dashboard-container"]` | Main dashboard container |
|
|
206
|
+
| Customers Nav | `[data-cy="sidebar-nav-customers"]` | Customers navigation item |
|
|
207
|
+
| Tasks Nav | `[data-cy="sidebar-nav-tasks"]` | Tasks navigation item |
|
|
208
|
+
| Create Button | `[data-cy="entity-create-button"]` | Entity create button |
|
|
209
|
+
| Entity List | `[data-cy="entity-list-container"]` | Entity list container |
|
|
210
|
+
| Settings Container | `[data-cy="settings-container"]` | Settings page container |
|
|
211
|
+
| Profile Tab | `[data-cy="settings-tab-profile"]` | Profile settings tab |
|
|
212
|
+
| Billing Container | `[data-cy="billing-container"]` | Billing page container |
|
|
213
|
+
|
|
214
|
+
---
|
|
215
|
+
|
|
216
|
+
## Summary
|
|
217
|
+
|
|
218
|
+
| Test ID | Block | Description | Tags |
|
|
219
|
+
|---------|-------|-------------|------|
|
|
220
|
+
| ADMIN-PERM-001 | Access | Dashboard with navigation | `@smoke` |
|
|
221
|
+
| ADMIN-PERM-002 | Access | Full CRUD to customers | `@smoke` |
|
|
222
|
+
| ADMIN-PERM-003 | Access | Settings with limits | |
|
|
223
|
+
| ADMIN-PERM-004 | Restricted | View-only billing | |
|
|
224
|
+
| ADMIN-PERM-005 | Blocked | Cannot access Sector7 | |
|
|
225
|
+
| ADMIN-PERM-006 | Blocked | Cannot access Dev Zone | |
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
/// <reference types="cypress" />
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Admin Team Role Login Tests
|
|
5
|
+
*
|
|
6
|
+
* Tests the Admin team role login and specific permissions:
|
|
7
|
+
* - Full CRUD access to entities
|
|
8
|
+
* - Limited team settings access (cannot delete team)
|
|
9
|
+
* - No billing access (owner only)
|
|
10
|
+
* - Member management (limited)
|
|
11
|
+
* - Cannot access /dev or /superadmin (app roles only)
|
|
12
|
+
*
|
|
13
|
+
* Note: Basic login is tested in login-logout.cy.ts
|
|
14
|
+
* This file focuses on Admin-specific permissions and restrictions.
|
|
15
|
+
*
|
|
16
|
+
* Tags: @uat, @feat-auth, @team-role, @admin
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import * as allure from 'allure-cypress'
|
|
20
|
+
|
|
21
|
+
import { loginAsDefaultAdmin, DEFAULT_THEME_USERS } from '../../../../src/session-helpers'
|
|
22
|
+
import { DashboardPOM } from '../../../../src/features/DashboardPOM'
|
|
23
|
+
import { SettingsPOM } from '../../../../src/features/SettingsPOM'
|
|
24
|
+
import { BillingPOM } from '../../../../src/features/BillingPOM'
|
|
25
|
+
import { SuperadminPOM } from '../../../../src/features/SuperadminPOM'
|
|
26
|
+
import { DevAreaPOM } from '../../../../src/features/DevAreaPOM'
|
|
27
|
+
|
|
28
|
+
describe('Authentication - Admin Team Role Permissions', {
|
|
29
|
+
tags: ['@uat', '@feat-auth', '@team-role', '@admin']
|
|
30
|
+
}, () => {
|
|
31
|
+
const dashboard = DashboardPOM.create()
|
|
32
|
+
const settings = SettingsPOM.create()
|
|
33
|
+
const billing = BillingPOM.create()
|
|
34
|
+
const sector7 = SuperadminPOM.create()
|
|
35
|
+
const devArea = DevAreaPOM.create()
|
|
36
|
+
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
allure.epic('Authentication')
|
|
39
|
+
allure.feature('Team Roles')
|
|
40
|
+
allure.story('Admin Permissions')
|
|
41
|
+
loginAsDefaultAdmin()
|
|
42
|
+
})
|
|
43
|
+
|
|
44
|
+
describe('ADMIN-PERM-001: Admin Dashboard Access', { tags: '@smoke' }, () => {
|
|
45
|
+
it('should access dashboard with full navigation', { tags: '@smoke' }, () => {
|
|
46
|
+
allure.severity('critical')
|
|
47
|
+
|
|
48
|
+
// 1. Visit dashboard and wait for it to load
|
|
49
|
+
dashboard.visitDashboard()
|
|
50
|
+
dashboard.waitForDashboard()
|
|
51
|
+
|
|
52
|
+
// 2. Validate sidebar navigation items
|
|
53
|
+
dashboard.assertEntityNavVisible('customers')
|
|
54
|
+
dashboard.assertEntityNavVisible('tasks')
|
|
55
|
+
|
|
56
|
+
cy.log(`✅ Admin dashboard access verified (${DEFAULT_THEME_USERS.ADMIN})`)
|
|
57
|
+
})
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
describe('ADMIN-PERM-002: Admin Full Entity Access', { tags: '@smoke' }, () => {
|
|
61
|
+
it('should have full CRUD access to customers', { tags: '@smoke' }, () => {
|
|
62
|
+
allure.severity('critical')
|
|
63
|
+
|
|
64
|
+
// 1. Navigate to customers
|
|
65
|
+
dashboard.visitEntity('customers')
|
|
66
|
+
dashboard.waitForEntityPage('customers')
|
|
67
|
+
|
|
68
|
+
// 2. Validate create button is visible (Admin can create)
|
|
69
|
+
dashboard.assertEntityAddButtonVisible('customers')
|
|
70
|
+
|
|
71
|
+
// 3. Validate table is visible
|
|
72
|
+
dashboard.assertEntityPageVisible('customers')
|
|
73
|
+
|
|
74
|
+
cy.log('✅ Admin has full CRUD access to customers')
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
describe('ADMIN-PERM-003: Admin Settings Access', () => {
|
|
79
|
+
it('should access settings page with limited options', () => {
|
|
80
|
+
allure.severity('high')
|
|
81
|
+
|
|
82
|
+
// 1. Navigate to settings
|
|
83
|
+
settings.visitSettings()
|
|
84
|
+
settings.waitForSettings()
|
|
85
|
+
|
|
86
|
+
// 2. Validate settings page is accessible
|
|
87
|
+
settings.assertSettingsVisible()
|
|
88
|
+
|
|
89
|
+
// 3. Validate profile nav is visible
|
|
90
|
+
settings.assertNavItemVisible('profile')
|
|
91
|
+
|
|
92
|
+
cy.log('✅ Admin can access settings')
|
|
93
|
+
})
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
describe('ADMIN-PERM-004: Admin Billing Restricted Access', () => {
|
|
97
|
+
it('should have view-only or no access to billing', () => {
|
|
98
|
+
allure.severity('high')
|
|
99
|
+
|
|
100
|
+
// 1. Navigate to billing
|
|
101
|
+
billing.visitBilling()
|
|
102
|
+
|
|
103
|
+
// 2. Check access - Admin may have view-only or redirected
|
|
104
|
+
cy.url().then((url) => {
|
|
105
|
+
if (url.includes('/billing')) {
|
|
106
|
+
// If accessible, billing container should be visible
|
|
107
|
+
billing.getBillingMain().should('be.visible')
|
|
108
|
+
cy.log('✅ Admin has view-only billing access')
|
|
109
|
+
} else {
|
|
110
|
+
// If redirected, that's also valid
|
|
111
|
+
cy.log('✅ Admin correctly redirected from billing')
|
|
112
|
+
}
|
|
113
|
+
})
|
|
114
|
+
})
|
|
115
|
+
})
|
|
116
|
+
|
|
117
|
+
describe('ADMIN-PERM-005: Admin Cannot Access Superadmin', () => {
|
|
118
|
+
it('should be redirected when trying to access /superadmin', () => {
|
|
119
|
+
allure.severity('high')
|
|
120
|
+
|
|
121
|
+
// 1. Attempt to visit Superadmin
|
|
122
|
+
cy.visit('/superadmin', { timeout: 60000, failOnStatusCode: false })
|
|
123
|
+
|
|
124
|
+
// 2. Should be redirected
|
|
125
|
+
sector7.assertAccessDenied()
|
|
126
|
+
|
|
127
|
+
cy.log('✅ Admin correctly blocked from Superadmin')
|
|
128
|
+
})
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
describe('ADMIN-PERM-006: Admin Cannot Access Dev Zone', () => {
|
|
132
|
+
it('should be redirected when trying to access /dev', () => {
|
|
133
|
+
allure.severity('high')
|
|
134
|
+
|
|
135
|
+
// 1. Attempt to visit Dev Zone
|
|
136
|
+
devArea.attemptToVisitDev()
|
|
137
|
+
|
|
138
|
+
// 2. Should be redirected
|
|
139
|
+
devArea.assertRedirectedToDashboard()
|
|
140
|
+
|
|
141
|
+
cy.log('✅ Admin correctly blocked from Dev Zone')
|
|
142
|
+
})
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
after(() => {
|
|
146
|
+
cy.log('✅ Admin team role tests completed')
|
|
147
|
+
})
|
|
148
|
+
})
|