@nextsparkjs/theme-default 0.1.0-beta.20 → 0.1.0-beta.22

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 (221) 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/support/e2e.ts +89 -0
  208. package/tests/cypress.config.ts +165 -0
  209. package/tests/jest/components/post-header.test.tsx +377 -0
  210. package/tests/jest/config/role-config.test.ts +529 -0
  211. package/tests/jest/jest.config.ts +81 -0
  212. package/tests/jest/langchain/COVERAGE.md +372 -0
  213. package/tests/jest/langchain/guardrails.test.ts +465 -0
  214. package/tests/jest/langchain/streaming.test.ts +367 -0
  215. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  216. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  217. package/tests/jest/langchain/tracer.test.ts +823 -0
  218. package/tests/jest/user-roles/role-helpers.test.ts +432 -0
  219. package/tests/jest/validation/categories.test.ts +429 -0
  220. package/tests/jest/validation/posts.test.ts +546 -0
  221. package/tests/tsconfig.json +15 -0
@@ -0,0 +1,375 @@
1
+ ---
2
+ feature: Scheduled Actions Cron Endpoint API
3
+ priority: critical
4
+ tags: [api, feat-scheduled-actions, security, cron, regression]
5
+ grepTags: ["@api", "@feat-scheduled-actions"]
6
+ coverage: 10 tests
7
+ ---
8
+
9
+ # Scheduled Actions Cron Endpoint API
10
+
11
+ > API tests for the `/api/v1/cron/process` endpoint that processes pending scheduled actions. This endpoint requires CRON_SECRET authentication and handles batch processing with cleanup.
12
+
13
+ ## Endpoint Covered
14
+
15
+ | Endpoint | Method | Description |
16
+ |----------|--------|-------------|
17
+ | `/api/v1/cron/process` | GET | Process pending scheduled actions |
18
+
19
+ ---
20
+
21
+ ## @test SCHED_CRON_001: Should return 401 without CRON_SECRET header
22
+
23
+ ### Metadata
24
+ - **Priority:** Critical
25
+ - **Type:** Security
26
+ - **Tags:** api, scheduled-actions, authentication, 401
27
+ - **AC:** AC-3
28
+
29
+ ```gherkin:en
30
+ Scenario: Request without CRON_SECRET returns 401
31
+
32
+ Given I make a request without x-cron-secret header
33
+ When I make a GET request to /api/v1/cron/process
34
+ Then the response status should be 401
35
+ And the response body should have success false
36
+ And the error code should be INVALID_CRON_SECRET
37
+ ```
38
+
39
+ ```gherkin:es
40
+ Scenario: Solicitud sin CRON_SECRET retorna 401
41
+
42
+ Given hago una solicitud sin header x-cron-secret
43
+ When hago una solicitud GET a /api/v1/cron/process
44
+ Then el status de respuesta deberia ser 401
45
+ And el body deberia tener success false
46
+ And el codigo de error deberia ser INVALID_CRON_SECRET
47
+ ```
48
+
49
+ ---
50
+
51
+ ## @test SCHED_CRON_002: Should return 401 with invalid CRON_SECRET
52
+
53
+ ### Metadata
54
+ - **Priority:** Critical
55
+ - **Type:** Security
56
+ - **Tags:** api, scheduled-actions, authentication, invalid-secret
57
+ - **AC:** AC-3
58
+
59
+ ```gherkin:en
60
+ Scenario: Invalid CRON_SECRET returns 401
61
+
62
+ Given I have an invalid CRON_SECRET
63
+ When I make a GET request to /api/v1/cron/process
64
+ Then the response status should be 401
65
+ And the response body should have success false
66
+ And the error code should be INVALID_CRON_SECRET
67
+ ```
68
+
69
+ ```gherkin:es
70
+ Scenario: CRON_SECRET invalido retorna 401
71
+
72
+ Given tengo un CRON_SECRET invalido
73
+ When hago una solicitud GET a /api/v1/cron/process
74
+ Then el status de respuesta deberia ser 401
75
+ And el body deberia tener success false
76
+ And el codigo de error deberia ser INVALID_CRON_SECRET
77
+ ```
78
+
79
+ ---
80
+
81
+ ## @test SCHED_CRON_003: Should return 200 with valid CRON_SECRET
82
+
83
+ ### Metadata
84
+ - **Priority:** Critical
85
+ - **Type:** Smoke
86
+ - **Tags:** api, scheduled-actions, authentication
87
+ - **AC:** AC-3, AC-2
88
+
89
+ ```gherkin:en
90
+ Scenario: Valid CRON_SECRET is accepted
91
+
92
+ Given I have a valid CRON_SECRET
93
+ When I make a GET request to /api/v1/cron/process
94
+ Then the response status should be 200
95
+ And the response body should have success true
96
+ ```
97
+
98
+ ```gherkin:es
99
+ Scenario: CRON_SECRET valido es aceptado
100
+
101
+ Given tengo un CRON_SECRET valido
102
+ When hago una solicitud GET a /api/v1/cron/process
103
+ Then el status de respuesta deberia ser 200
104
+ And el body deberia tener success true
105
+ ```
106
+
107
+ ---
108
+
109
+ ## @test SCHED_CRON_010: Should return ProcessResult structure
110
+
111
+ ### Metadata
112
+ - **Priority:** Critical
113
+ - **Type:** Smoke
114
+ - **Tags:** api, scheduled-actions, response-structure
115
+ - **AC:** AC-2
116
+
117
+ ```gherkin:en
118
+ Scenario: Response contains ProcessResult structure
119
+
120
+ Given I have a valid CRON_SECRET
121
+ When I make a GET request to /api/v1/cron/process
122
+ Then the response status should be 200
123
+ And the data should contain processing object
124
+ And the data should contain cleanup object
125
+ And the data should contain executionTime
126
+ And processing should have processed, succeeded, failed, errors
127
+ And cleanup should have deletedCount
128
+ ```
129
+
130
+ ```gherkin:es
131
+ Scenario: Respuesta contiene estructura ProcessResult
132
+
133
+ Given tengo un CRON_SECRET valido
134
+ When hago una solicitud GET a /api/v1/cron/process
135
+ Then el status de respuesta deberia ser 200
136
+ And los datos deberian contener objeto processing
137
+ And los datos deberian contener objeto cleanup
138
+ And los datos deberian contener executionTime
139
+ And processing deberia tener processed, succeeded, failed, errors
140
+ And cleanup deberia tener deletedCount
141
+ ```
142
+
143
+ ---
144
+
145
+ ## @test SCHED_CRON_011: Should include execution time in response
146
+
147
+ ### Metadata
148
+ - **Priority:** Normal
149
+ - **Type:** Functional
150
+ - **Tags:** api, scheduled-actions, metrics
151
+
152
+ ```gherkin:en
153
+ Scenario: Response includes execution time
154
+
155
+ Given I have a valid CRON_SECRET
156
+ When I make a GET request to /api/v1/cron/process
157
+ Then the response should include execution time metadata
158
+ ```
159
+
160
+ ```gherkin:es
161
+ Scenario: Respuesta incluye tiempo de ejecucion
162
+
163
+ Given tengo un CRON_SECRET valido
164
+ When hago una solicitud GET a /api/v1/cron/process
165
+ Then la respuesta deberia incluir metadata de tiempo de ejecucion
166
+ ```
167
+
168
+ ---
169
+
170
+ ## @test SCHED_CRON_020: Should process at most 10 actions per run
171
+
172
+ ### Metadata
173
+ - **Priority:** Critical
174
+ - **Type:** Functional
175
+ - **Tags:** api, scheduled-actions, batch-processing
176
+ - **AC:** AC-20
177
+
178
+ ```gherkin:en
179
+ Scenario: Batch size limited to 10 actions
180
+
181
+ Given I have a valid CRON_SECRET
182
+ When I make a GET request to /api/v1/cron/process
183
+ Then the processed count should be at most 10
184
+ ```
185
+
186
+ ```gherkin:es
187
+ Scenario: Tamano de batch limitado a 10 acciones
188
+
189
+ Given tengo un CRON_SECRET valido
190
+ When hago una solicitud GET a /api/v1/cron/process
191
+ Then el conteo de procesados deberia ser maximo 10
192
+ ```
193
+
194
+ ---
195
+
196
+ ## @test SCHED_CRON_030: Should handle CRON_SECRET not configured
197
+
198
+ ### Metadata
199
+ - **Priority:** Critical
200
+ - **Type:** Error Handling
201
+ - **Tags:** api, scheduled-actions, configuration
202
+
203
+ ```gherkin:en
204
+ Scenario: Handles missing CRON_SECRET configuration
205
+
206
+ Given CRON_SECRET is not configured in environment
207
+ When I make a GET request to /api/v1/cron/process
208
+ Then the response status should be 500
209
+ And the error code should be CRON_SECRET_NOT_CONFIGURED
210
+ ```
211
+
212
+ ```gherkin:es
213
+ Scenario: Maneja configuracion faltante de CRON_SECRET
214
+
215
+ Given CRON_SECRET no esta configurado en el entorno
216
+ When hago una solicitud GET a /api/v1/cron/process
217
+ Then el status de respuesta deberia ser 500
218
+ And el codigo de error deberia ser CRON_SECRET_NOT_CONFIGURED
219
+ ```
220
+
221
+ ---
222
+
223
+ ## @test SCHED_CRON_031: Should reject POST method
224
+
225
+ ### Metadata
226
+ - **Priority:** Normal
227
+ - **Type:** Security
228
+ - **Tags:** api, scheduled-actions, method-validation
229
+
230
+ ```gherkin:en
231
+ Scenario: POST method is rejected
232
+
233
+ Given I have a valid CRON_SECRET
234
+ When I make a POST request to /api/v1/cron/process
235
+ Then the response status should be 405
236
+ ```
237
+
238
+ ```gherkin:es
239
+ Scenario: Metodo POST es rechazado
240
+
241
+ Given tengo un CRON_SECRET valido
242
+ When hago una solicitud POST a /api/v1/cron/process
243
+ Then el status de respuesta deberia ser 405
244
+ ```
245
+
246
+ ---
247
+
248
+ ## @test SCHED_CRON_032: Should handle empty pending actions gracefully
249
+
250
+ ### Metadata
251
+ - **Priority:** Normal
252
+ - **Type:** Functional
253
+ - **Tags:** api, scheduled-actions, empty-queue
254
+ - **AC:** AC-2
255
+
256
+ ```gherkin:en
257
+ Scenario: Empty queue handled gracefully
258
+
259
+ Given I have a valid CRON_SECRET
260
+ And there are no pending scheduled actions
261
+ When I make a GET request to /api/v1/cron/process
262
+ Then the response status should be 200
263
+ And the processed count should be 0
264
+ ```
265
+
266
+ ```gherkin:es
267
+ Scenario: Cola vacia manejada correctamente
268
+
269
+ Given tengo un CRON_SECRET valido
270
+ And no hay acciones programadas pendientes
271
+ When hago una solicitud GET a /api/v1/cron/process
272
+ Then el status de respuesta deberia ser 200
273
+ And el conteo de procesados deberia ser 0
274
+ ```
275
+
276
+ ---
277
+
278
+ ## @test SCHED_CRON_100: Should be idempotent - multiple calls safe
279
+
280
+ ### Metadata
281
+ - **Priority:** Critical
282
+ - **Type:** Integration
283
+ - **Tags:** api, scheduled-actions, idempotency
284
+ - **AC:** AC-2
285
+
286
+ ```gherkin:en
287
+ Scenario: Multiple calls are idempotent
288
+
289
+ Given I have a valid CRON_SECRET
290
+ When I make a GET request to /api/v1/cron/process
291
+ And I make another GET request immediately
292
+ Then both responses should be successful
293
+ And no duplicate processing should occur
294
+ ```
295
+
296
+ ```gherkin:es
297
+ Scenario: Multiples llamadas son idempotentes
298
+
299
+ Given tengo un CRON_SECRET valido
300
+ When hago una solicitud GET a /api/v1/cron/process
301
+ And hago otra solicitud GET inmediatamente
302
+ Then ambas respuestas deberian ser exitosas
303
+ And no deberia ocurrir procesamiento duplicado
304
+ ```
305
+
306
+ ---
307
+
308
+ ## Response Format
309
+
310
+ ### Success Response (200)
311
+
312
+ ```json
313
+ {
314
+ "success": true,
315
+ "data": {
316
+ "processing": {
317
+ "processed": 5,
318
+ "succeeded": 4,
319
+ "failed": 1,
320
+ "errors": [
321
+ { "id": "abc123", "error": "Webhook timeout" }
322
+ ]
323
+ },
324
+ "cleanup": {
325
+ "deletedCount": 2
326
+ },
327
+ "executionTime": 1250
328
+ }
329
+ }
330
+ ```
331
+
332
+ ### Error Response (401)
333
+
334
+ ```json
335
+ {
336
+ "success": false,
337
+ "error": "Unauthorized",
338
+ "code": "INVALID_CRON_SECRET"
339
+ }
340
+ ```
341
+
342
+ ### Error Response (500)
343
+
344
+ ```json
345
+ {
346
+ "success": false,
347
+ "error": "CRON_SECRET environment variable is not configured",
348
+ "code": "CRON_SECRET_NOT_CONFIGURED"
349
+ }
350
+ ```
351
+
352
+ ---
353
+
354
+ ## Test Summary
355
+
356
+ | Test ID | Description | Priority | AC |
357
+ |---------|-------------|----------|-----|
358
+ | SCHED_CRON_001 | 401 without CRON_SECRET | Critical | AC-3 |
359
+ | SCHED_CRON_002 | 401 with invalid CRON_SECRET | Critical | AC-3 |
360
+ | SCHED_CRON_003 | 200 with valid CRON_SECRET | Critical | AC-3, AC-2 |
361
+ | SCHED_CRON_010 | ProcessResult structure | Critical | AC-2 |
362
+ | SCHED_CRON_011 | Execution time included | Normal | - |
363
+ | SCHED_CRON_020 | Batch limited to 10 | Critical | AC-20 |
364
+ | SCHED_CRON_030 | CRON_SECRET not configured | Critical | - |
365
+ | SCHED_CRON_031 | POST method rejected | Normal | - |
366
+ | SCHED_CRON_032 | Empty queue handled | Normal | AC-2 |
367
+ | SCHED_CRON_100 | Idempotency | Critical | AC-2 |
368
+
369
+ ---
370
+
371
+ ## Environment Variables Required
372
+
373
+ | Variable | Description |
374
+ |----------|-------------|
375
+ | `CRON_SECRET` | Secret key for cron endpoint authentication (min 32 chars) |