@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.
Files changed (48) hide show
  1. package/components/ai-chat/ChatPanel.tsx +7 -7
  2. package/components/ai-chat/Message.tsx +2 -2
  3. package/components/ai-chat/MessageInput.tsx +3 -3
  4. package/components/ai-chat/MessageList.tsx +3 -3
  5. package/components/ai-chat/TypingIndicator.tsx +2 -2
  6. package/entities/customers/api/docs.md +107 -0
  7. package/entities/customers/api/presets.ts +80 -0
  8. package/entities/pages/api/docs.md +114 -0
  9. package/entities/pages/api/presets.ts +72 -0
  10. package/entities/posts/api/docs.md +120 -0
  11. package/entities/posts/api/presets.ts +74 -0
  12. package/entities/tasks/api/docs.md +126 -0
  13. package/entities/tasks/api/presets.ts +84 -0
  14. package/lib/selectors.ts +2 -2
  15. package/messages/de/admin.json +45 -0
  16. package/messages/en/admin.json +45 -0
  17. package/messages/es/admin.json +45 -0
  18. package/messages/fr/admin.json +45 -0
  19. package/messages/it/admin.json +45 -0
  20. package/messages/pt/admin.json +45 -0
  21. package/package.json +3 -3
  22. package/styles/globals.css +24 -0
  23. package/tests/cypress/e2e/_utils/selectors/block-editor.bdd.md +491 -0
  24. package/tests/cypress/e2e/_utils/selectors/block-editor.cy.ts +475 -0
  25. package/tests/cypress/e2e/_utils/selectors/dashboard-container.cy.ts +52 -0
  26. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.cy.ts +14 -14
  27. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.cy.ts +3 -3
  28. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.bdd.md +38 -73
  29. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.cy.ts +21 -42
  30. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.bdd.md +117 -38
  31. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.cy.ts +35 -12
  32. package/tests/cypress/e2e/_utils/selectors/settings-layout.bdd.md +50 -59
  33. package/tests/cypress/e2e/_utils/selectors/settings-layout.cy.ts +15 -23
  34. package/tests/cypress/e2e/_utils/selectors/tasks.bdd.md +395 -155
  35. package/tests/cypress/e2e/_utils/selectors/tasks.cy.ts +795 -174
  36. package/tests/cypress/e2e/api/_core/teams/teams-security.cy.ts +415 -0
  37. package/tests/cypress/e2e/uat/_core/teams/inline-edit.cy.ts +278 -0
  38. package/tests/cypress/src/core/BlockEditorBasePOM.ts +269 -99
  39. package/tests/cypress/src/core/DashboardEntityPOM.ts +1 -1
  40. package/tests/cypress/src/features/DashboardPOM.ts +49 -28
  41. package/tests/cypress/src/features/PageBuilderPOM.ts +20 -0
  42. package/tests/cypress/src/features/SettingsPOM.ts +511 -166
  43. package/tests/cypress/src/features/SuperadminPOM.ts +679 -159
  44. package/tests/cypress/src/features/index.ts +10 -10
  45. package/tests/cypress/e2e/_utils/selectors/pages-editor.bdd.md +0 -207
  46. package/tests/cypress/e2e/_utils/selectors/pages-editor.cy.ts +0 -211
  47. package/tests/cypress/e2e/_utils/selectors/posts-editor.bdd.md +0 -184
  48. 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, SEL_DBAR_DOC]
6
- coverage: 2
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. Some tests are skipped due to misalignment between CORE_SELECTORS definitions and component implementations.
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. The component uses `createCyId()` which sometimes produces different selectors than defined in CORE_SELECTORS.
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:** Partial - 1 passing, 3 skipped
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 valid user
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 main container
30
- And the sidebar header should exist (skipped - selector mismatch)
31
- And the sidebar content should exist (skipped - not implemented)
32
- And the sidebar footer should exist (skipped - not implemented)
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 valido
41
+ Given estoy logueado como usuario developer
39
42
  And estoy viendo el dashboard en viewport desktop
40
- Then deberia encontrar el contenedor principal del sidebar
41
- And deberia existir el header del sidebar (skipped - selectores desalineados)
42
- And deberia existir el contenido del sidebar (skipped - no implementado)
43
- And deberia existir el footer del sidebar (skipped - no implementado)
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
- - `sidebar-main` selector exists (WORKING)
48
- - `sidebar-header` skipped - component uses `sidebar-header-section` instead
49
- - `sidebar-content` skipped - not implemented in Sidebar.tsx
50
- - `sidebar-footer` skipped - not implemented in Sidebar.tsx
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 uses these data-cy attributes:
54
- - `sidebar-main` - Main sidebar container (aligned with CORE_SELECTORS)
55
- - `sidebar-header-section` - NOT `sidebar-header`
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
- ## Known Issues
66
+ ## Related Components
97
67
 
98
- ### Selector/Component Misalignment
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
- | CORE_SELECTORS Path | Expected data-cy | Component Uses | Status |
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
- ### Recommendation
108
- Future fix should either:
109
- 1. Update CORE_SELECTORS to match component (`sidebar-header-section`)
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
- * - SEL_DBAR_DOC: Sidebar Selector Documentation
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 main container', () => {
47
- cy.get(dashboard.selectors.sidebarMain).should('exist')
47
+ it('should find sidebar container', () => {
48
+ cy.get(dashboard.selectors.sidebarContainer).should('exist')
48
49
  })
49
50
 
50
- // Selector mismatch: CORE_SELECTORS='sidebar-header' vs component='sidebar-header-section'
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
- // Not implemented in Sidebar.tsx
56
- it.skip('should find sidebar content (selector not implemented)', () => {
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
- // Not implemented in Sidebar.tsx
61
- it.skip('should find sidebar footer (selector not implemented)', () => {
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
- // SEL_DBAR_DOC: DOCUMENTATION
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
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 - 3 tests
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 header
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 section
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 header del topnav
41
+ Then deberia encontrar el contenedor del topnav
40
42
  And deberia encontrar el contenedor de acciones del topnav
41
- And deberia encontrar la seccion de busqueda del topnav
43
+ And deberia encontrar el contenedor de busqueda del topnav
42
44
  ```
43
45
 
44
46
  ### Expected Results
45
- - `topnav-header` selector exists
46
- - `topnav-actions` selector exists
47
- - `topnav-search-section` selector exists
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 - 4 passing
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 button
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 boton de notificaciones
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
- - `topnav-sidebar-toggle` selector exists
84
- - `topnav-notifications` selector exists
85
- - `topnav-help` selector exists
86
- - `topnav-theme-toggle` selector exists
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 - 2 tests
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
- - `topnav-superadmin` selector exists (developer sees with showToDevelopers: true)
123
- - `topnav-devtools` selector exists (developer has access)
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 - 5 passing
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 dropdown
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 dropdown del menu de usuario
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
- - `topnav-user-menu-trigger` selector exists
164
- - `topnav-user-menu` visible when opened
165
- - `topnav-menu-item-user` selector exists
166
- - `topnav-menu-item-settings` selector exists
167
- - `topnav-menu-action-signOut` selector exists
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 Skipped - transient state cannot be reliably tested
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
- - `topnav-user-loading` - only visible during auth loading
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 difficult to test in normal flow.
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 header', () => {
45
- cy.get(dashboard.selectors.topnavHeader).should('exist')
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 section', () => {
53
- cy.get(dashboard.selectors.topnavSearchSection).should('exist')
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 button', () => {
66
- cy.get(dashboard.selectors.topnavNotifications).should('exist')
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.topnavUserMenu).should('be.visible')
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.topnavMenuItem('user')).should('exist')
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.topnavMenuItem('settings')).should('exist')
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.topnavMenuAction('signOut')).should('exist')
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