@nextsparkjs/theme-default 0.1.0-beta.44 → 0.1.0-beta.45
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/components/ai-chat/ChatPanel.tsx +7 -7
- package/components/ai-chat/Message.tsx +2 -2
- package/components/ai-chat/MessageInput.tsx +3 -3
- package/components/ai-chat/MessageList.tsx +3 -3
- package/components/ai-chat/TypingIndicator.tsx +2 -2
- package/entities/customers/api/docs.md +107 -0
- package/entities/customers/api/presets.ts +80 -0
- package/entities/pages/api/docs.md +114 -0
- package/entities/pages/api/presets.ts +72 -0
- package/entities/posts/api/docs.md +120 -0
- package/entities/posts/api/presets.ts +74 -0
- package/entities/tasks/api/docs.md +126 -0
- package/entities/tasks/api/presets.ts +84 -0
- package/lib/selectors.ts +2 -2
- package/messages/de/admin.json +45 -0
- package/messages/en/admin.json +45 -0
- package/messages/es/admin.json +45 -0
- package/messages/fr/admin.json +45 -0
- package/messages/it/admin.json +45 -0
- package/messages/pt/admin.json +45 -0
- package/package.json +3 -3
- package/styles/globals.css +24 -0
- package/tests/cypress/e2e/_utils/selectors/block-editor.bdd.md +491 -0
- package/tests/cypress/e2e/_utils/selectors/block-editor.cy.ts +475 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-container.cy.ts +52 -0
- package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.cy.ts +14 -14
- package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.cy.ts +3 -3
- package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.bdd.md +38 -73
- package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.cy.ts +21 -42
- package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.bdd.md +117 -38
- package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.cy.ts +35 -12
- package/tests/cypress/e2e/_utils/selectors/settings-layout.bdd.md +50 -59
- package/tests/cypress/e2e/_utils/selectors/settings-layout.cy.ts +15 -23
- package/tests/cypress/e2e/_utils/selectors/tasks.bdd.md +395 -155
- package/tests/cypress/e2e/_utils/selectors/tasks.cy.ts +795 -174
- package/tests/cypress/e2e/api/_core/teams/teams-security.cy.ts +415 -0
- package/tests/cypress/e2e/uat/_core/teams/inline-edit.cy.ts +278 -0
- package/tests/cypress/src/core/BlockEditorBasePOM.ts +269 -99
- package/tests/cypress/src/core/DashboardEntityPOM.ts +1 -1
- package/tests/cypress/src/features/DashboardPOM.ts +49 -28
- package/tests/cypress/src/features/PageBuilderPOM.ts +20 -0
- package/tests/cypress/src/features/SettingsPOM.ts +511 -166
- package/tests/cypress/src/features/SuperadminPOM.ts +679 -159
- package/tests/cypress/src/features/index.ts +10 -10
- package/tests/cypress/e2e/_utils/selectors/pages-editor.bdd.md +0 -207
- package/tests/cypress/e2e/_utils/selectors/pages-editor.cy.ts +0 -211
- package/tests/cypress/e2e/_utils/selectors/posts-editor.bdd.md +0 -184
- package/tests/cypress/e2e/_utils/selectors/posts-editor.cy.ts +0 -350
|
@@ -2,15 +2,17 @@
|
|
|
2
2
|
feature: Dashboard Sidebar UI Selectors Validation
|
|
3
3
|
priority: medium
|
|
4
4
|
tags: [selectors, sidebar, dashboard, ui-validation]
|
|
5
|
-
grepTags: [ui-selectors, sidebar, SEL_DBAR_001
|
|
6
|
-
coverage:
|
|
5
|
+
grepTags: [ui-selectors, dashboard, sidebar, SEL_DBAR_001]
|
|
6
|
+
coverage: 1
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Dashboard Sidebar UI Selectors Validation
|
|
10
10
|
|
|
11
|
-
> Validates that dashboard sidebar component selectors exist in the DOM. This is a lightweight test that ONLY checks selector presence, not functionality.
|
|
11
|
+
> Validates that dashboard sidebar component 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
12
|
|
|
13
|
-
**IMPORTANT:** Sidebar is only visible on desktop viewports (>= 1024px) when authenticated.
|
|
13
|
+
**IMPORTANT:** Sidebar is only visible on desktop viewports (>= 1024px) when authenticated.
|
|
14
|
+
|
|
15
|
+
**Login:** Uses Developer via `loginAsDefaultDeveloper()`.
|
|
14
16
|
|
|
15
17
|
## @test SEL_DBAR_001: Sidebar Structure
|
|
16
18
|
|
|
@@ -18,94 +20,57 @@ coverage: 2
|
|
|
18
20
|
- **Priority:** High
|
|
19
21
|
- **Type:** Selector Validation
|
|
20
22
|
- **Tags:** sidebar, structure, desktop
|
|
21
|
-
- **Grep:** `@ui-selectors` `@SEL_DBAR_001`
|
|
22
|
-
- **Status:**
|
|
23
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@sidebar` `@SEL_DBAR_001`
|
|
24
|
+
- **Status:** Active (4 passing, 1 skipped)
|
|
23
25
|
|
|
24
26
|
```gherkin:en
|
|
25
27
|
Scenario: Dashboard sidebar has required structure selectors
|
|
26
28
|
|
|
27
|
-
Given I am logged in as a
|
|
29
|
+
Given I am logged in as a developer user
|
|
28
30
|
And I am viewing the dashboard on desktop viewport
|
|
29
|
-
Then I should find the sidebar
|
|
30
|
-
And
|
|
31
|
-
And
|
|
32
|
-
And
|
|
31
|
+
Then I should find the sidebar container
|
|
32
|
+
And I should find the sidebar header
|
|
33
|
+
And I should find the sidebar logo
|
|
34
|
+
And I should find the sidebar content
|
|
35
|
+
And I should find the sidebar footer (not implemented in component)
|
|
33
36
|
```
|
|
34
37
|
|
|
35
38
|
```gherkin:es
|
|
36
39
|
Scenario: Sidebar del dashboard tiene selectores de estructura requeridos
|
|
37
40
|
|
|
38
|
-
Given estoy logueado como usuario
|
|
41
|
+
Given estoy logueado como usuario developer
|
|
39
42
|
And estoy viendo el dashboard en viewport desktop
|
|
40
|
-
Then deberia encontrar el contenedor
|
|
41
|
-
And deberia
|
|
42
|
-
And deberia
|
|
43
|
-
And deberia
|
|
43
|
+
Then deberia encontrar el contenedor del sidebar
|
|
44
|
+
And deberia encontrar el header del sidebar
|
|
45
|
+
And deberia encontrar el logo del sidebar
|
|
46
|
+
And deberia encontrar el contenido del sidebar
|
|
47
|
+
And deberia encontrar el footer del sidebar (no implementado en componente)
|
|
44
48
|
```
|
|
45
49
|
|
|
46
50
|
### Expected Results
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
+
| Selector Path | POM Accessor | data-cy Value | Status |
|
|
52
|
+
|---------------|--------------|---------------|--------|
|
|
53
|
+
| dashboard.sidebar.container | dashboard.selectors.sidebarContainer | sidebar-main | Implemented |
|
|
54
|
+
| dashboard.sidebar.header | dashboard.selectors.sidebarHeader | sidebar-header | Implemented |
|
|
55
|
+
| dashboard.sidebar.logo | dashboard.selectors.sidebarLogo | sidebar-logo | Implemented |
|
|
56
|
+
| dashboard.sidebar.content | dashboard.selectors.sidebarContent | sidebar-content | Implemented |
|
|
57
|
+
| dashboard.sidebar.footer | dashboard.selectors.sidebarFooter | sidebar-footer | **NOT IMPLEMENTED** |
|
|
51
58
|
|
|
52
59
|
### Notes
|
|
53
|
-
The Sidebar.tsx component
|
|
54
|
-
-
|
|
55
|
-
-
|
|
56
|
-
- `sidebar-logo` - Logo container
|
|
57
|
-
- `sidebar-nav` - Navigation container
|
|
58
|
-
- `sidebar-nav-items` - Navigation items wrapper
|
|
59
|
-
|
|
60
|
-
---
|
|
61
|
-
|
|
62
|
-
## @test SEL_DBAR_DOC: Selector Documentation
|
|
63
|
-
|
|
64
|
-
### Metadata
|
|
65
|
-
- **Priority:** Low
|
|
66
|
-
- **Type:** Documentation
|
|
67
|
-
- **Tags:** sidebar, documentation
|
|
68
|
-
- **Grep:** `@ui-selectors` `@SEL_DBAR_DOC`
|
|
69
|
-
- **Status:** Active
|
|
70
|
-
|
|
71
|
-
```gherkin:en
|
|
72
|
-
Scenario: Document all sidebar component selectors
|
|
73
|
-
|
|
74
|
-
Given the sidebar selector tests are running
|
|
75
|
-
Then the test should log all sidebar selectors
|
|
76
|
-
And document which selectors are implemented vs defined in CORE_SELECTORS
|
|
77
|
-
And document any selector/component mismatches
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
```gherkin:es
|
|
81
|
-
Scenario: Documentar todos los selectores de componente sidebar
|
|
82
|
-
|
|
83
|
-
Given los tests de selectores de sidebar estan corriendo
|
|
84
|
-
Then el test deberia loguear todos los selectores de sidebar
|
|
85
|
-
And documentar que selectores estan implementados vs definidos en CORE_SELECTORS
|
|
86
|
-
And documentar cualquier desalineacion entre selectores y componentes
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
### Expected Results
|
|
90
|
-
- Test logs all sidebar selectors for reference
|
|
91
|
-
- Documents implemented vs not-implemented selectors
|
|
92
|
-
- Notes selector naming mismatches
|
|
60
|
+
- The sidebar footer selector is not currently implemented in Sidebar.tsx component
|
|
61
|
+
- Sidebar is only visible on desktop viewports when authenticated
|
|
62
|
+
- Component file: `packages/core/src/components/dashboard/Sidebar.tsx`
|
|
93
63
|
|
|
94
64
|
---
|
|
95
65
|
|
|
96
|
-
##
|
|
66
|
+
## Related Components
|
|
97
67
|
|
|
98
|
-
|
|
68
|
+
| Component | File | Selectors |
|
|
69
|
+
|-----------|------|-----------|
|
|
70
|
+
| Sidebar | `packages/core/src/components/dashboard/Sidebar.tsx` | sidebar-main, sidebar-header, sidebar-logo, sidebar-content |
|
|
99
71
|
|
|
100
|
-
|
|
101
|
-
|---------------------|-----------------|----------------|--------|
|
|
102
|
-
| `dashboard.sidebar.main` | `sidebar-main` | `sidebar-main` | ✅ Aligned |
|
|
103
|
-
| `dashboard.sidebar.header` | `sidebar-header` | `sidebar-header-section` | ⚠️ Mismatch |
|
|
104
|
-
| `dashboard.sidebar.content` | `sidebar-content` | N/A | ❌ Not implemented |
|
|
105
|
-
| `dashboard.sidebar.footer` | `sidebar-footer` | N/A | ❌ Not implemented |
|
|
72
|
+
## Related POMs
|
|
106
73
|
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
2. Update component to match CORE_SELECTORS (`sidebar-header`)
|
|
111
|
-
3. Add missing selectors to component (`sidebar-content`, `sidebar-footer`)
|
|
74
|
+
| POM | File | Usage |
|
|
75
|
+
|-----|------|-------|
|
|
76
|
+
| DashboardPOM | `themes/default/tests/cypress/src/features/DashboardPOM.ts` | Sidebar selectors and methods |
|
|
@@ -15,17 +15,23 @@
|
|
|
15
15
|
* - Fast execution (< 30 seconds per describe block)
|
|
16
16
|
*
|
|
17
17
|
* Test IDs:
|
|
18
|
-
* - SEL_DBAR_001: Sidebar Structure
|
|
19
|
-
*
|
|
18
|
+
* - SEL_DBAR_001: Sidebar Structure (4 selectors)
|
|
19
|
+
*
|
|
20
|
+
* Component: Sidebar.tsx
|
|
21
|
+
* Selectors:
|
|
22
|
+
* - dashboard.sidebar.container → 'sidebar-main'
|
|
23
|
+
* - dashboard.sidebar.header → 'sidebar-header'
|
|
24
|
+
* - dashboard.sidebar.logo → 'sidebar-logo'
|
|
25
|
+
* - dashboard.sidebar.content → 'sidebar-content'
|
|
26
|
+
* - dashboard.sidebar.footer → 'sidebar-footer' (not implemented in component)
|
|
20
27
|
*
|
|
21
28
|
* NOTE: Sidebar is only visible on desktop viewports when authenticated.
|
|
22
|
-
* Some selectors are skipped due to misalignment between CORE_SELECTORS and component implementation.
|
|
23
29
|
*/
|
|
24
30
|
|
|
25
31
|
import { DashboardPOM } from '../../../src/features/DashboardPOM'
|
|
26
32
|
import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
|
|
27
33
|
|
|
28
|
-
describe('Dashboard Sidebar Selectors Validation', { tags: ['@ui-selectors', '@sidebar'] }, () => {
|
|
34
|
+
describe('Dashboard Sidebar Selectors Validation', { tags: ['@ui-selectors', '@dashboard', '@sidebar'] }, () => {
|
|
29
35
|
const dashboard = DashboardPOM.create()
|
|
30
36
|
|
|
31
37
|
beforeEach(() => {
|
|
@@ -35,55 +41,28 @@ describe('Dashboard Sidebar Selectors Validation', { tags: ['@ui-selectors', '@s
|
|
|
35
41
|
})
|
|
36
42
|
|
|
37
43
|
// ============================================
|
|
38
|
-
// SEL_DBAR_001: SIDEBAR STRUCTURE
|
|
39
|
-
// NOTE: Component uses createCyId() with different values than CORE_SELECTORS
|
|
40
|
-
// - sidebar-main: implemented correctly
|
|
41
|
-
// - sidebar-header: NOT implemented (component uses sidebar-header-section)
|
|
42
|
-
// - sidebar-content: NOT implemented
|
|
43
|
-
// - sidebar-footer: NOT implemented
|
|
44
|
+
// SEL_DBAR_001: SIDEBAR STRUCTURE (4 selectors)
|
|
44
45
|
// ============================================
|
|
45
46
|
describe('SEL_DBAR_001: Sidebar Structure', { tags: '@SEL_DBAR_001' }, () => {
|
|
46
|
-
it('should find sidebar
|
|
47
|
-
cy.get(dashboard.selectors.
|
|
47
|
+
it('should find sidebar container', () => {
|
|
48
|
+
cy.get(dashboard.selectors.sidebarContainer).should('exist')
|
|
48
49
|
})
|
|
49
50
|
|
|
50
|
-
|
|
51
|
-
it.skip('should find sidebar header (selector not aligned with component)', () => {
|
|
51
|
+
it('should find sidebar header', () => {
|
|
52
52
|
cy.get(dashboard.selectors.sidebarHeader).should('exist')
|
|
53
53
|
})
|
|
54
54
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
cy.get(dashboard.selectors.sidebarContent).should('exist')
|
|
55
|
+
it('should find sidebar logo', () => {
|
|
56
|
+
cy.get(dashboard.selectors.sidebarLogo).should('exist')
|
|
58
57
|
})
|
|
59
58
|
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
cy.get(dashboard.selectors.sidebarFooter).should('exist')
|
|
59
|
+
it('should find sidebar content', () => {
|
|
60
|
+
cy.get(dashboard.selectors.sidebarContent).should('exist')
|
|
63
61
|
})
|
|
64
|
-
})
|
|
65
62
|
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
describe('SEL_DBAR_DOC: Selector Documentation', { tags: '@SEL_DBAR_DOC' }, () => {
|
|
70
|
-
it('should document sidebar component selectors', () => {
|
|
71
|
-
cy.log('=== DASHBOARD SIDEBAR SELECTORS ===')
|
|
72
|
-
cy.log('')
|
|
73
|
-
cy.log('Implemented (working):')
|
|
74
|
-
cy.log('- sidebar-main: Main sidebar container')
|
|
75
|
-
cy.log('')
|
|
76
|
-
cy.log('Selector/Component Mismatch:')
|
|
77
|
-
cy.log('- sidebar-header: CORE_SELECTORS defines, component uses sidebar-header-section')
|
|
78
|
-
cy.log('')
|
|
79
|
-
cy.log('Not Implemented in Component:')
|
|
80
|
-
cy.log('- sidebar-content: No data-cy attribute in Sidebar.tsx')
|
|
81
|
-
cy.log('- sidebar-footer: No data-cy attribute in Sidebar.tsx')
|
|
82
|
-
cy.log('')
|
|
83
|
-
cy.log('Component uses createCyId("sidebar", "..."):')
|
|
84
|
-
cy.log('- sidebar-main, sidebar-header-section')
|
|
85
|
-
cy.log('- sidebar-logo, sidebar-nav, sidebar-nav-items')
|
|
86
|
-
cy.wrap(true).should('be.true')
|
|
63
|
+
// Not implemented in Sidebar.tsx component
|
|
64
|
+
it.skip('should find sidebar footer (not implemented in component)', () => {
|
|
65
|
+
cy.get(dashboard.selectors.sidebarFooter).should('exist')
|
|
87
66
|
})
|
|
88
67
|
})
|
|
89
68
|
})
|
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
feature: Dashboard Topnav UI Selectors Validation
|
|
3
3
|
priority: high
|
|
4
4
|
tags: [selectors, topnav, dashboard, ui-validation]
|
|
5
|
-
grepTags: [ui-selectors, topnav, SEL_TNAV_001, SEL_TNAV_002, SEL_TNAV_003, SEL_TNAV_004, SEL_TNAV_006]
|
|
6
|
-
coverage:
|
|
5
|
+
grepTags: [ui-selectors, dashboard, topnav, SEL_TNAV_001, SEL_TNAV_002, SEL_TNAV_003, SEL_TNAV_004, SEL_TNAV_005, SEL_TNAV_006]
|
|
6
|
+
coverage: 6
|
|
7
7
|
---
|
|
8
8
|
|
|
9
9
|
# Dashboard Topnav UI Selectors Validation
|
|
@@ -12,23 +12,25 @@ coverage: 5
|
|
|
12
12
|
|
|
13
13
|
**NOTE:** Public navbar tests (logo, signin, signup) are in `public.cy.ts`.
|
|
14
14
|
|
|
15
|
+
**Login:** Uses Developer via `loginAsDefaultDeveloper()`.
|
|
16
|
+
|
|
15
17
|
## @test SEL_TNAV_001: Topnav Structure
|
|
16
18
|
|
|
17
19
|
### Metadata
|
|
18
20
|
- **Priority:** High
|
|
19
21
|
- **Type:** Selector Validation
|
|
20
22
|
- **Tags:** topnav, structure, desktop
|
|
21
|
-
- **Grep:** `@ui-selectors` `@SEL_TNAV_001`
|
|
22
|
-
- **Status:** Active
|
|
23
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_001`
|
|
24
|
+
- **Status:** Active (3 passing, 0 skipped)
|
|
23
25
|
|
|
24
26
|
```gherkin:en
|
|
25
27
|
Scenario: Dashboard topnav has complete structure
|
|
26
28
|
|
|
27
29
|
Given I am logged in as a developer user
|
|
28
30
|
And I navigate to the dashboard
|
|
29
|
-
Then I should find the topnav
|
|
31
|
+
Then I should find the topnav container
|
|
30
32
|
And I should find the topnav actions container
|
|
31
|
-
And I should find the topnav search
|
|
33
|
+
And I should find the topnav search container
|
|
32
34
|
```
|
|
33
35
|
|
|
34
36
|
```gherkin:es
|
|
@@ -36,15 +38,17 @@ Scenario: Topnav del dashboard tiene estructura completa
|
|
|
36
38
|
|
|
37
39
|
Given estoy logueado como usuario developer
|
|
38
40
|
And navego al dashboard
|
|
39
|
-
Then deberia encontrar el
|
|
41
|
+
Then deberia encontrar el contenedor del topnav
|
|
40
42
|
And deberia encontrar el contenedor de acciones del topnav
|
|
41
|
-
And deberia encontrar
|
|
43
|
+
And deberia encontrar el contenedor de busqueda del topnav
|
|
42
44
|
```
|
|
43
45
|
|
|
44
46
|
### Expected Results
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
47
|
+
| Selector Path | POM Accessor | data-cy Value | Status |
|
|
48
|
+
|---------------|--------------|---------------|--------|
|
|
49
|
+
| dashboard.topnav.container | dashboard.selectors.topnavContainer | topnav-header | Implemented |
|
|
50
|
+
| dashboard.topnav.actions | dashboard.selectors.topnavActions | topnav-actions | Implemented |
|
|
51
|
+
| dashboard.topnav.searchContainer | dashboard.selectors.topnavSearchContainer | topnav-search-section | Implemented |
|
|
48
52
|
|
|
49
53
|
---
|
|
50
54
|
|
|
@@ -54,8 +58,8 @@ And deberia encontrar la seccion de busqueda del topnav
|
|
|
54
58
|
- **Priority:** High
|
|
55
59
|
- **Type:** Selector Validation
|
|
56
60
|
- **Tags:** topnav, actions, buttons
|
|
57
|
-
- **Grep:** `@ui-selectors` `@SEL_TNAV_002`
|
|
58
|
-
- **Status:** Active
|
|
61
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_002`
|
|
62
|
+
- **Status:** Active (4 passing, 0 skipped)
|
|
59
63
|
|
|
60
64
|
```gherkin:en
|
|
61
65
|
Scenario: Dashboard topnav has all action buttons
|
|
@@ -63,7 +67,7 @@ Scenario: Dashboard topnav has all action buttons
|
|
|
63
67
|
Given I am logged in as a valid user
|
|
64
68
|
And I navigate to the dashboard
|
|
65
69
|
Then I should find the sidebar toggle button
|
|
66
|
-
And I should find the notifications
|
|
70
|
+
And I should find the notifications trigger
|
|
67
71
|
And I should find the help button
|
|
68
72
|
And I should find the theme toggle button
|
|
69
73
|
```
|
|
@@ -74,16 +78,18 @@ Scenario: Topnav del dashboard tiene todos los botones de accion
|
|
|
74
78
|
Given estoy logueado como usuario valido
|
|
75
79
|
And navego al dashboard
|
|
76
80
|
Then deberia encontrar el boton de toggle del sidebar
|
|
77
|
-
And deberia encontrar el
|
|
81
|
+
And deberia encontrar el trigger de notificaciones
|
|
78
82
|
And deberia encontrar el boton de ayuda
|
|
79
83
|
And deberia encontrar el boton de cambio de tema
|
|
80
84
|
```
|
|
81
85
|
|
|
82
86
|
### Expected Results
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
+
| Selector Path | POM Accessor | data-cy Value | Status |
|
|
88
|
+
|---------------|--------------|---------------|--------|
|
|
89
|
+
| dashboard.topnav.sidebarToggle | dashboard.selectors.topnavSidebarToggle | topnav-sidebar-toggle | Implemented |
|
|
90
|
+
| dashboard.topnav.notificationsTrigger | dashboard.selectors.topnavNotificationsTrigger | topnav-notifications | Implemented |
|
|
91
|
+
| dashboard.topnav.help | dashboard.selectors.topnavHelp | topnav-help | Implemented |
|
|
92
|
+
| dashboard.topnav.themeToggle | dashboard.selectors.topnavThemeToggle | topnav-theme-toggle | Implemented |
|
|
87
93
|
|
|
88
94
|
---
|
|
89
95
|
|
|
@@ -93,8 +99,8 @@ And deberia encontrar el boton de cambio de tema
|
|
|
93
99
|
- **Priority:** Medium
|
|
94
100
|
- **Type:** Selector Validation
|
|
95
101
|
- **Tags:** topnav, admin, superadmin, devtools
|
|
96
|
-
- **Grep:** `@ui-selectors` `@SEL_TNAV_003`
|
|
97
|
-
- **Status:** Active
|
|
102
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_003`
|
|
103
|
+
- **Status:** Active (2 passing, 0 skipped)
|
|
98
104
|
|
|
99
105
|
```gherkin:en
|
|
100
106
|
Scenario: Topnav shows admin links for developer users
|
|
@@ -119,8 +125,14 @@ And deberia encontrar el link de devtools
|
|
|
119
125
|
```
|
|
120
126
|
|
|
121
127
|
### Expected Results
|
|
122
|
-
|
|
123
|
-
|
|
128
|
+
| Selector Path | POM Accessor | data-cy Value | Status |
|
|
129
|
+
|---------------|--------------|---------------|--------|
|
|
130
|
+
| dashboard.topnav.superadmin | dashboard.selectors.topnavSuperadmin | topnav-superadmin | Implemented |
|
|
131
|
+
| dashboard.topnav.devtools | dashboard.selectors.topnavDevtools | topnav-devtools | Implemented |
|
|
132
|
+
|
|
133
|
+
### Notes
|
|
134
|
+
- Superadmin link: `superadminAccess.enabled && (isSuperAdmin || (isDeveloper && showToDevelopers))`
|
|
135
|
+
- Devtools link: `devtoolsAccess.enabled && isDeveloper`
|
|
124
136
|
|
|
125
137
|
---
|
|
126
138
|
|
|
@@ -130,8 +142,8 @@ And deberia encontrar el link de devtools
|
|
|
130
142
|
- **Priority:** High
|
|
131
143
|
- **Type:** Selector Validation
|
|
132
144
|
- **Tags:** topnav, user-menu, dropdown
|
|
133
|
-
- **Grep:** `@ui-selectors` `@SEL_TNAV_004`
|
|
134
|
-
- **Status:** Active
|
|
145
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_004`
|
|
146
|
+
- **Status:** Active (5 passing, 0 skipped)
|
|
135
147
|
|
|
136
148
|
```gherkin:en
|
|
137
149
|
Scenario: User menu opens and shows all items
|
|
@@ -140,8 +152,8 @@ Given I am logged in as a valid user
|
|
|
140
152
|
And I navigate to the dashboard
|
|
141
153
|
Then I should find the user menu trigger
|
|
142
154
|
When I click on the user menu trigger
|
|
143
|
-
Then I should see the user menu
|
|
144
|
-
And I should find the profile menu item
|
|
155
|
+
Then I should see the user menu content
|
|
156
|
+
And I should find the profile menu item (user)
|
|
145
157
|
And I should find the settings menu item
|
|
146
158
|
And I should find the signOut action
|
|
147
159
|
```
|
|
@@ -153,18 +165,65 @@ Given estoy logueado como usuario valido
|
|
|
153
165
|
And navego al dashboard
|
|
154
166
|
Then deberia encontrar el trigger del menu de usuario
|
|
155
167
|
When hago click en el trigger del menu de usuario
|
|
156
|
-
Then deberia ver el
|
|
157
|
-
And deberia encontrar el item de menu de perfil
|
|
168
|
+
Then deberia ver el contenido del menu de usuario
|
|
169
|
+
And deberia encontrar el item de menu de perfil (user)
|
|
158
170
|
And deberia encontrar el item de menu de configuracion
|
|
159
171
|
And deberia encontrar la accion de cerrar sesion
|
|
160
172
|
```
|
|
161
173
|
|
|
162
174
|
### Expected Results
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
175
|
+
| Selector Path | POM Accessor | data-cy Value | Status |
|
|
176
|
+
|---------------|--------------|---------------|--------|
|
|
177
|
+
| dashboard.topnav.userMenuTrigger | dashboard.selectors.topnavUserMenuTrigger | topnav-user-menu-trigger | Implemented |
|
|
178
|
+
| dashboard.topnav.userMenuContent | dashboard.selectors.topnavUserMenuContent | topnav-user-menu | Implemented |
|
|
179
|
+
| dashboard.topnav.userMenuItem(item) | dashboard.selectors.topnavUserMenuItem('user') | topnav-menu-item-user | Implemented |
|
|
180
|
+
| dashboard.topnav.userMenuItem(item) | dashboard.selectors.topnavUserMenuItem('settings') | topnav-menu-item-settings | Implemented |
|
|
181
|
+
| dashboard.topnav.userMenuAction(action) | dashboard.selectors.topnavUserMenuAction('signOut') | topnav-menu-action-signOut | Implemented |
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
|
|
185
|
+
## @test SEL_TNAV_005: Quick Create
|
|
186
|
+
|
|
187
|
+
### Metadata
|
|
188
|
+
- **Priority:** Medium
|
|
189
|
+
- **Type:** Selector Validation
|
|
190
|
+
- **Tags:** topnav, quick-create, dropdown
|
|
191
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_005`
|
|
192
|
+
- **Status:** Skipped (3 tests) - requires entity with create permission
|
|
193
|
+
|
|
194
|
+
```gherkin:en
|
|
195
|
+
Scenario: Quick create dropdown shows entity options
|
|
196
|
+
|
|
197
|
+
Given I am logged in as a user with create permissions
|
|
198
|
+
And I navigate to the dashboard
|
|
199
|
+
Then I should find the quick create trigger
|
|
200
|
+
When I click on the quick create trigger
|
|
201
|
+
Then I should see the quick create content
|
|
202
|
+
And I should find quick create links for entities (e.g., customers)
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
```gherkin:es
|
|
206
|
+
Scenario: Dropdown de creacion rapida muestra opciones de entidad
|
|
207
|
+
|
|
208
|
+
Given estoy logueado como usuario con permisos de crear
|
|
209
|
+
And navego al dashboard
|
|
210
|
+
Then deberia encontrar el trigger de creacion rapida
|
|
211
|
+
When hago click en el trigger de creacion rapida
|
|
212
|
+
Then deberia ver el contenido de creacion rapida
|
|
213
|
+
And deberia encontrar links de creacion rapida para entidades (ej. customers)
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Expected Results
|
|
217
|
+
| Selector Path | POM Accessor | data-cy Value | Status |
|
|
218
|
+
|---------------|--------------|---------------|--------|
|
|
219
|
+
| dashboard.topnav.quickCreateTrigger | dashboard.selectors.topnavQuickCreateTrigger | topnav-quick-create-trigger | **Skipped** |
|
|
220
|
+
| dashboard.topnav.quickCreateContent | dashboard.selectors.topnavQuickCreateContent | topnav-quick-create-content | **Skipped** |
|
|
221
|
+
| dashboard.topnav.quickCreateLink(entity) | dashboard.selectors.topnavQuickCreateLink('customers') | topnav-quick-create-customers | **Skipped** |
|
|
222
|
+
|
|
223
|
+
### Notes
|
|
224
|
+
- Component renders null if user has no create permissions on any entity
|
|
225
|
+
- Developer role may not have quickCreate entities configured
|
|
226
|
+
- Tests skipped because they require entity with create permission
|
|
168
227
|
|
|
169
228
|
---
|
|
170
229
|
|
|
@@ -174,8 +233,8 @@ And deberia encontrar la accion de cerrar sesion
|
|
|
174
233
|
- **Priority:** Low
|
|
175
234
|
- **Type:** Selector Validation
|
|
176
235
|
- **Tags:** topnav, loading, skeleton
|
|
177
|
-
- **Grep:** `@ui-selectors` `@SEL_TNAV_006`
|
|
178
|
-
- **Status:** 1
|
|
236
|
+
- **Grep:** `@ui-selectors` `@dashboard` `@topnav` `@SEL_TNAV_006`
|
|
237
|
+
- **Status:** Skipped (1 test) - transient state cannot be reliably tested
|
|
179
238
|
|
|
180
239
|
```gherkin:en
|
|
181
240
|
Scenario: Topnav shows loading state during auth
|
|
@@ -194,7 +253,27 @@ Then deberia encontrar el indicador de estado de carga del usuario
|
|
|
194
253
|
```
|
|
195
254
|
|
|
196
255
|
### Expected Results
|
|
197
|
-
|
|
256
|
+
| Selector Path | POM Accessor | data-cy Value | Status |
|
|
257
|
+
|---------------|--------------|---------------|--------|
|
|
258
|
+
| dashboard.topnav.userLoading | dashboard.selectors.topnavUserLoading | topnav-user-loading | **Skipped** |
|
|
198
259
|
|
|
199
260
|
### Notes
|
|
200
|
-
This transient state is
|
|
261
|
+
- This transient state is only visible during auth loading
|
|
262
|
+
- Difficult to test reliably in normal flow
|
|
263
|
+
|
|
264
|
+
---
|
|
265
|
+
|
|
266
|
+
## Related Components
|
|
267
|
+
|
|
268
|
+
| Component | File | Selectors |
|
|
269
|
+
|-----------|------|-----------|
|
|
270
|
+
| Topnav | `packages/core/src/components/dashboard/Topnav.tsx` | topnav-header, topnav-actions, topnav-search-section |
|
|
271
|
+
| TopnavActions | `packages/core/src/components/dashboard/TopnavActions.tsx` | topnav-sidebar-toggle, topnav-notifications, topnav-help, topnav-theme-toggle |
|
|
272
|
+
| TopnavUserMenu | `packages/core/src/components/dashboard/TopnavUserMenu.tsx` | topnav-user-menu-trigger, topnav-user-menu, topnav-menu-item-*, topnav-menu-action-* |
|
|
273
|
+
| TopnavQuickCreate | `packages/core/src/components/dashboard/TopnavQuickCreate.tsx` | topnav-quick-create-trigger, topnav-quick-create-content, topnav-quick-create-* |
|
|
274
|
+
|
|
275
|
+
## Related POMs
|
|
276
|
+
|
|
277
|
+
| POM | File | Usage |
|
|
278
|
+
|-----|------|-------|
|
|
279
|
+
| DashboardPOM | `themes/default/tests/cypress/src/features/DashboardPOM.ts` | Topnav selectors and methods |
|
|
@@ -19,6 +19,7 @@
|
|
|
19
19
|
* - SEL_TNAV_002: Topnav Actions (4 selectors)
|
|
20
20
|
* - SEL_TNAV_003: Topnav Admin Links (2 selectors - developer has access)
|
|
21
21
|
* - SEL_TNAV_004: User Menu (5 selectors)
|
|
22
|
+
* - SEL_TNAV_005: Quick Create (3 selectors)
|
|
22
23
|
* - SEL_TNAV_006: Loading State (1 skipped - transient state)
|
|
23
24
|
*
|
|
24
25
|
* NOTE: Public navbar tests (logo, signin, signup) are in public.cy.ts
|
|
@@ -27,7 +28,7 @@
|
|
|
27
28
|
import { DashboardPOM } from '../../../src/features/DashboardPOM'
|
|
28
29
|
import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
|
|
29
30
|
|
|
30
|
-
describe('Dashboard Topnav Selectors Validation', { tags: ['@ui-selectors', '@topnav'] }, () => {
|
|
31
|
+
describe('Dashboard Topnav Selectors Validation', { tags: ['@ui-selectors', '@dashboard', '@topnav'] }, () => {
|
|
31
32
|
const dashboard = DashboardPOM.create()
|
|
32
33
|
|
|
33
34
|
beforeEach(() => {
|
|
@@ -41,16 +42,16 @@ describe('Dashboard Topnav Selectors Validation', { tags: ['@ui-selectors', '@to
|
|
|
41
42
|
// NOTE: Logo test moved to public.cy.ts (only visible when not logged in)
|
|
42
43
|
// ============================================
|
|
43
44
|
describe('SEL_TNAV_001: Topnav Structure', { tags: '@SEL_TNAV_001' }, () => {
|
|
44
|
-
it('should find topnav
|
|
45
|
-
cy.get(dashboard.selectors.
|
|
45
|
+
it('should find topnav container', () => {
|
|
46
|
+
cy.get(dashboard.selectors.topnavContainer).should('exist')
|
|
46
47
|
})
|
|
47
48
|
|
|
48
49
|
it('should find topnav actions container', () => {
|
|
49
50
|
cy.get(dashboard.selectors.topnavActions).should('exist')
|
|
50
51
|
})
|
|
51
52
|
|
|
52
|
-
it('should find topnav search
|
|
53
|
-
cy.get(dashboard.selectors.
|
|
53
|
+
it('should find topnav search container', () => {
|
|
54
|
+
cy.get(dashboard.selectors.topnavSearchContainer).should('exist')
|
|
54
55
|
})
|
|
55
56
|
})
|
|
56
57
|
|
|
@@ -62,8 +63,8 @@ describe('Dashboard Topnav Selectors Validation', { tags: ['@ui-selectors', '@to
|
|
|
62
63
|
cy.get(dashboard.selectors.topnavSidebarToggle).should('exist')
|
|
63
64
|
})
|
|
64
65
|
|
|
65
|
-
it('should find notifications
|
|
66
|
-
cy.get(dashboard.selectors.
|
|
66
|
+
it('should find notifications trigger', () => {
|
|
67
|
+
cy.get(dashboard.selectors.topnavNotificationsTrigger).should('exist')
|
|
67
68
|
})
|
|
68
69
|
|
|
69
70
|
it('should find help button', () => {
|
|
@@ -99,25 +100,47 @@ describe('Dashboard Topnav Selectors Validation', { tags: ['@ui-selectors', '@to
|
|
|
99
100
|
cy.get(dashboard.selectors.topnavUserMenuTrigger).should('exist')
|
|
100
101
|
})
|
|
101
102
|
|
|
102
|
-
it('should find user menu when opened', () => {
|
|
103
|
+
it('should find user menu content when opened', () => {
|
|
103
104
|
cy.get(dashboard.selectors.topnavUserMenuTrigger).click()
|
|
104
|
-
cy.get(dashboard.selectors.
|
|
105
|
+
cy.get(dashboard.selectors.topnavUserMenuContent).should('be.visible')
|
|
105
106
|
})
|
|
106
107
|
|
|
107
108
|
it('should find profile menu item when opened', () => {
|
|
108
109
|
cy.get(dashboard.selectors.topnavUserMenuTrigger).click()
|
|
109
|
-
cy.get(dashboard.selectors.
|
|
110
|
+
cy.get(dashboard.selectors.topnavUserMenuItem('user')).should('exist')
|
|
110
111
|
})
|
|
111
112
|
|
|
112
113
|
it('should find settings menu item when opened', () => {
|
|
113
114
|
cy.get(dashboard.selectors.topnavUserMenuTrigger).click()
|
|
114
|
-
cy.get(dashboard.selectors.
|
|
115
|
+
cy.get(dashboard.selectors.topnavUserMenuItem('settings')).should('exist')
|
|
115
116
|
})
|
|
116
117
|
|
|
117
118
|
it('should find signOut action when opened', () => {
|
|
118
119
|
cy.get(dashboard.selectors.topnavUserMenuTrigger).click()
|
|
119
120
|
// Action is 'signOut' per dashboard.config.ts
|
|
120
|
-
cy.get(dashboard.selectors.
|
|
121
|
+
cy.get(dashboard.selectors.topnavUserMenuAction('signOut')).should('exist')
|
|
122
|
+
})
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
// ============================================
|
|
126
|
+
// SEL_TNAV_005: QUICK CREATE (3 selectors)
|
|
127
|
+
// NOTE: Component renders null if user has no create permissions on any entity.
|
|
128
|
+
// Developer role may not have quickCreate entities configured.
|
|
129
|
+
// ============================================
|
|
130
|
+
describe('SEL_TNAV_005: Quick Create', { tags: '@SEL_TNAV_005' }, () => {
|
|
131
|
+
it.skip('should find quick create trigger (requires entity with create permission)', () => {
|
|
132
|
+
cy.get(dashboard.selectors.topnavQuickCreateTrigger).should('exist')
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
it.skip('should find quick create content when opened (requires entity with create permission)', () => {
|
|
136
|
+
cy.get(dashboard.selectors.topnavQuickCreateTrigger).click()
|
|
137
|
+
cy.get(dashboard.selectors.topnavQuickCreateContent).should('be.visible')
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
it.skip('should find quick create link for entity when opened (requires entity with create permission)', () => {
|
|
141
|
+
cy.get(dashboard.selectors.topnavQuickCreateTrigger).click()
|
|
142
|
+
// Test with 'customers' entity (common in default theme)
|
|
143
|
+
cy.get(dashboard.selectors.topnavQuickCreateLink('customers')).should('exist')
|
|
121
144
|
})
|
|
122
145
|
})
|
|
123
146
|
|