@nextsparkjs/theme-default 0.1.0-beta.31 → 0.1.0-beta.35

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 (149) hide show
  1. package/lib/selectors.ts +5 -1
  2. package/package.json +2 -2
  3. package/tests/cypress/e2e/{_devtools → _utils/devtools}/access.cy.ts +3 -3
  4. package/tests/cypress/e2e/{_devtools → _utils/devtools}/navigation.cy.ts +3 -3
  5. package/tests/cypress/e2e/{_devtools → _utils/devtools}/pages.cy.ts +3 -3
  6. package/tests/cypress/e2e/_utils/selectors/auth.bdd.md +354 -0
  7. package/tests/cypress/e2e/{_selectors → _utils/selectors}/auth.cy.ts +39 -35
  8. package/tests/cypress/e2e/_utils/selectors/billing.bdd.md +276 -0
  9. package/tests/cypress/e2e/_utils/selectors/billing.cy.ts +182 -0
  10. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.bdd.md +205 -0
  11. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.cy.ts +137 -0
  12. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.bdd.md +147 -0
  13. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.cy.ts +114 -0
  14. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.bdd.md +111 -0
  15. package/tests/cypress/e2e/{_selectors → _utils/selectors}/dashboard-sidebar.cy.ts +35 -6
  16. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.bdd.md +200 -0
  17. package/tests/cypress/e2e/{_selectors → _utils/selectors}/dashboard-topnav.cy.ts +30 -43
  18. package/tests/cypress/e2e/_utils/selectors/devtools.bdd.md +306 -0
  19. package/tests/cypress/e2e/{_selectors → _utils/selectors}/devtools.cy.ts +77 -14
  20. package/tests/cypress/e2e/_utils/selectors/global-search.bdd.md +115 -0
  21. package/tests/cypress/e2e/{_selectors → _utils/selectors}/global-search.cy.ts +15 -10
  22. package/tests/cypress/e2e/_utils/selectors/pages-editor.bdd.md +207 -0
  23. package/tests/cypress/e2e/{_selectors → _utils/selectors}/pages-editor.cy.ts +44 -12
  24. package/tests/cypress/e2e/_utils/selectors/posts-editor.bdd.md +184 -0
  25. package/tests/cypress/e2e/{_selectors → _utils/selectors}/posts-editor.cy.ts +107 -39
  26. package/tests/cypress/e2e/{_selectors → _utils/selectors}/public.cy.ts +1 -1
  27. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.bdd.md +266 -0
  28. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-api-keys.cy.ts +30 -25
  29. package/tests/cypress/e2e/_utils/selectors/settings-billing.bdd.md +78 -0
  30. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-billing.cy.ts +10 -7
  31. package/tests/cypress/e2e/_utils/selectors/settings-layout.bdd.md +138 -0
  32. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-layout.cy.ts +12 -8
  33. package/tests/cypress/e2e/_utils/selectors/settings-password.bdd.md +82 -0
  34. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-password.cy.ts +10 -7
  35. package/tests/cypress/e2e/_utils/selectors/settings-profile.bdd.md +77 -0
  36. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-profile.cy.ts +15 -18
  37. package/tests/cypress/e2e/_utils/selectors/settings-teams.bdd.md +130 -0
  38. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-teams.cy.ts +36 -18
  39. package/tests/cypress/e2e/_utils/selectors/superadmin.bdd.md +261 -0
  40. package/tests/cypress/e2e/{_selectors → _utils/selectors}/superadmin.cy.ts +23 -15
  41. package/tests/cypress/e2e/_utils/selectors/tasks.bdd.md +353 -0
  42. package/tests/cypress/e2e/{_selectors → _utils/selectors}/tasks.cy.ts +11 -10
  43. package/tests/cypress/e2e/{_selectors → _utils/selectors}/taxonomies.cy.ts +1 -1
  44. package/tests/cypress/e2e/_utils/selectors/teams.bdd.md +278 -0
  45. package/tests/cypress/e2e/{_selectors → _utils/selectors}/teams.cy.ts +90 -37
  46. package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-teams.cy.ts +4 -4
  47. package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-users.cy.ts +4 -4
  48. package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/dashboard.cy.ts +4 -4
  49. package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/subscriptions-overview.cy.ts +4 -4
  50. package/tests/cypress/e2e/api/{entities → _core/users}/users-security.cy.ts +2 -2
  51. package/tests/cypress/e2e/uat/{auth → _core/auth}/login-logout.cy.ts +2 -2
  52. package/tests/cypress/e2e/uat/{auth → _core/auth}/password-reset.cy.ts +1 -1
  53. package/tests/cypress/e2e/uat/{billing → _core/billing}/extended.cy.ts +2 -2
  54. package/tests/cypress/e2e/uat/{billing → _core/billing}/feature-gates.cy.ts +2 -2
  55. package/tests/cypress/e2e/uat/{billing → _core/billing}/page.cy.ts +2 -2
  56. package/tests/cypress/e2e/uat/{billing → _core/billing}/status.cy.ts +2 -2
  57. package/tests/cypress/e2e/uat/{billing → _core/billing}/team-switch.cy.ts +2 -2
  58. package/tests/cypress/e2e/uat/{billing → _core/billing}/usage.cy.ts +2 -2
  59. package/tests/cypress/e2e/uat/{devtools → _core/devtools}/api-tester.cy.ts +2 -2
  60. package/tests/cypress/e2e/uat/{scheduled-actions → _core/scheduled-actions}/devtools-ui.cy.ts +2 -2
  61. package/tests/cypress/e2e/uat/{teams → _core/teams}/roles-matrix.cy.ts +2 -2
  62. package/tests/cypress/e2e/uat/{teams → _core/teams}/switcher.cy.ts +2 -2
  63. package/tests/cypress/e2e/uat/{roles → features/roles}/editor-role.cy.ts +2 -2
  64. package/tests/cypress/e2e/uat/{roles → features/roles}/member-restrictions.cy.ts +3 -3
  65. package/tests/cypress/e2e/uat/{roles → features/roles}/owner-full-crud.cy.ts +2 -2
  66. package/tests/cypress/src/core/DashboardEntityPOM.ts +2 -2
  67. package/tests/cypress/src/features/DashboardPOM.ts +2 -2
  68. package/tests/cypress/src/features/DevtoolsPOM.ts +12 -1
  69. package/tests/cypress/src/session-helpers.ts +35 -17
  70. package/tests/cypress/support/e2e.ts +2 -1
  71. package/tests/cypress.config.ts +29 -10
  72. package/tests/tsconfig.json +13 -7
  73. package/tests/cypress/e2e/_selectors/billing.cy.ts +0 -89
  74. package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +0 -113
  75. package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +0 -89
  76. /package/tests/cypress/e2e/{_devtools → _utils/devtools}/access.bdd.md +0 -0
  77. /package/tests/cypress/e2e/{_devtools → _utils/devtools}/navigation.bdd.md +0 -0
  78. /package/tests/cypress/e2e/{_devtools → _utils/devtools}/pages.bdd.md +0 -0
  79. /package/tests/cypress/e2e/{_docs → _utils/docs}/README.md +0 -0
  80. /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/sector7-superadmin-teams.narration.json +0 -0
  81. /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/sector7-superadmin.cy.ts +0 -0
  82. /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/teams-system.doc.cy.ts +0 -0
  83. /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/teams-system.narration.json +0 -0
  84. /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-teams.bdd.md +0 -0
  85. /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-users.bdd.md +0 -0
  86. /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/dashboard.bdd.md +0 -0
  87. /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/subscriptions-overview.bdd.md +0 -0
  88. /package/tests/cypress/e2e/api/{billing → _core/billing}/BillingAPIController.js +0 -0
  89. /package/tests/cypress/e2e/api/{billing → _core/billing}/check-action.cy.ts +0 -0
  90. /package/tests/cypress/e2e/api/{billing → _core/billing}/checkout.cy.ts +0 -0
  91. /package/tests/cypress/e2e/api/{billing → _core/billing}/lifecycle.cy.ts +0 -0
  92. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/README.md +0 -0
  93. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/business.cy.ts +0 -0
  94. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/downgrade.cy.ts +0 -0
  95. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/fixtures/billing-plans.json +0 -0
  96. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/free.cy.ts +0 -0
  97. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/pro.cy.ts +0 -0
  98. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/starter.cy.ts +0 -0
  99. /package/tests/cypress/e2e/api/{billing → _core/billing}/portal.cy.ts +0 -0
  100. /package/tests/cypress/e2e/api/{devtools → _core/devtools}/registries.bdd.md +0 -0
  101. /package/tests/cypress/e2e/api/{devtools → _core/devtools}/registries.cy.ts +0 -0
  102. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/cron-endpoint.bdd.md +0 -0
  103. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/cron-endpoint.cy.ts +0 -0
  104. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/devtools-endpoint.bdd.md +0 -0
  105. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/devtools-endpoint.cy.ts +0 -0
  106. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/scheduling.bdd.md +0 -0
  107. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/scheduling.cy.ts +0 -0
  108. /package/tests/cypress/e2e/api/{settings → _core/settings}/api-keys.crud.cy.ts +0 -0
  109. /package/tests/cypress/e2e/api/{entities → _core/users}/users-crud.cy.ts +0 -0
  110. /package/tests/cypress/e2e/api/{entities → _core/users}/users-metas.cy.ts +0 -0
  111. /package/tests/cypress/e2e/api/entities/{customers-crud.cy.ts → customers/customers-crud.cy.ts} +0 -0
  112. /package/tests/cypress/e2e/api/entities/{customers-metas.cy.ts → customers/customers-metas.cy.ts} +0 -0
  113. /package/tests/cypress/e2e/api/entities/{blocks-scope.cy.ts → pages/blocks-scope.cy.ts} +0 -0
  114. /package/tests/cypress/e2e/api/entities/{pages-crud.cy.ts → pages/pages-crud.cy.ts} +0 -0
  115. /package/tests/cypress/e2e/api/entities/{pages-status.cy.ts → pages/pages-status.cy.ts} +0 -0
  116. /package/tests/cypress/e2e/api/entities/{post-categories-crud.cy.ts → posts/post-categories-crud.cy.ts} +0 -0
  117. /package/tests/cypress/e2e/api/entities/{posts-crud.cy.ts → posts/posts-crud.cy.ts} +0 -0
  118. /package/tests/cypress/e2e/api/entities/{posts-status.cy.ts → posts/posts-status.cy.ts} +0 -0
  119. /package/tests/cypress/e2e/api/entities/{tasks-crud.cy.ts → tasks/tasks-crud.cy.ts} +0 -0
  120. /package/tests/cypress/e2e/api/entities/{tasks-metas.cy.ts → tasks/tasks-metas.cy.ts} +0 -0
  121. /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/developer-login.bdd.md +0 -0
  122. /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/developer-login.cy.ts +0 -0
  123. /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/superadmin-login.bdd.md +0 -0
  124. /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/superadmin-login.cy.ts +0 -0
  125. /package/tests/cypress/e2e/uat/{auth → _core/auth}/custom-roles/editor-login.bdd.md +0 -0
  126. /package/tests/cypress/e2e/uat/{auth → _core/auth}/custom-roles/editor-login.cy.ts +0 -0
  127. /package/tests/cypress/e2e/uat/{auth → _core/auth}/login-logout.bdd.md +0 -0
  128. /package/tests/cypress/e2e/uat/{auth → _core/auth}/password-reset.bdd.md +0 -0
  129. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/admin-login.bdd.md +0 -0
  130. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/admin-login.cy.ts +0 -0
  131. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/member-login.bdd.md +0 -0
  132. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/member-login.cy.ts +0 -0
  133. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/owner-login.bdd.md +0 -0
  134. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/owner-login.cy.ts +0 -0
  135. /package/tests/cypress/e2e/uat/{billing → _core/billing}/extended.bdd.md +0 -0
  136. /package/tests/cypress/e2e/uat/{billing → _core/billing}/feature-gates.bdd.md +0 -0
  137. /package/tests/cypress/e2e/uat/{billing → _core/billing}/page.bdd.md +0 -0
  138. /package/tests/cypress/e2e/uat/{billing → _core/billing}/status.bdd.md +0 -0
  139. /package/tests/cypress/e2e/uat/{billing → _core/billing}/team-switch.bdd.md +0 -0
  140. /package/tests/cypress/e2e/uat/{billing → _core/billing}/usage.bdd.md +0 -0
  141. /package/tests/cypress/e2e/uat/{blocks → _core/blocks}/hero.bdd.md +0 -0
  142. /package/tests/cypress/e2e/uat/{blocks → _core/blocks}/hero.cy.ts +0 -0
  143. /package/tests/cypress/e2e/uat/{scheduled-actions → _core/scheduled-actions}/devtools-ui.bdd.md +0 -0
  144. /package/tests/cypress/e2e/uat/{teams → _core/teams}/roles-matrix.bdd.md +0 -0
  145. /package/tests/cypress/e2e/uat/{teams → _core/teams}/switcher.bdd.md +0 -0
  146. /package/tests/cypress/e2e/uat/{teams → _core/teams}/team-switcher.md +0 -0
  147. /package/tests/cypress/e2e/uat/{roles → features/roles}/editor-role.bdd.md +0 -0
  148. /package/tests/cypress/e2e/uat/{roles → features/roles}/member-restrictions.bdd.md +0 -0
  149. /package/tests/cypress/e2e/uat/{roles → features/roles}/owner-full-crud.bdd.md +0 -0
@@ -14,13 +14,20 @@
14
14
  * - Assert elements exist in DOM (no form submissions)
15
15
  * - Fast execution (< 30 seconds per describe block)
16
16
  *
17
+ * Test IDs:
18
+ * - SEL_DEVT_001: Navigation Structure
19
+ * - SEL_DEVT_002: Home Page
20
+ * - SEL_DEVT_003: Style Gallery Page
21
+ * - SEL_DEVT_004: Config Viewer Page
22
+ * - SEL_DEVT_005: Test Cases Page
23
+ *
17
24
  * IMPORTANT: DevTools is only accessible to users with 'developer' app role.
18
25
  */
19
26
 
20
- import { DevtoolsPOM } from '../../src/features/DevtoolsPOM'
21
- import { loginAsDefaultDeveloper } from '../../src/session-helpers'
27
+ import { DevtoolsPOM } from '../../../src/features/DevtoolsPOM'
28
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
22
29
 
23
- describe('DevTools Selectors Validation', { tags: ['@ui-selectors'] }, () => {
30
+ describe('DevTools Selectors Validation', { tags: ['@ui-selectors', '@devtools'] }, () => {
24
31
  const dev = DevtoolsPOM.create()
25
32
 
26
33
  beforeEach(() => {
@@ -28,9 +35,9 @@ describe('DevTools Selectors Validation', { tags: ['@ui-selectors'] }, () => {
28
35
  })
29
36
 
30
37
  // ============================================
31
- // NAVIGATION STRUCTURE (8 selectors)
38
+ // SEL_DEVT_001: NAVIGATION STRUCTURE (8 selectors)
32
39
  // ============================================
33
- describe('Navigation Structure', () => {
40
+ describe('SEL_DEVT_001: Navigation Structure', { tags: '@SEL_DEVT_001' }, () => {
34
41
  beforeEach(() => {
35
42
  cy.visit('/devtools', { timeout: 60000, failOnStatusCode: false })
36
43
  cy.url().should('include', '/devtools')
@@ -70,9 +77,9 @@ describe('DevTools Selectors Validation', { tags: ['@ui-selectors'] }, () => {
70
77
  })
71
78
 
72
79
  // ============================================
73
- // HOME PAGE (4 selectors)
80
+ // SEL_DEVT_002: HOME PAGE (4 selectors)
74
81
  // ============================================
75
- describe('Home Page', () => {
82
+ describe('SEL_DEVT_002: Home Page', { tags: '@SEL_DEVT_002' }, () => {
76
83
  beforeEach(() => {
77
84
  cy.visit('/devtools', { timeout: 60000, failOnStatusCode: false })
78
85
  cy.url().should('include', '/devtools')
@@ -96,9 +103,9 @@ describe('DevTools Selectors Validation', { tags: ['@ui-selectors'] }, () => {
96
103
  })
97
104
 
98
105
  // ============================================
99
- // STYLE GALLERY PAGE (8 selectors)
106
+ // SEL_DEVT_003: STYLE GALLERY PAGE (8 selectors)
100
107
  // ============================================
101
- describe('Style Gallery Page', () => {
108
+ describe('SEL_DEVT_003: Style Gallery Page', { tags: '@SEL_DEVT_003' }, () => {
102
109
  beforeEach(() => {
103
110
  cy.visit('/devtools/style', { timeout: 60000, failOnStatusCode: false })
104
111
  cy.url().should('include', '/devtools/style')
@@ -140,9 +147,9 @@ describe('DevTools Selectors Validation', { tags: ['@ui-selectors'] }, () => {
140
147
  })
141
148
 
142
149
  // ============================================
143
- // CONFIG VIEWER PAGE (8 selectors)
150
+ // SEL_DEVT_004: CONFIG VIEWER PAGE (8 selectors)
144
151
  // ============================================
145
- describe('Config Viewer Page', () => {
152
+ describe('SEL_DEVT_004: Config Viewer Page', { tags: '@SEL_DEVT_004' }, () => {
146
153
  beforeEach(() => {
147
154
  cy.visit('/devtools/config', { timeout: 60000, failOnStatusCode: false })
148
155
  cy.url().should('include', '/devtools/config')
@@ -186,10 +193,10 @@ describe('DevTools Selectors Validation', { tags: ['@ui-selectors'] }, () => {
186
193
  })
187
194
 
188
195
  // ============================================
189
- // TEST CASES PAGE (3 selectors)
190
- // NOTE: Conditional states (loading, empty, error) removed - not testable in selector validation
196
+ // SEL_DEVT_005: TEST CASES PAGE (3 selectors)
197
+ // NOTE: Tests page components may not implement all data-cy selectors
191
198
  // ============================================
192
- describe('Test Cases Page', () => {
199
+ describe('SEL_DEVT_005: Test Cases Page', { tags: '@SEL_DEVT_005' }, () => {
193
200
  beforeEach(() => {
194
201
  cy.visit('/devtools/tests', { timeout: 60000, failOnStatusCode: false })
195
202
  cy.url().should('include', '/devtools/tests')
@@ -207,4 +214,60 @@ describe('DevTools Selectors Validation', { tags: ['@ui-selectors'] }, () => {
207
214
  cy.get(dev.selectors.testsTree).should('exist')
208
215
  })
209
216
  })
217
+
218
+ // ============================================
219
+ // SEL_DEVT_006: TEST COVERAGE DASHBOARD (9 selectors)
220
+ // ============================================
221
+ describe('SEL_DEVT_006: Test Coverage Dashboard', { tags: '@SEL_DEVT_006' }, () => {
222
+ beforeEach(() => {
223
+ cy.visit('/devtools/tests', { timeout: 60000, failOnStatusCode: false })
224
+ cy.url().should('include', '/devtools/tests')
225
+ })
226
+
227
+ it('should find dashboard container (no file selected)', () => {
228
+ cy.get(dev.selectors.testsDashboard).should('exist')
229
+ })
230
+
231
+ it('should find dashboard stats container', () => {
232
+ cy.get(dev.selectors.testsDashboardStats).should('exist')
233
+ })
234
+
235
+ it('should find features stat card', () => {
236
+ cy.get(dev.selectors.testsDashboardStatFeatures).should('exist')
237
+ })
238
+
239
+ it('should find flows stat card', () => {
240
+ cy.get(dev.selectors.testsDashboardStatFlows).should('exist')
241
+ })
242
+
243
+ it('should find files stat card', () => {
244
+ cy.get(dev.selectors.testsDashboardStatFiles).should('exist')
245
+ })
246
+
247
+ it('should find tags stat card', () => {
248
+ cy.get(dev.selectors.testsDashboardStatTags).should('exist')
249
+ })
250
+
251
+ it('should find coverage gaps container', () => {
252
+ cy.get(dev.selectors.testsDashboardGaps).should('exist')
253
+ })
254
+
255
+ it('should find dashboard button when file selected', () => {
256
+ // First expand a folder to reveal files
257
+ cy.get(dev.selectors.testsTree).find('[data-cy*="folder"]').first().click()
258
+ // Then select a file
259
+ cy.get(dev.selectors.testsTree).find('[data-cy*="file"]').first().click()
260
+ cy.get(dev.selectors.testsDashboardButton).should('exist')
261
+ })
262
+
263
+ it('should return to dashboard when button clicked', () => {
264
+ // Expand folder and select a file
265
+ cy.get(dev.selectors.testsTree).find('[data-cy*="folder"]').first().click()
266
+ cy.get(dev.selectors.testsTree).find('[data-cy*="file"]').first().click()
267
+ // Click dashboard button
268
+ cy.get(dev.selectors.testsDashboardButton).click()
269
+ // Dashboard should be visible again
270
+ cy.get(dev.selectors.testsDashboard).should('exist')
271
+ })
272
+ })
210
273
  })
@@ -0,0 +1,115 @@
1
+ ---
2
+ feature: Global Search UI Selectors Validation
3
+ priority: medium
4
+ tags: [selectors, search, modal, ui-validation]
5
+ grepTags: [ui-selectors, search, SEL_GSRCH_001, SEL_GSRCH_002, SEL_GSRCH_003]
6
+ coverage: 3
7
+ ---
8
+
9
+ # Global Search UI Selectors Validation
10
+
11
+ > Validates that global search component selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality. Most selectors require the search modal to be open.
12
+
13
+ ## @test SEL_GSRCH_001: Search Trigger
14
+
15
+ ### Metadata
16
+ - **Priority:** Medium
17
+ - **Type:** Selector Validation
18
+ - **Tags:** search, trigger, button
19
+ - **Grep:** `@ui-selectors` `@SEL_GSRCH_001`
20
+ - **Status:** Skipped - selector not implemented
21
+
22
+ ```gherkin:en
23
+ Scenario: Search trigger button is accessible
24
+
25
+ Given I am logged in as a valid user
26
+ And I navigate to the dashboard
27
+ Then I should find the search trigger button
28
+ ```
29
+
30
+ ```gherkin:es
31
+ Scenario: Boton de trigger de busqueda es accesible
32
+
33
+ Given estoy logueado como usuario valido
34
+ And navego al dashboard
35
+ Then deberia encontrar el boton de trigger de busqueda
36
+ ```
37
+
38
+ ### Expected Results
39
+ - `global-search-trigger` selector exists
40
+
41
+ ---
42
+
43
+ ## @test SEL_GSRCH_002: Search Modal (when open)
44
+
45
+ ### Metadata
46
+ - **Priority:** High
47
+ - **Type:** Selector Validation
48
+ - **Tags:** search, modal, input
49
+ - **Grep:** `@ui-selectors` `@SEL_GSRCH_002`
50
+ - **Status:** Partial - 1 passing, 3 skipped
51
+
52
+ ```gherkin:en
53
+ Scenario: Search modal has required components when opened
54
+
55
+ Given I am logged in as a valid user
56
+ And I navigate to the dashboard
57
+ When I press Cmd+K to open the search modal
58
+ Then I should find the search modal container
59
+ And I should find the search input
60
+ And I should find the search results container (when query entered)
61
+ And I should find search result items (when results available)
62
+ ```
63
+
64
+ ```gherkin:es
65
+ Scenario: Modal de busqueda tiene componentes requeridos cuando esta abierto
66
+
67
+ Given estoy logueado como usuario valido
68
+ And navego al dashboard
69
+ When presiono Cmd+K para abrir el modal de busqueda
70
+ Then deberia encontrar el contenedor del modal de busqueda
71
+ And deberia encontrar el input de busqueda
72
+ And deberia encontrar el contenedor de resultados (cuando hay query)
73
+ And deberia encontrar items de resultados (cuando hay resultados)
74
+ ```
75
+
76
+ ### Expected Results
77
+ - `global-search-modal` skipped - selector not implemented
78
+ - `global-search-input` selector exists (WORKING)
79
+ - `global-search-results` skipped - requires search query
80
+ - `global-search-result` skipped - requires results
81
+
82
+ ---
83
+
84
+ ## @test SEL_GSRCH_003: Search Modal (opened via click)
85
+
86
+ ### Metadata
87
+ - **Priority:** Low
88
+ - **Type:** Selector Validation
89
+ - **Tags:** search, modal, click
90
+ - **Grep:** `@ui-selectors` `@SEL_GSRCH_003`
91
+ - **Status:** Skipped - trigger selector not implemented
92
+
93
+ ```gherkin:en
94
+ Scenario: Search modal opens via click on trigger
95
+
96
+ Given I am logged in as a valid user
97
+ And I navigate to the dashboard
98
+ When I click on the search trigger button
99
+ Then the search modal should open
100
+ And I should find the search input
101
+ ```
102
+
103
+ ```gherkin:es
104
+ Scenario: Modal de busqueda se abre via click en trigger
105
+
106
+ Given estoy logueado como usuario valido
107
+ And navego al dashboard
108
+ When hago click en el boton de trigger de busqueda
109
+ Then el modal de busqueda deberia abrirse
110
+ And deberia encontrar el input de busqueda
111
+ ```
112
+
113
+ ### Expected Results
114
+ - Search modal opens when trigger is clicked
115
+ - `global-search-input` selector exists inside modal
@@ -14,13 +14,18 @@
14
14
  * - Open search modal
15
15
  * - Assert elements exist in DOM (no actual search)
16
16
  *
17
+ * Test IDs:
18
+ * - SEL_GSRCH_001: Search Trigger
19
+ * - SEL_GSRCH_002: Search Modal (when open)
20
+ * - SEL_GSRCH_003: Search Modal (opened via click)
21
+ *
17
22
  * NOTE: Search modal must be opened via keyboard shortcut or trigger button.
18
23
  */
19
24
 
20
- import { cySelector } from '../../src/selectors'
21
- import { loginAsDefaultOwner } from '../../src/session-helpers'
25
+ import { cySelector } from '../../../src/selectors'
26
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
22
27
 
23
- describe('Global Search Selectors Validation', { tags: ['@ui-selectors'] }, () => {
28
+ describe('Global Search Selectors Validation', { tags: ['@ui-selectors', '@search'] }, () => {
24
29
  // Define selectors locally since globalSearch might not be in selectors.ts
25
30
  const selectors = {
26
31
  modal: cySelector('globalSearch.modal'),
@@ -31,25 +36,25 @@ describe('Global Search Selectors Validation', { tags: ['@ui-selectors'] }, () =
31
36
  }
32
37
 
33
38
  beforeEach(() => {
34
- loginAsDefaultOwner()
39
+ loginAsDefaultDeveloper()
35
40
  cy.visit('/dashboard', { timeout: 60000, failOnStatusCode: false })
36
41
  cy.url().should('include', '/dashboard')
37
42
  })
38
43
 
39
44
  // ============================================
40
- // SEARCH TRIGGER (1 selector)
45
+ // SEL_GSRCH_001: SEARCH TRIGGER (1 selector)
41
46
  // ============================================
42
- describe('Search Trigger', () => {
47
+ describe('SEL_GSRCH_001: Search Trigger', { tags: '@SEL_GSRCH_001' }, () => {
43
48
  it.skip('should find search trigger button (selector not implemented)', () => {
44
49
  cy.get(selectors.trigger).should('exist')
45
50
  })
46
51
  })
47
52
 
48
53
  // ============================================
49
- // SEARCH MODAL (4 selectors)
54
+ // SEL_GSRCH_002: SEARCH MODAL (4 selectors)
50
55
  // These require the modal to be open
51
56
  // ============================================
52
- describe('Search Modal (when open)', () => {
57
+ describe('SEL_GSRCH_002: Search Modal (when open)', { tags: '@SEL_GSRCH_002' }, () => {
53
58
  beforeEach(() => {
54
59
  // Try to open search modal via keyboard shortcut (Cmd+K or Ctrl+K)
55
60
  cy.get('body').type('{meta}k')
@@ -75,9 +80,9 @@ describe('Global Search Selectors Validation', { tags: ['@ui-selectors'] }, () =
75
80
  })
76
81
 
77
82
  // ============================================
78
- // ALTERNATIVE: Open via click
83
+ // SEL_GSRCH_003: SEARCH MODAL VIA CLICK
79
84
  // ============================================
80
- describe('Search Modal (opened via click)', () => {
85
+ describe('SEL_GSRCH_003: Search Modal (opened via click)', { tags: '@SEL_GSRCH_003' }, () => {
81
86
  it.skip('should open search modal when clicking trigger (trigger selector not implemented)', () => {
82
87
  cy.get(selectors.trigger).click()
83
88
  cy.wait(500)
@@ -0,0 +1,207 @@
1
+ ---
2
+ feature: Pages Block Editor UI Selectors Validation
3
+ priority: high
4
+ tags: [selectors, pages, editor, page-builder, ui-validation]
5
+ grepTags: [ui-selectors, pages, editor, SEL_PGED_001, SEL_PGED_002, SEL_PGED_003, SEL_PGED_004, SEL_PGED_005, SEL_PGED_006]
6
+ coverage: 6
7
+ ---
8
+
9
+ # Pages Block Editor UI Selectors Validation
10
+
11
+ > Validates selectors specific to the Page Builder including page settings, SEO, and locale features. These tests ensure the page editor has all required UI elements.
12
+
13
+ ## @test SEL_PGED_001: Pages List Page Selectors
14
+
15
+ ### Metadata
16
+ - **Priority:** High
17
+ - **Type:** Selector Validation
18
+ - **Tags:** pages, list, table
19
+ - **Grep:** `@ui-selectors` `@SEL_PGED_001`
20
+ - **Status:** Active
21
+
22
+ ```gherkin:en
23
+ Scenario: Pages list has required selectors
24
+
25
+ Given I am logged in as a valid user
26
+ And I navigate to the pages list
27
+ Then I should find the pages table container
28
+ And I should find the add page button
29
+ And I should find at least one page row
30
+ ```
31
+
32
+ ```gherkin:es
33
+ Scenario: Lista de paginas tiene selectores requeridos
34
+
35
+ Given estoy logueado como usuario valido
36
+ And navego a la lista de paginas
37
+ Then deberia encontrar el contenedor de tabla de paginas
38
+ And deberia encontrar el boton de agregar pagina
39
+ And deberia encontrar al menos una fila de pagina
40
+ ```
41
+
42
+ ---
43
+
44
+ ## @test SEL_PGED_002: Block Editor Core Selectors
45
+
46
+ ### Metadata
47
+ - **Priority:** High
48
+ - **Type:** Selector Validation
49
+ - **Tags:** pages, editor, core
50
+ - **Grep:** `@ui-selectors` `@SEL_PGED_002`
51
+ - **Status:** Active
52
+
53
+ ```gherkin:en
54
+ Scenario: Page editor has core selectors
55
+
56
+ Given I am logged in as a valid user
57
+ And I create a new page
58
+ Then I should find the editor container
59
+ And I should find the title input
60
+ And I should find the slug input
61
+ And I should find the save button
62
+ ```
63
+
64
+ ```gherkin:es
65
+ Scenario: Editor de paginas tiene selectores core
66
+
67
+ Given estoy logueado como usuario valido
68
+ And creo una nueva pagina
69
+ Then deberia encontrar el contenedor del editor
70
+ And deberia encontrar el input de titulo
71
+ And deberia encontrar el input de slug
72
+ And deberia encontrar el boton de guardar
73
+ ```
74
+
75
+ ---
76
+
77
+ ## @test SEL_PGED_003: Page Settings Selectors
78
+
79
+ ### Metadata
80
+ - **Priority:** Medium
81
+ - **Type:** Selector Validation
82
+ - **Tags:** pages, settings, seo, locale
83
+ - **Grep:** `@ui-selectors` `@SEL_PGED_003`
84
+ - **Status:** Partial - 2 passing, 2 skipped (SEO not implemented)
85
+
86
+ ```gherkin:en
87
+ Scenario: Page editor has settings and SEO selectors
88
+
89
+ Given I am logged in as a valid user
90
+ And I edit an existing page
91
+ When I click on the fields tab
92
+ Then I should find the entity fields sidebar
93
+ And I should find the locale selector
94
+ And the SEO trigger should exist (skipped - not implemented)
95
+ And the SEO fields should exist when expanded (skipped - not implemented)
96
+ ```
97
+
98
+ ```gherkin:es
99
+ Scenario: Editor de paginas tiene selectores de configuracion y SEO
100
+
101
+ Given estoy logueado como usuario valido
102
+ And edito una pagina existente
103
+ When hago click en la tab de campos
104
+ Then deberia encontrar el sidebar de campos de entidad
105
+ And deberia encontrar el selector de locale
106
+ And el trigger de SEO deberia existir (skipped - no implementado)
107
+ And los campos de SEO deberian existir cuando se expanden (skipped - no implementado)
108
+ ```
109
+
110
+ ---
111
+
112
+ ## @test SEL_PGED_004: Block Picker Selectors
113
+
114
+ ### Metadata
115
+ - **Priority:** High
116
+ - **Type:** Selector Validation
117
+ - **Tags:** pages, blocks, picker
118
+ - **Grep:** `@ui-selectors` `@SEL_PGED_004`
119
+ - **Status:** Active
120
+
121
+ ```gherkin:en
122
+ Scenario: Page editor has block picker selectors
123
+
124
+ Given I am logged in as a valid user
125
+ And I create a new page
126
+ Then I should find the block picker container
127
+ And I should find the hero block item
128
+ And I should find the add hero block button
129
+ ```
130
+
131
+ ```gherkin:es
132
+ Scenario: Editor de paginas tiene selectores de block picker
133
+
134
+ Given estoy logueado como usuario valido
135
+ And creo una nueva pagina
136
+ Then deberia encontrar el contenedor del block picker
137
+ And deberia encontrar el item de bloque hero
138
+ And deberia encontrar el boton de agregar bloque hero
139
+ ```
140
+
141
+ ---
142
+
143
+ ## @test SEL_PGED_005: Block Canvas and Settings
144
+
145
+ ### Metadata
146
+ - **Priority:** High
147
+ - **Type:** Selector Validation
148
+ - **Tags:** pages, canvas, settings
149
+ - **Grep:** `@ui-selectors` `@SEL_PGED_005`
150
+ - **Status:** Active
151
+
152
+ ```gherkin:en
153
+ Scenario: Page editor canvas and settings work
154
+
155
+ Given I am logged in as a valid user
156
+ And I create a new page
157
+ Then I should find the empty state when no blocks added
158
+ When I add a hero block
159
+ Then I should find the block canvas
160
+ And I should find the settings panel
161
+ And I should find the content and design tabs
162
+ ```
163
+
164
+ ```gherkin:es
165
+ Scenario: Canvas y configuracion del editor de paginas funcionan
166
+
167
+ Given estoy logueado como usuario valido
168
+ And creo una nueva pagina
169
+ Then deberia encontrar el estado vacio cuando no hay bloques
170
+ When agrego un bloque hero
171
+ Then deberia encontrar el canvas de bloques
172
+ And deberia encontrar el panel de configuracion
173
+ And deberia encontrar las tabs de contenido y diseno
174
+ ```
175
+
176
+ ---
177
+
178
+ ## @test SEL_PGED_006: Edit Existing Page
179
+
180
+ ### Metadata
181
+ - **Priority:** High
182
+ - **Type:** Selector Validation
183
+ - **Tags:** pages, edit, existing
184
+ - **Grep:** `@ui-selectors` `@SEL_PGED_006`
185
+ - **Status:** Active
186
+
187
+ ```gherkin:en
188
+ Scenario: Editing existing page loads editor correctly
189
+
190
+ Given I am logged in as a valid user
191
+ And I navigate to the pages list
192
+ When I select an existing page to edit
193
+ Then I should find the editor container
194
+ And I should find the title input with existing content
195
+ And I should find the save button
196
+ ```
197
+
198
+ ```gherkin:es
199
+ Scenario: Editar pagina existente carga el editor correctamente
200
+
201
+ Given estoy logueado como usuario valido
202
+ And navego a la lista de paginas
203
+ When selecciono una pagina existente para editar
204
+ Then deberia encontrar el contenedor del editor
205
+ And deberia encontrar el input de titulo con contenido existente
206
+ And deberia encontrar el boton de guardar
207
+ ```
@@ -14,22 +14,39 @@
14
14
  * Scope:
15
15
  * - Only login and navigate
16
16
  * - Assert elements exist in DOM (no full CRUD operations)
17
+ *
18
+ * Test IDs:
19
+ * - SEL_PGED_001: Pages List Page Selectors
20
+ * - SEL_PGED_002: Block Editor Core Selectors
21
+ * - SEL_PGED_003: Page Settings Selectors
22
+ * - SEL_PGED_004: Block Picker Selectors
23
+ * - SEL_PGED_005: Block Canvas and Settings
24
+ * - SEL_PGED_006: Edit Existing Page
17
25
  */
18
26
 
19
- import { PageBuilderPOM } from '../../src/features/PageBuilderPOM'
20
- import { PagesPOM } from '../../src/entities/PagesPOM'
21
- import { loginAsDefaultOwner } from '../../src/session-helpers'
27
+ import { PageBuilderPOM } from '../../../src/features/PageBuilderPOM'
28
+ import { PagesPOM } from '../../../src/entities/PagesPOM'
29
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
30
+
31
+ // Team ID for developer's team (NextSpark Team)
32
+ const DEVELOPER_TEAM_ID = 'team-nextspark-001'
22
33
 
23
- describe('Pages Block Editor Selectors Validation', { tags: ['@ui-selectors'] }, ()
24
- => {
34
+ describe('Pages Block Editor Selectors Validation', { tags: ['@ui-selectors', '@pages', '@editor'] }, () => {
25
35
  const pageBuilder = PageBuilderPOM.create()
26
36
  const pages = PagesPOM.create()
27
37
 
28
38
  beforeEach(() => {
29
- loginAsDefaultOwner()
39
+ loginAsDefaultDeveloper()
40
+ // Set team context for entity API calls (pages is team-based)
41
+ cy.window().then((win) => {
42
+ win.localStorage.setItem('activeTeamId', DEVELOPER_TEAM_ID)
43
+ })
30
44
  })
31
45
 
32
- describe('Pages List Page Selectors (Entity POM)', () => {
46
+ // ============================================
47
+ // SEL_PGED_001: PAGES LIST PAGE SELECTORS
48
+ // ============================================
49
+ describe('SEL_PGED_001: Pages List Page Selectors', { tags: '@SEL_PGED_001' }, () => {
33
50
  beforeEach(() => {
34
51
  pages.visitList()
35
52
  pages.waitForList()
@@ -48,7 +65,10 @@ describe('Pages Block Editor Selectors Validation', { tags: ['@ui-selectors'] },
48
65
  })
49
66
  })
50
67
 
51
- describe('Block Editor Core Selectors (Pages)', () => {
68
+ // ============================================
69
+ // SEL_PGED_002: BLOCK EDITOR CORE SELECTORS
70
+ // ============================================
71
+ describe('SEL_PGED_002: Block Editor Core Selectors', { tags: '@SEL_PGED_002' }, () => {
52
72
  beforeEach(() => {
53
73
  pageBuilder.visitCreate()
54
74
  pageBuilder.waitForEditor()
@@ -71,7 +91,10 @@ describe('Pages Block Editor Selectors Validation', { tags: ['@ui-selectors'] },
71
91
  })
72
92
  })
73
93
 
74
- describe('Page Settings Selectors (Pages-specific)', () => {
94
+ // ============================================
95
+ // SEL_PGED_003: PAGE SETTINGS SELECTORS
96
+ // ============================================
97
+ describe('SEL_PGED_003: Page Settings Selectors', { tags: '@SEL_PGED_003' }, () => {
75
98
  beforeEach(() => {
76
99
  // Navigate to edit an existing page to see page settings and SEO
77
100
  pages.visitList()
@@ -115,7 +138,10 @@ describe('Pages Block Editor Selectors Validation', { tags: ['@ui-selectors'] },
115
138
  })
116
139
  })
117
140
 
118
- describe('Block Picker Selectors (Pages)', () => {
141
+ // ============================================
142
+ // SEL_PGED_004: BLOCK PICKER SELECTORS
143
+ // ============================================
144
+ describe('SEL_PGED_004: Block Picker Selectors', { tags: '@SEL_PGED_004' }, () => {
119
145
  beforeEach(() => {
120
146
  pageBuilder.visitCreate()
121
147
  pageBuilder.waitForEditor()
@@ -131,7 +157,10 @@ describe('Pages Block Editor Selectors Validation', { tags: ['@ui-selectors'] },
131
157
  })
132
158
  })
133
159
 
134
- describe('Block Canvas and Settings (Pages)', () => {
160
+ // ============================================
161
+ // SEL_PGED_005: BLOCK CANVAS AND SETTINGS
162
+ // ============================================
163
+ describe('SEL_PGED_005: Block Canvas and Settings', { tags: '@SEL_PGED_005' }, () => {
135
164
  beforeEach(() => {
136
165
  pageBuilder.visitCreate()
137
166
  pageBuilder.waitForEditor()
@@ -153,7 +182,10 @@ describe('Pages Block Editor Selectors Validation', { tags: ['@ui-selectors'] },
153
182
  })
154
183
  })
155
184
 
156
- describe('Edit Existing Page Selectors', () => {
185
+ // ============================================
186
+ // SEL_PGED_006: EDIT EXISTING PAGE
187
+ // ============================================
188
+ describe('SEL_PGED_006: Edit Existing Page', { tags: '@SEL_PGED_006' }, () => {
157
189
  it('should find editor elements when editing an existing page', () => {
158
190
  // Get a page ID from the list
159
191
  pages.visitList()