@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,367 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Patterns in Pages - Functional E2E Tests
|
|
3
|
+
*
|
|
4
|
+
* Tests the integration of the patterns system with the page builder:
|
|
5
|
+
* - Patterns tab visibility and functionality
|
|
6
|
+
* - Pattern insertion into pages
|
|
7
|
+
* - Pattern reference rendering and interaction
|
|
8
|
+
* - Pattern nesting prevention (patterns tab hidden when editing patterns)
|
|
9
|
+
*
|
|
10
|
+
* Sample Patterns in DB (team-nextspark-001):
|
|
11
|
+
* - Newsletter CTA (slug: newsletter-cta, status: published)
|
|
12
|
+
* - Footer Links (slug: footer-links, status: published)
|
|
13
|
+
* - Hero Header (slug: hero-header, status: draft)
|
|
14
|
+
*
|
|
15
|
+
* Re-execution:
|
|
16
|
+
* pnpm tags @patterns # Run all patterns tests
|
|
17
|
+
* pnpm tags @TC_PAT_001 # Run specific test
|
|
18
|
+
* pnpm cy:run --spec "cypress/e2e/patterns/patterns-in-pages.cy.ts"
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { PageBuilderPOM } from '../../src/features/PageBuilderPOM'
|
|
22
|
+
import { loginAsDefaultDeveloper } from '../../src/session-helpers'
|
|
23
|
+
|
|
24
|
+
const DEVELOPER_TEAM_ID = 'team-nextspark-001'
|
|
25
|
+
|
|
26
|
+
describe('Patterns in Pages - Functional Tests', {
|
|
27
|
+
tags: ['@patterns', '@block-editor', '@functional']
|
|
28
|
+
}, () => {
|
|
29
|
+
const pom = PageBuilderPOM.create()
|
|
30
|
+
|
|
31
|
+
beforeEach(() => {
|
|
32
|
+
loginAsDefaultDeveloper()
|
|
33
|
+
cy.window().then((win) => {
|
|
34
|
+
win.localStorage.setItem('activeTeamId', DEVELOPER_TEAM_ID)
|
|
35
|
+
})
|
|
36
|
+
})
|
|
37
|
+
|
|
38
|
+
// ===========================================================================
|
|
39
|
+
// TC_PAT_001: Can switch to Patterns tab in block picker
|
|
40
|
+
// ===========================================================================
|
|
41
|
+
describe('TC_PAT_001: Switch to Patterns Tab', { tags: '@TC_PAT_001' }, () => {
|
|
42
|
+
it('should display patterns tab when editing pages', { tags: '@TC_PAT_001_01' }, () => {
|
|
43
|
+
pom.visitCreate()
|
|
44
|
+
pom.waitForEditor()
|
|
45
|
+
|
|
46
|
+
// Patterns tab should be visible
|
|
47
|
+
cy.get('[data-cy="block-picker-tab-patterns"]')
|
|
48
|
+
.should('exist')
|
|
49
|
+
.and('be.visible')
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it('should switch to patterns tab on click', { tags: '@TC_PAT_001_02' }, () => {
|
|
53
|
+
pom.visitCreate()
|
|
54
|
+
pom.waitForEditor()
|
|
55
|
+
|
|
56
|
+
// Click patterns tab
|
|
57
|
+
cy.get('[data-cy="block-picker-tab-patterns"]').click()
|
|
58
|
+
|
|
59
|
+
// Patterns search and list should appear
|
|
60
|
+
cy.get('[data-cy="block-picker-patterns-search"]').should('be.visible')
|
|
61
|
+
cy.get('[data-cy="block-picker-patterns-list"]').should('be.visible')
|
|
62
|
+
})
|
|
63
|
+
|
|
64
|
+
it('should switch back to blocks tab', { tags: '@TC_PAT_001_03' }, () => {
|
|
65
|
+
pom.visitCreate()
|
|
66
|
+
pom.waitForEditor()
|
|
67
|
+
|
|
68
|
+
// Switch to patterns
|
|
69
|
+
cy.get('[data-cy="block-picker-tab-patterns"]').click()
|
|
70
|
+
cy.get('[data-cy="block-picker-patterns-list"]').should('be.visible')
|
|
71
|
+
|
|
72
|
+
// Switch back to blocks
|
|
73
|
+
cy.get('[data-cy="block-picker-tab-blocks"]').click()
|
|
74
|
+
cy.get('[data-cy="block-picker-list"]').should('be.visible')
|
|
75
|
+
})
|
|
76
|
+
})
|
|
77
|
+
|
|
78
|
+
// ===========================================================================
|
|
79
|
+
// TC_PAT_002: Patterns tab shows sample patterns
|
|
80
|
+
// ===========================================================================
|
|
81
|
+
describe('TC_PAT_002: Display Sample Patterns', { tags: '@TC_PAT_002' }, () => {
|
|
82
|
+
beforeEach(() => {
|
|
83
|
+
pom.visitCreate()
|
|
84
|
+
pom.waitForEditor()
|
|
85
|
+
cy.get('[data-cy="block-picker-tab-patterns"]').click()
|
|
86
|
+
cy.wait(500) // Wait for patterns to load
|
|
87
|
+
})
|
|
88
|
+
|
|
89
|
+
it('should display at least one published pattern', { tags: '@TC_PAT_002_01' }, () => {
|
|
90
|
+
// Check that at least one pattern card exists
|
|
91
|
+
cy.get('[data-cy^="block-picker-pattern-card-"]')
|
|
92
|
+
.should('have.length.at.least', 1)
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
it('should display pattern card with all elements', { tags: '@TC_PAT_002_02' }, () => {
|
|
96
|
+
// Get first pattern card
|
|
97
|
+
cy.get('[data-cy^="block-picker-pattern-card-"]').first().within(() => {
|
|
98
|
+
// Check for icon, title, description, insert button
|
|
99
|
+
cy.get('[data-cy^="block-picker-pattern-icon-"]').should('exist')
|
|
100
|
+
cy.get('[data-cy^="block-picker-pattern-title-"]').should('exist').and('not.be.empty')
|
|
101
|
+
cy.get('[data-cy^="block-picker-pattern-desc-"]').should('exist')
|
|
102
|
+
cy.get('[data-cy^="block-picker-pattern-insert-"]').should('exist').and('be.visible')
|
|
103
|
+
})
|
|
104
|
+
})
|
|
105
|
+
|
|
106
|
+
it('should filter patterns using search', { tags: '@TC_PAT_002_03' }, () => {
|
|
107
|
+
// Get initial count
|
|
108
|
+
cy.get('[data-cy^="block-picker-pattern-card-"]').then(($cards) => {
|
|
109
|
+
const initialCount = $cards.length
|
|
110
|
+
|
|
111
|
+
// Type search term
|
|
112
|
+
cy.get('[data-cy="block-picker-patterns-search"]').type('Newsletter')
|
|
113
|
+
cy.wait(300)
|
|
114
|
+
|
|
115
|
+
// Pattern list should be filtered
|
|
116
|
+
cy.get('[data-cy^="block-picker-pattern-card-"]').then(($filtered) => {
|
|
117
|
+
// Should have fewer or equal patterns after filtering
|
|
118
|
+
expect($filtered.length).to.be.at.most(initialCount)
|
|
119
|
+
|
|
120
|
+
// If newsletter pattern exists, it should be visible
|
|
121
|
+
if ($filtered.length > 0) {
|
|
122
|
+
cy.get('[data-cy^="block-picker-pattern-title-"]')
|
|
123
|
+
.first()
|
|
124
|
+
.should('contain.text', 'Newsletter')
|
|
125
|
+
}
|
|
126
|
+
})
|
|
127
|
+
})
|
|
128
|
+
})
|
|
129
|
+
|
|
130
|
+
it('should clear search filter', { tags: '@TC_PAT_002_04' }, () => {
|
|
131
|
+
// Search for something
|
|
132
|
+
cy.get('[data-cy="block-picker-patterns-search"]').type('Footer')
|
|
133
|
+
cy.wait(300)
|
|
134
|
+
|
|
135
|
+
// Clear search
|
|
136
|
+
cy.get('[data-cy="block-picker-patterns-search"]').clear()
|
|
137
|
+
cy.wait(300)
|
|
138
|
+
|
|
139
|
+
// All published patterns should be visible again
|
|
140
|
+
cy.get('[data-cy^="block-picker-pattern-card-"]')
|
|
141
|
+
.should('have.length.at.least', 1)
|
|
142
|
+
})
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
// ===========================================================================
|
|
146
|
+
// TC_PAT_003: Can insert a pattern into a page
|
|
147
|
+
// ===========================================================================
|
|
148
|
+
describe('TC_PAT_003: Insert Pattern into Page', { tags: '@TC_PAT_003' }, () => {
|
|
149
|
+
it('should insert pattern when clicking insert button', { tags: '@TC_PAT_003_01' }, () => {
|
|
150
|
+
pom.visitCreate()
|
|
151
|
+
pom.waitForEditor()
|
|
152
|
+
pom.switchToLayoutMode()
|
|
153
|
+
|
|
154
|
+
// Switch to patterns tab
|
|
155
|
+
cy.get('[data-cy="block-picker-tab-patterns"]').click()
|
|
156
|
+
cy.wait(500)
|
|
157
|
+
|
|
158
|
+
// Click insert on first pattern
|
|
159
|
+
cy.get('[data-cy^="block-picker-pattern-insert-"]').first().click()
|
|
160
|
+
|
|
161
|
+
// Pattern reference should appear in layout canvas
|
|
162
|
+
cy.wait(1000)
|
|
163
|
+
cy.get('[data-cy^="sortable-block-"]').should('have.length.at.least', 1)
|
|
164
|
+
})
|
|
165
|
+
|
|
166
|
+
it('should show pattern reference in sortable blocks list', { tags: '@TC_PAT_003_02' }, () => {
|
|
167
|
+
pom.visitCreate()
|
|
168
|
+
pom.waitForEditor()
|
|
169
|
+
pom.switchToLayoutMode()
|
|
170
|
+
|
|
171
|
+
// Insert pattern
|
|
172
|
+
cy.get('[data-cy="block-picker-tab-patterns"]').click()
|
|
173
|
+
cy.wait(500)
|
|
174
|
+
cy.get('[data-cy^="block-picker-pattern-insert-"]').first().click()
|
|
175
|
+
cy.wait(1000)
|
|
176
|
+
|
|
177
|
+
// Should see pattern reference block in layout canvas
|
|
178
|
+
// Pattern reference should have a distinct appearance (badge, etc.)
|
|
179
|
+
cy.get(pom.editorSelectors.sortableBlockGeneric)
|
|
180
|
+
.should('have.length.at.least', 1)
|
|
181
|
+
})
|
|
182
|
+
|
|
183
|
+
it('should allow inserting multiple patterns', { tags: '@TC_PAT_003_03' }, () => {
|
|
184
|
+
pom.visitCreate()
|
|
185
|
+
pom.waitForEditor()
|
|
186
|
+
pom.switchToLayoutMode()
|
|
187
|
+
|
|
188
|
+
cy.get('[data-cy="block-picker-tab-patterns"]').click()
|
|
189
|
+
cy.wait(500)
|
|
190
|
+
|
|
191
|
+
// Get count of available patterns
|
|
192
|
+
cy.get('[data-cy^="block-picker-pattern-insert-"]').then(($buttons) => {
|
|
193
|
+
const patternCount = Math.min($buttons.length, 2) // Insert max 2 patterns
|
|
194
|
+
|
|
195
|
+
// Insert first pattern
|
|
196
|
+
cy.get('[data-cy^="block-picker-pattern-insert-"]').eq(0).click()
|
|
197
|
+
cy.wait(500)
|
|
198
|
+
|
|
199
|
+
if (patternCount > 1) {
|
|
200
|
+
// Insert second pattern if available
|
|
201
|
+
cy.get('[data-cy^="block-picker-pattern-insert-"]').eq(1).click()
|
|
202
|
+
cy.wait(500)
|
|
203
|
+
|
|
204
|
+
// Should have 2 blocks
|
|
205
|
+
cy.get(pom.editorSelectors.sortableBlockGeneric)
|
|
206
|
+
.should('have.length.at.least', 2)
|
|
207
|
+
}
|
|
208
|
+
})
|
|
209
|
+
})
|
|
210
|
+
})
|
|
211
|
+
|
|
212
|
+
// ===========================================================================
|
|
213
|
+
// TC_PAT_004: Pattern reference displays correctly in preview
|
|
214
|
+
// ===========================================================================
|
|
215
|
+
describe('TC_PAT_004: Pattern Reference in Preview', { tags: '@TC_PAT_004' }, () => {
|
|
216
|
+
beforeEach(() => {
|
|
217
|
+
pom.visitCreate()
|
|
218
|
+
pom.waitForEditor()
|
|
219
|
+
pom.switchToLayoutMode()
|
|
220
|
+
|
|
221
|
+
// Insert a pattern
|
|
222
|
+
cy.get('[data-cy="block-picker-tab-patterns"]').click()
|
|
223
|
+
cy.wait(500)
|
|
224
|
+
cy.get('[data-cy^="block-picker-pattern-insert-"]').first().click()
|
|
225
|
+
cy.wait(1000)
|
|
226
|
+
|
|
227
|
+
// Switch to preview mode
|
|
228
|
+
pom.switchToPreviewMode()
|
|
229
|
+
cy.wait(500)
|
|
230
|
+
})
|
|
231
|
+
|
|
232
|
+
it('should render pattern reference container in preview', { tags: '@TC_PAT_004_01' }, () => {
|
|
233
|
+
// Pattern reference should be visible
|
|
234
|
+
cy.get('[data-cy^="pattern-reference-"]')
|
|
235
|
+
.should('exist')
|
|
236
|
+
.and('be.visible')
|
|
237
|
+
})
|
|
238
|
+
|
|
239
|
+
it('should display pattern reference badge', { tags: '@TC_PAT_004_02' }, () => {
|
|
240
|
+
// Badge should indicate this is a pattern reference
|
|
241
|
+
cy.get('[data-cy^="pattern-reference-badge-"]')
|
|
242
|
+
.should('exist')
|
|
243
|
+
})
|
|
244
|
+
|
|
245
|
+
it('should show pattern reference edit link', { tags: '@TC_PAT_004_03' }, () => {
|
|
246
|
+
// Edit link should allow navigating to pattern editor
|
|
247
|
+
cy.get('[data-cy^="pattern-reference-edit-link-"]')
|
|
248
|
+
.should('exist')
|
|
249
|
+
.and('be.visible')
|
|
250
|
+
})
|
|
251
|
+
|
|
252
|
+
it('should show remove button for pattern reference', { tags: '@TC_PAT_004_04' }, () => {
|
|
253
|
+
cy.get('[data-cy^="pattern-reference-remove-"]')
|
|
254
|
+
.should('exist')
|
|
255
|
+
})
|
|
256
|
+
|
|
257
|
+
it('should show locked state when pattern reference is selected', { tags: '@TC_PAT_004_05' }, () => {
|
|
258
|
+
// Click on pattern reference
|
|
259
|
+
cy.get('[data-cy^="pattern-reference-"]').first().click()
|
|
260
|
+
cy.wait(500)
|
|
261
|
+
|
|
262
|
+
// Locked indicator should appear
|
|
263
|
+
cy.get('[data-cy^="pattern-reference-locked-"]')
|
|
264
|
+
.should('exist')
|
|
265
|
+
})
|
|
266
|
+
})
|
|
267
|
+
|
|
268
|
+
// ===========================================================================
|
|
269
|
+
// TC_PAT_005: Can remove pattern reference from page
|
|
270
|
+
// ===========================================================================
|
|
271
|
+
describe('TC_PAT_005: Remove Pattern Reference', { tags: '@TC_PAT_005' }, () => {
|
|
272
|
+
it('should remove pattern reference when clicking remove button', { tags: '@TC_PAT_005_01' }, () => {
|
|
273
|
+
pom.visitCreate()
|
|
274
|
+
pom.waitForEditor()
|
|
275
|
+
pom.switchToLayoutMode()
|
|
276
|
+
|
|
277
|
+
// Insert pattern
|
|
278
|
+
cy.get('[data-cy="block-picker-tab-patterns"]').click()
|
|
279
|
+
cy.wait(500)
|
|
280
|
+
cy.get('[data-cy^="block-picker-pattern-insert-"]').first().click()
|
|
281
|
+
cy.wait(1000)
|
|
282
|
+
|
|
283
|
+
// Get initial count
|
|
284
|
+
cy.get(pom.editorSelectors.sortableBlockGeneric).then(($blocks) => {
|
|
285
|
+
const initialCount = $blocks.length
|
|
286
|
+
|
|
287
|
+
// Switch to preview to access remove button
|
|
288
|
+
pom.switchToPreviewMode()
|
|
289
|
+
cy.wait(500)
|
|
290
|
+
|
|
291
|
+
// Click remove button
|
|
292
|
+
cy.get('[data-cy^="pattern-reference-remove-"]').first().click()
|
|
293
|
+
cy.wait(500)
|
|
294
|
+
|
|
295
|
+
// Switch back to layout mode to verify
|
|
296
|
+
pom.switchToLayoutMode()
|
|
297
|
+
cy.wait(500)
|
|
298
|
+
|
|
299
|
+
// Block count should decrease
|
|
300
|
+
cy.get(pom.editorSelectors.sortableBlockGeneric).should('have.length', initialCount - 1)
|
|
301
|
+
})
|
|
302
|
+
})
|
|
303
|
+
|
|
304
|
+
it('should remove pattern reference from layout mode', { tags: '@TC_PAT_005_02' }, () => {
|
|
305
|
+
pom.visitCreate()
|
|
306
|
+
pom.waitForEditor()
|
|
307
|
+
pom.switchToLayoutMode()
|
|
308
|
+
|
|
309
|
+
// Insert pattern
|
|
310
|
+
cy.get('[data-cy="block-picker-tab-patterns"]').click()
|
|
311
|
+
cy.wait(500)
|
|
312
|
+
cy.get('[data-cy^="block-picker-pattern-insert-"]').first().click()
|
|
313
|
+
cy.wait(1000)
|
|
314
|
+
|
|
315
|
+
// In layout mode, use standard block remove button
|
|
316
|
+
cy.get(pom.editorSelectors.sortableBlockGeneric).first()
|
|
317
|
+
.invoke('attr', 'data-cy')
|
|
318
|
+
.then((dataCy) => {
|
|
319
|
+
const blockId = dataCy?.replace('sortable-block-', '') || ''
|
|
320
|
+
cy.get(pom.editorSelectors.removeBlock(blockId)).click()
|
|
321
|
+
cy.wait(500)
|
|
322
|
+
|
|
323
|
+
// Block should be removed
|
|
324
|
+
cy.get(pom.editorSelectors.sortableBlockGeneric).should('have.length', 0)
|
|
325
|
+
})
|
|
326
|
+
})
|
|
327
|
+
})
|
|
328
|
+
|
|
329
|
+
// ===========================================================================
|
|
330
|
+
// TC_PAT_006: Patterns tab is NOT shown when editing patterns entity
|
|
331
|
+
// ===========================================================================
|
|
332
|
+
describe('TC_PAT_006: Prevent Pattern Nesting', { tags: '@TC_PAT_006' }, () => {
|
|
333
|
+
it('should NOT show patterns tab when editing a pattern', { tags: '@TC_PAT_006_01' }, () => {
|
|
334
|
+
// Visit the patterns entity create page
|
|
335
|
+
cy.visit('/dashboard/patterns/create')
|
|
336
|
+
cy.wait(1000)
|
|
337
|
+
|
|
338
|
+
// Wait for editor to load
|
|
339
|
+
cy.get(pom.editorSelectors.container, { timeout: 15000 }).should('be.visible')
|
|
340
|
+
|
|
341
|
+
// Patterns tab should NOT exist (to prevent nesting patterns inside patterns)
|
|
342
|
+
cy.get('[data-cy="block-picker-tab-patterns"]').should('not.exist')
|
|
343
|
+
})
|
|
344
|
+
|
|
345
|
+
it('should only show blocks and config tabs when editing patterns', { tags: '@TC_PAT_006_02' }, () => {
|
|
346
|
+
cy.visit('/dashboard/patterns/create')
|
|
347
|
+
cy.wait(1000)
|
|
348
|
+
cy.get(pom.editorSelectors.container, { timeout: 15000 }).should('be.visible')
|
|
349
|
+
|
|
350
|
+
// Only Blocks and Config tabs should be visible
|
|
351
|
+
cy.get('[data-cy="block-picker-tab-blocks"]').should('exist').and('be.visible')
|
|
352
|
+
cy.get('[data-cy="block-picker-tab-config"]').should('exist').and('be.visible')
|
|
353
|
+
cy.get('[data-cy="block-picker-tab-patterns"]').should('not.exist')
|
|
354
|
+
})
|
|
355
|
+
|
|
356
|
+
it('should show patterns tab when editing pages (control test)', { tags: '@TC_PAT_006_03' }, () => {
|
|
357
|
+
// Visit pages create (should show patterns tab)
|
|
358
|
+
pom.visitCreate()
|
|
359
|
+
pom.waitForEditor()
|
|
360
|
+
|
|
361
|
+
// All three tabs should be visible
|
|
362
|
+
cy.get('[data-cy="block-picker-tab-blocks"]').should('exist').and('be.visible')
|
|
363
|
+
cy.get('[data-cy="block-picker-tab-patterns"]').should('exist').and('be.visible')
|
|
364
|
+
cy.get('[data-cy="block-picker-tab-config"]').should('exist').and('be.visible')
|
|
365
|
+
})
|
|
366
|
+
})
|
|
367
|
+
})
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: Developer App Role Authentication
|
|
3
|
+
priority: critical
|
|
4
|
+
tags: [auth, app-role, developer, dev-zone, security]
|
|
5
|
+
grepTags: [uat, feat-auth, app-role, developer]
|
|
6
|
+
coverage: 6
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# Developer App Role Authentication
|
|
10
|
+
|
|
11
|
+
> Tests for Developer app role login and specific access privileges. Developer is a global app role (not team-based) that grants access to the Dev Zone and inherits Sector7 access.
|
|
12
|
+
|
|
13
|
+
## @test DEV-LOGIN-001: Developer Login and Dev Zone Access
|
|
14
|
+
|
|
15
|
+
### Metadata
|
|
16
|
+
- **Priority:** Critical
|
|
17
|
+
- **Type:** Smoke
|
|
18
|
+
- **Tags:** developer, login, dev-zone
|
|
19
|
+
- **Grep:** `@smoke`
|
|
20
|
+
|
|
21
|
+
```gherkin:en
|
|
22
|
+
Scenario: Developer can login and access Dev Zone
|
|
23
|
+
|
|
24
|
+
Given I am logged in as Developer (developer@nextspark.dev)
|
|
25
|
+
When I visit /dev
|
|
26
|
+
Then the URL should include /dev
|
|
27
|
+
And the Dev Zone home page should be visible
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
```gherkin:es
|
|
31
|
+
Scenario: Developer puede loguearse y acceder a Dev Zone
|
|
32
|
+
|
|
33
|
+
Given estoy logueado como Developer (developer@nextspark.dev)
|
|
34
|
+
When visito /dev
|
|
35
|
+
Then la URL deberia incluir /dev
|
|
36
|
+
And la pagina principal de Dev Zone deberia estar visible
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
### Expected Results
|
|
40
|
+
- Developer successfully logs in
|
|
41
|
+
- Access to /dev is granted
|
|
42
|
+
- Dev Zone home page renders correctly
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
|
|
46
|
+
## @test DEV-LOGIN-002: Developer Access to Style Gallery
|
|
47
|
+
|
|
48
|
+
### Metadata
|
|
49
|
+
- **Priority:** Normal
|
|
50
|
+
- **Type:** Smoke
|
|
51
|
+
- **Tags:** developer, style-gallery
|
|
52
|
+
- **Grep:** `@smoke`
|
|
53
|
+
|
|
54
|
+
```gherkin:en
|
|
55
|
+
Scenario: Developer can access Style Gallery
|
|
56
|
+
|
|
57
|
+
Given I am logged in as Developer (developer@nextspark.dev)
|
|
58
|
+
When I visit /dev/style
|
|
59
|
+
Then the URL should include /dev/style
|
|
60
|
+
And the Style Gallery page should be visible
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
```gherkin:es
|
|
64
|
+
Scenario: Developer puede acceder a Style Gallery
|
|
65
|
+
|
|
66
|
+
Given estoy logueado como Developer (developer@nextspark.dev)
|
|
67
|
+
When visito /dev/style
|
|
68
|
+
Then la URL deberia incluir /dev/style
|
|
69
|
+
And la pagina de Style Gallery deberia estar visible
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
### Expected Results
|
|
73
|
+
- Style Gallery page loads successfully
|
|
74
|
+
- All component sections available
|
|
75
|
+
|
|
76
|
+
---
|
|
77
|
+
|
|
78
|
+
## @test DEV-LOGIN-003: Developer Access to Test Cases
|
|
79
|
+
|
|
80
|
+
### Metadata
|
|
81
|
+
- **Priority:** Normal
|
|
82
|
+
- **Type:** Smoke
|
|
83
|
+
- **Tags:** developer, test-cases
|
|
84
|
+
- **Grep:** `@smoke`
|
|
85
|
+
|
|
86
|
+
```gherkin:en
|
|
87
|
+
Scenario: Developer can access Test Cases viewer
|
|
88
|
+
|
|
89
|
+
Given I am logged in as Developer (developer@nextspark.dev)
|
|
90
|
+
When I visit /dev/tests
|
|
91
|
+
Then the URL should include /dev/tests
|
|
92
|
+
And the Test Cases viewer should be visible
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
```gherkin:es
|
|
96
|
+
Scenario: Developer puede acceder al visor de Test Cases
|
|
97
|
+
|
|
98
|
+
Given estoy logueado como Developer (developer@nextspark.dev)
|
|
99
|
+
When visito /dev/tests
|
|
100
|
+
Then la URL deberia incluir /dev/tests
|
|
101
|
+
And el visor de Test Cases deberia estar visible
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Expected Results
|
|
105
|
+
- Test Cases viewer loads successfully
|
|
106
|
+
- File tree or empty state visible
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
110
|
+
## @test DEV-LOGIN-004: Developer Access to Config Viewer
|
|
111
|
+
|
|
112
|
+
### Metadata
|
|
113
|
+
- **Priority:** Normal
|
|
114
|
+
- **Type:** Smoke
|
|
115
|
+
- **Tags:** developer, config-viewer
|
|
116
|
+
- **Grep:** `@smoke`
|
|
117
|
+
|
|
118
|
+
```gherkin:en
|
|
119
|
+
Scenario: Developer can access Config Viewer
|
|
120
|
+
|
|
121
|
+
Given I am logged in as Developer (developer@nextspark.dev)
|
|
122
|
+
When I visit /dev/config
|
|
123
|
+
Then the URL should include /dev/config
|
|
124
|
+
And the Config Viewer page should be visible
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
```gherkin:es
|
|
128
|
+
Scenario: Developer puede acceder a Config Viewer
|
|
129
|
+
|
|
130
|
+
Given estoy logueado como Developer (developer@nextspark.dev)
|
|
131
|
+
When visito /dev/config
|
|
132
|
+
Then la URL deberia incluir /dev/config
|
|
133
|
+
And la pagina de Config Viewer deberia estar visible
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Expected Results
|
|
137
|
+
- Config Viewer loads successfully
|
|
138
|
+
- Theme and Entities tabs available
|
|
139
|
+
|
|
140
|
+
---
|
|
141
|
+
|
|
142
|
+
## @test DEV-LOGIN-005: Developer Inherited Sector7 Access
|
|
143
|
+
|
|
144
|
+
### Metadata
|
|
145
|
+
- **Priority:** High
|
|
146
|
+
- **Type:** Regression
|
|
147
|
+
- **Tags:** developer, sector7, inherited
|
|
148
|
+
|
|
149
|
+
```gherkin:en
|
|
150
|
+
Scenario: Developer can access Sector7 (inherited privilege)
|
|
151
|
+
|
|
152
|
+
Given I am logged in as Developer (developer@nextspark.dev)
|
|
153
|
+
When I visit /sector7
|
|
154
|
+
Then the URL should include /sector7
|
|
155
|
+
And the Sector7 container should be visible
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
```gherkin:es
|
|
159
|
+
Scenario: Developer puede acceder a Sector7 (privilegio heredado)
|
|
160
|
+
|
|
161
|
+
Given estoy logueado como Developer (developer@nextspark.dev)
|
|
162
|
+
When visito /sector7
|
|
163
|
+
Then la URL deberia incluir /sector7
|
|
164
|
+
And el contenedor de Sector7 deberia estar visible
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Expected Results
|
|
168
|
+
- Developer inherits superadmin privileges for Sector7
|
|
169
|
+
- Sector7 control panel accessible
|
|
170
|
+
- No access denied redirect
|
|
171
|
+
|
|
172
|
+
---
|
|
173
|
+
|
|
174
|
+
## @test DEV-LOGIN-006: Developer Logout Flow
|
|
175
|
+
|
|
176
|
+
### Metadata
|
|
177
|
+
- **Priority:** Normal
|
|
178
|
+
- **Type:** Regression
|
|
179
|
+
- **Tags:** developer, logout
|
|
180
|
+
|
|
181
|
+
```gherkin:en
|
|
182
|
+
Scenario: Developer can logout successfully
|
|
183
|
+
|
|
184
|
+
Given I am logged in as Developer (developer@nextspark.dev)
|
|
185
|
+
And I am on the dashboard
|
|
186
|
+
When I click on user menu
|
|
187
|
+
And I click on Sign Out
|
|
188
|
+
Then I should be redirected to /login
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
```gherkin:es
|
|
192
|
+
Scenario: Developer puede cerrar sesion correctamente
|
|
193
|
+
|
|
194
|
+
Given estoy logueado como Developer (developer@nextspark.dev)
|
|
195
|
+
And estoy en el dashboard
|
|
196
|
+
When hago click en el menu de usuario
|
|
197
|
+
And hago click en Sign Out
|
|
198
|
+
Then deberia ser redirigido a /login
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### Expected Results
|
|
202
|
+
- User menu opens correctly
|
|
203
|
+
- Sign out action works
|
|
204
|
+
- Redirect to login page
|
|
205
|
+
|
|
206
|
+
---
|
|
207
|
+
|
|
208
|
+
## UI Elements
|
|
209
|
+
|
|
210
|
+
| Element | Selector | Description |
|
|
211
|
+
|---------|----------|-------------|
|
|
212
|
+
| Dev Home Page | `[data-cy="dev-home-page"]` | Dev Zone home page container |
|
|
213
|
+
| Dev Style Page | `[data-cy="dev-style-page"]` | Style Gallery page container |
|
|
214
|
+
| Dev Tests Page | `[data-cy="dev-tests-page"]` | Test Cases viewer container |
|
|
215
|
+
| Dev Config Page | `[data-cy="dev-config-page"]` | Config Viewer page container |
|
|
216
|
+
| Sector7 Container | `[data-cy="sector7-container"]` | Sector7 main container |
|
|
217
|
+
| User Menu Trigger | `[data-cy="topnav-user-menu-trigger"]` | User menu dropdown trigger |
|
|
218
|
+
| Sign Out Button | `[data-cy="topnav-menu-signOut"]` | Sign out menu item |
|
|
219
|
+
|
|
220
|
+
---
|
|
221
|
+
|
|
222
|
+
## Summary
|
|
223
|
+
|
|
224
|
+
| Test ID | Block | Description | Tags |
|
|
225
|
+
|---------|-------|-------------|------|
|
|
226
|
+
| DEV-LOGIN-001 | Login | Developer login + Dev Zone access | `@smoke` |
|
|
227
|
+
| DEV-LOGIN-002 | Access | Style Gallery access | `@smoke` |
|
|
228
|
+
| DEV-LOGIN-003 | Access | Test Cases viewer access | `@smoke` |
|
|
229
|
+
| DEV-LOGIN-004 | Access | Config Viewer access | `@smoke` |
|
|
230
|
+
| DEV-LOGIN-005 | Inherited | Sector7 access (inherited) | |
|
|
231
|
+
| DEV-LOGIN-006 | Logout | Developer logout flow | |
|