@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.
- package/lib/selectors.ts +5 -1
- package/package.json +2 -2
- package/tests/cypress/e2e/{_devtools → _utils/devtools}/access.cy.ts +3 -3
- package/tests/cypress/e2e/{_devtools → _utils/devtools}/navigation.cy.ts +3 -3
- package/tests/cypress/e2e/{_devtools → _utils/devtools}/pages.cy.ts +3 -3
- package/tests/cypress/e2e/_utils/selectors/auth.bdd.md +354 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/auth.cy.ts +39 -35
- package/tests/cypress/e2e/_utils/selectors/billing.bdd.md +276 -0
- package/tests/cypress/e2e/_utils/selectors/billing.cy.ts +182 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.bdd.md +205 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.cy.ts +137 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.bdd.md +147 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.cy.ts +114 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.bdd.md +111 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/dashboard-sidebar.cy.ts +35 -6
- package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.bdd.md +200 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/dashboard-topnav.cy.ts +30 -43
- package/tests/cypress/e2e/_utils/selectors/devtools.bdd.md +306 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/devtools.cy.ts +77 -14
- package/tests/cypress/e2e/_utils/selectors/global-search.bdd.md +115 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/global-search.cy.ts +15 -10
- package/tests/cypress/e2e/_utils/selectors/pages-editor.bdd.md +207 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/pages-editor.cy.ts +44 -12
- package/tests/cypress/e2e/_utils/selectors/posts-editor.bdd.md +184 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/posts-editor.cy.ts +107 -39
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/public.cy.ts +1 -1
- package/tests/cypress/e2e/_utils/selectors/settings-api-keys.bdd.md +266 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-api-keys.cy.ts +30 -25
- package/tests/cypress/e2e/_utils/selectors/settings-billing.bdd.md +78 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-billing.cy.ts +10 -7
- package/tests/cypress/e2e/_utils/selectors/settings-layout.bdd.md +138 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-layout.cy.ts +12 -8
- package/tests/cypress/e2e/_utils/selectors/settings-password.bdd.md +82 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-password.cy.ts +10 -7
- package/tests/cypress/e2e/_utils/selectors/settings-profile.bdd.md +77 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-profile.cy.ts +15 -18
- package/tests/cypress/e2e/_utils/selectors/settings-teams.bdd.md +130 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-teams.cy.ts +36 -18
- package/tests/cypress/e2e/_utils/selectors/superadmin.bdd.md +261 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/superadmin.cy.ts +23 -15
- package/tests/cypress/e2e/_utils/selectors/tasks.bdd.md +353 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/tasks.cy.ts +11 -10
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/taxonomies.cy.ts +1 -1
- package/tests/cypress/e2e/_utils/selectors/teams.bdd.md +278 -0
- package/tests/cypress/e2e/{_selectors → _utils/selectors}/teams.cy.ts +90 -37
- package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-teams.cy.ts +4 -4
- package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-users.cy.ts +4 -4
- package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/dashboard.cy.ts +4 -4
- package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/subscriptions-overview.cy.ts +4 -4
- package/tests/cypress/e2e/api/{entities → _core/users}/users-security.cy.ts +2 -2
- package/tests/cypress/e2e/uat/{auth → _core/auth}/login-logout.cy.ts +2 -2
- package/tests/cypress/e2e/uat/{auth → _core/auth}/password-reset.cy.ts +1 -1
- package/tests/cypress/e2e/uat/{billing → _core/billing}/extended.cy.ts +2 -2
- package/tests/cypress/e2e/uat/{billing → _core/billing}/feature-gates.cy.ts +2 -2
- package/tests/cypress/e2e/uat/{billing → _core/billing}/page.cy.ts +2 -2
- package/tests/cypress/e2e/uat/{billing → _core/billing}/status.cy.ts +2 -2
- package/tests/cypress/e2e/uat/{billing → _core/billing}/team-switch.cy.ts +2 -2
- package/tests/cypress/e2e/uat/{billing → _core/billing}/usage.cy.ts +2 -2
- package/tests/cypress/e2e/uat/{devtools → _core/devtools}/api-tester.cy.ts +2 -2
- package/tests/cypress/e2e/uat/{scheduled-actions → _core/scheduled-actions}/devtools-ui.cy.ts +2 -2
- package/tests/cypress/e2e/uat/{teams → _core/teams}/roles-matrix.cy.ts +2 -2
- package/tests/cypress/e2e/uat/{teams → _core/teams}/switcher.cy.ts +2 -2
- package/tests/cypress/e2e/uat/{roles → features/roles}/editor-role.cy.ts +2 -2
- package/tests/cypress/e2e/uat/{roles → features/roles}/member-restrictions.cy.ts +3 -3
- package/tests/cypress/e2e/uat/{roles → features/roles}/owner-full-crud.cy.ts +2 -2
- package/tests/cypress/src/core/DashboardEntityPOM.ts +2 -2
- package/tests/cypress/src/features/DashboardPOM.ts +2 -2
- package/tests/cypress/src/features/DevtoolsPOM.ts +12 -1
- package/tests/cypress/src/session-helpers.ts +35 -17
- package/tests/cypress/support/e2e.ts +2 -1
- package/tests/cypress.config.ts +29 -10
- package/tests/tsconfig.json +13 -7
- package/tests/cypress/e2e/_selectors/billing.cy.ts +0 -89
- package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +0 -113
- package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +0 -89
- /package/tests/cypress/e2e/{_devtools → _utils/devtools}/access.bdd.md +0 -0
- /package/tests/cypress/e2e/{_devtools → _utils/devtools}/navigation.bdd.md +0 -0
- /package/tests/cypress/e2e/{_devtools → _utils/devtools}/pages.bdd.md +0 -0
- /package/tests/cypress/e2e/{_docs → _utils/docs}/README.md +0 -0
- /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/sector7-superadmin-teams.narration.json +0 -0
- /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/sector7-superadmin.cy.ts +0 -0
- /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/teams-system.doc.cy.ts +0 -0
- /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/teams-system.narration.json +0 -0
- /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-teams.bdd.md +0 -0
- /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-users.bdd.md +0 -0
- /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/dashboard.bdd.md +0 -0
- /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/subscriptions-overview.bdd.md +0 -0
- /package/tests/cypress/e2e/api/{billing → _core/billing}/BillingAPIController.js +0 -0
- /package/tests/cypress/e2e/api/{billing → _core/billing}/check-action.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{billing → _core/billing}/checkout.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{billing → _core/billing}/lifecycle.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/README.md +0 -0
- /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/business.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/downgrade.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/fixtures/billing-plans.json +0 -0
- /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/free.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/pro.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/starter.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{billing → _core/billing}/portal.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{devtools → _core/devtools}/registries.bdd.md +0 -0
- /package/tests/cypress/e2e/api/{devtools → _core/devtools}/registries.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/cron-endpoint.bdd.md +0 -0
- /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/cron-endpoint.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/devtools-endpoint.bdd.md +0 -0
- /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/devtools-endpoint.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/scheduling.bdd.md +0 -0
- /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/scheduling.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{settings → _core/settings}/api-keys.crud.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{entities → _core/users}/users-crud.cy.ts +0 -0
- /package/tests/cypress/e2e/api/{entities → _core/users}/users-metas.cy.ts +0 -0
- /package/tests/cypress/e2e/api/entities/{customers-crud.cy.ts → customers/customers-crud.cy.ts} +0 -0
- /package/tests/cypress/e2e/api/entities/{customers-metas.cy.ts → customers/customers-metas.cy.ts} +0 -0
- /package/tests/cypress/e2e/api/entities/{blocks-scope.cy.ts → pages/blocks-scope.cy.ts} +0 -0
- /package/tests/cypress/e2e/api/entities/{pages-crud.cy.ts → pages/pages-crud.cy.ts} +0 -0
- /package/tests/cypress/e2e/api/entities/{pages-status.cy.ts → pages/pages-status.cy.ts} +0 -0
- /package/tests/cypress/e2e/api/entities/{post-categories-crud.cy.ts → posts/post-categories-crud.cy.ts} +0 -0
- /package/tests/cypress/e2e/api/entities/{posts-crud.cy.ts → posts/posts-crud.cy.ts} +0 -0
- /package/tests/cypress/e2e/api/entities/{posts-status.cy.ts → posts/posts-status.cy.ts} +0 -0
- /package/tests/cypress/e2e/api/entities/{tasks-crud.cy.ts → tasks/tasks-crud.cy.ts} +0 -0
- /package/tests/cypress/e2e/api/entities/{tasks-metas.cy.ts → tasks/tasks-metas.cy.ts} +0 -0
- /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/developer-login.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/developer-login.cy.ts +0 -0
- /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/superadmin-login.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/superadmin-login.cy.ts +0 -0
- /package/tests/cypress/e2e/uat/{auth → _core/auth}/custom-roles/editor-login.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{auth → _core/auth}/custom-roles/editor-login.cy.ts +0 -0
- /package/tests/cypress/e2e/uat/{auth → _core/auth}/login-logout.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{auth → _core/auth}/password-reset.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/admin-login.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/admin-login.cy.ts +0 -0
- /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/member-login.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/member-login.cy.ts +0 -0
- /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/owner-login.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/owner-login.cy.ts +0 -0
- /package/tests/cypress/e2e/uat/{billing → _core/billing}/extended.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{billing → _core/billing}/feature-gates.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{billing → _core/billing}/page.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{billing → _core/billing}/status.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{billing → _core/billing}/team-switch.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{billing → _core/billing}/usage.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{blocks → _core/blocks}/hero.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{blocks → _core/blocks}/hero.cy.ts +0 -0
- /package/tests/cypress/e2e/uat/{scheduled-actions → _core/scheduled-actions}/devtools-ui.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{teams → _core/teams}/roles-matrix.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{teams → _core/teams}/switcher.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{teams → _core/teams}/team-switcher.md +0 -0
- /package/tests/cypress/e2e/uat/{roles → features/roles}/editor-role.bdd.md +0 -0
- /package/tests/cypress/e2e/uat/{roles → features/roles}/member-restrictions.bdd.md +0 -0
- /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 '
|
|
22
|
-
import {
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
81
|
-
// NOTE:
|
|
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
|
|
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
|
|
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
|
|
210
|
+
// SEL_API_006: REVOKE / NEW KEY DISPLAY SELECTORS
|
|
199
211
|
// ============================================
|
|
200
|
-
describe('Revoke
|
|
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 '
|
|
23
|
-
import {
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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 '
|
|
19
|
-
import {
|
|
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
|
-
|
|
29
|
+
loginAsDefaultDeveloper()
|
|
26
30
|
})
|
|
27
31
|
|
|
28
32
|
// ============================================
|
|
29
|
-
// LAYOUT 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
|
|
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
|
-
*
|
|
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 '
|
|
22
|
-
import {
|
|
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
|
-
|
|
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
|
|
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 |
|