@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,739 @@
1
+ /**
2
+ * DevtoolsPOM - Page Object Model for DevTools (/devtools)
3
+ *
4
+ * Provides methods for:
5
+ * - Navigation to /devtools pages (home, style, tests, config)
6
+ * - Sidebar interaction
7
+ * - Access control assertions
8
+ * - Page content validation
9
+ *
10
+ * @version 3.0 - Uses centralized selectors from cySelector()
11
+ *
12
+ * @example
13
+ * const devtools = new DevtoolsPOM()
14
+ * devtools.visitHome()
15
+ * .assertOnDevtoolsHome()
16
+ * .clickStyleGallery()
17
+ */
18
+
19
+ import { BasePOM } from '../core/BasePOM'
20
+ import { cySelector } from '../selectors'
21
+
22
+ export class DevtoolsPOM extends BasePOM {
23
+ // ============================================
24
+ // SELECTORS using centralized cySelector()
25
+ // ============================================
26
+
27
+ get selectors() {
28
+ return {
29
+ // Layout & Navigation
30
+ mobileHeader: cySelector('devtools.navigation.mobileHeader'),
31
+ sidebarCollapseToggle: cySelector('devtools.navigation.collapseToggle'),
32
+
33
+ // Navigation items
34
+ navHome: cySelector('devtools.navigation.navItem', { section: 'home' }),
35
+ navStyleGallery: cySelector('devtools.navigation.navItem', { section: 'stylegallery' }),
36
+ navTestCases: cySelector('devtools.navigation.navItem', { section: 'testcases' }),
37
+ navConfig: cySelector('devtools.navigation.navItem', { section: 'config' }),
38
+
39
+ // Exit navigation
40
+ exitToDashboard: cySelector('devtools.navigation.exitToDashboard'),
41
+ goToAdmin: cySelector('devtools.navigation.goToAdmin'),
42
+
43
+ // Home Page
44
+ homePage: cySelector('devtools.home.page'),
45
+ homeStyleLink: cySelector('devtools.home.styleLink'),
46
+ homeTestsLink: cySelector('devtools.home.testsLink'),
47
+ homeConfigLink: cySelector('devtools.home.configLink'),
48
+
49
+ // Style Gallery Page
50
+ stylePage: cySelector('devtools.style.page'),
51
+ styleTabComponents: cySelector('devtools.style.tabComponents'),
52
+ styleTabFieldTypes: cySelector('devtools.style.tabFieldTypes'),
53
+ styleTabTheme: cySelector('devtools.style.tabTheme'),
54
+ styleTabGuidelines: cySelector('devtools.style.tabGuidelines'),
55
+ styleComponentGallery: cySelector('devtools.style.componentGallery'),
56
+ styleFieldTypes: cySelector('devtools.style.fieldTypes'),
57
+ styleThemePreview: cySelector('devtools.style.themePreview'),
58
+
59
+ // Test Cases Page
60
+ testsPage: cySelector('devtools.tests.page'),
61
+ testsViewer: cySelector('devtools.tests.viewer'),
62
+ testsTree: cySelector('devtools.tests.tree'),
63
+ testsLoading: cySelector('devtools.tests.loading'),
64
+ testsFileLoading: cySelector('devtools.tests.fileLoading'),
65
+ testsEmptyState: cySelector('devtools.tests.emptyState'),
66
+ testsContent: cySelector('devtools.tests.content'),
67
+ testsError: cySelector('devtools.tests.error'),
68
+ testsMarkdownContent: cySelector('devtools.tests.markdownContent'),
69
+
70
+ // Dynamic selectors for file tree
71
+ testsFolder: (name: string) => cySelector('devtools.tests.folder', { name }),
72
+ testsFile: (name: string) => cySelector('devtools.tests.file', { name }),
73
+
74
+ // Config Viewer Page
75
+ configPage: cySelector('devtools.config.page'),
76
+ configViewer: cySelector('devtools.config.viewer'),
77
+ configTabTheme: cySelector('devtools.config.tabTheme'),
78
+ configTabEntities: cySelector('devtools.config.tabEntities'),
79
+ configThemeContent: cySelector('devtools.config.themeContent'),
80
+ configEntitiesContent: cySelector('devtools.config.entitiesContent'),
81
+ configCopyTheme: cySelector('devtools.config.copyTheme'),
82
+ configCopyEntities: cySelector('devtools.config.copyEntities'),
83
+
84
+ // Additional tests selectors
85
+ testsNotFound: cySelector('devtools.tests.notFound'),
86
+ testsBackToList: cySelector('devtools.tests.backToList'),
87
+
88
+ // Sidebar
89
+ sidebar: cySelector('devtools.navigation.sidebar'),
90
+
91
+ // API Tester selectors (new feature)
92
+ apiTester: '[data-cy="api-tester"]',
93
+ apiTesterBackBtn: '[data-cy="api-tester-back-btn"]',
94
+ apiTesterEndpointInfo: '[data-cy="api-tester-endpoint-info"]',
95
+ apiTesterMethodSelector: '[data-cy="api-tester-method-selector"]',
96
+ apiTesterMethodBadge: (method: string) => `[data-cy="api-tester-method-${method.toLowerCase()}"]`,
97
+ apiTesterUrlPreview: '[data-cy="api-tester-url-preview"]',
98
+ apiTesterPathParams: '[data-cy="api-tester-path-params"]',
99
+ apiTesterPathParam: (name: string) => `[data-cy="api-tester-path-param-${name}"]`,
100
+ apiTesterPathParamInput: (name: string) => `[data-cy="api-tester-path-param-${name}-input"]`,
101
+ apiTesterQueryEditor: '[data-cy="api-tester-query-editor"]',
102
+ apiTesterQueryRow: (index: number) => `[data-cy="api-tester-query-row-${index}"]`,
103
+ apiTesterQueryKey: (index: number) => `[data-cy="api-tester-query-row-${index}-key"]`,
104
+ apiTesterQueryValue: (index: number) => `[data-cy="api-tester-query-row-${index}-value"]`,
105
+ apiTesterQueryDelete: (index: number) => `[data-cy="api-tester-query-row-${index}-delete"]`,
106
+ apiTesterQueryAddBtn: '[data-cy="api-tester-query-add-btn"]',
107
+ apiTesterHeadersEditor: '[data-cy="api-tester-headers-editor"]',
108
+ apiTesterAuth: '[data-cy="api-tester-auth"]',
109
+ apiTesterAuthType: '[data-cy="api-tester-auth-type"]',
110
+ apiTesterAuthSession: '[data-cy="api-tester-auth-session"]',
111
+ apiTesterAuthApiKey: '[data-cy="api-tester-auth-apikey"]',
112
+ apiTesterApiKeyInput: '[data-cy="api-tester-apikey-input"]',
113
+ apiTesterPayload: '[data-cy="api-tester-payload"]',
114
+ apiTesterPayloadTextarea: '[data-cy="api-tester-payload-textarea"]',
115
+ apiTesterPayloadError: '[data-cy="api-tester-payload-error"]',
116
+ apiTesterSendBtn: '[data-cy="api-tester-send-btn"]',
117
+ apiTesterCancelBtn: '[data-cy="api-tester-cancel-btn"]',
118
+ apiTesterResponse: '[data-cy="api-tester-response"]',
119
+ apiTesterResponseIdle: '[data-cy="api-tester-response-idle"]',
120
+ apiTesterResponseLoading: '[data-cy="api-tester-response-loading"]',
121
+ apiTesterResponseError: '[data-cy="api-tester-response-error"]',
122
+ apiTesterResponseStatus: '[data-cy="api-tester-response-status"]',
123
+ apiTesterResponseTime: '[data-cy="api-tester-response-time"]',
124
+ apiTesterResponseTabBody: '[data-cy="api-tester-response-tab-body"]',
125
+ apiTesterResponseTabHeaders: '[data-cy="api-tester-response-tab-headers"]',
126
+ apiTesterResponseBody: '[data-cy="api-tester-response-body"]',
127
+ apiTesterResponseHeaders: '[data-cy="api-tester-response-headers"]',
128
+ }
129
+ }
130
+
131
+ // ============================================
132
+ // FACTORY METHOD
133
+ // ============================================
134
+
135
+ static create(): DevtoolsPOM {
136
+ return new DevtoolsPOM()
137
+ }
138
+
139
+ // ============================================
140
+ // NAVIGATION
141
+ // ============================================
142
+
143
+ /**
144
+ * Visit /devtools home page
145
+ */
146
+ visitHome() {
147
+ cy.visit('/devtools')
148
+ return this
149
+ }
150
+
151
+ /**
152
+ * Visit /devtools/style (Style Gallery)
153
+ */
154
+ visitStyleGallery() {
155
+ cy.visit('/devtools/style')
156
+ return this
157
+ }
158
+
159
+ /**
160
+ * Visit /devtools/tests (Test Cases Viewer)
161
+ */
162
+ visitTestCases() {
163
+ cy.visit('/devtools/tests')
164
+ return this
165
+ }
166
+
167
+ /**
168
+ * Visit /devtools/config (Config Viewer)
169
+ */
170
+ visitConfig() {
171
+ cy.visit('/devtools/config')
172
+ return this
173
+ }
174
+
175
+ /**
176
+ * Attempt to visit /devtools (for access control tests)
177
+ * Uses failOnStatusCode: false to capture redirects
178
+ */
179
+ attemptToVisitDevtools() {
180
+ cy.visit('/devtools', { failOnStatusCode: false })
181
+ return this
182
+ }
183
+
184
+ // ============================================
185
+ // SIDEBAR NAVIGATION ACTIONS
186
+ // ============================================
187
+
188
+ /**
189
+ * Click on Home navigation item in sidebar
190
+ */
191
+ clickNavHome() {
192
+ cy.get(this.selectors.navHome).click()
193
+ return this
194
+ }
195
+
196
+ /**
197
+ * Click on Style Gallery navigation item in sidebar
198
+ */
199
+ clickNavStyleGallery() {
200
+ cy.get(this.selectors.navStyleGallery).click()
201
+ return this
202
+ }
203
+
204
+ /**
205
+ * Click on Test Cases navigation item in sidebar
206
+ */
207
+ clickNavTestCases() {
208
+ cy.get(this.selectors.navTestCases).click()
209
+ return this
210
+ }
211
+
212
+ /**
213
+ * Click on Config navigation item in sidebar
214
+ */
215
+ clickNavConfig() {
216
+ cy.get(this.selectors.navConfig).click()
217
+ return this
218
+ }
219
+
220
+ /**
221
+ * Click on "Exit to Dashboard" link
222
+ */
223
+ clickExitToDashboard() {
224
+ cy.get(this.selectors.exitToDashboard).click()
225
+ return this
226
+ }
227
+
228
+ /**
229
+ * Click on "Go to Admin" link
230
+ */
231
+ clickGoToAdmin() {
232
+ cy.get(this.selectors.goToAdmin).click()
233
+ return this
234
+ }
235
+
236
+ // ============================================
237
+ // HOME PAGE QUICK LINKS
238
+ // ============================================
239
+
240
+ /**
241
+ * Click on Style Gallery quick link (home page)
242
+ */
243
+ clickHomeStyleLink() {
244
+ cy.get(this.selectors.homeStyleLink).click()
245
+ return this
246
+ }
247
+
248
+ /**
249
+ * Click on Test Cases quick link (home page)
250
+ */
251
+ clickHomeTestsLink() {
252
+ cy.get(this.selectors.homeTestsLink).click()
253
+ return this
254
+ }
255
+
256
+ /**
257
+ * Click on Config Viewer quick link (home page)
258
+ */
259
+ clickHomeConfigLink() {
260
+ cy.get(this.selectors.homeConfigLink).click()
261
+ return this
262
+ }
263
+
264
+ // ============================================
265
+ // CONFIG VIEWER ACTIONS
266
+ // ============================================
267
+
268
+ /**
269
+ * Click on Theme tab in config viewer
270
+ */
271
+ clickConfigTabTheme() {
272
+ cy.get(this.selectors.configTabTheme).click()
273
+ return this
274
+ }
275
+
276
+ /**
277
+ * Click on Entities tab in config viewer
278
+ */
279
+ clickConfigTabEntities() {
280
+ cy.get(this.selectors.configTabEntities).click()
281
+ return this
282
+ }
283
+
284
+ /**
285
+ * Click copy button for theme config
286
+ */
287
+ clickCopyThemeConfig() {
288
+ cy.get(this.selectors.configCopyTheme).click()
289
+ return this
290
+ }
291
+
292
+ /**
293
+ * Click copy button for entities config
294
+ */
295
+ clickCopyEntitiesConfig() {
296
+ cy.get(this.selectors.configCopyEntities).click()
297
+ return this
298
+ }
299
+
300
+ // ============================================
301
+ // WAITS
302
+ // ============================================
303
+
304
+ /**
305
+ * Wait for /devtools home page to load
306
+ */
307
+ waitForHomePage() {
308
+ cy.get(this.selectors.homePage, { timeout: 10000 }).should('be.visible')
309
+ return this
310
+ }
311
+
312
+ /**
313
+ * Wait for style gallery page to load
314
+ */
315
+ waitForStylePage() {
316
+ cy.get(this.selectors.stylePage, { timeout: 10000 }).should('be.visible')
317
+ return this
318
+ }
319
+
320
+ /**
321
+ * Wait for test cases page to load
322
+ */
323
+ waitForTestsPage() {
324
+ cy.get(this.selectors.testsPage, { timeout: 10000 }).should('be.visible')
325
+ return this
326
+ }
327
+
328
+ /**
329
+ * Wait for config page to load
330
+ */
331
+ waitForConfigPage() {
332
+ cy.get(this.selectors.configPage, { timeout: 10000 }).should('be.visible')
333
+ return this
334
+ }
335
+
336
+ // ============================================
337
+ // ASSERTIONS - URL
338
+ // ============================================
339
+
340
+ /**
341
+ * Assert user is on /devtools home page
342
+ */
343
+ assertOnDevtoolsHome() {
344
+ cy.url().should('eq', Cypress.config().baseUrl + '/devtools')
345
+ return this
346
+ }
347
+
348
+ /**
349
+ * Assert user is on /devtools/style
350
+ */
351
+ assertOnStyleGallery() {
352
+ cy.url().should('include', '/devtools/style')
353
+ return this
354
+ }
355
+
356
+ /**
357
+ * Assert user is on /devtools/tests
358
+ */
359
+ assertOnTestCases() {
360
+ cy.url().should('include', '/devtools/tests')
361
+ return this
362
+ }
363
+
364
+ /**
365
+ * Assert user is on /devtools/config
366
+ */
367
+ assertOnConfig() {
368
+ cy.url().should('include', '/devtools/config')
369
+ return this
370
+ }
371
+
372
+ /**
373
+ * Assert user was redirected to /dashboard (blocked from /devtools)
374
+ */
375
+ assertRedirectedToDashboard() {
376
+ cy.url().should('include', '/dashboard')
377
+ cy.url().should('not.include', '/devtools')
378
+ return this
379
+ }
380
+
381
+ /**
382
+ * Assert user is on /superadmin (superadmin panel)
383
+ */
384
+ assertOnSuperadmin() {
385
+ cy.url().should('include', '/superadmin')
386
+ return this
387
+ }
388
+
389
+ // ============================================
390
+ // ASSERTIONS - PAGE CONTENT
391
+ // ============================================
392
+
393
+ /**
394
+ * Assert home page container is visible
395
+ */
396
+ assertHomePageVisible() {
397
+ cy.get(this.selectors.homePage).should('be.visible')
398
+ return this
399
+ }
400
+
401
+ /**
402
+ * Assert all home page quick links are visible
403
+ */
404
+ assertHomeQuickLinksVisible() {
405
+ cy.get(this.selectors.homeStyleLink).should('be.visible')
406
+ cy.get(this.selectors.homeTestsLink).should('be.visible')
407
+ cy.get(this.selectors.homeConfigLink).should('be.visible')
408
+ return this
409
+ }
410
+
411
+ /**
412
+ * Assert style gallery page is visible
413
+ */
414
+ assertStylePageVisible() {
415
+ cy.get(this.selectors.stylePage).should('be.visible')
416
+ return this
417
+ }
418
+
419
+ /**
420
+ * Assert all style gallery sections are visible by clicking through tabs
421
+ * Tabs work one at a time - Components is default, need to click others
422
+ */
423
+ assertStyleSectionsVisible() {
424
+ // Components tab is active by default
425
+ cy.get(this.selectors.styleComponentGallery).should('be.visible')
426
+
427
+ // Click Field Types tab and verify
428
+ cy.get(this.selectors.styleTabFieldTypes).click()
429
+ cy.get(this.selectors.styleFieldTypes).should('be.visible')
430
+
431
+ // Click Theme tab and verify
432
+ cy.get(this.selectors.styleTabTheme).click()
433
+ cy.get(this.selectors.styleThemePreview).should('be.visible')
434
+
435
+ // Click back to Components tab (restore default state)
436
+ cy.get(this.selectors.styleTabComponents).click()
437
+ return this
438
+ }
439
+
440
+ /**
441
+ * Click Style Gallery Components tab
442
+ */
443
+ clickStyleTabComponents() {
444
+ cy.get(this.selectors.styleTabComponents).click()
445
+ return this
446
+ }
447
+
448
+ /**
449
+ * Click Style Gallery Field Types tab
450
+ */
451
+ clickStyleTabFieldTypes() {
452
+ cy.get(this.selectors.styleTabFieldTypes).click()
453
+ return this
454
+ }
455
+
456
+ /**
457
+ * Click Style Gallery Theme tab
458
+ */
459
+ clickStyleTabTheme() {
460
+ cy.get(this.selectors.styleTabTheme).click()
461
+ return this
462
+ }
463
+
464
+ /**
465
+ * Assert test cases page is visible
466
+ */
467
+ assertTestsPageVisible() {
468
+ cy.get(this.selectors.testsPage).should('be.visible')
469
+ return this
470
+ }
471
+
472
+ /**
473
+ * Assert test cases viewer (file tree) is visible
474
+ */
475
+ assertTestsViewerVisible() {
476
+ cy.get(this.selectors.testsViewer).should('be.visible')
477
+ cy.get(this.selectors.testsTree).should('be.visible')
478
+ return this
479
+ }
480
+
481
+ /**
482
+ * Assert config page is visible
483
+ */
484
+ assertConfigPageVisible() {
485
+ cy.get(this.selectors.configPage).should('be.visible')
486
+ return this
487
+ }
488
+
489
+ /**
490
+ * Assert config viewer tabs are visible
491
+ */
492
+ assertConfigTabsVisible() {
493
+ cy.get(this.selectors.configViewer).should('be.visible')
494
+ cy.get(this.selectors.configTabTheme).should('be.visible')
495
+ cy.get(this.selectors.configTabEntities).should('be.visible')
496
+ return this
497
+ }
498
+
499
+ // ============================================
500
+ // ASSERTIONS - NAVIGATION
501
+ // ============================================
502
+
503
+ /**
504
+ * Assert all sidebar navigation items are visible
505
+ */
506
+ assertSidebarNavigationVisible() {
507
+ cy.get(this.selectors.navHome).should('be.visible')
508
+ cy.get(this.selectors.navStyleGallery).should('be.visible')
509
+ cy.get(this.selectors.navTestCases).should('be.visible')
510
+ cy.get(this.selectors.navConfig).should('be.visible')
511
+ return this
512
+ }
513
+
514
+ /**
515
+ * Assert exit links (Dashboard, Admin) are visible
516
+ */
517
+ assertExitLinksVisible() {
518
+ cy.get(this.selectors.exitToDashboard).should('be.visible')
519
+ cy.get(this.selectors.goToAdmin).should('be.visible')
520
+ return this
521
+ }
522
+
523
+ // ============================================
524
+ // API TESTER METHODS (New Feature)
525
+ // ============================================
526
+
527
+ /**
528
+ * Visit /devtools/api (API endpoint list)
529
+ */
530
+ visitApiList() {
531
+ cy.visit('/devtools/api')
532
+ return this
533
+ }
534
+
535
+ /**
536
+ * Visit specific API endpoint detail page
537
+ * @param path - API path without /api prefix (e.g., '/v1/customers')
538
+ */
539
+ visitApiEndpoint(path: string) {
540
+ cy.visit(`/devtools/api${path}`)
541
+ return this
542
+ }
543
+
544
+ /**
545
+ * Click on an endpoint link in the API list
546
+ * Uses the first endpoint from Core category as default
547
+ */
548
+ clickFirstEndpoint() {
549
+ cy.get('[data-cy^="devtools-api-route-"]').first().click()
550
+ return this
551
+ }
552
+
553
+ /**
554
+ * Select HTTP method in API tester
555
+ */
556
+ selectMethod(method: string) {
557
+ cy.get(this.selectors.apiTesterMethodBadge(method)).click()
558
+ return this
559
+ }
560
+
561
+ /**
562
+ * Fill path parameter input
563
+ */
564
+ fillPathParam(paramName: string, value: string) {
565
+ cy.get(this.selectors.apiTesterPathParamInput(paramName)).clear().type(value)
566
+ return this
567
+ }
568
+
569
+ /**
570
+ * Add query parameter
571
+ */
572
+ addQueryParam(key: string, value: string) {
573
+ cy.get(this.selectors.apiTesterQueryAddBtn).click()
574
+ const index = 0 // Assuming first param for simplicity
575
+ cy.get(this.selectors.apiTesterQueryKey(index)).type(key)
576
+ cy.get(this.selectors.apiTesterQueryValue(index)).type(value)
577
+ return this
578
+ }
579
+
580
+ /**
581
+ * Fill request payload (JSON)
582
+ */
583
+ fillPayload(json: string) {
584
+ cy.get(this.selectors.apiTesterPayloadTextarea).clear().type(json, { parseSpecialCharSequences: false })
585
+ return this
586
+ }
587
+
588
+ /**
589
+ * Select authentication type
590
+ */
591
+ selectAuthType(type: 'session' | 'apiKey') {
592
+ if (type === 'session') {
593
+ cy.get(this.selectors.apiTesterAuthSession).click()
594
+ } else {
595
+ cy.get(this.selectors.apiTesterAuthApiKey).click()
596
+ }
597
+ return this
598
+ }
599
+
600
+ /**
601
+ * Fill API key input
602
+ */
603
+ fillApiKey(apiKey: string) {
604
+ cy.get(this.selectors.apiTesterApiKeyInput).type(apiKey)
605
+ return this
606
+ }
607
+
608
+ /**
609
+ * Click Send Request button
610
+ */
611
+ clickSendRequest() {
612
+ cy.get(this.selectors.apiTesterSendBtn).click()
613
+ return this
614
+ }
615
+
616
+ /**
617
+ * Click Cancel button (during request)
618
+ */
619
+ clickCancelRequest() {
620
+ cy.get(this.selectors.apiTesterCancelBtn).click()
621
+ return this
622
+ }
623
+
624
+ /**
625
+ * Wait for response to appear
626
+ */
627
+ waitForResponse() {
628
+ cy.get(this.selectors.apiTesterResponse, { timeout: 10000 }).should('be.visible')
629
+ return this
630
+ }
631
+
632
+ /**
633
+ * Assert API tester page is visible
634
+ */
635
+ assertApiTesterVisible() {
636
+ cy.get(this.selectors.apiTester).should('be.visible')
637
+ return this
638
+ }
639
+
640
+ /**
641
+ * Assert endpoint info card is visible
642
+ */
643
+ assertEndpointInfoVisible() {
644
+ cy.get(this.selectors.apiTesterEndpointInfo).should('be.visible')
645
+ return this
646
+ }
647
+
648
+ /**
649
+ * Assert method selector shows specific method
650
+ */
651
+ assertMethodExists(method: string) {
652
+ cy.get(this.selectors.apiTesterMethodBadge(method)).should('exist')
653
+ return this
654
+ }
655
+
656
+ /**
657
+ * Assert URL preview contains text
658
+ */
659
+ assertUrlPreviewContains(text: string) {
660
+ cy.get(this.selectors.apiTesterUrlPreview).should('contain', text)
661
+ return this
662
+ }
663
+
664
+ /**
665
+ * Assert payload editor is visible
666
+ */
667
+ assertPayloadEditorVisible() {
668
+ cy.get(this.selectors.apiTesterPayload).should('be.visible')
669
+ return this
670
+ }
671
+
672
+ /**
673
+ * Assert payload editor is NOT visible
674
+ */
675
+ assertPayloadEditorNotVisible() {
676
+ cy.get(this.selectors.apiTesterPayload).should('not.exist')
677
+ return this
678
+ }
679
+
680
+ /**
681
+ * Assert JSON validation error is shown
682
+ */
683
+ assertPayloadErrorShown() {
684
+ cy.get(this.selectors.apiTesterPayloadError).should('be.visible')
685
+ return this
686
+ }
687
+
688
+ /**
689
+ * Assert response status code badge is visible and has correct color
690
+ */
691
+ assertResponseStatus(statusCode: number) {
692
+ cy.get(this.selectors.apiTesterResponseStatus).should('contain', statusCode.toString())
693
+ return this
694
+ }
695
+
696
+ /**
697
+ * Assert response time is visible
698
+ */
699
+ assertResponseTimeVisible() {
700
+ cy.get(this.selectors.apiTesterResponseTime).should('be.visible')
701
+ return this
702
+ }
703
+
704
+ /**
705
+ * Click Response Body tab
706
+ */
707
+ clickResponseBodyTab() {
708
+ cy.get(this.selectors.apiTesterResponseTabBody).click()
709
+ return this
710
+ }
711
+
712
+ /**
713
+ * Click Response Headers tab
714
+ */
715
+ clickResponseHeadersTab() {
716
+ cy.get(this.selectors.apiTesterResponseTabHeaders).click()
717
+ return this
718
+ }
719
+
720
+ /**
721
+ * Assert response body contains text
722
+ */
723
+ assertResponseBodyContains(text: string) {
724
+ cy.get(this.selectors.apiTesterResponseBody).should('contain', text)
725
+ return this
726
+ }
727
+
728
+ /**
729
+ * Assert back button navigates to /devtools/api
730
+ */
731
+ clickBackToList() {
732
+ cy.get(this.selectors.apiTesterBackBtn).click()
733
+ cy.url().should('include', '/devtools/api')
734
+ cy.url().should('not.include', '/devtools/api/')
735
+ return this
736
+ }
737
+ }
738
+
739
+ export default DevtoolsPOM