@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.
Files changed (220) 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.config.ts +150 -0
  208. package/tests/jest/components/post-header.test.tsx +377 -0
  209. package/tests/jest/config/role-config.test.ts +529 -0
  210. package/tests/jest/jest.config.ts +81 -0
  211. package/tests/jest/langchain/COVERAGE.md +372 -0
  212. package/tests/jest/langchain/guardrails.test.ts +465 -0
  213. package/tests/jest/langchain/streaming.test.ts +367 -0
  214. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  215. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  216. package/tests/jest/langchain/tracer.test.ts +823 -0
  217. package/tests/jest/user-roles/role-helpers.test.ts +432 -0
  218. package/tests/jest/validation/categories.test.ts +429 -0
  219. package/tests/jest/validation/posts.test.ts +546 -0
  220. 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