@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,451 @@
1
+ ---
2
+ feature: Scheduled Actions DevTools Endpoint API
3
+ priority: critical
4
+ tags: [api, feat-scheduled-actions, devtools, filters, pagination, regression]
5
+ grepTags: ["@api", "@feat-scheduled-actions"]
6
+ coverage: 13 tests
7
+ ---
8
+
9
+ # Scheduled Actions DevTools Endpoint API
10
+
11
+ > API tests for the `/api/v1/devtools/scheduled-actions` endpoint that provides access to scheduled actions with filtering, pagination, and metadata. Requires superadmin/developer API key authentication.
12
+
13
+ ## Endpoint Covered
14
+
15
+ | Endpoint | Method | Description |
16
+ |----------|--------|-------------|
17
+ | `/api/v1/devtools/scheduled-actions` | GET | List scheduled actions with filters |
18
+
19
+ ## Query Parameters
20
+
21
+ | Parameter | Type | Default | Description |
22
+ |-----------|------|---------|-------------|
23
+ | `status` | string | - | Filter: pending, running, completed, failed |
24
+ | `action_type` | string | - | Filter by action type name |
25
+ | `page` | number | 1 | Page number |
26
+ | `limit` | number | 20 | Results per page |
27
+
28
+ ---
29
+
30
+ ## @test SA_DEVTOOLS_AUTH_001: Should return 401 without API key
31
+
32
+ ### Metadata
33
+ - **Priority:** Critical
34
+ - **Type:** Security
35
+ - **Tags:** api, scheduled-actions, authentication, 401
36
+ - **AC:** -
37
+
38
+ ```gherkin:en
39
+ Scenario: Request without API key returns 401
40
+
41
+ Given I make a request without x-api-key header
42
+ When I make a GET request to /api/v1/devtools/scheduled-actions
43
+ Then the response status should be 401
44
+ And the error code should be AUTHENTICATION_REQUIRED
45
+ ```
46
+
47
+ ```gherkin:es
48
+ Scenario: Solicitud sin API key retorna 401
49
+
50
+ Given hago una solicitud sin header x-api-key
51
+ When hago una solicitud GET a /api/v1/devtools/scheduled-actions
52
+ Then el status de respuesta deberia ser 401
53
+ And el codigo de error deberia ser AUTHENTICATION_REQUIRED
54
+ ```
55
+
56
+ ---
57
+
58
+ ## @test SA_DEVTOOLS_AUTH_002: Should return 200 with valid API key
59
+
60
+ ### Metadata
61
+ - **Priority:** Critical
62
+ - **Type:** Smoke
63
+ - **Tags:** api, scheduled-actions, authentication
64
+ - **AC:** -
65
+
66
+ ```gherkin:en
67
+ Scenario: Valid API key is accepted
68
+
69
+ Given I have a valid superadmin API key
70
+ When I make a GET request to /api/v1/devtools/scheduled-actions
71
+ Then the response status should be 200
72
+ And the response body should have success true
73
+ ```
74
+
75
+ ```gherkin:es
76
+ Scenario: API key valido es aceptado
77
+
78
+ Given tengo una API key de superadmin valida
79
+ When hago una solicitud GET a /api/v1/devtools/scheduled-actions
80
+ Then el status de respuesta deberia ser 200
81
+ And el body deberia tener success true
82
+ ```
83
+
84
+ ---
85
+
86
+ ## @test SA_DEVTOOLS_001: Should filter by status=pending
87
+
88
+ ### Metadata
89
+ - **Priority:** Critical
90
+ - **Type:** Functional
91
+ - **Tags:** api, scheduled-actions, filtering, status
92
+ - **AC:** AC-27
93
+
94
+ ```gherkin:en
95
+ Scenario: Filter by pending status
96
+
97
+ Given I have a valid API key
98
+ When I make a GET request with ?status=pending
99
+ Then the response status should be 200
100
+ And all returned actions should have status "pending"
101
+ ```
102
+
103
+ ```gherkin:es
104
+ Scenario: Filtrar por estado pending
105
+
106
+ Given tengo una API key valida
107
+ When hago una solicitud GET con ?status=pending
108
+ Then el status de respuesta deberia ser 200
109
+ And todas las acciones retornadas deberian tener status "pending"
110
+ ```
111
+
112
+ ---
113
+
114
+ ## @test SA_DEVTOOLS_002: Should filter by status=completed
115
+
116
+ ### Metadata
117
+ - **Priority:** Critical
118
+ - **Type:** Functional
119
+ - **Tags:** api, scheduled-actions, filtering, status
120
+ - **AC:** AC-27
121
+
122
+ ```gherkin:en
123
+ Scenario: Filter by completed status
124
+
125
+ Given I have a valid API key
126
+ When I make a GET request with ?status=completed
127
+ Then the response status should be 200
128
+ And all returned actions should have status "completed"
129
+ ```
130
+
131
+ ```gherkin:es
132
+ Scenario: Filtrar por estado completed
133
+
134
+ Given tengo una API key valida
135
+ When hago una solicitud GET con ?status=completed
136
+ Then el status de respuesta deberia ser 200
137
+ And todas las acciones retornadas deberian tener status "completed"
138
+ ```
139
+
140
+ ---
141
+
142
+ ## @test SA_DEVTOOLS_003: Should filter by action_type
143
+
144
+ ### Metadata
145
+ - **Priority:** Critical
146
+ - **Type:** Functional
147
+ - **Tags:** api, scheduled-actions, filtering, action-type
148
+ - **AC:** AC-28
149
+
150
+ ```gherkin:en
151
+ Scenario: Filter by action type
152
+
153
+ Given I have a valid API key
154
+ When I make a GET request with ?action_type=webhook:send
155
+ Then the response status should be 200
156
+ And all returned actions should have actionType "webhook:send"
157
+ ```
158
+
159
+ ```gherkin:es
160
+ Scenario: Filtrar por tipo de accion
161
+
162
+ Given tengo una API key valida
163
+ When hago una solicitud GET con ?action_type=webhook:send
164
+ Then el status de respuesta deberia ser 200
165
+ And todas las acciones retornadas deberian tener actionType "webhook:send"
166
+ ```
167
+
168
+ ---
169
+
170
+ ## @test SA_DEVTOOLS_004: Should filter by status AND action_type together
171
+
172
+ ### Metadata
173
+ - **Priority:** Critical
174
+ - **Type:** Functional
175
+ - **Tags:** api, scheduled-actions, filtering, combined
176
+ - **AC:** AC-29
177
+
178
+ ```gherkin:en
179
+ Scenario: Combined filters work together
180
+
181
+ Given I have a valid API key
182
+ When I make a GET request with ?status=completed&action_type=webhook:send
183
+ Then the response status should be 200
184
+ And all returned actions should have status "completed"
185
+ And all returned actions should have actionType "webhook:send"
186
+ ```
187
+
188
+ ```gherkin:es
189
+ Scenario: Filtros combinados funcionan juntos
190
+
191
+ Given tengo una API key valida
192
+ When hago una solicitud GET con ?status=completed&action_type=webhook:send
193
+ Then el status de respuesta deberia ser 200
194
+ And todas las acciones retornadas deberian tener status "completed"
195
+ And todas las acciones retornadas deberian tener actionType "webhook:send"
196
+ ```
197
+
198
+ ---
199
+
200
+ ## @test SA_DEVTOOLS_005: Should return empty array for non-existent action_type
201
+
202
+ ### Metadata
203
+ - **Priority:** Normal
204
+ - **Type:** Functional
205
+ - **Tags:** api, scheduled-actions, filtering, empty
206
+ - **AC:** AC-30
207
+
208
+ ```gherkin:en
209
+ Scenario: Non-existent action type returns empty
210
+
211
+ Given I have a valid API key
212
+ When I make a GET request with ?action_type=non-existent:action
213
+ Then the response status should be 200
214
+ And the actions array should be empty
215
+ And pagination total should be 0
216
+ ```
217
+
218
+ ```gherkin:es
219
+ Scenario: Tipo de accion inexistente retorna vacio
220
+
221
+ Given tengo una API key valida
222
+ When hago una solicitud GET con ?action_type=non-existent:action
223
+ Then el status de respuesta deberia ser 200
224
+ And el array de acciones deberia estar vacio
225
+ And el total de paginacion deberia ser 0
226
+ ```
227
+
228
+ ---
229
+
230
+ ## @test SA_DEVTOOLS_006: Should paginate filtered results correctly
231
+
232
+ ### Metadata
233
+ - **Priority:** Critical
234
+ - **Type:** Functional
235
+ - **Tags:** api, scheduled-actions, pagination
236
+ - **AC:** AC-31
237
+
238
+ ```gherkin:en
239
+ Scenario: Pagination with filters
240
+
241
+ Given I have a valid API key
242
+ When I make a GET request with ?status=completed&limit=5&page=1
243
+ Then the response status should be 200
244
+ And pagination should show page 1
245
+ And pagination should show limit 5
246
+ And actions count should be at most 5
247
+ ```
248
+
249
+ ```gherkin:es
250
+ Scenario: Paginacion con filtros
251
+
252
+ Given tengo una API key valida
253
+ When hago una solicitud GET con ?status=completed&limit=5&page=1
254
+ Then el status de respuesta deberia ser 200
255
+ And la paginacion deberia mostrar pagina 1
256
+ And la paginacion deberia mostrar limite 5
257
+ And el conteo de acciones deberia ser maximo 5
258
+ ```
259
+
260
+ ---
261
+
262
+ ## @test SA_DEVTOOLS_007: Should include registeredActionTypes in meta
263
+
264
+ ### Metadata
265
+ - **Priority:** Critical
266
+ - **Type:** Functional
267
+ - **Tags:** api, scheduled-actions, meta, registry
268
+ - **AC:** AC-32
269
+
270
+ ```gherkin:en
271
+ Scenario: Response includes registered action types
272
+
273
+ Given I have a valid API key
274
+ When I make a GET request to /api/v1/devtools/scheduled-actions
275
+ Then the response should contain meta object
276
+ And meta should contain registeredActionTypes array
277
+ And registeredActionTypes should include "webhook:send"
278
+ And registeredActionTypes should include "billing:check-renewals"
279
+ ```
280
+
281
+ ```gherkin:es
282
+ Scenario: Respuesta incluye tipos de accion registrados
283
+
284
+ Given tengo una API key valida
285
+ When hago una solicitud GET a /api/v1/devtools/scheduled-actions
286
+ Then la respuesta deberia contener objeto meta
287
+ And meta deberia contener array registeredActionTypes
288
+ And registeredActionTypes deberia incluir "webhook:send"
289
+ And registeredActionTypes deberia incluir "billing:check-renewals"
290
+ ```
291
+
292
+ ---
293
+
294
+ ## @test SA_DEVTOOLS_008: Should return correct action structure
295
+
296
+ ### Metadata
297
+ - **Priority:** Critical
298
+ - **Type:** Functional
299
+ - **Tags:** api, scheduled-actions, response-structure
300
+ - **AC:** -
301
+
302
+ ```gherkin:en
303
+ Scenario: Action object has correct structure
304
+
305
+ Given I have a valid API key
306
+ When I make a GET request with ?limit=1
307
+ Then the response status should be 200
308
+ And action should have id, actionType, status, payload
309
+ And action should have teamId, scheduledAt, createdAt, updatedAt
310
+ And action should have attempts, recurringInterval
311
+ ```
312
+
313
+ ```gherkin:es
314
+ Scenario: Objeto de accion tiene estructura correcta
315
+
316
+ Given tengo una API key valida
317
+ When hago una solicitud GET con ?limit=1
318
+ Then el status de respuesta deberia ser 200
319
+ And la accion deberia tener id, actionType, status, payload
320
+ And la accion deberia tener teamId, scheduledAt, createdAt, updatedAt
321
+ And la accion deberia tener attempts, recurringInterval
322
+ ```
323
+
324
+ ---
325
+
326
+ ## Response Format
327
+
328
+ ### Success Response (200)
329
+
330
+ ```json
331
+ {
332
+ "success": true,
333
+ "data": {
334
+ "actions": [
335
+ {
336
+ "id": "abc123",
337
+ "actionType": "webhook:send",
338
+ "status": "completed",
339
+ "payload": { "entityId": "123", "eventType": "created" },
340
+ "teamId": "team-001",
341
+ "scheduledAt": "2025-12-30T10:00:00Z",
342
+ "startedAt": "2025-12-30T10:01:00Z",
343
+ "completedAt": "2025-12-30T10:01:05Z",
344
+ "errorMessage": null,
345
+ "attempts": 1,
346
+ "recurringInterval": null,
347
+ "createdAt": "2025-12-30T10:00:00Z",
348
+ "updatedAt": "2025-12-30T10:01:05Z"
349
+ }
350
+ ],
351
+ "pagination": {
352
+ "total": 50,
353
+ "page": 1,
354
+ "limit": 20,
355
+ "totalPages": 3
356
+ },
357
+ "meta": {
358
+ "registeredActionTypes": [
359
+ "webhook:send",
360
+ "billing:check-renewals"
361
+ ]
362
+ }
363
+ }
364
+ }
365
+ ```
366
+
367
+ ### Error Response (401)
368
+
369
+ ```json
370
+ {
371
+ "success": false,
372
+ "error": {
373
+ "message": "Authentication required",
374
+ "code": "AUTHENTICATION_REQUIRED",
375
+ "details": {
376
+ "hint": "Provide a valid API key via Authorization header or x-api-key header"
377
+ }
378
+ }
379
+ }
380
+ ```
381
+
382
+ ---
383
+
384
+ ## Test Summary
385
+
386
+ | Test ID | Description | Priority | AC |
387
+ |---------|-------------|----------|-----|
388
+ | SA_DEVTOOLS_AUTH_001 | 401 without API key | Critical | - |
389
+ | SA_DEVTOOLS_AUTH_002 | 200 with valid API key | Critical | - |
390
+ | SA_DEVTOOLS_001 | Filter by status=pending | Critical | AC-27 |
391
+ | SA_DEVTOOLS_002 | Filter by status=completed | Critical | AC-27 |
392
+ | SA_DEVTOOLS_002b | Filter by status=failed | Normal | AC-27 |
393
+ | SA_DEVTOOLS_002c | Filter by status=running | Normal | AC-27 |
394
+ | SA_DEVTOOLS_003 | Filter by action_type=webhook:send | Critical | AC-28 |
395
+ | SA_DEVTOOLS_003b | Filter by action_type=billing:check-renewals | Normal | AC-28 |
396
+ | SA_DEVTOOLS_004 | Combined status + action_type filters | Critical | AC-29 |
397
+ | SA_DEVTOOLS_005 | Empty array for non-existent type | Normal | AC-30 |
398
+ | SA_DEVTOOLS_005b | Handle invalid status gracefully | Normal | AC-30 |
399
+ | SA_DEVTOOLS_006 | Pagination with filters | Critical | AC-31 |
400
+ | SA_DEVTOOLS_006b | Navigate to page 2 | Normal | AC-31 |
401
+ | SA_DEVTOOLS_007 | Meta includes registeredActionTypes | Critical | AC-32 |
402
+ | SA_DEVTOOLS_008 | Action structure validation | Critical | - |
403
+
404
+ ---
405
+
406
+ ## Visual Flow
407
+
408
+ ```
409
+ ┌─────────────────────────────────────────────────────────────────┐
410
+ │ GET /api/v1/devtools/scheduled-actions │
411
+ │ + x-api-key: sk_test_... │
412
+ │ + ?status=completed&action_type=webhook:send&limit=10&page=1 │
413
+ └─────────────────────────────────────────────────────────────────┘
414
+
415
+
416
+ ┌─────────────────────────────────────────────────────────────────┐
417
+ │ Authentication Check │
418
+ │ ├── No API key? → 401 AUTHENTICATION_REQUIRED │
419
+ │ ├── Invalid key? → 401 or 403 │
420
+ │ └── Valid key? → Continue │
421
+ └─────────────────────────────────────────────────────────────────┘
422
+
423
+
424
+ ┌─────────────────────────────────────────────────────────────────┐
425
+ │ Build Query │
426
+ │ ├── Add status filter if provided │
427
+ │ ├── Add action_type filter if provided │
428
+ │ └── Apply pagination (limit, offset) │
429
+ └─────────────────────────────────────────────────────────────────┘
430
+
431
+
432
+ ┌─────────────────────────────────────────────────────────────────┐
433
+ │ Response │
434
+ │ { │
435
+ │ success: true, │
436
+ │ data: { │
437
+ │ actions: [...], │
438
+ │ pagination: { total, page, limit, totalPages }, │
439
+ │ meta: { registeredActionTypes: [...] } │
440
+ │ } │
441
+ │ } │
442
+ └─────────────────────────────────────────────────────────────────┘
443
+ ```
444
+
445
+ ---
446
+
447
+ ## Environment Variables Required
448
+
449
+ | Variable | Description |
450
+ |----------|-------------|
451
+ | `SUPERADMIN_API_KEY` | API key with superadmin/developer access |