@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,463 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ScheduledActionsPOM - Page Object Model for DevTools Scheduled Actions
|
|
3
|
+
*
|
|
4
|
+
* Provides methods for:
|
|
5
|
+
* - Navigation to /devtools/scheduled-actions
|
|
6
|
+
* - Filter interaction (status, action type)
|
|
7
|
+
* - Table interaction and assertions
|
|
8
|
+
* - Pagination controls
|
|
9
|
+
* - Error and empty state assertions
|
|
10
|
+
*
|
|
11
|
+
* @version 1.0 - Uses centralized selectors from cySelector()
|
|
12
|
+
*
|
|
13
|
+
* @example
|
|
14
|
+
* const scheduledActions = new ScheduledActionsPOM()
|
|
15
|
+
* scheduledActions.visit()
|
|
16
|
+
* .assertPageVisible()
|
|
17
|
+
* .filterByStatus('pending')
|
|
18
|
+
* .assertTableVisible()
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { BasePOM } from '../core/BasePOM'
|
|
22
|
+
import { cySelector } from '../selectors'
|
|
23
|
+
|
|
24
|
+
export class ScheduledActionsPOM extends BasePOM {
|
|
25
|
+
// ============================================
|
|
26
|
+
// SELECTORS using centralized cySelector()
|
|
27
|
+
// ============================================
|
|
28
|
+
|
|
29
|
+
get selectors() {
|
|
30
|
+
return {
|
|
31
|
+
// Page container
|
|
32
|
+
page: cySelector('devtools.scheduledActions.page'),
|
|
33
|
+
|
|
34
|
+
// Filters
|
|
35
|
+
filterStatus: cySelector('devtools.scheduledActions.filterStatus'),
|
|
36
|
+
filterType: cySelector('devtools.scheduledActions.filterType'),
|
|
37
|
+
filterApply: cySelector('devtools.scheduledActions.filterApply'),
|
|
38
|
+
filterReset: cySelector('devtools.scheduledActions.filterReset'),
|
|
39
|
+
|
|
40
|
+
// Table
|
|
41
|
+
table: cySelector('devtools.scheduledActions.table'),
|
|
42
|
+
row: (id: string) => cySelector('devtools.scheduledActions.row', { id }),
|
|
43
|
+
cellType: cySelector('devtools.scheduledActions.cellType'),
|
|
44
|
+
cellStatus: cySelector('devtools.scheduledActions.cellStatus'),
|
|
45
|
+
cellScheduledAt: cySelector('devtools.scheduledActions.cellScheduledAt'),
|
|
46
|
+
cellTeam: cySelector('devtools.scheduledActions.cellTeam'),
|
|
47
|
+
cellPayload: cySelector('devtools.scheduledActions.cellPayload'),
|
|
48
|
+
cellError: cySelector('devtools.scheduledActions.cellError'),
|
|
49
|
+
|
|
50
|
+
// Status badges
|
|
51
|
+
statusPending: cySelector('devtools.scheduledActions.statusPending'),
|
|
52
|
+
statusRunning: cySelector('devtools.scheduledActions.statusRunning'),
|
|
53
|
+
statusCompleted: cySelector('devtools.scheduledActions.statusCompleted'),
|
|
54
|
+
statusFailed: cySelector('devtools.scheduledActions.statusFailed'),
|
|
55
|
+
|
|
56
|
+
// Pagination
|
|
57
|
+
pagination: cySelector('devtools.scheduledActions.pagination'),
|
|
58
|
+
paginationPrev: cySelector('devtools.scheduledActions.paginationPrev'),
|
|
59
|
+
paginationNext: cySelector('devtools.scheduledActions.paginationNext'),
|
|
60
|
+
|
|
61
|
+
// Empty state
|
|
62
|
+
emptyState: cySelector('devtools.scheduledActions.emptyState'),
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// ============================================
|
|
67
|
+
// FACTORY METHOD
|
|
68
|
+
// ============================================
|
|
69
|
+
|
|
70
|
+
static create(): ScheduledActionsPOM {
|
|
71
|
+
return new ScheduledActionsPOM()
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
// ============================================
|
|
75
|
+
// NAVIGATION
|
|
76
|
+
// ============================================
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Visit /devtools/scheduled-actions page
|
|
80
|
+
*/
|
|
81
|
+
visit() {
|
|
82
|
+
cy.visit('/devtools/scheduled-actions')
|
|
83
|
+
return this
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* Visit with failOnStatusCode: false (for access control tests)
|
|
88
|
+
*/
|
|
89
|
+
attemptToVisit() {
|
|
90
|
+
cy.visit('/devtools/scheduled-actions', { failOnStatusCode: false })
|
|
91
|
+
return this
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
// ============================================
|
|
95
|
+
// FILTER ACTIONS
|
|
96
|
+
// ============================================
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Filter by status using shadcn/ui Select (Radix UI)
|
|
100
|
+
*
|
|
101
|
+
* Uses text-based selection which is more reliable for Radix UI Select
|
|
102
|
+
* since data-value attributes may have different formats.
|
|
103
|
+
*
|
|
104
|
+
* @param status - 'all' | 'pending' | 'running' | 'completed' | 'failed'
|
|
105
|
+
*/
|
|
106
|
+
filterByStatus(status: string) {
|
|
107
|
+
// Map values to display labels (matches i18n translations)
|
|
108
|
+
const statusLabels: Record<string, string> = {
|
|
109
|
+
all: 'All',
|
|
110
|
+
pending: 'Pending',
|
|
111
|
+
running: 'Running',
|
|
112
|
+
completed: 'Completed',
|
|
113
|
+
failed: 'Failed',
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
// Click the SelectTrigger to open the dropdown
|
|
117
|
+
cy.get(this.selectors.filterStatus).click()
|
|
118
|
+
// Wait for dropdown content to be visible
|
|
119
|
+
cy.get('[data-radix-select-viewport]').should('be.visible')
|
|
120
|
+
// Click the option by visible text using contains() with selector
|
|
121
|
+
cy.contains('[role="option"]', statusLabels[status] || status).click()
|
|
122
|
+
return this
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Filter by action type using shadcn/ui Select (Radix UI)
|
|
127
|
+
*
|
|
128
|
+
* @param actionType - e.g., 'all', 'webhook:send', 'billing:check-renewals'
|
|
129
|
+
*/
|
|
130
|
+
filterByType(actionType: string) {
|
|
131
|
+
// Map 'all' to display label
|
|
132
|
+
const displayText = actionType === 'all' ? 'All' : actionType
|
|
133
|
+
|
|
134
|
+
// Click the SelectTrigger to open the dropdown
|
|
135
|
+
cy.get(this.selectors.filterType).click()
|
|
136
|
+
// Wait for dropdown content to be visible
|
|
137
|
+
cy.get('[data-radix-select-viewport]').should('be.visible')
|
|
138
|
+
// Click the option by visible text using contains() with selector
|
|
139
|
+
cy.contains('[role="option"]', displayText).click()
|
|
140
|
+
return this
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/**
|
|
144
|
+
* Click reset filters button
|
|
145
|
+
*/
|
|
146
|
+
resetFilters() {
|
|
147
|
+
cy.get(this.selectors.filterReset).click()
|
|
148
|
+
return this
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
// ============================================
|
|
152
|
+
// TABLE INTERACTIONS
|
|
153
|
+
// ============================================
|
|
154
|
+
|
|
155
|
+
/**
|
|
156
|
+
* Click on a specific row (for expandable rows)
|
|
157
|
+
* @param id - Action ID
|
|
158
|
+
*/
|
|
159
|
+
clickRow(id: string) {
|
|
160
|
+
cy.get(this.selectors.row(id)).click()
|
|
161
|
+
return this
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Get all visible rows
|
|
166
|
+
*/
|
|
167
|
+
getRows() {
|
|
168
|
+
return cy.get(`[data-cy^="scheduled-actions-row-"]`)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
// ============================================
|
|
172
|
+
// PAGINATION
|
|
173
|
+
// ============================================
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* Click next page button
|
|
177
|
+
*/
|
|
178
|
+
clickNextPage() {
|
|
179
|
+
cy.get(this.selectors.paginationNext).click()
|
|
180
|
+
return this
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
/**
|
|
184
|
+
* Click previous page button
|
|
185
|
+
*/
|
|
186
|
+
clickPrevPage() {
|
|
187
|
+
cy.get(this.selectors.paginationPrev).click()
|
|
188
|
+
return this
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
// ============================================
|
|
192
|
+
// WAITS
|
|
193
|
+
// ============================================
|
|
194
|
+
|
|
195
|
+
/**
|
|
196
|
+
* Wait for page to load
|
|
197
|
+
*/
|
|
198
|
+
waitForPage() {
|
|
199
|
+
cy.get(this.selectors.page, { timeout: 10000 }).should('be.visible')
|
|
200
|
+
return this
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
/**
|
|
204
|
+
* Wait for table to load
|
|
205
|
+
*/
|
|
206
|
+
waitForTable() {
|
|
207
|
+
cy.get(this.selectors.table, { timeout: 10000 }).should('be.visible')
|
|
208
|
+
return this
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// ============================================
|
|
212
|
+
// ASSERTIONS - URL
|
|
213
|
+
// ============================================
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* Assert user is on /devtools/scheduled-actions
|
|
217
|
+
*/
|
|
218
|
+
assertOnScheduledActionsPage() {
|
|
219
|
+
cy.url().should('include', '/devtools/scheduled-actions')
|
|
220
|
+
return this
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Assert user was redirected to /dashboard (blocked access)
|
|
225
|
+
*/
|
|
226
|
+
assertRedirectedToDashboard() {
|
|
227
|
+
cy.url().should('include', '/dashboard')
|
|
228
|
+
cy.url().should('not.include', '/devtools')
|
|
229
|
+
return this
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// ============================================
|
|
233
|
+
// ASSERTIONS - PAGE ELEMENTS
|
|
234
|
+
// ============================================
|
|
235
|
+
|
|
236
|
+
/**
|
|
237
|
+
* Assert page container is visible
|
|
238
|
+
*/
|
|
239
|
+
assertPageVisible() {
|
|
240
|
+
cy.get(this.selectors.page).should('be.visible')
|
|
241
|
+
return this
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Assert table is visible
|
|
246
|
+
*/
|
|
247
|
+
assertTableVisible() {
|
|
248
|
+
cy.get(this.selectors.table).should('be.visible')
|
|
249
|
+
return this
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
/**
|
|
253
|
+
* Assert empty state is visible
|
|
254
|
+
*/
|
|
255
|
+
assertEmptyStateVisible() {
|
|
256
|
+
cy.get(this.selectors.emptyState).should('be.visible')
|
|
257
|
+
return this
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Assert empty state is NOT visible (has data)
|
|
262
|
+
*/
|
|
263
|
+
assertEmptyStateNotVisible() {
|
|
264
|
+
cy.get(this.selectors.emptyState).should('not.exist')
|
|
265
|
+
return this
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
// ============================================
|
|
269
|
+
// ASSERTIONS - FILTERS
|
|
270
|
+
// ============================================
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Assert filter controls are visible
|
|
274
|
+
*/
|
|
275
|
+
assertFiltersVisible() {
|
|
276
|
+
cy.get(this.selectors.filterStatus).should('be.visible')
|
|
277
|
+
cy.get(this.selectors.filterType).should('be.visible')
|
|
278
|
+
return this
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
/**
|
|
282
|
+
* Assert reset button is visible
|
|
283
|
+
*/
|
|
284
|
+
assertResetButtonVisible() {
|
|
285
|
+
cy.get(this.selectors.filterReset).should('be.visible')
|
|
286
|
+
return this
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
/**
|
|
290
|
+
* Assert reset button is NOT visible (no active filters)
|
|
291
|
+
*/
|
|
292
|
+
assertResetButtonNotVisible() {
|
|
293
|
+
cy.get(this.selectors.filterReset).should('not.exist')
|
|
294
|
+
return this
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
// ============================================
|
|
298
|
+
// ASSERTIONS - TABLE CONTENT
|
|
299
|
+
// ============================================
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Assert table has at least one row
|
|
303
|
+
*/
|
|
304
|
+
assertTableHasRows() {
|
|
305
|
+
this.getRows().should('have.length.greaterThan', 0)
|
|
306
|
+
return this
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Assert table has no rows
|
|
311
|
+
*/
|
|
312
|
+
assertTableEmpty() {
|
|
313
|
+
this.getRows().should('have.length', 0)
|
|
314
|
+
return this
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Assert specific row exists
|
|
319
|
+
* @param id - Action ID
|
|
320
|
+
*/
|
|
321
|
+
assertRowExists(id: string) {
|
|
322
|
+
cy.get(this.selectors.row(id)).should('exist')
|
|
323
|
+
return this
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/**
|
|
327
|
+
* Assert row does not exist
|
|
328
|
+
* @param id - Action ID
|
|
329
|
+
*/
|
|
330
|
+
assertRowNotExists(id: string) {
|
|
331
|
+
cy.get(this.selectors.row(id)).should('not.exist')
|
|
332
|
+
return this
|
|
333
|
+
}
|
|
334
|
+
|
|
335
|
+
// ============================================
|
|
336
|
+
// ASSERTIONS - STATUS BADGES
|
|
337
|
+
// ============================================
|
|
338
|
+
|
|
339
|
+
/**
|
|
340
|
+
* Assert status badge for a specific status exists
|
|
341
|
+
* @param status - 'pending' | 'running' | 'completed' | 'failed'
|
|
342
|
+
*/
|
|
343
|
+
assertStatusBadgeExists(status: 'pending' | 'running' | 'completed' | 'failed') {
|
|
344
|
+
const selector = this.selectors[`status${status.charAt(0).toUpperCase() + status.slice(1)}` as keyof typeof this.selectors] as string
|
|
345
|
+
cy.get(selector).should('exist')
|
|
346
|
+
return this
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/**
|
|
350
|
+
* Assert at least one pending action is visible
|
|
351
|
+
*/
|
|
352
|
+
assertPendingActionsVisible() {
|
|
353
|
+
cy.get(this.selectors.statusPending).should('be.visible')
|
|
354
|
+
return this
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
/**
|
|
358
|
+
* Assert at least one running action is visible
|
|
359
|
+
*/
|
|
360
|
+
assertRunningActionsVisible() {
|
|
361
|
+
cy.get(this.selectors.statusRunning).should('be.visible')
|
|
362
|
+
return this
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
/**
|
|
366
|
+
* Assert at least one completed action is visible
|
|
367
|
+
*/
|
|
368
|
+
assertCompletedActionsVisible() {
|
|
369
|
+
cy.get(this.selectors.statusCompleted).should('be.visible')
|
|
370
|
+
return this
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Assert at least one failed action is visible
|
|
375
|
+
*/
|
|
376
|
+
assertFailedActionsVisible() {
|
|
377
|
+
cy.get(this.selectors.statusFailed).should('be.visible')
|
|
378
|
+
return this
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// ============================================
|
|
382
|
+
// ASSERTIONS - COLUMN HEADERS
|
|
383
|
+
// ============================================
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* Assert all table column headers are visible
|
|
387
|
+
*/
|
|
388
|
+
assertColumnHeadersVisible() {
|
|
389
|
+
cy.get(this.selectors.cellType).should('be.visible')
|
|
390
|
+
cy.get(this.selectors.cellStatus).should('be.visible')
|
|
391
|
+
cy.get(this.selectors.cellScheduledAt).should('be.visible')
|
|
392
|
+
cy.get(this.selectors.cellTeam).should('be.visible')
|
|
393
|
+
cy.get(this.selectors.cellPayload).should('be.visible')
|
|
394
|
+
cy.get(this.selectors.cellError).should('be.visible')
|
|
395
|
+
return this
|
|
396
|
+
}
|
|
397
|
+
|
|
398
|
+
// ============================================
|
|
399
|
+
// ASSERTIONS - ERROR DISPLAY
|
|
400
|
+
// ============================================
|
|
401
|
+
|
|
402
|
+
/**
|
|
403
|
+
* Assert error column header is visible
|
|
404
|
+
*/
|
|
405
|
+
assertErrorColumnVisible() {
|
|
406
|
+
cy.get(this.selectors.cellError).should('be.visible')
|
|
407
|
+
return this
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Assert at least one error message is visible in the table
|
|
412
|
+
*/
|
|
413
|
+
assertErrorMessagesVisible() {
|
|
414
|
+
cy.get(this.selectors.cellError).parent().parent().should('contain.text', 'Error')
|
|
415
|
+
return this
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
// ============================================
|
|
419
|
+
// ASSERTIONS - PAGINATION
|
|
420
|
+
// ============================================
|
|
421
|
+
|
|
422
|
+
/**
|
|
423
|
+
* Assert pagination controls are visible
|
|
424
|
+
*/
|
|
425
|
+
assertPaginationVisible() {
|
|
426
|
+
cy.get(this.selectors.pagination).should('be.visible')
|
|
427
|
+
return this
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
/**
|
|
431
|
+
* Assert next button is enabled
|
|
432
|
+
*/
|
|
433
|
+
assertNextButtonEnabled() {
|
|
434
|
+
cy.get(this.selectors.paginationNext).should('not.be.disabled')
|
|
435
|
+
return this
|
|
436
|
+
}
|
|
437
|
+
|
|
438
|
+
/**
|
|
439
|
+
* Assert next button is disabled
|
|
440
|
+
*/
|
|
441
|
+
assertNextButtonDisabled() {
|
|
442
|
+
cy.get(this.selectors.paginationNext).should('be.disabled')
|
|
443
|
+
return this
|
|
444
|
+
}
|
|
445
|
+
|
|
446
|
+
/**
|
|
447
|
+
* Assert previous button is enabled
|
|
448
|
+
*/
|
|
449
|
+
assertPrevButtonEnabled() {
|
|
450
|
+
cy.get(this.selectors.paginationPrev).should('not.be.disabled')
|
|
451
|
+
return this
|
|
452
|
+
}
|
|
453
|
+
|
|
454
|
+
/**
|
|
455
|
+
* Assert previous button is disabled
|
|
456
|
+
*/
|
|
457
|
+
assertPrevButtonDisabled() {
|
|
458
|
+
cy.get(this.selectors.paginationPrev).should('be.disabled')
|
|
459
|
+
return this
|
|
460
|
+
}
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
export default ScheduledActionsPOM
|