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