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

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 +33 -12
  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
@@ -0,0 +1,276 @@
1
+ ---
2
+ feature: Billing UI Selectors Validation
3
+ priority: high
4
+ tags: [selectors, billing, ui-validation]
5
+ grepTags: [ui-selectors, billing, SEL_BILL_001, SEL_BILL_002, SEL_BILL_003, SEL_BILL_004, SEL_BILL_005, SEL_BILL_006, SEL_BILL_DOC]
6
+ coverage: 7
7
+ ---
8
+
9
+ # Billing UI Selectors Validation
10
+
11
+ > Validates that billing component selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality. Most tests are skipped due to permission requirements (OWNER role only) or specific state requirements (paid subscription, downgrade flow).
12
+
13
+ **IMPORTANT:** Billing page requires `settings.billing` permission which only OWNER role has. See also: `settings-billing.cy.ts` for additional billing page selectors.
14
+
15
+ ## @test SEL_BILL_001: Billing Page Structure
16
+
17
+ ### Metadata
18
+ - **Priority:** High
19
+ - **Type:** Selector Validation
20
+ - **Tags:** billing, page, structure
21
+ - **Grep:** `@ui-selectors` `@SEL_BILL_001`
22
+ - **Status:** Skipped - requires OWNER permission
23
+
24
+ ```gherkin:en
25
+ Scenario: Billing page has complete structure
26
+
27
+ Given I am logged in as OWNER
28
+ And I navigate to the billing settings page
29
+ Then I should find the billing main container
30
+ And I should find the billing header
31
+ And I should find the upgrade plan button
32
+ And I should find the add payment button
33
+ ```
34
+
35
+ ```gherkin:es
36
+ Scenario: Pagina de billing tiene estructura completa
37
+
38
+ Given estoy logueado como OWNER
39
+ And navego a la pagina de configuracion de billing
40
+ Then deberia encontrar el contenedor principal de billing
41
+ And deberia encontrar el header de billing
42
+ And deberia encontrar el boton de upgrade plan
43
+ And deberia encontrar el boton de agregar pago
44
+ ```
45
+
46
+ ### Expected Results
47
+ - `billing-main` selector exists
48
+ - `billing-header` selector exists
49
+ - `billing-upgrade-plan` selector exists
50
+ - `billing-add-payment` selector exists
51
+
52
+ ### Notes
53
+ All tests skipped because billing page requires `settings.billing` permission which only OWNER role has.
54
+
55
+ ---
56
+
57
+ ## @test SEL_BILL_002: Invoices Section
58
+
59
+ ### Metadata
60
+ - **Priority:** High
61
+ - **Type:** Selector Validation
62
+ - **Tags:** billing, invoices, table
63
+ - **Grep:** `@ui-selectors` `@SEL_BILL_002`
64
+ - **Status:** Skipped - requires OWNER permission
65
+
66
+ ```gherkin:en
67
+ Scenario: Billing page has invoices section
68
+
69
+ Given I am logged in as OWNER
70
+ And I navigate to the billing settings page
71
+ Then I should find the invoices table
72
+ And I should find invoice rows (when invoices exist)
73
+ And I should find load more button (when many invoices)
74
+ And I should find invoice status badges
75
+ ```
76
+
77
+ ```gherkin:es
78
+ Scenario: Pagina de billing tiene seccion de facturas
79
+
80
+ Given estoy logueado como OWNER
81
+ And navego a la pagina de configuracion de billing
82
+ Then deberia encontrar la tabla de facturas
83
+ And deberia encontrar filas de facturas (cuando existen)
84
+ And deberia encontrar boton cargar mas (cuando hay muchas)
85
+ And deberia encontrar badges de estado de factura
86
+ ```
87
+
88
+ ### Expected Results
89
+ - `invoices-table` selector exists
90
+ - `invoices-row` selector exists (when invoices present)
91
+ - `invoices-load-more` selector exists (when more invoices available)
92
+ - `invoice-status-badge` selector exists (when invoices present)
93
+
94
+ ---
95
+
96
+ ## @test SEL_BILL_003: Usage Display
97
+
98
+ ### Metadata
99
+ - **Priority:** Medium
100
+ - **Type:** Selector Validation
101
+ - **Tags:** billing, usage, limits
102
+ - **Grep:** `@ui-selectors` `@SEL_BILL_003`
103
+ - **Status:** Skipped - requires OWNER permission
104
+
105
+ ```gherkin:en
106
+ Scenario: Billing page displays usage information
107
+
108
+ Given I am logged in as OWNER
109
+ And I navigate to the billing settings page
110
+ Then I should see usage numbers in format "X / Y"
111
+ And I should find the usage dashboard component
112
+ ```
113
+
114
+ ```gherkin:es
115
+ Scenario: Pagina de billing muestra informacion de uso
116
+
117
+ Given estoy logueado como OWNER
118
+ And navego a la pagina de configuracion de billing
119
+ Then deberia ver numeros de uso en formato "X / Y"
120
+ And deberia encontrar el componente usage dashboard
121
+ ```
122
+
123
+ ### Expected Results
124
+ - Usage numbers displayed in format `N / M`
125
+ - `usage-dashboard` selector exists
126
+
127
+ ---
128
+
129
+ ## @test SEL_BILL_004: ManageBillingButton
130
+
131
+ ### Metadata
132
+ - **Priority:** Low
133
+ - **Type:** Selector Validation
134
+ - **Tags:** billing, manage, stripe
135
+ - **Grep:** `@ui-selectors` `@SEL_BILL_004`
136
+ - **Status:** Skipped - requires paid Stripe subscription
137
+
138
+ ```gherkin:en
139
+ Scenario: Billing page has manage billing button for paid users
140
+
141
+ Given I am logged in as a user with paid subscription
142
+ And the subscription has an external Stripe customer ID
143
+ And I navigate to the billing settings page
144
+ Then I should find the manage billing button
145
+ ```
146
+
147
+ ```gherkin:es
148
+ Scenario: Pagina de billing tiene boton de gestionar billing para usuarios de pago
149
+
150
+ Given estoy logueado como usuario con suscripcion de pago
151
+ And la suscripcion tiene un ID de cliente externo de Stripe
152
+ And navego a la pagina de configuracion de billing
153
+ Then deberia encontrar el boton de gestionar billing
154
+ ```
155
+
156
+ ### Expected Results
157
+ - `manage-billing-button` selector exists
158
+
159
+ ### Notes
160
+ ManageBillingButton only renders when `subscription.externalCustomerId` exists (Stripe customer).
161
+
162
+ ---
163
+
164
+ ## @test SEL_BILL_005: SubscriptionStatus
165
+
166
+ ### Metadata
167
+ - **Priority:** Low
168
+ - **Type:** Selector Validation
169
+ - **Tags:** billing, subscription, status
170
+ - **Grep:** `@ui-selectors` `@SEL_BILL_005`
171
+ - **Status:** Skipped - requires active subscription
172
+
173
+ ```gherkin:en
174
+ Scenario: Billing page shows subscription status for subscribers
175
+
176
+ Given I am logged in as a user with active subscription
177
+ And I navigate to the billing settings page
178
+ Then I should find the subscription status container
179
+ And I should find the subscription plan name
180
+ And I should find the subscription status badge
181
+ ```
182
+
183
+ ```gherkin:es
184
+ Scenario: Pagina de billing muestra estado de suscripcion para suscriptores
185
+
186
+ Given estoy logueado como usuario con suscripcion activa
187
+ And navego a la pagina de configuracion de billing
188
+ Then deberia encontrar el contenedor de estado de suscripcion
189
+ And deberia encontrar el nombre del plan de suscripcion
190
+ And deberia encontrar el badge de estado de suscripcion
191
+ ```
192
+
193
+ ### Expected Results
194
+ - `subscription-status` selector exists
195
+ - `subscription-status-plan` selector exists
196
+ - `subscription-status-badge` selector exists
197
+
198
+ ---
199
+
200
+ ## @test SEL_BILL_006: DowngradeWarning
201
+
202
+ ### Metadata
203
+ - **Priority:** Low
204
+ - **Type:** Selector Validation
205
+ - **Tags:** billing, downgrade, warning
206
+ - **Grep:** `@ui-selectors` `@SEL_BILL_006`
207
+ - **Status:** Skipped - requires downgrade flow with over-limit resources
208
+
209
+ ```gherkin:en
210
+ Scenario: Downgrade warning appears when user has over-limit resources
211
+
212
+ Given I am attempting to downgrade my subscription
213
+ And I have resources that exceed the new plan limits
214
+ Then I should see the downgrade warning alert
215
+ And I should see the warning title
216
+ And I should see the warning description
217
+ And I should see the list of over-limit resources
218
+ And I should see the confirm downgrade button
219
+ And I should see the cancel button
220
+ ```
221
+
222
+ ```gherkin:es
223
+ Scenario: Advertencia de downgrade aparece cuando usuario tiene recursos sobre el limite
224
+
225
+ Given estoy intentando bajar mi suscripcion
226
+ And tengo recursos que exceden los limites del nuevo plan
227
+ Then deberia ver la alerta de advertencia de downgrade
228
+ And deberia ver el titulo de advertencia
229
+ And deberia ver la descripcion de advertencia
230
+ And deberia ver la lista de recursos sobre el limite
231
+ And deberia ver el boton de confirmar downgrade
232
+ And deberia ver el boton de cancelar
233
+ ```
234
+
235
+ ### Expected Results
236
+ - `downgrade-warning` selector exists
237
+ - `downgrade-warning-title` selector exists
238
+ - `downgrade-warning-description` selector exists
239
+ - `downgrade-warning-list` selector exists
240
+ - `downgrade-limit-{slug}` selectors exist
241
+ - `downgrade-warning-confirm` selector exists
242
+ - `downgrade-warning-cancel` selector exists
243
+
244
+ ### Notes
245
+ DowngradeWarning only renders when `overLimitResources.length > 0`.
246
+
247
+ ---
248
+
249
+ ## @test SEL_BILL_DOC: Selector Documentation
250
+
251
+ ### Metadata
252
+ - **Priority:** Low
253
+ - **Type:** Documentation
254
+ - **Tags:** billing, documentation
255
+ - **Grep:** `@ui-selectors` `@SEL_BILL_DOC`
256
+ - **Status:** Active
257
+
258
+ ```gherkin:en
259
+ Scenario: Document all billing component selectors
260
+
261
+ Given the billing selector tests are running
262
+ Then the test should log all available billing selectors
263
+ And document which permissions/states are required for each
264
+ ```
265
+
266
+ ```gherkin:es
267
+ Scenario: Documentar todos los selectores de componentes de billing
268
+
269
+ Given los tests de selectores de billing estan corriendo
270
+ Then el test deberia loguear todos los selectores de billing disponibles
271
+ And documentar que permisos/estados se requieren para cada uno
272
+ ```
273
+
274
+ ### Expected Results
275
+ - Test logs all billing selectors for reference
276
+ - Documents permission and state requirements
@@ -0,0 +1,182 @@
1
+ /**
2
+ * UI Selectors Validation: Billing Components
3
+ *
4
+ * This test validates that billing component selectors exist in the DOM.
5
+ * This is a lightweight test that ONLY checks selector presence, not functionality.
6
+ *
7
+ * Purpose:
8
+ * - Validate billing component selectors (ManageBillingButton, SubscriptionStatus, etc.)
9
+ * - Document selectors from CORE_SELECTORS.settings.billing
10
+ * - Run as Phase 12 sub-gate before functional tests
11
+ *
12
+ * Scope:
13
+ * - Billing page requires 'settings.billing' permission (OWNER role only)
14
+ * - Most tests are skipped due to permission/state requirements
15
+ * - Fast execution (< 30 seconds per describe block)
16
+ *
17
+ * Test IDs:
18
+ * - SEL_BILL_001: Billing Page Structure (skipped - requires OWNER permission)
19
+ * - SEL_BILL_002: Invoices Section (skipped - requires OWNER permission)
20
+ * - SEL_BILL_003: Usage Display (skipped - requires OWNER permission)
21
+ * - SEL_BILL_004: ManageBillingButton (skipped - requires paid subscription)
22
+ * - SEL_BILL_005: SubscriptionStatus (skipped - requires active subscription)
23
+ * - SEL_BILL_006: DowngradeWarning (skipped - requires downgrade flow)
24
+ *
25
+ * IMPORTANT: Billing page requires 'settings.billing' permission which only OWNER role has.
26
+ * Users without this permission are redirected to /dashboard/settings.
27
+ * See also: settings-billing.cy.ts for additional billing selectors.
28
+ */
29
+
30
+ describe('Billing Selectors Validation', { tags: ['@ui-selectors', '@billing'] }, () => {
31
+ // ============================================
32
+ // SEL_BILL_001: BILLING PAGE STRUCTURE
33
+ // ============================================
34
+ describe('SEL_BILL_001: Billing Page Structure', { tags: '@SEL_BILL_001' }, () => {
35
+ // NOTE: Billing page requires 'settings.billing' permission (OWNER role only)
36
+ // Default test users may not have this permission
37
+
38
+ it.skip('should find billing main container (requires OWNER permission)', () => {
39
+ cy.get('[data-cy="billing-main"]').should('exist')
40
+ })
41
+
42
+ it.skip('should find billing header (requires OWNER permission)', () => {
43
+ cy.get('[data-cy="billing-header"]').should('exist')
44
+ })
45
+
46
+ it.skip('should find upgrade plan button (requires OWNER permission)', () => {
47
+ cy.get('[data-cy="billing-upgrade-plan"]').should('exist')
48
+ })
49
+
50
+ it.skip('should find add payment button (requires OWNER permission)', () => {
51
+ cy.get('[data-cy="billing-add-payment"]').should('exist')
52
+ })
53
+ })
54
+
55
+ // ============================================
56
+ // SEL_BILL_002: INVOICES SECTION
57
+ // ============================================
58
+ describe('SEL_BILL_002: Invoices Section', { tags: '@SEL_BILL_002' }, () => {
59
+ it.skip('should find invoices table (requires OWNER permission)', () => {
60
+ cy.get('[data-cy="invoices-table"]').should('exist')
61
+ })
62
+
63
+ it.skip('should find invoices row (requires invoices)', () => {
64
+ cy.get('[data-cy="invoices-row"]').should('exist')
65
+ })
66
+
67
+ it.skip('should find load more button (requires many invoices)', () => {
68
+ cy.get('[data-cy="invoices-load-more"]').should('exist')
69
+ })
70
+
71
+ it.skip('should find invoice status badge (requires invoices)', () => {
72
+ cy.get('[data-cy="invoice-status-badge"]').should('exist')
73
+ })
74
+ })
75
+
76
+ // ============================================
77
+ // SEL_BILL_003: USAGE DISPLAY
78
+ // ============================================
79
+ describe('SEL_BILL_003: Usage Display', { tags: '@SEL_BILL_003' }, () => {
80
+ it.skip('should display usage numbers (requires OWNER permission)', () => {
81
+ cy.contains(/\d+\s*\/\s*\d+/).should('be.visible')
82
+ })
83
+
84
+ it.skip('should find usage dashboard (requires UsageDashboard component)', () => {
85
+ cy.get('[data-cy="usage-dashboard"]').should('exist')
86
+ })
87
+ })
88
+
89
+ // ============================================
90
+ // SEL_BILL_004: MANAGE BILLING BUTTON
91
+ // ============================================
92
+ describe('SEL_BILL_004: ManageBillingButton', { tags: '@SEL_BILL_004' }, () => {
93
+ // ManageBillingButton only renders when subscription has externalCustomerId
94
+
95
+ it.skip('should find manage billing button (requires paid subscription)', () => {
96
+ cy.get('[data-cy="manage-billing-button"]').should('exist')
97
+ })
98
+ })
99
+
100
+ // ============================================
101
+ // SEL_BILL_005: SUBSCRIPTION STATUS
102
+ // ============================================
103
+ describe('SEL_BILL_005: SubscriptionStatus', { tags: '@SEL_BILL_005' }, () => {
104
+ // SubscriptionStatus requires an active subscription
105
+
106
+ it.skip('should find subscription status container (requires subscription)', () => {
107
+ cy.get('[data-cy="subscription-status"]').should('exist')
108
+ })
109
+
110
+ it.skip('should find subscription plan name (requires subscription)', () => {
111
+ cy.get('[data-cy="subscription-status-plan"]').should('exist')
112
+ })
113
+
114
+ it.skip('should find subscription status badge (requires subscription)', () => {
115
+ cy.get('[data-cy="subscription-status-badge"]').should('exist')
116
+ })
117
+ })
118
+
119
+ // ============================================
120
+ // SEL_BILL_006: DOWNGRADE WARNING
121
+ // ============================================
122
+ describe('SEL_BILL_006: DowngradeWarning', { tags: '@SEL_BILL_006' }, () => {
123
+ // DowngradeWarning only renders when overLimitResources.length > 0
124
+
125
+ it.skip('should find downgrade warning (requires downgrade flow)', () => {
126
+ cy.get('[data-cy="downgrade-warning"]').should('exist')
127
+ })
128
+
129
+ it.skip('should find downgrade warning title (requires downgrade flow)', () => {
130
+ cy.get('[data-cy="downgrade-warning-title"]').should('exist')
131
+ })
132
+
133
+ it.skip('should find downgrade warning description (requires downgrade flow)', () => {
134
+ cy.get('[data-cy="downgrade-warning-description"]').should('exist')
135
+ })
136
+
137
+ it.skip('should find downgrade warning list (requires downgrade flow)', () => {
138
+ cy.get('[data-cy="downgrade-warning-list"]').should('exist')
139
+ })
140
+
141
+ it.skip('should find downgrade confirm button (requires downgrade flow)', () => {
142
+ cy.get('[data-cy="downgrade-warning-confirm"]').should('exist')
143
+ })
144
+
145
+ it.skip('should find downgrade cancel button (requires downgrade flow)', () => {
146
+ cy.get('[data-cy="downgrade-warning-cancel"]').should('exist')
147
+ })
148
+ })
149
+
150
+ // ============================================
151
+ // DOCUMENTATION TEST
152
+ // ============================================
153
+ describe('SEL_BILL_DOC: Selector Documentation', { tags: '@SEL_BILL_DOC' }, () => {
154
+ it('should document billing component selectors', () => {
155
+ cy.log('=== BILLING COMPONENT SELECTORS ===')
156
+ cy.log('')
157
+ cy.log('Billing Page (requires OWNER permission):')
158
+ cy.log('- billing-main, billing-header')
159
+ cy.log('- billing-upgrade-plan, billing-add-payment')
160
+ cy.log('- invoices-table, invoices-row, invoices-load-more')
161
+ cy.log('')
162
+ cy.log('ManageBillingButton (requires paid subscription):')
163
+ cy.log('- manage-billing-button')
164
+ cy.log('')
165
+ cy.log('SubscriptionStatus (requires active subscription):')
166
+ cy.log('- subscription-status, subscription-status-plan')
167
+ cy.log('- subscription-status-badge, subscription-status-period')
168
+ cy.log('- subscription-status-upgrade, subscription-manage-billing')
169
+ cy.log('')
170
+ cy.log('DowngradeWarning (requires downgrade flow):')
171
+ cy.log('- downgrade-warning, downgrade-warning-title')
172
+ cy.log('- downgrade-warning-description, downgrade-warning-list')
173
+ cy.log('- downgrade-limit-{slug}, downgrade-warning-policy')
174
+ cy.log('- downgrade-warning-confirm, downgrade-warning-cancel')
175
+ cy.log('')
176
+ cy.log('UsageDashboard:')
177
+ cy.log('- usage-dashboard, usage-dashboard-limits')
178
+ cy.log('- usage-dashboard-limit-{slug}, usage-bar-{slug}')
179
+ cy.wrap(true).should('be.true')
180
+ })
181
+ })
182
+ })
@@ -0,0 +1,205 @@
1
+ ---
2
+ feature: Dashboard Mobile UI Selectors Validation
3
+ priority: medium
4
+ tags: [selectors, mobile, dashboard, ui-validation]
5
+ grepTags: [ui-selectors, mobile, SEL_DMOB_DOC, SEL_DMOB_001, SEL_DMOB_002, SEL_DMOB_003, SEL_DMOB_004]
6
+ coverage: 5
7
+ ---
8
+
9
+ # Dashboard Mobile UI Selectors Validation
10
+
11
+ > Validates that dashboard mobile component selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality. All tests are skipped because they require mobile viewport (< 1024px).
12
+
13
+ **IMPORTANT:** Mobile selectors are ONLY visible on small viewports. Desktop tests will not find these elements. To test: add `cy.viewport('iphone-x')` or run with `--config viewportWidth=375,viewportHeight=812`.
14
+
15
+ ## @test SEL_DMOB_DOC: Mobile Testing Documentation
16
+
17
+ ### Metadata
18
+ - **Priority:** Low
19
+ - **Type:** Documentation
20
+ - **Tags:** mobile, documentation
21
+ - **Grep:** `@ui-selectors` `@SEL_DMOB_DOC`
22
+ - **Status:** Active
23
+
24
+ ```gherkin:en
25
+ Scenario: Document all dashboard mobile selectors
26
+
27
+ Given the mobile selector tests are running
28
+ Then the test should log all mobile selectors
29
+ And document viewport requirements for each section
30
+ ```
31
+
32
+ ```gherkin:es
33
+ Scenario: Documentar todos los selectores mobile del dashboard
34
+
35
+ Given los tests de selectores mobile estan corriendo
36
+ Then el test deberia loguear todos los selectores mobile
37
+ And documentar los requisitos de viewport para cada seccion
38
+ ```
39
+
40
+ ### Expected Results
41
+ - Test logs all mobile selectors for reference
42
+ - Documents viewport requirements (<1024px)
43
+
44
+ ---
45
+
46
+ ## @test SEL_DMOB_001: Mobile Topbar Selectors
47
+
48
+ ### Metadata
49
+ - **Priority:** Medium
50
+ - **Type:** Selector Validation
51
+ - **Tags:** mobile, topbar, navigation
52
+ - **Grep:** `@ui-selectors` `@SEL_DMOB_001`
53
+ - **Status:** Skipped - requires mobile viewport
54
+
55
+ ```gherkin:en
56
+ Scenario: Mobile topbar has all required selectors
57
+
58
+ Given I am viewing the dashboard on a mobile viewport
59
+ And I am logged in as a valid user
60
+ Then I should find the mobile topbar header
61
+ And I should find the user profile button
62
+ And I should find the notifications button
63
+ And I should find the theme toggle button
64
+ ```
65
+
66
+ ```gherkin:es
67
+ Scenario: Topbar mobile tiene todos los selectores requeridos
68
+
69
+ Given estoy viendo el dashboard en viewport mobile
70
+ And estoy logueado como usuario valido
71
+ Then deberia encontrar el header del topbar mobile
72
+ And deberia encontrar el boton de perfil de usuario
73
+ And deberia encontrar el boton de notificaciones
74
+ And deberia encontrar el boton de cambio de tema
75
+ ```
76
+
77
+ ### Expected Results
78
+ - `mobile-topbar-header` selector exists
79
+ - `mobile-topbar-user-profile` selector exists
80
+ - `mobile-topbar-notifications` selector exists
81
+ - `mobile-topbar-theme-toggle` selector exists
82
+
83
+ ### Notes
84
+ All selectors have `lg:hidden` CSS class - only visible on screens < 1024px.
85
+
86
+ ---
87
+
88
+ ## @test SEL_DMOB_002: Mobile Bottom Nav Selectors
89
+
90
+ ### Metadata
91
+ - **Priority:** Medium
92
+ - **Type:** Selector Validation
93
+ - **Tags:** mobile, bottom-nav, navigation
94
+ - **Grep:** `@ui-selectors` `@SEL_DMOB_002`
95
+ - **Status:** Skipped - requires mobile viewport
96
+
97
+ ```gherkin:en
98
+ Scenario: Mobile bottom navigation has all required selectors
99
+
100
+ Given I am viewing the dashboard on a mobile viewport
101
+ And I am logged in as a valid user
102
+ Then I should find the bottom navigation bar
103
+ And I should find bottom nav items for key sections
104
+ ```
105
+
106
+ ```gherkin:es
107
+ Scenario: Navegacion inferior mobile tiene todos los selectores requeridos
108
+
109
+ Given estoy viendo el dashboard en viewport mobile
110
+ And estoy logueado como usuario valido
111
+ Then deberia encontrar la barra de navegacion inferior
112
+ And deberia encontrar items de navegacion para secciones clave
113
+ ```
114
+
115
+ ### Expected Results
116
+ - `mobile-bottom-nav` selector exists
117
+ - `mobile-bottom-nav-item-{slug}` selectors exist (dashboard, entities, create, more)
118
+
119
+ ### Notes
120
+ Bottom nav replaces sidebar on mobile. Shows 4 main navigation items.
121
+
122
+ ---
123
+
124
+ ## @test SEL_DMOB_003: Mobile More Sheet Selectors
125
+
126
+ ### Metadata
127
+ - **Priority:** Medium
128
+ - **Type:** Selector Validation
129
+ - **Tags:** mobile, sheet, navigation
130
+ - **Grep:** `@ui-selectors` `@SEL_DMOB_003`
131
+ - **Status:** Skipped - requires mobile viewport
132
+
133
+ ```gherkin:en
134
+ Scenario: Mobile more sheet has all required selectors
135
+
136
+ Given I am viewing the dashboard on a mobile viewport
137
+ And I am logged in as a valid user
138
+ And I tap on the "More" button in bottom nav
139
+ Then I should find the more sheet content
140
+ And I should find more sheet items for each section
141
+ And I should find the superadmin link (if permitted)
142
+ And I should find the team switcher
143
+ And I should find the signout button
144
+ ```
145
+
146
+ ```gherkin:es
147
+ Scenario: Sheet de mas opciones mobile tiene todos los selectores requeridos
148
+
149
+ Given estoy viendo el dashboard en viewport mobile
150
+ And estoy logueado como usuario valido
151
+ And toco el boton "Mas" en la navegacion inferior
152
+ Then deberia encontrar el contenido del sheet de mas opciones
153
+ And deberia encontrar items del sheet para cada seccion
154
+ And deberia encontrar el link de superadmin (si esta permitido)
155
+ And deberia encontrar el selector de equipo
156
+ And deberia encontrar el boton de cerrar sesion
157
+ ```
158
+
159
+ ### Expected Results
160
+ - `mobile-more-sheet-content` selector exists
161
+ - `mobile-more-sheet-item-{slug}` selectors exist
162
+ - `mobile-more-sheet-superadmin` selector exists
163
+ - `mobile-more-sheet-team-switcher` selector exists
164
+ - `mobile-more-sheet-signout` selector exists
165
+
166
+ ### Notes
167
+ More sheet opens from bottom of screen as a sheet/drawer component.
168
+
169
+ ---
170
+
171
+ ## @test SEL_DMOB_004: Mobile Quick Create Selectors
172
+
173
+ ### Metadata
174
+ - **Priority:** Medium
175
+ - **Type:** Selector Validation
176
+ - **Tags:** mobile, sheet, quick-create
177
+ - **Grep:** `@ui-selectors` `@SEL_DMOB_004`
178
+ - **Status:** Skipped - requires mobile viewport
179
+
180
+ ```gherkin:en
181
+ Scenario: Mobile quick create sheet has all required selectors
182
+
183
+ Given I am viewing the dashboard on a mobile viewport
184
+ And I am logged in as a valid user
185
+ And I tap on the "Create" button in bottom nav
186
+ Then I should find the quick create sheet content
187
+ And I should find quick create items for each entity type
188
+ ```
189
+
190
+ ```gherkin:es
191
+ Scenario: Sheet de creacion rapida mobile tiene todos los selectores requeridos
192
+
193
+ Given estoy viendo el dashboard en viewport mobile
194
+ And estoy logueado como usuario valido
195
+ And toco el boton "Crear" en la navegacion inferior
196
+ Then deberia encontrar el contenido del sheet de creacion rapida
197
+ And deberia encontrar items de creacion rapida para cada tipo de entidad
198
+ ```
199
+
200
+ ### Expected Results
201
+ - `mobile-quick-create-content` selector exists
202
+ - `mobile-quick-create-item-{slug}` selectors exist (tasks, customers, posts, pages, etc.)
203
+
204
+ ### Notes
205
+ Quick create sheet shows available entity types for fast creation on mobile.