@nextsparkjs/theme-default 0.1.0-beta.2 → 0.1.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +8 -4
- package/templates/(public)/page.tsx +1 -1
- package/tests/cypress/e2e/_devtools/access.bdd.md +262 -0
- package/tests/cypress/e2e/_devtools/access.cy.ts +171 -0
- package/tests/cypress/e2e/_devtools/navigation.bdd.md +261 -0
- package/tests/cypress/e2e/_devtools/navigation.cy.ts +157 -0
- package/tests/cypress/e2e/_devtools/pages.bdd.md +303 -0
- package/tests/cypress/e2e/_devtools/pages.cy.ts +184 -0
- package/tests/cypress/e2e/_docs/README.md +215 -0
- package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin-teams.narration.json +155 -0
- package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin.cy.ts +390 -0
- package/tests/cypress/e2e/_docs/tutorials/teams-system.doc.cy.ts +349 -0
- package/tests/cypress/e2e/_docs/tutorials/teams-system.narration.json +165 -0
- package/tests/cypress/e2e/_selectors/auth.cy.ts +306 -0
- package/tests/cypress/e2e/_selectors/billing.cy.ts +89 -0
- package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +113 -0
- package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +89 -0
- package/tests/cypress/e2e/_selectors/dashboard-sidebar.cy.ts +60 -0
- package/tests/cypress/e2e/_selectors/dashboard-topnav.cy.ts +146 -0
- package/tests/cypress/e2e/_selectors/devtools.cy.ts +210 -0
- package/tests/cypress/e2e/_selectors/global-search.cy.ts +88 -0
- package/tests/cypress/e2e/_selectors/pages-editor.cy.ts +179 -0
- package/tests/cypress/e2e/_selectors/posts-editor.cy.ts +282 -0
- package/tests/cypress/e2e/_selectors/public.cy.ts +112 -0
- package/tests/cypress/e2e/_selectors/settings-api-keys.cy.ts +228 -0
- package/tests/cypress/e2e/_selectors/settings-billing.cy.ts +105 -0
- package/tests/cypress/e2e/_selectors/settings-layout.cy.ts +119 -0
- package/tests/cypress/e2e/_selectors/settings-password.cy.ts +71 -0
- package/tests/cypress/e2e/_selectors/settings-profile.cy.ts +82 -0
- package/tests/cypress/e2e/_selectors/settings-teams.cy.ts +68 -0
- package/tests/cypress/e2e/_selectors/superadmin.cy.ts +185 -0
- package/tests/cypress/e2e/_selectors/tasks.cy.ts +242 -0
- package/tests/cypress/e2e/_selectors/taxonomies.cy.ts +126 -0
- package/tests/cypress/e2e/_selectors/teams.cy.ts +142 -0
- package/tests/cypress/e2e/_superadmin/all-teams.bdd.md +261 -0
- package/tests/cypress/e2e/_superadmin/all-teams.cy.ts +177 -0
- package/tests/cypress/e2e/_superadmin/all-users.bdd.md +406 -0
- package/tests/cypress/e2e/_superadmin/all-users.cy.ts +294 -0
- package/tests/cypress/e2e/_superadmin/dashboard.bdd.md +235 -0
- package/tests/cypress/e2e/_superadmin/dashboard.cy.ts +149 -0
- package/tests/cypress/e2e/_superadmin/subscriptions-overview.bdd.md +290 -0
- package/tests/cypress/e2e/_superadmin/subscriptions-overview.cy.ts +194 -0
- package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
- package/tests/cypress/e2e/ai/chat-api.cy.ts +107 -0
- package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
- package/tests/cypress/e2e/api/billing/BillingAPIController.js +319 -0
- package/tests/cypress/e2e/api/billing/check-action.cy.ts +326 -0
- package/tests/cypress/e2e/api/billing/checkout.cy.ts +358 -0
- package/tests/cypress/e2e/api/billing/lifecycle.cy.ts +423 -0
- package/tests/cypress/e2e/api/billing/plans/README.md +345 -0
- package/tests/cypress/e2e/api/billing/plans/business.cy.ts +412 -0
- package/tests/cypress/e2e/api/billing/plans/downgrade.cy.ts +510 -0
- package/tests/cypress/e2e/api/billing/plans/fixtures/billing-plans.json +163 -0
- package/tests/cypress/e2e/api/billing/plans/free.cy.ts +500 -0
- package/tests/cypress/e2e/api/billing/plans/pro.cy.ts +497 -0
- package/tests/cypress/e2e/api/billing/plans/starter.cy.ts +342 -0
- package/tests/cypress/e2e/api/billing/portal.cy.ts +313 -0
- package/tests/cypress/e2e/api/devtools/registries.bdd.md +300 -0
- package/tests/cypress/e2e/api/devtools/registries.cy.ts +368 -0
- package/tests/cypress/e2e/api/entities/blocks-scope.cy.ts +396 -0
- package/tests/cypress/e2e/api/entities/customers-crud.cy.ts +648 -0
- package/tests/cypress/e2e/api/entities/customers-metas.cy.ts +839 -0
- package/tests/cypress/e2e/api/entities/pages-crud.cy.ts +425 -0
- package/tests/cypress/e2e/api/entities/pages-status.cy.ts +335 -0
- package/tests/cypress/e2e/api/entities/post-categories-crud.cy.ts +610 -0
- package/tests/cypress/e2e/api/entities/posts-crud.cy.ts +709 -0
- package/tests/cypress/e2e/api/entities/posts-status.cy.ts +396 -0
- package/tests/cypress/e2e/api/entities/tasks-crud.cy.ts +602 -0
- package/tests/cypress/e2e/api/entities/tasks-metas.cy.ts +878 -0
- package/tests/cypress/e2e/api/entities/users-crud.cy.ts +469 -0
- package/tests/cypress/e2e/api/entities/users-metas.cy.ts +913 -0
- package/tests/cypress/e2e/api/entities/users-security.cy.ts +375 -0
- package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.bdd.md +375 -0
- package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.cy.ts +346 -0
- package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.bdd.md +451 -0
- package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.cy.ts +447 -0
- package/tests/cypress/e2e/api/scheduled-actions/scheduling.bdd.md +649 -0
- package/tests/cypress/e2e/api/scheduled-actions/scheduling.cy.ts +333 -0
- package/tests/cypress/e2e/api/settings/api-keys.crud.cy.ts +923 -0
- package/tests/cypress/e2e/uat/auth/app-roles/developer-login.bdd.md +231 -0
- package/tests/cypress/e2e/uat/auth/app-roles/developer-login.cy.ts +144 -0
- package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.bdd.md +118 -0
- package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.cy.ts +84 -0
- package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.bdd.md +288 -0
- package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.cy.ts +188 -0
- package/tests/cypress/e2e/uat/auth/login-logout.bdd.md +160 -0
- package/tests/cypress/e2e/uat/auth/login-logout.cy.ts +116 -0
- package/tests/cypress/e2e/uat/auth/password-reset.bdd.md +289 -0
- package/tests/cypress/e2e/uat/auth/password-reset.cy.ts +200 -0
- package/tests/cypress/e2e/uat/auth/team-roles/admin-login.bdd.md +225 -0
- package/tests/cypress/e2e/uat/auth/team-roles/admin-login.cy.ts +148 -0
- package/tests/cypress/e2e/uat/auth/team-roles/member-login.bdd.md +251 -0
- package/tests/cypress/e2e/uat/auth/team-roles/member-login.cy.ts +163 -0
- package/tests/cypress/e2e/uat/auth/team-roles/owner-login.bdd.md +231 -0
- package/tests/cypress/e2e/uat/auth/team-roles/owner-login.cy.ts +141 -0
- package/tests/cypress/e2e/uat/billing/extended.bdd.md +273 -0
- package/tests/cypress/e2e/uat/billing/extended.cy.ts +209 -0
- package/tests/cypress/e2e/uat/billing/feature-gates.bdd.md +407 -0
- package/tests/cypress/e2e/uat/billing/feature-gates.cy.ts +307 -0
- package/tests/cypress/e2e/uat/billing/page.bdd.md +329 -0
- package/tests/cypress/e2e/uat/billing/page.cy.ts +250 -0
- package/tests/cypress/e2e/uat/billing/status.bdd.md +190 -0
- package/tests/cypress/e2e/uat/billing/status.cy.ts +145 -0
- package/tests/cypress/e2e/uat/billing/team-switch.bdd.md +156 -0
- package/tests/cypress/e2e/uat/billing/team-switch.cy.ts +122 -0
- package/tests/cypress/e2e/uat/billing/usage.bdd.md +218 -0
- package/tests/cypress/e2e/uat/billing/usage.cy.ts +176 -0
- package/tests/cypress/e2e/uat/blocks/hero.bdd.md +124 -0
- package/tests/cypress/e2e/uat/blocks/hero.cy.ts +56 -0
- package/tests/cypress/e2e/uat/devtools/api-tester.cy.ts +390 -0
- package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
- package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
- package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
- package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
- package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
- package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
- package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
- package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
- package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
- package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
- package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
- package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
- package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
- package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
- package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
- package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
- package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
- package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
- package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
- package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
- package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
- package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
- package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
- package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
- package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
- package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
- package/tests/cypress/e2e/uat/roles/editor-role.bdd.md +552 -0
- package/tests/cypress/e2e/uat/roles/editor-role.cy.ts +210 -0
- package/tests/cypress/e2e/uat/roles/member-restrictions.bdd.md +450 -0
- package/tests/cypress/e2e/uat/roles/member-restrictions.cy.ts +189 -0
- package/tests/cypress/e2e/uat/roles/owner-full-crud.bdd.md +530 -0
- package/tests/cypress/e2e/uat/roles/owner-full-crud.cy.ts +247 -0
- package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.bdd.md +736 -0
- package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.cy.ts +740 -0
- package/tests/cypress/e2e/uat/teams/roles-matrix.bdd.md +553 -0
- package/tests/cypress/e2e/uat/teams/roles-matrix.cy.ts +185 -0
- package/tests/cypress/e2e/uat/teams/switcher.bdd.md +1151 -0
- package/tests/cypress/e2e/uat/teams/switcher.cy.ts +497 -0
- package/tests/cypress/e2e/uat/teams/team-switcher.md +198 -0
- package/tests/cypress/fixtures/blocks.json +218 -0
- package/tests/cypress/fixtures/entities.json +78 -0
- package/tests/cypress/fixtures/page-builder.json +21 -0
- package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
- package/tests/cypress/src/components/CustomersPOM.ts +439 -0
- package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
- package/tests/cypress/src/components/EntityForm.ts +375 -0
- package/tests/cypress/src/components/EntityList.ts +389 -0
- package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
- package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
- package/tests/cypress/src/components/PostsListPOM.ts +223 -0
- package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
- package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
- package/tests/cypress/src/components/TasksPOM.ts +272 -0
- package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
- package/tests/cypress/src/components/index.ts +21 -0
- package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
- package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
- package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
- package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
- package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
- package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
- package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
- package/tests/cypress/src/controllers/index.js +25 -0
- package/tests/cypress/src/core/AuthPOM.ts +450 -0
- package/tests/cypress/src/core/BasePOM.ts +86 -0
- package/tests/cypress/src/core/BlockEditorBasePOM.ts +576 -0
- package/tests/cypress/src/core/DashboardEntityPOM.ts +692 -0
- package/tests/cypress/src/core/index.ts +14 -0
- package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
- package/tests/cypress/src/entities/PagesPOM.ts +137 -0
- package/tests/cypress/src/entities/PostsPOM.ts +137 -0
- package/tests/cypress/src/entities/TasksPOM.ts +176 -0
- package/tests/cypress/src/entities/index.ts +14 -0
- package/tests/cypress/src/features/BillingPOM.ts +385 -0
- package/tests/cypress/src/features/DashboardPOM.ts +245 -0
- package/tests/cypress/src/features/DevtoolsPOM.ts +739 -0
- package/tests/cypress/src/features/PageBuilderPOM.ts +263 -0
- package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
- package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
- package/tests/cypress/src/features/SettingsPOM.ts +362 -0
- package/tests/cypress/src/features/SuperadminPOM.ts +331 -0
- package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
- package/tests/cypress/src/features/index.ts +28 -0
- package/tests/cypress/src/helpers/ApiInterceptor.ts +177 -0
- package/tests/cypress/src/index.ts +101 -0
- package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
- package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
- package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
- package/tests/cypress/src/pages/dashboard/index.js +6 -0
- package/tests/cypress/src/pages/index.js +5 -0
- package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
- package/tests/cypress/src/pages/public/LandingPage.js +69 -0
- package/tests/cypress/src/pages/public/PricingPage.js +33 -0
- package/tests/cypress/src/pages/public/index.js +6 -0
- package/tests/cypress/src/selectors.ts +46 -0
- package/tests/cypress/src/session-helpers.ts +500 -0
- package/tests/cypress/support/doc-commands.ts +260 -0
- package/tests/cypress.config.ts +150 -0
- package/tests/jest/components/post-header.test.tsx +377 -0
- package/tests/jest/config/role-config.test.ts +529 -0
- package/tests/jest/jest.config.ts +81 -0
- package/tests/jest/langchain/COVERAGE.md +372 -0
- package/tests/jest/langchain/guardrails.test.ts +465 -0
- package/tests/jest/langchain/streaming.test.ts +367 -0
- package/tests/jest/langchain/token-tracker.test.ts +455 -0
- package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
- package/tests/jest/langchain/tracer.test.ts +823 -0
- package/tests/jest/user-roles/role-helpers.test.ts +432 -0
- package/tests/jest/validation/categories.test.ts +429 -0
- package/tests/jest/validation/posts.test.ts +546 -0
- package/tests/tsconfig.json +15 -0
- package/LICENSE +0 -21
|
@@ -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) |
|