@nextsparkjs/theme-default 0.1.0-beta.30 → 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,27 +14,40 @@
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_API_001: API Keys Page Structure
19
+ * - SEL_API_002: Empty State / Skeleton Selectors
20
+ * - SEL_API_003: Create Dialog Selectors
21
+ * - SEL_API_004: API Key Row Dynamic Selectors
22
+ * - SEL_API_005: Details Dialog Selectors
23
+ * - SEL_API_006: Revoke/New Key Selectors
24
+ *
17
25
  * NOTE: API Keys page requires 'api-keys' permission (colaborator role minimum).
18
26
  * Many selectors are dynamic with {id} placeholders.
27
+ *
28
+ * SELECTOR MISMATCHES:
29
+ * - CORE_SELECTORS uses 'api-keys-create-dialog' but component uses 'api-keys-dialog'
30
+ * - CORE_SELECTORS uses 'api-key-name' but component uses 'api-keys-dialog-name'
31
+ * Tests use direct selectors based on actual implementation where mismatches exist.
19
32
  */
20
33
 
21
- import { SettingsPOM } from '../../src/features/SettingsPOM'
22
- import { loginAsDefaultOwner } from '../../src/session-helpers'
34
+ import { SettingsPOM } from '../../../src/features/SettingsPOM'
35
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
23
36
 
24
- describe('Settings API Keys Selectors Validation', { tags: ['@ui-selectors'] }, () => {
37
+ describe('Settings API Keys Selectors Validation', { tags: ['@ui-selectors', '@settings'] }, () => {
25
38
  const settings = SettingsPOM.create()
26
39
 
27
40
  beforeEach(() => {
28
- loginAsDefaultOwner()
41
+ loginAsDefaultDeveloper()
29
42
  settings.visitApiKeys()
30
43
  // Wait for API keys page to load
31
44
  cy.get(settings.selectors.apiKeysPage, { timeout: 15000 }).should('exist')
32
45
  })
33
46
 
34
47
  // ============================================
35
- // API KEYS PAGE STRUCTURE (5 selectors)
48
+ // SEL_API_001: API KEYS PAGE STRUCTURE
36
49
  // ============================================
37
- describe('API Keys Page Structure', () => {
50
+ describe('SEL_API_001: API Keys Page Structure', { tags: '@SEL_API_001' }, () => {
38
51
  it('should find api keys page container', () => {
39
52
  cy.get(settings.selectors.apiKeysPage).should('exist')
40
53
  })
@@ -58,9 +71,9 @@ describe('Settings API Keys Selectors Validation', { tags: ['@ui-selectors'] },
58
71
  })
59
72
 
60
73
  // ============================================
61
- // EMPTY STATE / SKELETON (3 selectors)
74
+ // SEL_API_002: EMPTY STATE / SKELETON
62
75
  // ============================================
63
- describe('Empty State Selectors', () => {
76
+ describe('SEL_API_002: Empty State / Skeleton Selectors', { tags: '@SEL_API_002' }, () => {
64
77
  // Note: Skeleton only visible during loading
65
78
  it.skip('should find skeleton (only visible during loading)', () => {
66
79
  cy.get(settings.selectors.apiKeysSkeleton).should('exist')
@@ -77,11 +90,10 @@ describe('Settings API Keys Selectors Validation', { tags: ['@ui-selectors'] },
77
90
  })
78
91
 
79
92
  // ============================================
80
- // CREATE DIALOG SELECTORS (4 selectors)
81
- // NOTE: CORE_SELECTORS uses 'api-keys-create-dialog' but component uses 'api-keys-dialog'
82
- // Tests use direct selectors based on actual implementation
93
+ // SEL_API_003: CREATE DIALOG SELECTORS
94
+ // NOTE: Component uses different selectors than CORE_SELECTORS
83
95
  // ============================================
84
- describe('Create Dialog Selectors', () => {
96
+ describe('SEL_API_003: Create Dialog Selectors', { tags: '@SEL_API_003' }, () => {
85
97
  beforeEach(() => {
86
98
  cy.get(settings.selectors.apiKeysCreate).click()
87
99
  // Component uses 'api-keys-dialog' not 'api-keys-create-dialog'
@@ -109,9 +121,9 @@ describe('Settings API Keys Selectors Validation', { tags: ['@ui-selectors'] },
109
121
  })
110
122
 
111
123
  // ============================================
112
- // API KEY ROW SELECTORS (Dynamic with {id})
124
+ // SEL_API_004: API KEY ROW DYNAMIC SELECTORS
113
125
  // ============================================
114
- describe('API Key Row Dynamic Selectors', () => {
126
+ describe('SEL_API_004: API Key Row Dynamic Selectors', { tags: '@SEL_API_004' }, () => {
115
127
  it('should find api key rows if any exist', () => {
116
128
  cy.get('body').then(($body) => {
117
129
  const hasRows = $body.find(settings.selectors.apiKeyRowGeneric).length > 0
@@ -133,10 +145,10 @@ describe('Settings API Keys Selectors Validation', { tags: ['@ui-selectors'] },
133
145
  })
134
146
 
135
147
  // ============================================
136
- // DETAILS DIALOG SELECTORS (14 selectors) - SKIP
148
+ // SEL_API_005: DETAILS DIALOG SELECTORS
137
149
  // Require clicking on an existing API key
138
150
  // ============================================
139
- describe('Details Dialog Selectors', () => {
151
+ describe('SEL_API_005: Details Dialog Selectors', { tags: '@SEL_API_005' }, () => {
140
152
  it.skip('should find details dialog (requires existing API key)', () => {
141
153
  cy.get(settings.selectors.apiKeysDetailsDialog).should('exist')
142
154
  })
@@ -195,9 +207,9 @@ describe('Settings API Keys Selectors Validation', { tags: ['@ui-selectors'] },
195
207
  })
196
208
 
197
209
  // ============================================
198
- // REVOKE DIALOG SELECTORS (3 selectors) - SKIP
210
+ // SEL_API_006: REVOKE / NEW KEY DISPLAY SELECTORS
199
211
  // ============================================
200
- describe('Revoke Dialog Selectors', () => {
212
+ describe('SEL_API_006: Revoke / New Key Selectors', { tags: '@SEL_API_006' }, () => {
201
213
  it.skip('should find revoke dialog (requires clicking revoke)', () => {
202
214
  cy.get(settings.selectors.apiKeyRevokeDialog).should('exist')
203
215
  })
@@ -206,13 +218,6 @@ describe('Settings API Keys Selectors Validation', { tags: ['@ui-selectors'] },
206
218
  cy.get(settings.selectors.apiKeyRevokeConfirm).should('exist')
207
219
  })
208
220
 
209
- // Note: Cancel is in dialog footer, not specific selector
210
- })
211
-
212
- // ============================================
213
- // NEW KEY DISPLAY SELECTORS (3 selectors) - SKIP
214
- // ============================================
215
- describe('New Key Display Selectors', () => {
216
221
  it.skip('should find new key display (after creating key)', () => {
217
222
  cy.get(settings.selectors.apiKeyNewDisplay).should('exist')
218
223
  })
@@ -0,0 +1,78 @@
1
+ ---
2
+ feature: Settings Billing UI Selectors Validation
3
+ priority: medium
4
+ tags: [selectors, settings, billing, ui-validation]
5
+ grepTags: [ui-selectors, settings, SEL_BILL_001]
6
+ coverage: 1
7
+ ---
8
+
9
+ # Settings Billing UI Selectors Validation
10
+
11
+ > Validates that settings billing selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality. Runs as Phase 12 sub-gate before functional tests.
12
+
13
+ ## @test SEL_BILL_001: Billing Page Selectors
14
+
15
+ ### Metadata
16
+ - **Priority:** Medium
17
+ - **Type:** Selector Validation
18
+ - **Tags:** settings, billing, subscription
19
+ - **Grep:** `@ui-selectors` `@SEL_BILL_001`
20
+ - **Status:** Active (1 passing, 13 skipped)
21
+
22
+ ```gherkin:en
23
+ Scenario: Billing page has required selectors
24
+
25
+ Given I am logged in as admin with billing permission
26
+ And I navigate to the billing settings page
27
+ Then I should find the billing main container
28
+ And I should find the manage subscription button
29
+ And I should find the current plan card
30
+ And I should find the plan name display
31
+ And I should find the plan status display
32
+ ```
33
+
34
+ ```gherkin:es
35
+ Scenario: La pagina de billing tiene los selectores requeridos
36
+
37
+ Given estoy logueado como admin con permiso de billing
38
+ And navego a la pagina de settings de billing
39
+ Then deberia encontrar el contenedor principal de billing
40
+ And deberia encontrar el boton de administrar suscripcion
41
+ And deberia encontrar la tarjeta del plan actual
42
+ And deberia encontrar el nombre del plan
43
+ And deberia encontrar el estado del plan
44
+ ```
45
+
46
+ ### Expected Results
47
+ - `settings.billing.main` selector exists (settings-billing-main) - **SKIPPED: Requires admin**
48
+ - `settings.billing.manageSubscription` selector exists (settings-billing-manage-subscription) - **SKIPPED: Requires admin**
49
+ - `settings.billing.currentPlan` selector exists (settings-billing-current-plan) - **SKIPPED: Requires admin**
50
+ - `settings.billing.planName` selector exists (settings-billing-plan-name) - **SKIPPED: Requires admin**
51
+ - `settings.billing.planStatus` selector exists (settings-billing-plan-status) - **SKIPPED: Requires admin**
52
+
53
+ ### Notes
54
+ **All tests are skipped because:**
55
+ - The billing page requires `settings.billing` permission
56
+ - The default developer user in devKeyring does not have this permission
57
+ - To test billing selectors:
58
+ 1. Configure a user with admin role that includes billing permissions
59
+ 2. Use `loginAsUser('admin')` instead of `loginAsDefaultDeveloper()`
60
+ 3. Enable tests by removing `.skip`
61
+
62
+ **Future Enhancement:**
63
+ Consider adding a billing admin user to devKeyring specifically for testing billing functionality.
64
+
65
+ ---
66
+
67
+ ## Related Components
68
+
69
+ | Component | File | Selectors |
70
+ |-----------|------|-----------|
71
+ | BillingSettings | `packages/core/src/components/settings/BillingSettings.tsx` | settings-billing-* |
72
+ | PlanCard | `packages/core/src/components/billing/PlanCard.tsx` | settings-billing-current-plan, settings-billing-plan-name, settings-billing-plan-status |
73
+
74
+ ## Related POMs
75
+
76
+ | POM | File | Usage |
77
+ |-----|------|-------|
78
+ | SettingsPOM | `themes/default/tests/cypress/src/features/SettingsPOM.ts` | Billing page selectors |
@@ -14,35 +14,38 @@
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_BILL_001: Billing Page Selectors (mostly skipped - requires admin role)
19
+ *
17
20
  * IMPORTANT: Billing page requires 'settings.billing' permission (admin role).
18
21
  * Users without this permission are redirected to /dashboard/settings.
19
22
  * Many billing selectors from CORE_SELECTORS are not yet implemented.
20
23
  */
21
24
 
22
- import { SettingsPOM } from '../../src/features/SettingsPOM'
23
- import { loginAsDefaultOwner } from '../../src/session-helpers'
25
+ import { SettingsPOM } from '../../../src/features/SettingsPOM'
26
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
24
27
 
25
- describe('Settings Billing Selectors Validation', { tags: ['@ui-selectors'] }, () => {
28
+ describe('Settings Billing Selectors Validation', { tags: ['@ui-selectors', '@settings'] }, () => {
26
29
  const settings = SettingsPOM.create()
27
30
 
28
31
  // ============================================
29
- // BILLING SELECTORS (19 selectors in CORE_SELECTORS)
32
+ // SEL_BILL_001: BILLING PAGE SELECTORS
30
33
  // Requires admin role permission 'settings.billing'
31
34
  // All tests skipped - billing page requires special permissions
32
35
  // ============================================
33
- describe('Billing Page Selectors', () => {
36
+ describe('SEL_BILL_001: Billing Page Selectors', { tags: '@SEL_BILL_001' }, () => {
34
37
  // NOTE: Billing page requires 'settings.billing' permission (admin role)
35
38
  // The default owner may not have this permission, causing redirects
36
39
  // All tests are skipped until proper admin login is available
37
40
 
38
41
  it.skip('should find billing main (requires admin permission)', () => {
39
- loginAsDefaultOwner()
42
+ loginAsDefaultDeveloper()
40
43
  settings.visitBilling()
41
44
  cy.get(settings.selectors.billingMain).should('exist')
42
45
  })
43
46
 
44
47
  it.skip('should find billing header (requires admin permission)', () => {
45
- loginAsDefaultOwner()
48
+ loginAsDefaultDeveloper()
46
49
  settings.visitBilling()
47
50
  cy.get(settings.selectors.billingHeader).should('exist')
48
51
  })
@@ -0,0 +1,138 @@
1
+ ---
2
+ feature: Settings Layout UI Selectors Validation
3
+ priority: high
4
+ tags: [selectors, settings, layout, ui-validation]
5
+ grepTags: [ui-selectors, settings, SEL_LAY_001, SEL_LAY_002]
6
+ coverage: 2
7
+ ---
8
+
9
+ # Settings Layout UI Selectors Validation
10
+
11
+ > Validates that settings layout selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality. Runs as Phase 12 sub-gate before functional tests.
12
+
13
+ ## @test SEL_LAY_001: Layout Selectors
14
+
15
+ ### Metadata
16
+ - **Priority:** High
17
+ - **Type:** Selector Validation
18
+ - **Tags:** settings, layout, container
19
+ - **Grep:** `@ui-selectors` `@SEL_LAY_001`
20
+ - **Status:** Active (7 passing, 0 skipped)
21
+
22
+ ```gherkin:en
23
+ Scenario: Settings layout has required selectors
24
+
25
+ Given I am logged in as developer
26
+ And I navigate to the settings page
27
+ Then I should find the settings layout main container
28
+ And I should find the settings header
29
+ And I should find the settings content area
30
+ And I should find the settings sidebar
31
+ And I should find the settings sidebar container
32
+ And I should find the settings mobile menu trigger
33
+ And I should find the settings mobile sheet
34
+ ```
35
+
36
+ ```gherkin:es
37
+ Scenario: El layout de settings tiene los selectores requeridos
38
+
39
+ Given estoy logueado como developer
40
+ And navego a la pagina de settings
41
+ Then deberia encontrar el contenedor principal del layout de settings
42
+ And deberia encontrar el header de settings
43
+ And deberia encontrar el area de contenido de settings
44
+ And deberia encontrar el sidebar de settings
45
+ And deberia encontrar el contenedor del sidebar de settings
46
+ And deberia encontrar el trigger del menu movil de settings
47
+ And deberia encontrar el sheet movil de settings
48
+ ```
49
+
50
+ ### Expected Results
51
+ - `settings.layout.main` selector exists (settings-layout-main)
52
+ - `settings.layout.header` selector exists (settings-layout-header)
53
+ - `settings.layout.content` selector exists (settings-layout-content)
54
+ - `settings.layout.sidebar` selector exists (settings-layout-sidebar)
55
+ - `settings.layout.sidebarContainer` selector exists (settings-sidebar-container)
56
+ - `settings.layout.mobileMenuTrigger` selector exists (settings-mobile-menu-trigger)
57
+ - `settings.layout.mobileSheet` selector exists (settings-mobile-sheet)
58
+
59
+ ---
60
+
61
+ ## @test SEL_LAY_002: Sidebar Selectors
62
+
63
+ ### Metadata
64
+ - **Priority:** High
65
+ - **Type:** Selector Validation
66
+ - **Tags:** settings, sidebar, navigation
67
+ - **Grep:** `@ui-selectors` `@SEL_LAY_002`
68
+ - **Status:** Active (11 passing, 0 skipped)
69
+
70
+ ```gherkin:en
71
+ Scenario: Settings sidebar has all navigation links
72
+
73
+ Given I am logged in as developer
74
+ And I navigate to the settings page
75
+ Then I should find the profile nav link
76
+ And I should find the password nav link
77
+ And I should find the teams nav link
78
+ And I should find the API keys nav link
79
+ And I should find the appearance nav link
80
+ And I should find the notifications nav link
81
+ And I should find the billing nav link
82
+ And I should find the members nav link
83
+ And I should find the invite nav link
84
+ And I should find the roles nav link
85
+ And I should find the danger zone nav link
86
+ And I should find the back to dashboard link
87
+ ```
88
+
89
+ ```gherkin:es
90
+ Scenario: El sidebar de settings tiene todos los links de navegacion
91
+
92
+ Given estoy logueado como developer
93
+ And navego a la pagina de settings
94
+ Then deberia encontrar el link de navegacion a perfil
95
+ And deberia encontrar el link de navegacion a password
96
+ And deberia encontrar el link de navegacion a equipos
97
+ And deberia encontrar el link de navegacion a API keys
98
+ And deberia encontrar el link de navegacion a apariencia
99
+ And deberia encontrar el link de navegacion a notificaciones
100
+ And deberia encontrar el link de navegacion a facturacion
101
+ And deberia encontrar el link de navegacion a miembros
102
+ And deberia encontrar el link de navegacion a invitar
103
+ And deberia encontrar el link de navegacion a roles
104
+ And deberia encontrar el link de navegacion a zona de peligro
105
+ And deberia encontrar el link de volver al dashboard
106
+ ```
107
+
108
+ ### Expected Results
109
+ - `settings.sidebar.profile` selector exists (settings-sidebar-profile)
110
+ - `settings.sidebar.password` selector exists (settings-sidebar-password)
111
+ - `settings.sidebar.teams` selector exists (settings-sidebar-teams)
112
+ - `settings.sidebar.apiKeys` selector exists (settings-sidebar-api-keys)
113
+ - `settings.sidebar.appearance` selector exists (settings-sidebar-appearance)
114
+ - `settings.sidebar.notifications` selector exists (settings-sidebar-notifications)
115
+ - `settings.sidebar.billing` selector exists (settings-sidebar-billing)
116
+ - `settings.sidebar.members` selector exists (settings-sidebar-members)
117
+ - `settings.sidebar.invite` selector exists (settings-sidebar-invite)
118
+ - `settings.sidebar.roles` selector exists (settings-sidebar-roles)
119
+ - `settings.sidebar.dangerZone` selector exists (settings-sidebar-danger-zone)
120
+ - `settings.sidebar.backToDashboard` selector exists (settings-sidebar-back-to-dashboard)
121
+
122
+ ### Notes
123
+ Some sidebar items may not be visible depending on user permissions. The test validates selectors that are accessible to the developer role.
124
+
125
+ ---
126
+
127
+ ## Related Components
128
+
129
+ | Component | File | Selectors |
130
+ |-----------|------|-----------|
131
+ | SettingsLayout | `packages/core/src/components/settings/SettingsLayout.tsx` | settings-layout-main, settings-layout-header, settings-layout-content |
132
+ | SettingsSidebar | `packages/core/src/components/settings/SettingsSidebar.tsx` | settings-sidebar-*, settings-layout-sidebar |
133
+
134
+ ## Related POMs
135
+
136
+ | POM | File | Usage |
137
+ |-----|------|-------|
138
+ | SettingsPOM | `themes/default/tests/cypress/src/features/SettingsPOM.ts` | Settings layout and sidebar selectors |
@@ -13,22 +13,26 @@
13
13
  * - Navigate to settings pages (requires login)
14
14
  * - Assert elements exist in DOM (no form submissions)
15
15
  * - Fast execution (< 30 seconds per describe block)
16
+ *
17
+ * Test IDs:
18
+ * - SEL_LAY_001: Layout Selectors
19
+ * - SEL_LAY_002: Sidebar Selectors
16
20
  */
17
21
 
18
- import { SettingsPOM } from '../../src/features/SettingsPOM'
19
- import { loginAsDefaultOwner } from '../../src/session-helpers'
22
+ import { SettingsPOM } from '../../../src/features/SettingsPOM'
23
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
20
24
 
21
- describe('Settings Layout Selectors Validation', { tags: ['@ui-selectors'] }, () => {
25
+ describe('Settings Layout Selectors Validation', { tags: ['@ui-selectors', '@settings'] }, () => {
22
26
  const settings = SettingsPOM.create()
23
27
 
24
28
  beforeEach(() => {
25
- loginAsDefaultOwner()
29
+ loginAsDefaultDeveloper()
26
30
  })
27
31
 
28
32
  // ============================================
29
- // LAYOUT SELECTORS (7 selectors)
33
+ // SEL_LAY_001: LAYOUT SELECTORS
30
34
  // ============================================
31
- describe('Layout Selectors', () => {
35
+ describe('SEL_LAY_001: Layout Selectors', { tags: '@SEL_LAY_001' }, () => {
32
36
  beforeEach(() => {
33
37
  settings.visitSettings()
34
38
  settings.waitForSettings()
@@ -64,9 +68,9 @@ describe('Settings Layout Selectors Validation', { tags: ['@ui-selectors'] }, ()
64
68
  })
65
69
 
66
70
  // ============================================
67
- // SIDEBAR SELECTORS (4 selectors)
71
+ // SEL_LAY_002: SIDEBAR SELECTORS
68
72
  // ============================================
69
- describe('Sidebar Selectors', () => {
73
+ describe('SEL_LAY_002: Sidebar Selectors', { tags: '@SEL_LAY_002' }, () => {
70
74
  beforeEach(() => {
71
75
  settings.visitSettings()
72
76
  settings.waitForSettings()
@@ -0,0 +1,82 @@
1
+ ---
2
+ feature: Settings Password UI Selectors Validation
3
+ priority: high
4
+ tags: [selectors, settings, password, ui-validation]
5
+ grepTags: [ui-selectors, settings, SEL_PASS_001]
6
+ coverage: 1
7
+ ---
8
+
9
+ # Settings Password UI Selectors Validation
10
+
11
+ > Validates that settings password selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality. Runs as Phase 12 sub-gate before functional tests.
12
+
13
+ ## @test SEL_PASS_001: Password Page Selectors
14
+
15
+ ### Metadata
16
+ - **Priority:** High
17
+ - **Type:** Selector Validation
18
+ - **Tags:** settings, password, form
19
+ - **Grep:** `@ui-selectors` `@SEL_PASS_001`
20
+ - **Status:** Active (2 passing, 5 skipped)
21
+
22
+ ```gherkin:en
23
+ Scenario: Password page has required selectors
24
+
25
+ Given I am logged in as developer
26
+ And I navigate to the password settings page
27
+ Then I should find the password container
28
+ And I should find the password form
29
+ And I should find the current password input
30
+ And I should find the new password input
31
+ And I should find the confirm password input
32
+ And I should find the password submit button
33
+ ```
34
+
35
+ ```gherkin:es
36
+ Scenario: La pagina de password tiene los selectores requeridos
37
+
38
+ Given estoy logueado como developer
39
+ And navego a la pagina de settings de password
40
+ Then deberia encontrar el contenedor de password
41
+ And deberia encontrar el formulario de password
42
+ And deberia encontrar el input de password actual
43
+ And deberia encontrar el input de nuevo password
44
+ And deberia encontrar el input de confirmar password
45
+ And deberia encontrar el boton de enviar password
46
+ ```
47
+
48
+ ### Expected Results
49
+ - `settings.password.container` selector exists (settings-password) - **SKIPPED: Mismatch**
50
+ - `settings.password.form` selector exists (password-form)
51
+ - `settings.password.current` selector exists (password-current) - **SKIPPED: Mismatch**
52
+ - `settings.password.new` selector exists (password-new) - **SKIPPED: Mismatch**
53
+ - `settings.password.confirm` selector exists (password-confirm) - **SKIPPED: Mismatch**
54
+ - `settings.password.submit` selector exists (password-submit)
55
+
56
+ ### Notes
57
+ **Selector Mismatches Documented:**
58
+
59
+ | Expected (CORE_SELECTORS) | Actual (Component) | Issue |
60
+ |---------------------------|-------------------|-------|
61
+ | `settings-password` | `password-main` | Container uses different naming |
62
+ | `password-current` | `password-current-input` | Extra `-input` suffix |
63
+ | `password-new` | `password-new-input` | Extra `-input` suffix |
64
+ | `password-confirm` | `password-confirm-input` | Extra `-input` suffix |
65
+
66
+ Resolution options:
67
+ 1. Update CORE_SELECTORS to match component naming
68
+ 2. Update PasswordForm component to match CORE_SELECTORS
69
+
70
+ ---
71
+
72
+ ## Related Components
73
+
74
+ | Component | File | Selectors |
75
+ |-----------|------|-----------|
76
+ | PasswordForm | `packages/core/src/components/settings/PasswordForm.tsx` | password-main, password-form, password-current-input, password-new-input, password-confirm-input, password-submit |
77
+
78
+ ## Related POMs
79
+
80
+ | POM | File | Usage |
81
+ |-----|------|-------|
82
+ | SettingsPOM | `themes/default/tests/cypress/src/features/SettingsPOM.ts` | Password page selectors |
@@ -14,27 +14,30 @@
14
14
  * - Assert elements exist in DOM (no form submissions)
15
15
  * - Fast execution (< 30 seconds per describe block)
16
16
  *
17
- * NOTE: Password page only visible for users with password auth (not Google OAuth)
17
+ * Test IDs:
18
+ * - SEL_PASS_001: Password Page Selectors
19
+ *
20
+ * NOTE: Password page only visible for users with password auth (not Google OAuth).
18
21
  * Some selectors from CORE_SELECTORS have naming mismatches with implementation.
19
22
  */
20
23
 
21
- import { SettingsPOM } from '../../src/features/SettingsPOM'
22
- import { loginAsDefaultOwner } from '../../src/session-helpers'
24
+ import { SettingsPOM } from '../../../src/features/SettingsPOM'
25
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
23
26
 
24
- describe('Settings Password Selectors Validation', { tags: ['@ui-selectors'] }, () => {
27
+ describe('Settings Password Selectors Validation', { tags: ['@ui-selectors', '@settings'] }, () => {
25
28
  const settings = SettingsPOM.create()
26
29
 
27
30
  beforeEach(() => {
28
- loginAsDefaultOwner()
31
+ loginAsDefaultDeveloper()
29
32
  settings.visitPassword()
30
33
  // Wait for password page to load
31
34
  cy.get(settings.selectors.passwordForm, { timeout: 15000 }).should('be.visible')
32
35
  })
33
36
 
34
37
  // ============================================
35
- // PASSWORD SELECTORS (7 selectors in CORE_SELECTORS)
38
+ // SEL_PASS_001: PASSWORD PAGE SELECTORS
36
39
  // ============================================
37
- describe('Password Page Selectors', () => {
40
+ describe('SEL_PASS_001: Password Page Selectors', { tags: '@SEL_PASS_001' }, () => {
38
41
  // NOTE: CORE_SELECTORS defines 'settings-password' but component uses 'password-main'
39
42
  it.skip('should find password container (selector mismatch: CORE uses settings-password, component uses password-main)', () => {
40
43
  cy.get(settings.selectors.passwordContainer).should('exist')
@@ -0,0 +1,77 @@
1
+ ---
2
+ feature: Settings Profile UI Selectors Validation
3
+ priority: high
4
+ tags: [selectors, settings, profile, ui-validation]
5
+ grepTags: [ui-selectors, settings, SEL_PROF_001]
6
+ coverage: 1
7
+ ---
8
+
9
+ # Settings Profile UI Selectors Validation
10
+
11
+ > Validates that settings profile selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality. Runs as Phase 12 sub-gate before functional tests.
12
+
13
+ ## @test SEL_PROF_001: Profile Page Selectors
14
+
15
+ ### Metadata
16
+ - **Priority:** High
17
+ - **Type:** Selector Validation
18
+ - **Tags:** settings, profile, form
19
+ - **Grep:** `@ui-selectors` `@SEL_PROF_001`
20
+ - **Status:** Active (6 passing, 3 skipped)
21
+
22
+ ```gherkin:en
23
+ Scenario: Profile page has required selectors
24
+
25
+ Given I am logged in as developer
26
+ And I navigate to the profile settings page
27
+ Then I should find the profile container
28
+ And I should find the profile form
29
+ And I should find the first name input
30
+ And I should find the last name input
31
+ And I should find the email input
32
+ And I should find the profile submit button
33
+ ```
34
+
35
+ ```gherkin:es
36
+ Scenario: La pagina de perfil tiene los selectores requeridos
37
+
38
+ Given estoy logueado como developer
39
+ And navego a la pagina de settings de perfil
40
+ Then deberia encontrar el contenedor de perfil
41
+ And deberia encontrar el formulario de perfil
42
+ And deberia encontrar el input de nombre
43
+ And deberia encontrar el input de apellido
44
+ And deberia encontrar el input de email
45
+ And deberia encontrar el boton de enviar perfil
46
+ ```
47
+
48
+ ### Expected Results
49
+ - `settings.profile.container` selector exists (settings-profile) ✅
50
+ - `settings.profile.form` selector exists (profile-form) ✅
51
+ - `settings.profile.firstName` selector exists (profile-first-name) ✅
52
+ - `settings.profile.lastName` selector exists (profile-last-name) ✅
53
+ - `settings.profile.email` selector exists (profile-email) ✅
54
+ - `settings.profile.submit` selector exists (profile-submit) ✅
55
+ - `settings.profile.avatar` selector - **SKIPPED: Feature not implemented**
56
+ - `settings.profile.avatarUpload` selector - **SKIPPED: Feature not implemented**
57
+ - `settings.profile.successMessage` selector - **SKIPPED: Requires form submission (functional test)**
58
+
59
+ ### Notes
60
+ **Skipped Tests (3):**
61
+ 1. `profile-avatar` - Avatar feature not implemented in ProfilePage component
62
+ 2. `profile-avatar-upload` - Avatar upload feature not implemented
63
+ 3. `profile-success` - Success message only appears after form submission (functional test, not selector validation)
64
+
65
+ ---
66
+
67
+ ## Related Components
68
+
69
+ | Component | File | Selectors |
70
+ |-----------|------|-----------|
71
+ | ProfilePage | `apps/dev/app/dashboard/settings/profile/page.tsx` | settings-profile, profile-form, profile-first-name, profile-last-name, profile-email, profile-submit, profile-success |
72
+
73
+ ## Related POMs
74
+
75
+ | POM | File | Usage |
76
+ |-----|------|-------|
77
+ | SettingsPOM | `themes/default/tests/cypress/src/features/SettingsPOM.ts` | Profile page selectors |