@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,649 @@
1
+ ---
2
+ feature: Scheduled Actions Scheduling API
3
+ priority: critical
4
+ tags: [api, feat-scheduled-actions, scheduling, lifecycle, regression]
5
+ grepTags: ["@api", "@feat-scheduled-actions"]
6
+ coverage: 22 tests
7
+ ---
8
+
9
+ # Scheduled Actions Scheduling API
10
+
11
+ > Documentation tests for the scheduled-actions library. These tests verify the scheduling API, status transitions, error handling, and registry functions through documented behavior.
12
+
13
+ ## Functions Covered
14
+
15
+ | Function | Description |
16
+ |----------|-------------|
17
+ | `scheduleAction(actionType, payload, options)` | Schedule one-time action |
18
+ | `scheduleRecurringAction(actionType, payload, interval, options)` | Schedule recurring action |
19
+ | `registerScheduledAction(name, handler, options)` | Register action handler |
20
+ | `getAllRegisteredActions()` | List registered actions |
21
+ | `isActionRegistered(name)` | Check if action is registered |
22
+ | `cleanupOldActions(retentionDays)` | Cleanup old actions |
23
+
24
+ ---
25
+
26
+ ## @test SCHED_DB_001: Should have scheduledActions table available
27
+
28
+ ### Metadata
29
+ - **Priority:** Critical
30
+ - **Type:** Infrastructure
31
+ - **Tags:** api, scheduled-actions, database
32
+ - **AC:** AC-1
33
+
34
+ ```gherkin:en
35
+ Scenario: Database table exists
36
+
37
+ Given the application is deployed
38
+ Then the scheduledActions table should exist
39
+ And it should have required columns: id, teamId, actionType, status, payload, scheduledAt
40
+ ```
41
+
42
+ ```gherkin:es
43
+ Scenario: Tabla de base de datos existe
44
+
45
+ Given la aplicacion esta desplegada
46
+ Then la tabla scheduledActions deberia existir
47
+ And deberia tener columnas requeridas: id, teamId, actionType, status, payload, scheduledAt
48
+ ```
49
+
50
+ ---
51
+
52
+ ## @test SCHED_SCHEDULE_010: Should schedule one-time action
53
+
54
+ ### Metadata
55
+ - **Priority:** Critical
56
+ - **Type:** Functional
57
+ - **Tags:** api, scheduled-actions, one-time
58
+ - **AC:** AC-4
59
+
60
+ ```gherkin:en
61
+ Scenario: Schedule one-time action
62
+
63
+ Given I have a valid action type
64
+ When I call scheduleAction(actionType, payload, options)
65
+ Then a new action should be created
66
+ And the status should be pending
67
+ And the action ID should be returned
68
+ ```
69
+
70
+ ```gherkin:es
71
+ Scenario: Programar accion unica
72
+
73
+ Given tengo un tipo de accion valido
74
+ When llamo scheduleAction(actionType, payload, options)
75
+ Then una nueva accion deberia crearse
76
+ And el status deberia ser pending
77
+ And el ID de la accion deberia retornarse
78
+ ```
79
+
80
+ ---
81
+
82
+ ## @test SCHED_SCHEDULE_011: Should default to immediate execution when no scheduledAt
83
+
84
+ ### Metadata
85
+ - **Priority:** Normal
86
+ - **Type:** Functional
87
+ - **Tags:** api, scheduled-actions, defaults
88
+ - **AC:** AC-4
89
+
90
+ ```gherkin:en
91
+ Scenario: Default scheduledAt is NOW()
92
+
93
+ Given I call scheduleAction without scheduledAt option
94
+ Then the action should be scheduled for immediate processing
95
+ And scheduledAt should default to current time
96
+ ```
97
+
98
+ ```gherkin:es
99
+ Scenario: scheduledAt por defecto es NOW()
100
+
101
+ Given llamo scheduleAction sin opcion scheduledAt
102
+ Then la accion deberia programarse para procesamiento inmediato
103
+ And scheduledAt deberia ser el tiempo actual por defecto
104
+ ```
105
+
106
+ ---
107
+
108
+ ## @test SCHED_SCHEDULE_020: Should schedule recurring action
109
+
110
+ ### Metadata
111
+ - **Priority:** Critical
112
+ - **Type:** Functional
113
+ - **Tags:** api, scheduled-actions, recurring
114
+ - **AC:** AC-5
115
+
116
+ ```gherkin:en
117
+ Scenario: Schedule recurring action
118
+
119
+ Given I have a valid action type
120
+ When I call scheduleRecurringAction(actionType, payload, interval, options)
121
+ Then a recurring action should be created
122
+ And it should create a new action after completion
123
+ ```
124
+
125
+ ```gherkin:es
126
+ Scenario: Programar accion recurrente
127
+
128
+ Given tengo un tipo de accion valido
129
+ When llamo scheduleRecurringAction(actionType, payload, interval, options)
130
+ Then una accion recurrente deberia crearse
131
+ And deberia crear una nueva accion despues de completar
132
+ ```
133
+
134
+ ---
135
+
136
+ ## @test SCHED_SCHEDULE_021: Should support hourly recurring interval
137
+
138
+ ### Metadata
139
+ - **Priority:** Normal
140
+ - **Type:** Functional
141
+ - **Tags:** api, scheduled-actions, recurring, hourly
142
+ - **AC:** AC-5
143
+
144
+ ```gherkin:en
145
+ Scenario: Hourly recurring interval
146
+
147
+ Given I schedule a recurring action with interval "hourly"
148
+ Then the next action should be scheduled +1 hour from completion
149
+ ```
150
+
151
+ ```gherkin:es
152
+ Scenario: Intervalo recurrente por hora
153
+
154
+ Given programo una accion recurrente con intervalo "hourly"
155
+ Then la siguiente accion deberia programarse +1 hora desde la completacion
156
+ ```
157
+
158
+ ---
159
+
160
+ ## @test SCHED_SCHEDULE_022: Should support daily recurring interval
161
+
162
+ ### Metadata
163
+ - **Priority:** Normal
164
+ - **Type:** Functional
165
+ - **Tags:** api, scheduled-actions, recurring, daily
166
+ - **AC:** AC-5
167
+
168
+ ```gherkin:en
169
+ Scenario: Daily recurring interval
170
+
171
+ Given I schedule a recurring action with interval "daily"
172
+ Then the next action should be scheduled +1 day from completion
173
+ ```
174
+
175
+ ```gherkin:es
176
+ Scenario: Intervalo recurrente diario
177
+
178
+ Given programo una accion recurrente con intervalo "daily"
179
+ Then la siguiente accion deberia programarse +1 dia desde la completacion
180
+ ```
181
+
182
+ ---
183
+
184
+ ## @test SCHED_SCHEDULE_023: Should support weekly recurring interval
185
+
186
+ ### Metadata
187
+ - **Priority:** Normal
188
+ - **Type:** Functional
189
+ - **Tags:** api, scheduled-actions, recurring, weekly
190
+ - **AC:** AC-5
191
+
192
+ ```gherkin:en
193
+ Scenario: Weekly recurring interval
194
+
195
+ Given I schedule a recurring action with interval "weekly"
196
+ Then the next action should be scheduled +7 days from completion
197
+ ```
198
+
199
+ ```gherkin:es
200
+ Scenario: Intervalo recurrente semanal
201
+
202
+ Given programo una accion recurrente con intervalo "weekly"
203
+ Then la siguiente accion deberia programarse +7 dias desde la completacion
204
+ ```
205
+
206
+ ---
207
+
208
+ ## @test SCHED_STATUS_030: Should start with pending status
209
+
210
+ ### Metadata
211
+ - **Priority:** Critical
212
+ - **Type:** Functional
213
+ - **Tags:** api, scheduled-actions, status
214
+ - **AC:** AC-4
215
+
216
+ ```gherkin:en
217
+ Scenario: Initial status is pending
218
+
219
+ Given I schedule a new action
220
+ Then the status should be "pending"
221
+ And the processor will pick it up on next run
222
+ ```
223
+
224
+ ```gherkin:es
225
+ Scenario: Status inicial es pending
226
+
227
+ Given programo una nueva accion
228
+ Then el status deberia ser "pending"
229
+ And el procesador la tomara en la siguiente ejecucion
230
+ ```
231
+
232
+ ---
233
+
234
+ ## @test SCHED_STATUS_031: Should transition to running when processing
235
+
236
+ ### Metadata
237
+ - **Priority:** Critical
238
+ - **Type:** Functional
239
+ - **Tags:** api, scheduled-actions, status, transition
240
+ - **AC:** AC-2
241
+
242
+ ```gherkin:en
243
+ Scenario: Status transitions to running
244
+
245
+ Given a pending action is picked up by the processor
246
+ Then the status should change to "running"
247
+ And this prevents duplicate processing
248
+ ```
249
+
250
+ ```gherkin:es
251
+ Scenario: Status cambia a running
252
+
253
+ Given una accion pending es tomada por el procesador
254
+ Then el status deberia cambiar a "running"
255
+ And esto previene procesamiento duplicado
256
+ ```
257
+
258
+ ---
259
+
260
+ ## @test SCHED_STATUS_032: Should transition to completed on success
261
+
262
+ ### Metadata
263
+ - **Priority:** Critical
264
+ - **Type:** Functional
265
+ - **Tags:** api, scheduled-actions, status, success
266
+ - **AC:** AC-7
267
+
268
+ ```gherkin:en
269
+ Scenario: Status transitions to completed on success
270
+
271
+ Given a running action executes successfully
272
+ Then the status should change to "completed"
273
+ And AC-7 completed actions are marked correctly
274
+ ```
275
+
276
+ ```gherkin:es
277
+ Scenario: Status cambia a completed en exito
278
+
279
+ Given una accion running se ejecuta exitosamente
280
+ Then el status deberia cambiar a "completed"
281
+ And AC-7 acciones completadas se marcan correctamente
282
+ ```
283
+
284
+ ---
285
+
286
+ ## @test SCHED_STATUS_033: Should transition to failed on error
287
+
288
+ ### Metadata
289
+ - **Priority:** Critical
290
+ - **Type:** Functional
291
+ - **Tags:** api, scheduled-actions, status, error
292
+ - **AC:** AC-6
293
+
294
+ ```gherkin:en
295
+ Scenario: Status transitions to failed on error
296
+
297
+ Given a running action encounters an error
298
+ Then the status should change to "failed"
299
+ And the error message should be stored
300
+ And AC-6 failed actions are marked with error message
301
+ ```
302
+
303
+ ```gherkin:es
304
+ Scenario: Status cambia a failed en error
305
+
306
+ Given una accion running encuentra un error
307
+ Then el status deberia cambiar a "failed"
308
+ And el mensaje de error deberia guardarse
309
+ And AC-6 acciones fallidas se marcan con mensaje de error
310
+ ```
311
+
312
+ ---
313
+
314
+ ## @test SCHED_ERROR_040: Should store error message on failure
315
+
316
+ ### Metadata
317
+ - **Priority:** Critical
318
+ - **Type:** Error Handling
319
+ - **Tags:** api, scheduled-actions, error
320
+ - **AC:** AC-6
321
+
322
+ ```gherkin:en
323
+ Scenario: Error message is stored
324
+
325
+ Given an action fails during processing
326
+ Then the error message should be stored in errorMessage column
327
+ And it should contain the error stack trace or message
328
+ And it should be available for debugging
329
+ ```
330
+
331
+ ```gherkin:es
332
+ Scenario: Mensaje de error se almacena
333
+
334
+ Given una accion falla durante el procesamiento
335
+ Then el mensaje de error deberia guardarse en la columna errorMessage
336
+ And deberia contener el stack trace o mensaje de error
337
+ And deberia estar disponible para debugging
338
+ ```
339
+
340
+ ---
341
+
342
+ ## @test SCHED_ERROR_041: Should handle unknown action types
343
+
344
+ ### Metadata
345
+ - **Priority:** Critical
346
+ - **Type:** Error Handling
347
+ - **Tags:** api, scheduled-actions, unknown-action
348
+ - **AC:** AC-10
349
+
350
+ ```gherkin:en
351
+ Scenario: Unknown action types are handled
352
+
353
+ Given an action has an unregistered action type
354
+ When the processor tries to execute it
355
+ Then the action should fail
356
+ And the error should be "No handler registered for action: unknown:action"
357
+ ```
358
+
359
+ ```gherkin:es
360
+ Scenario: Tipos de accion desconocidos se manejan
361
+
362
+ Given una accion tiene un tipo de accion no registrado
363
+ When el procesador intenta ejecutarla
364
+ Then la accion deberia fallar
365
+ And el error deberia ser "No handler registered for action: unknown:action"
366
+ ```
367
+
368
+ ---
369
+
370
+ ## @test SCHED_ERROR_042: Should handle timeout protection
371
+
372
+ ### Metadata
373
+ - **Priority:** Critical
374
+ - **Type:** Error Handling
375
+ - **Tags:** api, scheduled-actions, timeout
376
+ - **AC:** AC-21
377
+
378
+ ```gherkin:en
379
+ Scenario: Timeout protection implemented
380
+
381
+ Given an action handler takes too long
382
+ When the timeout is exceeded (default 30 seconds)
383
+ Then the action should fail
384
+ And the error should be "Action timed out after 30000ms"
385
+ ```
386
+
387
+ ```gherkin:es
388
+ Scenario: Proteccion de timeout implementada
389
+
390
+ Given un handler de accion toma demasiado tiempo
391
+ When el timeout es excedido (default 30 segundos)
392
+ Then la accion deberia fallar
393
+ And el error deberia ser "Action timed out after 30000ms"
394
+ ```
395
+
396
+ ---
397
+
398
+ ## @test SCHED_REGISTRY_050: Should provide registry function
399
+
400
+ ### Metadata
401
+ - **Priority:** Critical
402
+ - **Type:** Functional
403
+ - **Tags:** api, scheduled-actions, registry
404
+ - **AC:** AC-8
405
+
406
+ ```gherkin:en
407
+ Scenario: Registry function is provided
408
+
409
+ Given the scheduled-actions library is available
410
+ Then registerScheduledAction function should be exported
411
+ And it should accept name, handler, and options parameters
412
+ ```
413
+
414
+ ```gherkin:es
415
+ Scenario: Funcion de registro es proporcionada
416
+
417
+ Given la libreria scheduled-actions esta disponible
418
+ Then la funcion registerScheduledAction deberia exportarse
419
+ And deberia aceptar parametros name, handler y options
420
+ ```
421
+
422
+ ---
423
+
424
+ ## @test SCHED_REGISTRY_051: Should allow handler registration
425
+
426
+ ### Metadata
427
+ - **Priority:** Critical
428
+ - **Type:** Functional
429
+ - **Tags:** api, scheduled-actions, handler
430
+ - **AC:** AC-9
431
+
432
+ ```gherkin:en
433
+ Scenario: Handlers can be registered
434
+
435
+ Given I want to register a new action handler
436
+ When I call registerScheduledAction(name, handler, options)
437
+ Then the handler should be registered
438
+ And it should be available for processing
439
+ ```
440
+
441
+ ```gherkin:es
442
+ Scenario: Handlers pueden registrarse
443
+
444
+ Given quiero registrar un nuevo handler de accion
445
+ When llamo registerScheduledAction(name, handler, options)
446
+ Then el handler deberia registrarse
447
+ And deberia estar disponible para procesamiento
448
+ ```
449
+
450
+ ---
451
+
452
+ ## @test SCHED_REGISTRY_052: Should list registered actions
453
+
454
+ ### Metadata
455
+ - **Priority:** Normal
456
+ - **Type:** Functional
457
+ - **Tags:** api, scheduled-actions, registry
458
+ - **AC:** AC-8
459
+
460
+ ```gherkin:en
461
+ Scenario: Can list registered actions
462
+
463
+ Given actions have been registered
464
+ When I call getAllRegisteredActions()
465
+ Then I should receive an array of action names
466
+ And it should be usable for DevTools UI and monitoring
467
+ ```
468
+
469
+ ```gherkin:es
470
+ Scenario: Puede listar acciones registradas
471
+
472
+ Given se han registrado acciones
473
+ When llamo getAllRegisteredActions()
474
+ Then deberia recibir un array de nombres de acciones
475
+ And deberia ser usable para DevTools UI y monitoreo
476
+ ```
477
+
478
+ ---
479
+
480
+ ## @test SCHED_REGISTRY_053: Should check if action is registered
481
+
482
+ ### Metadata
483
+ - **Priority:** Normal
484
+ - **Type:** Functional
485
+ - **Tags:** api, scheduled-actions, validation
486
+ - **AC:** AC-8
487
+
488
+ ```gherkin:en
489
+ Scenario: Can check if action is registered
490
+
491
+ Given I want to validate an action type
492
+ When I call isActionRegistered(name)
493
+ Then I should receive a boolean
494
+ And this can be used for validation before scheduling
495
+ ```
496
+
497
+ ```gherkin:es
498
+ Scenario: Puede verificar si accion esta registrada
499
+
500
+ Given quiero validar un tipo de accion
501
+ When llamo isActionRegistered(name)
502
+ Then deberia recibir un boolean
503
+ And esto puede usarse para validacion antes de programar
504
+ ```
505
+
506
+ ---
507
+
508
+ ## @test SCHED_CLEANUP_060: Should cleanup old completed actions
509
+
510
+ ### Metadata
511
+ - **Priority:** Normal
512
+ - **Type:** Maintenance
513
+ - **Tags:** api, scheduled-actions, cleanup
514
+
515
+ ```gherkin:en
516
+ Scenario: Old actions are cleaned up
517
+
518
+ Given there are old completed and failed actions
519
+ When cleanupOldActions is called (default 7 days retention)
520
+ Then actions older than retention period should be deleted
521
+ And this is called automatically by the cron endpoint
522
+ ```
523
+
524
+ ```gherkin:es
525
+ Scenario: Acciones antiguas se limpian
526
+
527
+ Given hay acciones completadas y fallidas antiguas
528
+ When se llama cleanupOldActions (default 7 dias retencion)
529
+ Then acciones mas antiguas que el periodo de retencion deberian eliminarse
530
+ And esto se llama automaticamente por el endpoint cron
531
+ ```
532
+
533
+ ---
534
+
535
+ ## @test SCHED_CLEANUP_061: Should preserve pending and running actions
536
+
537
+ ### Metadata
538
+ - **Priority:** Critical
539
+ - **Type:** Safety
540
+ - **Tags:** api, scheduled-actions, cleanup, safety
541
+
542
+ ```gherkin:en
543
+ Scenario: Active actions are preserved
544
+
545
+ Given cleanup is running
546
+ Then only completed and failed actions should be affected
547
+ And pending and running actions should never be deleted
548
+ And this ensures no active actions are lost
549
+ ```
550
+
551
+ ```gherkin:es
552
+ Scenario: Acciones activas se preservan
553
+
554
+ Given el cleanup esta ejecutandose
555
+ Then solo acciones completed y failed deberian afectarse
556
+ And acciones pending y running nunca deberian eliminarse
557
+ And esto asegura que no se pierdan acciones activas
558
+ ```
559
+
560
+ ---
561
+
562
+ ## @test SCHED_FLOW_100: Should complete full action lifecycle
563
+
564
+ ### Metadata
565
+ - **Priority:** Critical
566
+ - **Type:** Integration
567
+ - **Tags:** api, scheduled-actions, lifecycle
568
+ - **AC:** AC-4, AC-6, AC-7
569
+
570
+ ```gherkin:en
571
+ Scenario: Full action lifecycle
572
+
573
+ Given I schedule a new action
574
+ When the cron processes it
575
+ Then the lifecycle should be:
576
+ 1. SCHEDULE: status = pending
577
+ 2. PROCESS: status = running
578
+ 3. EXECUTE: handler is called
579
+ 4. COMPLETE: status = completed OR failed
580
+ ```
581
+
582
+ ```gherkin:es
583
+ Scenario: Ciclo de vida completo de accion
584
+
585
+ Given programo una nueva accion
586
+ When el cron la procesa
587
+ Then el ciclo de vida deberia ser:
588
+ 1. SCHEDULE: status = pending
589
+ 2. PROCESS: status = running
590
+ 3. EXECUTE: handler es llamado
591
+ 4. COMPLETE: status = completed O failed
592
+ ```
593
+
594
+ ---
595
+
596
+ ## @test SCHED_FLOW_101: Should handle recurring action lifecycle
597
+
598
+ ### Metadata
599
+ - **Priority:** Critical
600
+ - **Type:** Integration
601
+ - **Tags:** api, scheduled-actions, recurring, lifecycle
602
+ - **AC:** AC-5
603
+
604
+ ```gherkin:en
605
+ Scenario: Recurring action lifecycle
606
+
607
+ Given I schedule a recurring action
608
+ When the action completes successfully
609
+ Then a new action should be scheduled
610
+ And the interval should determine the next scheduledAt
611
+ ```
612
+
613
+ ```gherkin:es
614
+ Scenario: Ciclo de vida de accion recurrente
615
+
616
+ Given programo una accion recurrente
617
+ When la accion se completa exitosamente
618
+ Then una nueva accion deberia programarse
619
+ And el intervalo deberia determinar el siguiente scheduledAt
620
+ ```
621
+
622
+ ---
623
+
624
+ ## Test Summary
625
+
626
+ | Test ID | Description | Priority | AC |
627
+ |---------|-------------|----------|-----|
628
+ | SCHED_DB_001 | Database table exists | Critical | AC-1 |
629
+ | SCHED_SCHEDULE_010 | One-time scheduling | Critical | AC-4 |
630
+ | SCHED_SCHEDULE_011 | Default scheduledAt | Normal | AC-4 |
631
+ | SCHED_SCHEDULE_020 | Recurring scheduling | Critical | AC-5 |
632
+ | SCHED_SCHEDULE_021 | Hourly interval | Normal | AC-5 |
633
+ | SCHED_SCHEDULE_022 | Daily interval | Normal | AC-5 |
634
+ | SCHED_SCHEDULE_023 | Weekly interval | Normal | AC-5 |
635
+ | SCHED_STATUS_030 | Initial pending status | Critical | AC-4 |
636
+ | SCHED_STATUS_031 | Running transition | Critical | AC-2 |
637
+ | SCHED_STATUS_032 | Completed transition | Critical | AC-7 |
638
+ | SCHED_STATUS_033 | Failed transition | Critical | AC-6 |
639
+ | SCHED_ERROR_040 | Error message storage | Critical | AC-6 |
640
+ | SCHED_ERROR_041 | Unknown action handling | Critical | AC-10 |
641
+ | SCHED_ERROR_042 | Timeout protection | Critical | AC-21 |
642
+ | SCHED_REGISTRY_050 | Registry function | Critical | AC-8 |
643
+ | SCHED_REGISTRY_051 | Handler registration | Critical | AC-9 |
644
+ | SCHED_REGISTRY_052 | List registered actions | Normal | AC-8 |
645
+ | SCHED_REGISTRY_053 | Check registration | Normal | AC-8 |
646
+ | SCHED_CLEANUP_060 | Cleanup old actions | Normal | - |
647
+ | SCHED_CLEANUP_061 | Preserve active actions | Critical | - |
648
+ | SCHED_FLOW_100 | Full lifecycle | Critical | AC-4, AC-6, AC-7 |
649
+ | SCHED_FLOW_101 | Recurring lifecycle | Critical | AC-5 |