@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.
Files changed (220) hide show
  1. package/package.json +1 -1
  2. package/tests/cypress/e2e/_devtools/access.bdd.md +262 -0
  3. package/tests/cypress/e2e/_devtools/access.cy.ts +171 -0
  4. package/tests/cypress/e2e/_devtools/navigation.bdd.md +261 -0
  5. package/tests/cypress/e2e/_devtools/navigation.cy.ts +157 -0
  6. package/tests/cypress/e2e/_devtools/pages.bdd.md +303 -0
  7. package/tests/cypress/e2e/_devtools/pages.cy.ts +184 -0
  8. package/tests/cypress/e2e/_docs/README.md +215 -0
  9. package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin-teams.narration.json +155 -0
  10. package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin.cy.ts +390 -0
  11. package/tests/cypress/e2e/_docs/tutorials/teams-system.doc.cy.ts +349 -0
  12. package/tests/cypress/e2e/_docs/tutorials/teams-system.narration.json +165 -0
  13. package/tests/cypress/e2e/_selectors/auth.cy.ts +306 -0
  14. package/tests/cypress/e2e/_selectors/billing.cy.ts +89 -0
  15. package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +113 -0
  16. package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +89 -0
  17. package/tests/cypress/e2e/_selectors/dashboard-sidebar.cy.ts +60 -0
  18. package/tests/cypress/e2e/_selectors/dashboard-topnav.cy.ts +146 -0
  19. package/tests/cypress/e2e/_selectors/devtools.cy.ts +210 -0
  20. package/tests/cypress/e2e/_selectors/global-search.cy.ts +88 -0
  21. package/tests/cypress/e2e/_selectors/pages-editor.cy.ts +179 -0
  22. package/tests/cypress/e2e/_selectors/posts-editor.cy.ts +282 -0
  23. package/tests/cypress/e2e/_selectors/public.cy.ts +112 -0
  24. package/tests/cypress/e2e/_selectors/settings-api-keys.cy.ts +228 -0
  25. package/tests/cypress/e2e/_selectors/settings-billing.cy.ts +105 -0
  26. package/tests/cypress/e2e/_selectors/settings-layout.cy.ts +119 -0
  27. package/tests/cypress/e2e/_selectors/settings-password.cy.ts +71 -0
  28. package/tests/cypress/e2e/_selectors/settings-profile.cy.ts +82 -0
  29. package/tests/cypress/e2e/_selectors/settings-teams.cy.ts +68 -0
  30. package/tests/cypress/e2e/_selectors/superadmin.cy.ts +185 -0
  31. package/tests/cypress/e2e/_selectors/tasks.cy.ts +242 -0
  32. package/tests/cypress/e2e/_selectors/taxonomies.cy.ts +126 -0
  33. package/tests/cypress/e2e/_selectors/teams.cy.ts +142 -0
  34. package/tests/cypress/e2e/_superadmin/all-teams.bdd.md +261 -0
  35. package/tests/cypress/e2e/_superadmin/all-teams.cy.ts +177 -0
  36. package/tests/cypress/e2e/_superadmin/all-users.bdd.md +406 -0
  37. package/tests/cypress/e2e/_superadmin/all-users.cy.ts +294 -0
  38. package/tests/cypress/e2e/_superadmin/dashboard.bdd.md +235 -0
  39. package/tests/cypress/e2e/_superadmin/dashboard.cy.ts +149 -0
  40. package/tests/cypress/e2e/_superadmin/subscriptions-overview.bdd.md +290 -0
  41. package/tests/cypress/e2e/_superadmin/subscriptions-overview.cy.ts +194 -0
  42. package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
  43. package/tests/cypress/e2e/ai/chat-api.cy.ts +107 -0
  44. package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
  45. package/tests/cypress/e2e/api/billing/BillingAPIController.js +319 -0
  46. package/tests/cypress/e2e/api/billing/check-action.cy.ts +326 -0
  47. package/tests/cypress/e2e/api/billing/checkout.cy.ts +358 -0
  48. package/tests/cypress/e2e/api/billing/lifecycle.cy.ts +423 -0
  49. package/tests/cypress/e2e/api/billing/plans/README.md +345 -0
  50. package/tests/cypress/e2e/api/billing/plans/business.cy.ts +412 -0
  51. package/tests/cypress/e2e/api/billing/plans/downgrade.cy.ts +510 -0
  52. package/tests/cypress/e2e/api/billing/plans/fixtures/billing-plans.json +163 -0
  53. package/tests/cypress/e2e/api/billing/plans/free.cy.ts +500 -0
  54. package/tests/cypress/e2e/api/billing/plans/pro.cy.ts +497 -0
  55. package/tests/cypress/e2e/api/billing/plans/starter.cy.ts +342 -0
  56. package/tests/cypress/e2e/api/billing/portal.cy.ts +313 -0
  57. package/tests/cypress/e2e/api/devtools/registries.bdd.md +300 -0
  58. package/tests/cypress/e2e/api/devtools/registries.cy.ts +368 -0
  59. package/tests/cypress/e2e/api/entities/blocks-scope.cy.ts +396 -0
  60. package/tests/cypress/e2e/api/entities/customers-crud.cy.ts +648 -0
  61. package/tests/cypress/e2e/api/entities/customers-metas.cy.ts +839 -0
  62. package/tests/cypress/e2e/api/entities/pages-crud.cy.ts +425 -0
  63. package/tests/cypress/e2e/api/entities/pages-status.cy.ts +335 -0
  64. package/tests/cypress/e2e/api/entities/post-categories-crud.cy.ts +610 -0
  65. package/tests/cypress/e2e/api/entities/posts-crud.cy.ts +709 -0
  66. package/tests/cypress/e2e/api/entities/posts-status.cy.ts +396 -0
  67. package/tests/cypress/e2e/api/entities/tasks-crud.cy.ts +602 -0
  68. package/tests/cypress/e2e/api/entities/tasks-metas.cy.ts +878 -0
  69. package/tests/cypress/e2e/api/entities/users-crud.cy.ts +469 -0
  70. package/tests/cypress/e2e/api/entities/users-metas.cy.ts +913 -0
  71. package/tests/cypress/e2e/api/entities/users-security.cy.ts +375 -0
  72. package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.bdd.md +375 -0
  73. package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.cy.ts +346 -0
  74. package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.bdd.md +451 -0
  75. package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.cy.ts +447 -0
  76. package/tests/cypress/e2e/api/scheduled-actions/scheduling.bdd.md +649 -0
  77. package/tests/cypress/e2e/api/scheduled-actions/scheduling.cy.ts +333 -0
  78. package/tests/cypress/e2e/api/settings/api-keys.crud.cy.ts +923 -0
  79. package/tests/cypress/e2e/uat/auth/app-roles/developer-login.bdd.md +231 -0
  80. package/tests/cypress/e2e/uat/auth/app-roles/developer-login.cy.ts +144 -0
  81. package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.bdd.md +118 -0
  82. package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.cy.ts +84 -0
  83. package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.bdd.md +288 -0
  84. package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.cy.ts +188 -0
  85. package/tests/cypress/e2e/uat/auth/login-logout.bdd.md +160 -0
  86. package/tests/cypress/e2e/uat/auth/login-logout.cy.ts +116 -0
  87. package/tests/cypress/e2e/uat/auth/password-reset.bdd.md +289 -0
  88. package/tests/cypress/e2e/uat/auth/password-reset.cy.ts +200 -0
  89. package/tests/cypress/e2e/uat/auth/team-roles/admin-login.bdd.md +225 -0
  90. package/tests/cypress/e2e/uat/auth/team-roles/admin-login.cy.ts +148 -0
  91. package/tests/cypress/e2e/uat/auth/team-roles/member-login.bdd.md +251 -0
  92. package/tests/cypress/e2e/uat/auth/team-roles/member-login.cy.ts +163 -0
  93. package/tests/cypress/e2e/uat/auth/team-roles/owner-login.bdd.md +231 -0
  94. package/tests/cypress/e2e/uat/auth/team-roles/owner-login.cy.ts +141 -0
  95. package/tests/cypress/e2e/uat/billing/extended.bdd.md +273 -0
  96. package/tests/cypress/e2e/uat/billing/extended.cy.ts +209 -0
  97. package/tests/cypress/e2e/uat/billing/feature-gates.bdd.md +407 -0
  98. package/tests/cypress/e2e/uat/billing/feature-gates.cy.ts +307 -0
  99. package/tests/cypress/e2e/uat/billing/page.bdd.md +329 -0
  100. package/tests/cypress/e2e/uat/billing/page.cy.ts +250 -0
  101. package/tests/cypress/e2e/uat/billing/status.bdd.md +190 -0
  102. package/tests/cypress/e2e/uat/billing/status.cy.ts +145 -0
  103. package/tests/cypress/e2e/uat/billing/team-switch.bdd.md +156 -0
  104. package/tests/cypress/e2e/uat/billing/team-switch.cy.ts +122 -0
  105. package/tests/cypress/e2e/uat/billing/usage.bdd.md +218 -0
  106. package/tests/cypress/e2e/uat/billing/usage.cy.ts +176 -0
  107. package/tests/cypress/e2e/uat/blocks/hero.bdd.md +124 -0
  108. package/tests/cypress/e2e/uat/blocks/hero.cy.ts +56 -0
  109. package/tests/cypress/e2e/uat/devtools/api-tester.cy.ts +390 -0
  110. package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
  111. package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
  112. package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
  113. package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
  114. package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
  115. package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
  116. package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
  117. package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
  118. package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
  119. package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
  120. package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
  121. package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
  122. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
  123. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
  124. package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
  125. package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
  126. package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
  127. package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
  128. package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
  129. package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
  130. package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
  131. package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
  132. package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
  133. package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
  134. package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
  135. package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
  136. package/tests/cypress/e2e/uat/roles/editor-role.bdd.md +552 -0
  137. package/tests/cypress/e2e/uat/roles/editor-role.cy.ts +210 -0
  138. package/tests/cypress/e2e/uat/roles/member-restrictions.bdd.md +450 -0
  139. package/tests/cypress/e2e/uat/roles/member-restrictions.cy.ts +189 -0
  140. package/tests/cypress/e2e/uat/roles/owner-full-crud.bdd.md +530 -0
  141. package/tests/cypress/e2e/uat/roles/owner-full-crud.cy.ts +247 -0
  142. package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.bdd.md +736 -0
  143. package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.cy.ts +740 -0
  144. package/tests/cypress/e2e/uat/teams/roles-matrix.bdd.md +553 -0
  145. package/tests/cypress/e2e/uat/teams/roles-matrix.cy.ts +185 -0
  146. package/tests/cypress/e2e/uat/teams/switcher.bdd.md +1151 -0
  147. package/tests/cypress/e2e/uat/teams/switcher.cy.ts +497 -0
  148. package/tests/cypress/e2e/uat/teams/team-switcher.md +198 -0
  149. package/tests/cypress/fixtures/blocks.json +218 -0
  150. package/tests/cypress/fixtures/entities.json +78 -0
  151. package/tests/cypress/fixtures/page-builder.json +21 -0
  152. package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
  153. package/tests/cypress/src/components/CustomersPOM.ts +439 -0
  154. package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
  155. package/tests/cypress/src/components/EntityForm.ts +375 -0
  156. package/tests/cypress/src/components/EntityList.ts +389 -0
  157. package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
  158. package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
  159. package/tests/cypress/src/components/PostsListPOM.ts +223 -0
  160. package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
  161. package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
  162. package/tests/cypress/src/components/TasksPOM.ts +272 -0
  163. package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
  164. package/tests/cypress/src/components/index.ts +21 -0
  165. package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
  166. package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
  167. package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
  168. package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
  169. package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
  170. package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
  171. package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
  172. package/tests/cypress/src/controllers/index.js +25 -0
  173. package/tests/cypress/src/core/AuthPOM.ts +450 -0
  174. package/tests/cypress/src/core/BasePOM.ts +86 -0
  175. package/tests/cypress/src/core/BlockEditorBasePOM.ts +576 -0
  176. package/tests/cypress/src/core/DashboardEntityPOM.ts +692 -0
  177. package/tests/cypress/src/core/index.ts +14 -0
  178. package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
  179. package/tests/cypress/src/entities/PagesPOM.ts +137 -0
  180. package/tests/cypress/src/entities/PostsPOM.ts +137 -0
  181. package/tests/cypress/src/entities/TasksPOM.ts +176 -0
  182. package/tests/cypress/src/entities/index.ts +14 -0
  183. package/tests/cypress/src/features/BillingPOM.ts +385 -0
  184. package/tests/cypress/src/features/DashboardPOM.ts +245 -0
  185. package/tests/cypress/src/features/DevtoolsPOM.ts +739 -0
  186. package/tests/cypress/src/features/PageBuilderPOM.ts +263 -0
  187. package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
  188. package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
  189. package/tests/cypress/src/features/SettingsPOM.ts +362 -0
  190. package/tests/cypress/src/features/SuperadminPOM.ts +331 -0
  191. package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
  192. package/tests/cypress/src/features/index.ts +28 -0
  193. package/tests/cypress/src/helpers/ApiInterceptor.ts +177 -0
  194. package/tests/cypress/src/index.ts +101 -0
  195. package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
  196. package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
  197. package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
  198. package/tests/cypress/src/pages/dashboard/index.js +6 -0
  199. package/tests/cypress/src/pages/index.js +5 -0
  200. package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
  201. package/tests/cypress/src/pages/public/LandingPage.js +69 -0
  202. package/tests/cypress/src/pages/public/PricingPage.js +33 -0
  203. package/tests/cypress/src/pages/public/index.js +6 -0
  204. package/tests/cypress/src/selectors.ts +46 -0
  205. package/tests/cypress/src/session-helpers.ts +500 -0
  206. package/tests/cypress/support/doc-commands.ts +260 -0
  207. package/tests/cypress.config.ts +150 -0
  208. package/tests/jest/components/post-header.test.tsx +377 -0
  209. package/tests/jest/config/role-config.test.ts +529 -0
  210. package/tests/jest/jest.config.ts +81 -0
  211. package/tests/jest/langchain/COVERAGE.md +372 -0
  212. package/tests/jest/langchain/guardrails.test.ts +465 -0
  213. package/tests/jest/langchain/streaming.test.ts +367 -0
  214. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  215. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  216. package/tests/jest/langchain/tracer.test.ts +823 -0
  217. package/tests/jest/user-roles/role-helpers.test.ts +432 -0
  218. package/tests/jest/validation/categories.test.ts +429 -0
  219. package/tests/jest/validation/posts.test.ts +546 -0
  220. 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
+ })