@nextsparkjs/theme-default 0.1.0-beta.20 → 0.1.0-beta.21
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/package.json +1 -1
- package/tests/cypress/e2e/_devtools/access.bdd.md +262 -0
- package/tests/cypress/e2e/_devtools/access.cy.ts +171 -0
- package/tests/cypress/e2e/_devtools/navigation.bdd.md +261 -0
- package/tests/cypress/e2e/_devtools/navigation.cy.ts +157 -0
- package/tests/cypress/e2e/_devtools/pages.bdd.md +303 -0
- package/tests/cypress/e2e/_devtools/pages.cy.ts +184 -0
- package/tests/cypress/e2e/_docs/README.md +215 -0
- package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin-teams.narration.json +155 -0
- package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin.cy.ts +390 -0
- package/tests/cypress/e2e/_docs/tutorials/teams-system.doc.cy.ts +349 -0
- package/tests/cypress/e2e/_docs/tutorials/teams-system.narration.json +165 -0
- package/tests/cypress/e2e/_selectors/auth.cy.ts +306 -0
- package/tests/cypress/e2e/_selectors/billing.cy.ts +89 -0
- package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +113 -0
- package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +89 -0
- package/tests/cypress/e2e/_selectors/dashboard-sidebar.cy.ts +60 -0
- package/tests/cypress/e2e/_selectors/dashboard-topnav.cy.ts +146 -0
- package/tests/cypress/e2e/_selectors/devtools.cy.ts +210 -0
- package/tests/cypress/e2e/_selectors/global-search.cy.ts +88 -0
- package/tests/cypress/e2e/_selectors/pages-editor.cy.ts +179 -0
- package/tests/cypress/e2e/_selectors/posts-editor.cy.ts +282 -0
- package/tests/cypress/e2e/_selectors/public.cy.ts +112 -0
- package/tests/cypress/e2e/_selectors/settings-api-keys.cy.ts +228 -0
- package/tests/cypress/e2e/_selectors/settings-billing.cy.ts +105 -0
- package/tests/cypress/e2e/_selectors/settings-layout.cy.ts +119 -0
- package/tests/cypress/e2e/_selectors/settings-password.cy.ts +71 -0
- package/tests/cypress/e2e/_selectors/settings-profile.cy.ts +82 -0
- package/tests/cypress/e2e/_selectors/settings-teams.cy.ts +68 -0
- package/tests/cypress/e2e/_selectors/superadmin.cy.ts +185 -0
- package/tests/cypress/e2e/_selectors/tasks.cy.ts +242 -0
- package/tests/cypress/e2e/_selectors/taxonomies.cy.ts +126 -0
- package/tests/cypress/e2e/_selectors/teams.cy.ts +142 -0
- package/tests/cypress/e2e/_superadmin/all-teams.bdd.md +261 -0
- package/tests/cypress/e2e/_superadmin/all-teams.cy.ts +177 -0
- package/tests/cypress/e2e/_superadmin/all-users.bdd.md +406 -0
- package/tests/cypress/e2e/_superadmin/all-users.cy.ts +294 -0
- package/tests/cypress/e2e/_superadmin/dashboard.bdd.md +235 -0
- package/tests/cypress/e2e/_superadmin/dashboard.cy.ts +149 -0
- package/tests/cypress/e2e/_superadmin/subscriptions-overview.bdd.md +290 -0
- package/tests/cypress/e2e/_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 +107 -0
- package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
- package/tests/cypress/e2e/api/billing/BillingAPIController.js +319 -0
- package/tests/cypress/e2e/api/billing/check-action.cy.ts +326 -0
- package/tests/cypress/e2e/api/billing/checkout.cy.ts +358 -0
- package/tests/cypress/e2e/api/billing/lifecycle.cy.ts +423 -0
- package/tests/cypress/e2e/api/billing/plans/README.md +345 -0
- package/tests/cypress/e2e/api/billing/plans/business.cy.ts +412 -0
- package/tests/cypress/e2e/api/billing/plans/downgrade.cy.ts +510 -0
- package/tests/cypress/e2e/api/billing/plans/fixtures/billing-plans.json +163 -0
- package/tests/cypress/e2e/api/billing/plans/free.cy.ts +500 -0
- package/tests/cypress/e2e/api/billing/plans/pro.cy.ts +497 -0
- package/tests/cypress/e2e/api/billing/plans/starter.cy.ts +342 -0
- package/tests/cypress/e2e/api/billing/portal.cy.ts +313 -0
- package/tests/cypress/e2e/api/devtools/registries.bdd.md +300 -0
- package/tests/cypress/e2e/api/devtools/registries.cy.ts +368 -0
- package/tests/cypress/e2e/api/entities/blocks-scope.cy.ts +396 -0
- package/tests/cypress/e2e/api/entities/customers-crud.cy.ts +648 -0
- package/tests/cypress/e2e/api/entities/customers-metas.cy.ts +839 -0
- package/tests/cypress/e2e/api/entities/pages-crud.cy.ts +425 -0
- package/tests/cypress/e2e/api/entities/pages-status.cy.ts +335 -0
- package/tests/cypress/e2e/api/entities/post-categories-crud.cy.ts +610 -0
- package/tests/cypress/e2e/api/entities/posts-crud.cy.ts +709 -0
- package/tests/cypress/e2e/api/entities/posts-status.cy.ts +396 -0
- package/tests/cypress/e2e/api/entities/tasks-crud.cy.ts +602 -0
- package/tests/cypress/e2e/api/entities/tasks-metas.cy.ts +878 -0
- package/tests/cypress/e2e/api/entities/users-crud.cy.ts +469 -0
- package/tests/cypress/e2e/api/entities/users-metas.cy.ts +913 -0
- package/tests/cypress/e2e/api/entities/users-security.cy.ts +375 -0
- package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.bdd.md +375 -0
- package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.cy.ts +346 -0
- package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.bdd.md +451 -0
- package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.cy.ts +447 -0
- package/tests/cypress/e2e/api/scheduled-actions/scheduling.bdd.md +649 -0
- package/tests/cypress/e2e/api/scheduled-actions/scheduling.cy.ts +333 -0
- package/tests/cypress/e2e/api/settings/api-keys.crud.cy.ts +923 -0
- package/tests/cypress/e2e/uat/auth/app-roles/developer-login.bdd.md +231 -0
- package/tests/cypress/e2e/uat/auth/app-roles/developer-login.cy.ts +144 -0
- package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.bdd.md +118 -0
- package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.cy.ts +84 -0
- package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.bdd.md +288 -0
- package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.cy.ts +188 -0
- package/tests/cypress/e2e/uat/auth/login-logout.bdd.md +160 -0
- package/tests/cypress/e2e/uat/auth/login-logout.cy.ts +116 -0
- package/tests/cypress/e2e/uat/auth/password-reset.bdd.md +289 -0
- package/tests/cypress/e2e/uat/auth/password-reset.cy.ts +200 -0
- package/tests/cypress/e2e/uat/auth/team-roles/admin-login.bdd.md +225 -0
- package/tests/cypress/e2e/uat/auth/team-roles/admin-login.cy.ts +148 -0
- package/tests/cypress/e2e/uat/auth/team-roles/member-login.bdd.md +251 -0
- package/tests/cypress/e2e/uat/auth/team-roles/member-login.cy.ts +163 -0
- package/tests/cypress/e2e/uat/auth/team-roles/owner-login.bdd.md +231 -0
- package/tests/cypress/e2e/uat/auth/team-roles/owner-login.cy.ts +141 -0
- package/tests/cypress/e2e/uat/billing/extended.bdd.md +273 -0
- package/tests/cypress/e2e/uat/billing/extended.cy.ts +209 -0
- package/tests/cypress/e2e/uat/billing/feature-gates.bdd.md +407 -0
- package/tests/cypress/e2e/uat/billing/feature-gates.cy.ts +307 -0
- package/tests/cypress/e2e/uat/billing/page.bdd.md +329 -0
- package/tests/cypress/e2e/uat/billing/page.cy.ts +250 -0
- package/tests/cypress/e2e/uat/billing/status.bdd.md +190 -0
- package/tests/cypress/e2e/uat/billing/status.cy.ts +145 -0
- package/tests/cypress/e2e/uat/billing/team-switch.bdd.md +156 -0
- package/tests/cypress/e2e/uat/billing/team-switch.cy.ts +122 -0
- package/tests/cypress/e2e/uat/billing/usage.bdd.md +218 -0
- package/tests/cypress/e2e/uat/billing/usage.cy.ts +176 -0
- package/tests/cypress/e2e/uat/blocks/hero.bdd.md +124 -0
- package/tests/cypress/e2e/uat/blocks/hero.cy.ts +56 -0
- package/tests/cypress/e2e/uat/devtools/api-tester.cy.ts +390 -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/roles/editor-role.bdd.md +552 -0
- package/tests/cypress/e2e/uat/roles/editor-role.cy.ts +210 -0
- package/tests/cypress/e2e/uat/roles/member-restrictions.bdd.md +450 -0
- package/tests/cypress/e2e/uat/roles/member-restrictions.cy.ts +189 -0
- package/tests/cypress/e2e/uat/roles/owner-full-crud.bdd.md +530 -0
- package/tests/cypress/e2e/uat/roles/owner-full-crud.cy.ts +247 -0
- package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.bdd.md +736 -0
- package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.cy.ts +740 -0
- package/tests/cypress/e2e/uat/teams/roles-matrix.bdd.md +553 -0
- package/tests/cypress/e2e/uat/teams/roles-matrix.cy.ts +185 -0
- package/tests/cypress/e2e/uat/teams/switcher.bdd.md +1151 -0
- package/tests/cypress/e2e/uat/teams/switcher.cy.ts +497 -0
- package/tests/cypress/e2e/uat/teams/team-switcher.md +198 -0
- package/tests/cypress/fixtures/blocks.json +218 -0
- package/tests/cypress/fixtures/entities.json +78 -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/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 +86 -0
- package/tests/cypress/src/core/BlockEditorBasePOM.ts +576 -0
- package/tests/cypress/src/core/DashboardEntityPOM.ts +692 -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/PostsPOM.ts +137 -0
- package/tests/cypress/src/entities/TasksPOM.ts +176 -0
- package/tests/cypress/src/entities/index.ts +14 -0
- package/tests/cypress/src/features/BillingPOM.ts +385 -0
- package/tests/cypress/src/features/DashboardPOM.ts +245 -0
- package/tests/cypress/src/features/DevtoolsPOM.ts +739 -0
- package/tests/cypress/src/features/PageBuilderPOM.ts +263 -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 +362 -0
- package/tests/cypress/src/features/SuperadminPOM.ts +331 -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 +177 -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 +500 -0
- package/tests/cypress/support/doc-commands.ts +260 -0
- package/tests/cypress.config.ts +150 -0
- package/tests/jest/components/post-header.test.tsx +377 -0
- package/tests/jest/config/role-config.test.ts +529 -0
- package/tests/jest/jest.config.ts +81 -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 +367 -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/user-roles/role-helpers.test.ts +432 -0
- package/tests/jest/validation/categories.test.ts +429 -0
- package/tests/jest/validation/posts.test.ts +546 -0
- package/tests/tsconfig.json +15 -0
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
---
|
|
2
|
+
feature: DevTools Registries API
|
|
3
|
+
priority: high
|
|
4
|
+
tags: [api, feat-devtools, security, regression]
|
|
5
|
+
grepTags: ["@api", "@feat-devtools"]
|
|
6
|
+
coverage: 16 tests
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
# DevTools Registries API
|
|
10
|
+
|
|
11
|
+
> API tests for the DevTools registry endpoints that provide access to features, flows, blocks, and testing registries. These endpoints require superadmin or developer user role for access.
|
|
12
|
+
|
|
13
|
+
## Endpoints Covered
|
|
14
|
+
|
|
15
|
+
| Endpoint | Method | Description |
|
|
16
|
+
|----------|--------|-------------|
|
|
17
|
+
| `/api/v1/devtools/features` | GET | Feature registry with test coverage |
|
|
18
|
+
| `/api/v1/devtools/flows` | GET | Flow registry (user journeys) |
|
|
19
|
+
| `/api/v1/devtools/blocks` | GET | Block registry with field definitions |
|
|
20
|
+
| `/api/v1/devtools/testing` | GET | Complete tags registry |
|
|
21
|
+
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## @test DEVTOOLS_API_001: Features Registry Access
|
|
25
|
+
|
|
26
|
+
### Metadata
|
|
27
|
+
- **Priority:** Critical
|
|
28
|
+
- **Type:** Smoke
|
|
29
|
+
- **Tags:** api, devtools, features, authentication
|
|
30
|
+
- **Grep:** `@smoke @feat-devtools`
|
|
31
|
+
|
|
32
|
+
```gherkin:en
|
|
33
|
+
Scenario: Superadmin can access features registry
|
|
34
|
+
|
|
35
|
+
Given I have a valid superadmin API key
|
|
36
|
+
When I make a GET request to /api/v1/devtools/features
|
|
37
|
+
Then the response status should be 200
|
|
38
|
+
And the response body should have success true
|
|
39
|
+
And the data should contain features array
|
|
40
|
+
And the data should contain summary with total, withTests, withoutTests
|
|
41
|
+
And the data should contain meta with theme and generatedAt
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
```gherkin:es
|
|
45
|
+
Scenario: Superadmin puede acceder al registro de features
|
|
46
|
+
|
|
47
|
+
Given tengo una API key de superadmin válida
|
|
48
|
+
When hago una solicitud GET a /api/v1/devtools/features
|
|
49
|
+
Then el status de respuesta debería ser 200
|
|
50
|
+
And el body debería tener success true
|
|
51
|
+
And los datos deberían contener un array de features
|
|
52
|
+
And los datos deberían contener summary con total, withTests, withoutTests
|
|
53
|
+
And los datos deberían contener meta con theme y generatedAt
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### Expected Results
|
|
57
|
+
- Status: 200 OK
|
|
58
|
+
- Response contains features array
|
|
59
|
+
- Summary includes coverage statistics
|
|
60
|
+
- Meta includes theme and generation timestamp
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## @test DEVTOOLS_API_002: Authentication Required (Features)
|
|
65
|
+
|
|
66
|
+
### Metadata
|
|
67
|
+
- **Priority:** Critical
|
|
68
|
+
- **Type:** Security
|
|
69
|
+
- **Tags:** api, devtools, authentication, 401
|
|
70
|
+
|
|
71
|
+
```gherkin:en
|
|
72
|
+
Scenario: Request without API key returns 401
|
|
73
|
+
|
|
74
|
+
Given I make a request without authentication
|
|
75
|
+
When I make a GET request to /api/v1/devtools/features
|
|
76
|
+
Then the response status should be 401
|
|
77
|
+
And the response body should have success false
|
|
78
|
+
And the error code should be AUTHENTICATION_REQUIRED
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
```gherkin:es
|
|
82
|
+
Scenario: Solicitud sin API key retorna 401
|
|
83
|
+
|
|
84
|
+
Given hago una solicitud sin autenticación
|
|
85
|
+
When hago una solicitud GET a /api/v1/devtools/features
|
|
86
|
+
Then el status de respuesta debería ser 401
|
|
87
|
+
And el body debería tener success false
|
|
88
|
+
And el código de error debería ser AUTHENTICATION_REQUIRED
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
|
|
93
|
+
## @test DEVTOOLS_API_003: Invalid API Key (Features)
|
|
94
|
+
|
|
95
|
+
### Metadata
|
|
96
|
+
- **Priority:** Critical
|
|
97
|
+
- **Type:** Security
|
|
98
|
+
- **Tags:** api, devtools, authentication, invalid-key
|
|
99
|
+
|
|
100
|
+
```gherkin:en
|
|
101
|
+
Scenario: Invalid API key returns 401
|
|
102
|
+
|
|
103
|
+
Given I have an invalid API key
|
|
104
|
+
When I make a GET request to /api/v1/devtools/features
|
|
105
|
+
Then the response status should be 401
|
|
106
|
+
And the response body should have success false
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
```gherkin:es
|
|
110
|
+
Scenario: API key inválida retorna 401
|
|
111
|
+
|
|
112
|
+
Given tengo una API key inválida
|
|
113
|
+
When hago una solicitud GET a /api/v1/devtools/features
|
|
114
|
+
Then el status de respuesta debería ser 401
|
|
115
|
+
And el body debería tener success false
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
---
|
|
119
|
+
|
|
120
|
+
## @test DEVTOOLS_API_004: Flows Registry Access
|
|
121
|
+
|
|
122
|
+
### Metadata
|
|
123
|
+
- **Priority:** Critical
|
|
124
|
+
- **Type:** Smoke
|
|
125
|
+
- **Tags:** api, devtools, flows
|
|
126
|
+
|
|
127
|
+
```gherkin:en
|
|
128
|
+
Scenario: Superadmin can access flows registry
|
|
129
|
+
|
|
130
|
+
Given I have a valid superadmin API key
|
|
131
|
+
When I make a GET request to /api/v1/devtools/flows
|
|
132
|
+
Then the response status should be 200
|
|
133
|
+
And the data should contain flows array
|
|
134
|
+
And the data should contain summary with total, withTests, withoutTests
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
```gherkin:es
|
|
138
|
+
Scenario: Superadmin puede acceder al registro de flows
|
|
139
|
+
|
|
140
|
+
Given tengo una API key de superadmin válida
|
|
141
|
+
When hago una solicitud GET a /api/v1/devtools/flows
|
|
142
|
+
Then el status de respuesta debería ser 200
|
|
143
|
+
And los datos deberían contener un array de flows
|
|
144
|
+
And los datos deberían contener summary con total, withTests, withoutTests
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## @test DEVTOOLS_API_007: Blocks Registry Access
|
|
150
|
+
|
|
151
|
+
### Metadata
|
|
152
|
+
- **Priority:** Critical
|
|
153
|
+
- **Type:** Smoke
|
|
154
|
+
- **Tags:** api, devtools, blocks
|
|
155
|
+
|
|
156
|
+
```gherkin:en
|
|
157
|
+
Scenario: Superadmin can access blocks registry
|
|
158
|
+
|
|
159
|
+
Given I have a valid superadmin API key
|
|
160
|
+
When I make a GET request to /api/v1/devtools/blocks
|
|
161
|
+
Then the response status should be 200
|
|
162
|
+
And the data should contain blocks array
|
|
163
|
+
And each block should have slug, name, category, and testing properties
|
|
164
|
+
And the summary should contain categories array
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
```gherkin:es
|
|
168
|
+
Scenario: Superadmin puede acceder al registro de blocks
|
|
169
|
+
|
|
170
|
+
Given tengo una API key de superadmin válida
|
|
171
|
+
When hago una solicitud GET a /api/v1/devtools/blocks
|
|
172
|
+
Then el status de respuesta debería ser 200
|
|
173
|
+
And los datos deberían contener un array de blocks
|
|
174
|
+
And cada block debería tener propiedades slug, name, category y testing
|
|
175
|
+
And el summary debería contener un array de categories
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
---
|
|
179
|
+
|
|
180
|
+
## @test DEVTOOLS_API_010: Testing Registry Access
|
|
181
|
+
|
|
182
|
+
### Metadata
|
|
183
|
+
- **Priority:** Critical
|
|
184
|
+
- **Type:** Smoke
|
|
185
|
+
- **Tags:** api, devtools, testing, tags
|
|
186
|
+
|
|
187
|
+
```gherkin:en
|
|
188
|
+
Scenario: Superadmin can access testing/tags registry
|
|
189
|
+
|
|
190
|
+
Given I have a valid superadmin API key
|
|
191
|
+
When I make a GET request to /api/v1/devtools/testing
|
|
192
|
+
Then the response status should be 200
|
|
193
|
+
And the data should contain tags object
|
|
194
|
+
And the summary should contain totalTags and testFiles
|
|
195
|
+
And the summary should contain byCategory object
|
|
196
|
+
And the summary should contain features and flows statistics
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
```gherkin:es
|
|
200
|
+
Scenario: Superadmin puede acceder al registro de testing/tags
|
|
201
|
+
|
|
202
|
+
Given tengo una API key de superadmin válida
|
|
203
|
+
When hago una solicitud GET a /api/v1/devtools/testing
|
|
204
|
+
Then el status de respuesta debería ser 200
|
|
205
|
+
And los datos deberían contener un objeto tags
|
|
206
|
+
And el summary debería contener totalTags y testFiles
|
|
207
|
+
And el summary debería contener objeto byCategory
|
|
208
|
+
And el summary debería contener estadísticas de features y flows
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
---
|
|
212
|
+
|
|
213
|
+
## Response Format
|
|
214
|
+
|
|
215
|
+
### Success Response (200)
|
|
216
|
+
|
|
217
|
+
```json
|
|
218
|
+
{
|
|
219
|
+
"success": true,
|
|
220
|
+
"data": {
|
|
221
|
+
"features|flows|blocks|tags": [...],
|
|
222
|
+
"summary": {
|
|
223
|
+
"total": 0,
|
|
224
|
+
"withTests": 0,
|
|
225
|
+
"withoutTests": 0
|
|
226
|
+
},
|
|
227
|
+
"meta": {
|
|
228
|
+
"theme": "default",
|
|
229
|
+
"generatedAt": "2025-12-29T00:00:00.000Z"
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
### Error Response (401)
|
|
236
|
+
|
|
237
|
+
```json
|
|
238
|
+
{
|
|
239
|
+
"success": false,
|
|
240
|
+
"error": {
|
|
241
|
+
"message": "Authentication required",
|
|
242
|
+
"code": "AUTHENTICATION_REQUIRED",
|
|
243
|
+
"details": {
|
|
244
|
+
"hint": "Provide a valid API key via Authorization header or x-api-key header"
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
}
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
### Error Response (403) - Member Role
|
|
251
|
+
|
|
252
|
+
```json
|
|
253
|
+
{
|
|
254
|
+
"success": false,
|
|
255
|
+
"error": {
|
|
256
|
+
"message": "Access denied: DevTools APIs require superadmin or developer role",
|
|
257
|
+
"code": "DEVTOOLS_ACCESS_DENIED",
|
|
258
|
+
"details": {
|
|
259
|
+
"requiredRoles": ["superadmin", "developer"],
|
|
260
|
+
"hint": "User role \"member\" cannot access DevTools APIs regardless of team role"
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
```
|
|
265
|
+
|
|
266
|
+
---
|
|
267
|
+
|
|
268
|
+
## Test Summary
|
|
269
|
+
|
|
270
|
+
| Test ID | Endpoint | Description | Tags |
|
|
271
|
+
|---------|----------|-------------|------|
|
|
272
|
+
| DEVTOOLS_API_001 | /features | Success with superadmin key | `@smoke` |
|
|
273
|
+
| DEVTOOLS_API_002 | /features | 401 without auth | |
|
|
274
|
+
| DEVTOOLS_API_003 | /features | 401 with invalid key | |
|
|
275
|
+
| DEVTOOLS_API_004 | /flows | Success with superadmin key | `@smoke` |
|
|
276
|
+
| DEVTOOLS_API_005 | /flows | 401 without auth | |
|
|
277
|
+
| DEVTOOLS_API_006 | /flows | 401 with invalid key | |
|
|
278
|
+
| DEVTOOLS_API_007 | /blocks | Success with superadmin key | `@smoke` |
|
|
279
|
+
| DEVTOOLS_API_008 | /blocks | 401 without auth | |
|
|
280
|
+
| DEVTOOLS_API_009 | /blocks | 401 with invalid key | |
|
|
281
|
+
| DEVTOOLS_API_010 | /testing | Success with superadmin key | `@smoke` |
|
|
282
|
+
| DEVTOOLS_API_011 | /testing | 401 without auth | |
|
|
283
|
+
| DEVTOOLS_API_012 | /testing | 401 with invalid key | |
|
|
284
|
+
| - | All | Response format consistency | |
|
|
285
|
+
|
|
286
|
+
---
|
|
287
|
+
|
|
288
|
+
## Environment Variables Required
|
|
289
|
+
|
|
290
|
+
| Variable | Description |
|
|
291
|
+
|----------|-------------|
|
|
292
|
+
| `SUPERADMIN_API_KEY` | API key for superadmin user |
|
|
293
|
+
|
|
294
|
+
---
|
|
295
|
+
|
|
296
|
+
## Security Notes
|
|
297
|
+
|
|
298
|
+
1. **Role-based access**: Only `superadmin` and `developer` user roles can access these endpoints
|
|
299
|
+
2. **Member restriction**: Users with `member` role are denied regardless of their team role
|
|
300
|
+
3. **API key validation**: Invalid or missing API keys return 401 Unauthorized
|
|
@@ -0,0 +1,368 @@
|
|
|
1
|
+
/// <reference types="cypress" />
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* DevTools Registries API Tests
|
|
5
|
+
*
|
|
6
|
+
* Tests for the devtools registry endpoints:
|
|
7
|
+
* - GET /api/v1/devtools/features
|
|
8
|
+
* - GET /api/v1/devtools/flows
|
|
9
|
+
* - GET /api/v1/devtools/blocks
|
|
10
|
+
* - GET /api/v1/devtools/testing
|
|
11
|
+
*
|
|
12
|
+
* These endpoints require superadmin or developer user role.
|
|
13
|
+
* Member role users are NOT allowed regardless of team role.
|
|
14
|
+
*/
|
|
15
|
+
|
|
16
|
+
import * as allure from 'allure-cypress'
|
|
17
|
+
|
|
18
|
+
describe('DevTools Registries API', {
|
|
19
|
+
tags: ['@api', '@feat-devtools', '@security', '@regression']
|
|
20
|
+
}, () => {
|
|
21
|
+
const BASE_URL = Cypress.config('baseUrl') || 'http://localhost:5173'
|
|
22
|
+
|
|
23
|
+
// Superadmin API key for testing (same as other API tests)
|
|
24
|
+
const SUPERADMIN_API_KEY = 'test_api_key_for_testing_purposes_only_not_a_real_secret_key_abc123'
|
|
25
|
+
const INVALID_API_KEY = 'test_invalid_key_placeholder_does_not_exist_00000'
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* Helper to build headers with API key
|
|
29
|
+
*/
|
|
30
|
+
const getHeaders = (apiKey: string | null) => {
|
|
31
|
+
const headers: Record<string, string> = {
|
|
32
|
+
'Content-Type': 'application/json'
|
|
33
|
+
}
|
|
34
|
+
if (apiKey) {
|
|
35
|
+
headers['Authorization'] = `Bearer ${apiKey}`
|
|
36
|
+
}
|
|
37
|
+
return headers
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
beforeEach(() => {
|
|
41
|
+
allure.epic('API')
|
|
42
|
+
allure.feature('DevTools')
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
// ============================================================
|
|
46
|
+
// GET /api/v1/devtools/features
|
|
47
|
+
// ============================================================
|
|
48
|
+
describe('GET /api/v1/devtools/features', () => {
|
|
49
|
+
const endpoint = '/api/v1/devtools/features'
|
|
50
|
+
|
|
51
|
+
beforeEach(() => {
|
|
52
|
+
allure.story('Features Registry')
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('DEVTOOLS_API_001: Should return features registry with valid superadmin API key', { tags: '@smoke' }, () => {
|
|
56
|
+
allure.severity('critical')
|
|
57
|
+
|
|
58
|
+
cy.request({
|
|
59
|
+
method: 'GET',
|
|
60
|
+
url: `${BASE_URL}${endpoint}`,
|
|
61
|
+
headers: getHeaders(SUPERADMIN_API_KEY),
|
|
62
|
+
failOnStatusCode: false
|
|
63
|
+
}).then((response) => {
|
|
64
|
+
expect(response.status).to.eq(200)
|
|
65
|
+
expect(response.body).to.have.property('success', true)
|
|
66
|
+
expect(response.body).to.have.property('data')
|
|
67
|
+
|
|
68
|
+
// Validate data structure
|
|
69
|
+
const { data } = response.body
|
|
70
|
+
expect(data).to.have.property('features')
|
|
71
|
+
expect(data.features).to.be.an('array')
|
|
72
|
+
expect(data).to.have.property('summary')
|
|
73
|
+
expect(data.summary).to.have.property('total')
|
|
74
|
+
expect(data.summary).to.have.property('withTests')
|
|
75
|
+
expect(data.summary).to.have.property('withoutTests')
|
|
76
|
+
expect(data).to.have.property('meta')
|
|
77
|
+
expect(data.meta).to.have.property('theme')
|
|
78
|
+
expect(data.meta).to.have.property('generatedAt')
|
|
79
|
+
|
|
80
|
+
cy.log(`Features: ${data.features.length}, Theme: ${data.meta.theme}`)
|
|
81
|
+
})
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
it('DEVTOOLS_API_002: Should return 401 without authentication', () => {
|
|
85
|
+
allure.severity('critical')
|
|
86
|
+
|
|
87
|
+
cy.request({
|
|
88
|
+
method: 'GET',
|
|
89
|
+
url: `${BASE_URL}${endpoint}`,
|
|
90
|
+
headers: getHeaders(null),
|
|
91
|
+
failOnStatusCode: false
|
|
92
|
+
}).then((response) => {
|
|
93
|
+
expect(response.status).to.eq(401)
|
|
94
|
+
expect(response.body).to.have.property('success', false)
|
|
95
|
+
expect(response.body).to.have.property('error')
|
|
96
|
+
expect(response.body.error).to.have.property('code', 'AUTHENTICATION_REQUIRED')
|
|
97
|
+
})
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
it('DEVTOOLS_API_003: Should return 401 with invalid API key', () => {
|
|
101
|
+
allure.severity('critical')
|
|
102
|
+
|
|
103
|
+
cy.request({
|
|
104
|
+
method: 'GET',
|
|
105
|
+
url: `${BASE_URL}${endpoint}`,
|
|
106
|
+
headers: getHeaders(INVALID_API_KEY),
|
|
107
|
+
failOnStatusCode: false
|
|
108
|
+
}).then((response) => {
|
|
109
|
+
expect(response.status).to.eq(401)
|
|
110
|
+
expect(response.body).to.have.property('success', false)
|
|
111
|
+
})
|
|
112
|
+
})
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
// ============================================================
|
|
116
|
+
// GET /api/v1/devtools/flows
|
|
117
|
+
// ============================================================
|
|
118
|
+
describe('GET /api/v1/devtools/flows', () => {
|
|
119
|
+
const endpoint = '/api/v1/devtools/flows'
|
|
120
|
+
|
|
121
|
+
beforeEach(() => {
|
|
122
|
+
allure.story('Flows Registry')
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
it('DEVTOOLS_API_004: Should return flows registry with valid superadmin API key', { tags: '@smoke' }, () => {
|
|
126
|
+
allure.severity('critical')
|
|
127
|
+
|
|
128
|
+
cy.request({
|
|
129
|
+
method: 'GET',
|
|
130
|
+
url: `${BASE_URL}${endpoint}`,
|
|
131
|
+
headers: getHeaders(SUPERADMIN_API_KEY),
|
|
132
|
+
failOnStatusCode: false
|
|
133
|
+
}).then((response) => {
|
|
134
|
+
expect(response.status).to.eq(200)
|
|
135
|
+
expect(response.body).to.have.property('success', true)
|
|
136
|
+
expect(response.body).to.have.property('data')
|
|
137
|
+
|
|
138
|
+
// Validate data structure
|
|
139
|
+
const { data } = response.body
|
|
140
|
+
expect(data).to.have.property('flows')
|
|
141
|
+
expect(data.flows).to.be.an('array')
|
|
142
|
+
expect(data).to.have.property('summary')
|
|
143
|
+
expect(data.summary).to.have.property('total')
|
|
144
|
+
expect(data.summary).to.have.property('withTests')
|
|
145
|
+
expect(data.summary).to.have.property('withoutTests')
|
|
146
|
+
expect(data).to.have.property('meta')
|
|
147
|
+
|
|
148
|
+
cy.log(`Flows: ${data.flows.length}`)
|
|
149
|
+
})
|
|
150
|
+
})
|
|
151
|
+
|
|
152
|
+
it('DEVTOOLS_API_005: Should return 401 without authentication', () => {
|
|
153
|
+
allure.severity('critical')
|
|
154
|
+
|
|
155
|
+
cy.request({
|
|
156
|
+
method: 'GET',
|
|
157
|
+
url: `${BASE_URL}${endpoint}`,
|
|
158
|
+
headers: getHeaders(null),
|
|
159
|
+
failOnStatusCode: false
|
|
160
|
+
}).then((response) => {
|
|
161
|
+
expect(response.status).to.eq(401)
|
|
162
|
+
expect(response.body).to.have.property('success', false)
|
|
163
|
+
expect(response.body.error).to.have.property('code', 'AUTHENTICATION_REQUIRED')
|
|
164
|
+
})
|
|
165
|
+
})
|
|
166
|
+
|
|
167
|
+
it('DEVTOOLS_API_006: Should return 401 with invalid API key', () => {
|
|
168
|
+
allure.severity('critical')
|
|
169
|
+
|
|
170
|
+
cy.request({
|
|
171
|
+
method: 'GET',
|
|
172
|
+
url: `${BASE_URL}${endpoint}`,
|
|
173
|
+
headers: getHeaders(INVALID_API_KEY),
|
|
174
|
+
failOnStatusCode: false
|
|
175
|
+
}).then((response) => {
|
|
176
|
+
expect(response.status).to.eq(401)
|
|
177
|
+
expect(response.body).to.have.property('success', false)
|
|
178
|
+
})
|
|
179
|
+
})
|
|
180
|
+
})
|
|
181
|
+
|
|
182
|
+
// ============================================================
|
|
183
|
+
// GET /api/v1/devtools/blocks
|
|
184
|
+
// ============================================================
|
|
185
|
+
describe('GET /api/v1/devtools/blocks', () => {
|
|
186
|
+
const endpoint = '/api/v1/devtools/blocks'
|
|
187
|
+
|
|
188
|
+
beforeEach(() => {
|
|
189
|
+
allure.story('Blocks Registry')
|
|
190
|
+
})
|
|
191
|
+
|
|
192
|
+
it('DEVTOOLS_API_007: Should return blocks registry with valid superadmin API key', { tags: '@smoke' }, () => {
|
|
193
|
+
allure.severity('critical')
|
|
194
|
+
|
|
195
|
+
cy.request({
|
|
196
|
+
method: 'GET',
|
|
197
|
+
url: `${BASE_URL}${endpoint}`,
|
|
198
|
+
headers: getHeaders(SUPERADMIN_API_KEY),
|
|
199
|
+
failOnStatusCode: false
|
|
200
|
+
}).then((response) => {
|
|
201
|
+
expect(response.status).to.eq(200)
|
|
202
|
+
expect(response.body).to.have.property('success', true)
|
|
203
|
+
expect(response.body).to.have.property('data')
|
|
204
|
+
|
|
205
|
+
// Validate data structure
|
|
206
|
+
const { data } = response.body
|
|
207
|
+
expect(data).to.have.property('blocks')
|
|
208
|
+
expect(data.blocks).to.be.an('array')
|
|
209
|
+
expect(data).to.have.property('summary')
|
|
210
|
+
expect(data.summary).to.have.property('total')
|
|
211
|
+
expect(data.summary).to.have.property('withTests')
|
|
212
|
+
expect(data.summary).to.have.property('withoutTests')
|
|
213
|
+
expect(data.summary).to.have.property('categories')
|
|
214
|
+
expect(data.summary.categories).to.be.an('array')
|
|
215
|
+
expect(data).to.have.property('meta')
|
|
216
|
+
|
|
217
|
+
// Validate block structure if any blocks exist
|
|
218
|
+
if (data.blocks.length > 0) {
|
|
219
|
+
const block = data.blocks[0]
|
|
220
|
+
expect(block).to.have.property('slug')
|
|
221
|
+
expect(block).to.have.property('name')
|
|
222
|
+
expect(block).to.have.property('category')
|
|
223
|
+
expect(block).to.have.property('testing')
|
|
224
|
+
expect(block.testing).to.have.property('hasTests')
|
|
225
|
+
expect(block.testing).to.have.property('testCount')
|
|
226
|
+
expect(block.testing).to.have.property('tag')
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
cy.log(`Blocks: ${data.blocks.length}, Categories: ${data.summary.categories.join(', ')}`)
|
|
230
|
+
})
|
|
231
|
+
})
|
|
232
|
+
|
|
233
|
+
it('DEVTOOLS_API_008: Should return 401 without authentication', () => {
|
|
234
|
+
allure.severity('critical')
|
|
235
|
+
|
|
236
|
+
cy.request({
|
|
237
|
+
method: 'GET',
|
|
238
|
+
url: `${BASE_URL}${endpoint}`,
|
|
239
|
+
headers: getHeaders(null),
|
|
240
|
+
failOnStatusCode: false
|
|
241
|
+
}).then((response) => {
|
|
242
|
+
expect(response.status).to.eq(401)
|
|
243
|
+
expect(response.body).to.have.property('success', false)
|
|
244
|
+
expect(response.body.error).to.have.property('code', 'AUTHENTICATION_REQUIRED')
|
|
245
|
+
})
|
|
246
|
+
})
|
|
247
|
+
|
|
248
|
+
it('DEVTOOLS_API_009: Should return 401 with invalid API key', () => {
|
|
249
|
+
allure.severity('critical')
|
|
250
|
+
|
|
251
|
+
cy.request({
|
|
252
|
+
method: 'GET',
|
|
253
|
+
url: `${BASE_URL}${endpoint}`,
|
|
254
|
+
headers: getHeaders(INVALID_API_KEY),
|
|
255
|
+
failOnStatusCode: false
|
|
256
|
+
}).then((response) => {
|
|
257
|
+
expect(response.status).to.eq(401)
|
|
258
|
+
expect(response.body).to.have.property('success', false)
|
|
259
|
+
})
|
|
260
|
+
})
|
|
261
|
+
})
|
|
262
|
+
|
|
263
|
+
// ============================================================
|
|
264
|
+
// GET /api/v1/devtools/testing
|
|
265
|
+
// ============================================================
|
|
266
|
+
describe('GET /api/v1/devtools/testing', () => {
|
|
267
|
+
const endpoint = '/api/v1/devtools/testing'
|
|
268
|
+
|
|
269
|
+
beforeEach(() => {
|
|
270
|
+
allure.story('Testing Registry')
|
|
271
|
+
})
|
|
272
|
+
|
|
273
|
+
it('DEVTOOLS_API_010: Should return testing/tags registry with valid superadmin API key', { tags: '@smoke' }, () => {
|
|
274
|
+
allure.severity('critical')
|
|
275
|
+
|
|
276
|
+
cy.request({
|
|
277
|
+
method: 'GET',
|
|
278
|
+
url: `${BASE_URL}${endpoint}`,
|
|
279
|
+
headers: getHeaders(SUPERADMIN_API_KEY),
|
|
280
|
+
failOnStatusCode: false
|
|
281
|
+
}).then((response) => {
|
|
282
|
+
expect(response.status).to.eq(200)
|
|
283
|
+
expect(response.body).to.have.property('success', true)
|
|
284
|
+
expect(response.body).to.have.property('data')
|
|
285
|
+
|
|
286
|
+
// Validate data structure
|
|
287
|
+
const { data } = response.body
|
|
288
|
+
expect(data).to.have.property('tags')
|
|
289
|
+
expect(data.tags).to.be.an('object')
|
|
290
|
+
expect(data).to.have.property('summary')
|
|
291
|
+
expect(data.summary).to.have.property('totalTags')
|
|
292
|
+
expect(data.summary).to.have.property('testFiles')
|
|
293
|
+
expect(data.summary).to.have.property('byCategory')
|
|
294
|
+
expect(data.summary.byCategory).to.be.an('object')
|
|
295
|
+
expect(data.summary).to.have.property('features')
|
|
296
|
+
expect(data.summary).to.have.property('flows')
|
|
297
|
+
expect(data).to.have.property('meta')
|
|
298
|
+
|
|
299
|
+
cy.log(`Total tags: ${data.summary.totalTags}, Test files: ${data.summary.testFiles}`)
|
|
300
|
+
})
|
|
301
|
+
})
|
|
302
|
+
|
|
303
|
+
it('DEVTOOLS_API_011: Should return 401 without authentication', () => {
|
|
304
|
+
allure.severity('critical')
|
|
305
|
+
|
|
306
|
+
cy.request({
|
|
307
|
+
method: 'GET',
|
|
308
|
+
url: `${BASE_URL}${endpoint}`,
|
|
309
|
+
headers: getHeaders(null),
|
|
310
|
+
failOnStatusCode: false
|
|
311
|
+
}).then((response) => {
|
|
312
|
+
expect(response.status).to.eq(401)
|
|
313
|
+
expect(response.body).to.have.property('success', false)
|
|
314
|
+
expect(response.body.error).to.have.property('code', 'AUTHENTICATION_REQUIRED')
|
|
315
|
+
})
|
|
316
|
+
})
|
|
317
|
+
|
|
318
|
+
it('DEVTOOLS_API_012: Should return 401 with invalid API key', () => {
|
|
319
|
+
allure.severity('critical')
|
|
320
|
+
|
|
321
|
+
cy.request({
|
|
322
|
+
method: 'GET',
|
|
323
|
+
url: `${BASE_URL}${endpoint}`,
|
|
324
|
+
headers: getHeaders(INVALID_API_KEY),
|
|
325
|
+
failOnStatusCode: false
|
|
326
|
+
}).then((response) => {
|
|
327
|
+
expect(response.status).to.eq(401)
|
|
328
|
+
expect(response.body).to.have.property('success', false)
|
|
329
|
+
})
|
|
330
|
+
})
|
|
331
|
+
})
|
|
332
|
+
|
|
333
|
+
// ============================================================
|
|
334
|
+
// Cross-endpoint validation
|
|
335
|
+
// ============================================================
|
|
336
|
+
describe('Response Format Consistency', () => {
|
|
337
|
+
beforeEach(() => {
|
|
338
|
+
allure.story('Response Format')
|
|
339
|
+
})
|
|
340
|
+
|
|
341
|
+
const endpoints = [
|
|
342
|
+
'/api/v1/devtools/features',
|
|
343
|
+
'/api/v1/devtools/flows',
|
|
344
|
+
'/api/v1/devtools/blocks',
|
|
345
|
+
'/api/v1/devtools/testing'
|
|
346
|
+
]
|
|
347
|
+
|
|
348
|
+
endpoints.forEach((endpoint) => {
|
|
349
|
+
it(`Should have consistent response format for ${endpoint}`, () => {
|
|
350
|
+
cy.request({
|
|
351
|
+
method: 'GET',
|
|
352
|
+
url: `${BASE_URL}${endpoint}`,
|
|
353
|
+
headers: getHeaders(SUPERADMIN_API_KEY),
|
|
354
|
+
failOnStatusCode: false
|
|
355
|
+
}).then((response) => {
|
|
356
|
+
expect(response.status).to.eq(200)
|
|
357
|
+
|
|
358
|
+
// All endpoints should have these common properties
|
|
359
|
+
expect(response.body).to.have.property('success', true)
|
|
360
|
+
expect(response.body).to.have.property('data')
|
|
361
|
+
expect(response.body.data).to.have.property('meta')
|
|
362
|
+
expect(response.body.data.meta).to.have.property('theme')
|
|
363
|
+
expect(response.body.data.meta).to.have.property('generatedAt')
|
|
364
|
+
})
|
|
365
|
+
})
|
|
366
|
+
})
|
|
367
|
+
})
|
|
368
|
+
})
|