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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (149) hide show
  1. package/lib/selectors.ts +5 -1
  2. package/package.json +2 -2
  3. package/tests/cypress/e2e/{_devtools → _utils/devtools}/access.cy.ts +3 -3
  4. package/tests/cypress/e2e/{_devtools → _utils/devtools}/navigation.cy.ts +3 -3
  5. package/tests/cypress/e2e/{_devtools → _utils/devtools}/pages.cy.ts +3 -3
  6. package/tests/cypress/e2e/_utils/selectors/auth.bdd.md +354 -0
  7. package/tests/cypress/e2e/{_selectors → _utils/selectors}/auth.cy.ts +39 -35
  8. package/tests/cypress/e2e/_utils/selectors/billing.bdd.md +276 -0
  9. package/tests/cypress/e2e/_utils/selectors/billing.cy.ts +182 -0
  10. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.bdd.md +205 -0
  11. package/tests/cypress/e2e/_utils/selectors/dashboard-mobile.cy.ts +137 -0
  12. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.bdd.md +147 -0
  13. package/tests/cypress/e2e/_utils/selectors/dashboard-navigation.cy.ts +114 -0
  14. package/tests/cypress/e2e/_utils/selectors/dashboard-sidebar.bdd.md +111 -0
  15. package/tests/cypress/e2e/{_selectors → _utils/selectors}/dashboard-sidebar.cy.ts +35 -6
  16. package/tests/cypress/e2e/_utils/selectors/dashboard-topnav.bdd.md +200 -0
  17. package/tests/cypress/e2e/{_selectors → _utils/selectors}/dashboard-topnav.cy.ts +30 -43
  18. package/tests/cypress/e2e/_utils/selectors/devtools.bdd.md +306 -0
  19. package/tests/cypress/e2e/{_selectors → _utils/selectors}/devtools.cy.ts +77 -14
  20. package/tests/cypress/e2e/_utils/selectors/global-search.bdd.md +115 -0
  21. package/tests/cypress/e2e/{_selectors → _utils/selectors}/global-search.cy.ts +15 -10
  22. package/tests/cypress/e2e/_utils/selectors/pages-editor.bdd.md +207 -0
  23. package/tests/cypress/e2e/{_selectors → _utils/selectors}/pages-editor.cy.ts +44 -12
  24. package/tests/cypress/e2e/_utils/selectors/posts-editor.bdd.md +184 -0
  25. package/tests/cypress/e2e/{_selectors → _utils/selectors}/posts-editor.cy.ts +107 -39
  26. package/tests/cypress/e2e/{_selectors → _utils/selectors}/public.cy.ts +1 -1
  27. package/tests/cypress/e2e/_utils/selectors/settings-api-keys.bdd.md +266 -0
  28. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-api-keys.cy.ts +30 -25
  29. package/tests/cypress/e2e/_utils/selectors/settings-billing.bdd.md +78 -0
  30. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-billing.cy.ts +10 -7
  31. package/tests/cypress/e2e/_utils/selectors/settings-layout.bdd.md +138 -0
  32. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-layout.cy.ts +12 -8
  33. package/tests/cypress/e2e/_utils/selectors/settings-password.bdd.md +82 -0
  34. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-password.cy.ts +10 -7
  35. package/tests/cypress/e2e/_utils/selectors/settings-profile.bdd.md +77 -0
  36. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-profile.cy.ts +15 -18
  37. package/tests/cypress/e2e/_utils/selectors/settings-teams.bdd.md +130 -0
  38. package/tests/cypress/e2e/{_selectors → _utils/selectors}/settings-teams.cy.ts +36 -18
  39. package/tests/cypress/e2e/_utils/selectors/superadmin.bdd.md +261 -0
  40. package/tests/cypress/e2e/{_selectors → _utils/selectors}/superadmin.cy.ts +23 -15
  41. package/tests/cypress/e2e/_utils/selectors/tasks.bdd.md +353 -0
  42. package/tests/cypress/e2e/{_selectors → _utils/selectors}/tasks.cy.ts +11 -10
  43. package/tests/cypress/e2e/{_selectors → _utils/selectors}/taxonomies.cy.ts +1 -1
  44. package/tests/cypress/e2e/_utils/selectors/teams.bdd.md +278 -0
  45. package/tests/cypress/e2e/{_selectors → _utils/selectors}/teams.cy.ts +90 -37
  46. package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-teams.cy.ts +4 -4
  47. package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-users.cy.ts +4 -4
  48. package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/dashboard.cy.ts +4 -4
  49. package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/subscriptions-overview.cy.ts +4 -4
  50. package/tests/cypress/e2e/api/{entities → _core/users}/users-security.cy.ts +2 -2
  51. package/tests/cypress/e2e/uat/{auth → _core/auth}/login-logout.cy.ts +2 -2
  52. package/tests/cypress/e2e/uat/{auth → _core/auth}/password-reset.cy.ts +1 -1
  53. package/tests/cypress/e2e/uat/{billing → _core/billing}/extended.cy.ts +2 -2
  54. package/tests/cypress/e2e/uat/{billing → _core/billing}/feature-gates.cy.ts +2 -2
  55. package/tests/cypress/e2e/uat/{billing → _core/billing}/page.cy.ts +2 -2
  56. package/tests/cypress/e2e/uat/{billing → _core/billing}/status.cy.ts +2 -2
  57. package/tests/cypress/e2e/uat/{billing → _core/billing}/team-switch.cy.ts +2 -2
  58. package/tests/cypress/e2e/uat/{billing → _core/billing}/usage.cy.ts +2 -2
  59. package/tests/cypress/e2e/uat/{devtools → _core/devtools}/api-tester.cy.ts +2 -2
  60. package/tests/cypress/e2e/uat/{scheduled-actions → _core/scheduled-actions}/devtools-ui.cy.ts +2 -2
  61. package/tests/cypress/e2e/uat/{teams → _core/teams}/roles-matrix.cy.ts +2 -2
  62. package/tests/cypress/e2e/uat/{teams → _core/teams}/switcher.cy.ts +2 -2
  63. package/tests/cypress/e2e/uat/{roles → features/roles}/editor-role.cy.ts +2 -2
  64. package/tests/cypress/e2e/uat/{roles → features/roles}/member-restrictions.cy.ts +3 -3
  65. package/tests/cypress/e2e/uat/{roles → features/roles}/owner-full-crud.cy.ts +2 -2
  66. package/tests/cypress/src/core/DashboardEntityPOM.ts +2 -2
  67. package/tests/cypress/src/features/DashboardPOM.ts +2 -2
  68. package/tests/cypress/src/features/DevtoolsPOM.ts +12 -1
  69. package/tests/cypress/src/session-helpers.ts +35 -17
  70. package/tests/cypress/support/e2e.ts +2 -1
  71. package/tests/cypress.config.ts +29 -10
  72. package/tests/tsconfig.json +13 -7
  73. package/tests/cypress/e2e/_selectors/billing.cy.ts +0 -89
  74. package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +0 -113
  75. package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +0 -89
  76. /package/tests/cypress/e2e/{_devtools → _utils/devtools}/access.bdd.md +0 -0
  77. /package/tests/cypress/e2e/{_devtools → _utils/devtools}/navigation.bdd.md +0 -0
  78. /package/tests/cypress/e2e/{_devtools → _utils/devtools}/pages.bdd.md +0 -0
  79. /package/tests/cypress/e2e/{_docs → _utils/docs}/README.md +0 -0
  80. /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/sector7-superadmin-teams.narration.json +0 -0
  81. /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/sector7-superadmin.cy.ts +0 -0
  82. /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/teams-system.doc.cy.ts +0 -0
  83. /package/tests/cypress/e2e/{_docs → _utils/docs}/tutorials/teams-system.narration.json +0 -0
  84. /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-teams.bdd.md +0 -0
  85. /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/all-users.bdd.md +0 -0
  86. /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/dashboard.bdd.md +0 -0
  87. /package/tests/cypress/e2e/{_superadmin → _utils/superadmin}/subscriptions-overview.bdd.md +0 -0
  88. /package/tests/cypress/e2e/api/{billing → _core/billing}/BillingAPIController.js +0 -0
  89. /package/tests/cypress/e2e/api/{billing → _core/billing}/check-action.cy.ts +0 -0
  90. /package/tests/cypress/e2e/api/{billing → _core/billing}/checkout.cy.ts +0 -0
  91. /package/tests/cypress/e2e/api/{billing → _core/billing}/lifecycle.cy.ts +0 -0
  92. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/README.md +0 -0
  93. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/business.cy.ts +0 -0
  94. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/downgrade.cy.ts +0 -0
  95. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/fixtures/billing-plans.json +0 -0
  96. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/free.cy.ts +0 -0
  97. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/pro.cy.ts +0 -0
  98. /package/tests/cypress/e2e/api/{billing → _core/billing}/plans/starter.cy.ts +0 -0
  99. /package/tests/cypress/e2e/api/{billing → _core/billing}/portal.cy.ts +0 -0
  100. /package/tests/cypress/e2e/api/{devtools → _core/devtools}/registries.bdd.md +0 -0
  101. /package/tests/cypress/e2e/api/{devtools → _core/devtools}/registries.cy.ts +0 -0
  102. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/cron-endpoint.bdd.md +0 -0
  103. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/cron-endpoint.cy.ts +0 -0
  104. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/devtools-endpoint.bdd.md +0 -0
  105. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/devtools-endpoint.cy.ts +0 -0
  106. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/scheduling.bdd.md +0 -0
  107. /package/tests/cypress/e2e/api/{scheduled-actions → _core/scheduled-actions}/scheduling.cy.ts +0 -0
  108. /package/tests/cypress/e2e/api/{settings → _core/settings}/api-keys.crud.cy.ts +0 -0
  109. /package/tests/cypress/e2e/api/{entities → _core/users}/users-crud.cy.ts +0 -0
  110. /package/tests/cypress/e2e/api/{entities → _core/users}/users-metas.cy.ts +0 -0
  111. /package/tests/cypress/e2e/api/entities/{customers-crud.cy.ts → customers/customers-crud.cy.ts} +0 -0
  112. /package/tests/cypress/e2e/api/entities/{customers-metas.cy.ts → customers/customers-metas.cy.ts} +0 -0
  113. /package/tests/cypress/e2e/api/entities/{blocks-scope.cy.ts → pages/blocks-scope.cy.ts} +0 -0
  114. /package/tests/cypress/e2e/api/entities/{pages-crud.cy.ts → pages/pages-crud.cy.ts} +0 -0
  115. /package/tests/cypress/e2e/api/entities/{pages-status.cy.ts → pages/pages-status.cy.ts} +0 -0
  116. /package/tests/cypress/e2e/api/entities/{post-categories-crud.cy.ts → posts/post-categories-crud.cy.ts} +0 -0
  117. /package/tests/cypress/e2e/api/entities/{posts-crud.cy.ts → posts/posts-crud.cy.ts} +0 -0
  118. /package/tests/cypress/e2e/api/entities/{posts-status.cy.ts → posts/posts-status.cy.ts} +0 -0
  119. /package/tests/cypress/e2e/api/entities/{tasks-crud.cy.ts → tasks/tasks-crud.cy.ts} +0 -0
  120. /package/tests/cypress/e2e/api/entities/{tasks-metas.cy.ts → tasks/tasks-metas.cy.ts} +0 -0
  121. /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/developer-login.bdd.md +0 -0
  122. /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/developer-login.cy.ts +0 -0
  123. /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/superadmin-login.bdd.md +0 -0
  124. /package/tests/cypress/e2e/uat/{auth → _core/auth}/app-roles/superadmin-login.cy.ts +0 -0
  125. /package/tests/cypress/e2e/uat/{auth → _core/auth}/custom-roles/editor-login.bdd.md +0 -0
  126. /package/tests/cypress/e2e/uat/{auth → _core/auth}/custom-roles/editor-login.cy.ts +0 -0
  127. /package/tests/cypress/e2e/uat/{auth → _core/auth}/login-logout.bdd.md +0 -0
  128. /package/tests/cypress/e2e/uat/{auth → _core/auth}/password-reset.bdd.md +0 -0
  129. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/admin-login.bdd.md +0 -0
  130. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/admin-login.cy.ts +0 -0
  131. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/member-login.bdd.md +0 -0
  132. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/member-login.cy.ts +0 -0
  133. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/owner-login.bdd.md +0 -0
  134. /package/tests/cypress/e2e/uat/{auth → _core/auth}/team-roles/owner-login.cy.ts +0 -0
  135. /package/tests/cypress/e2e/uat/{billing → _core/billing}/extended.bdd.md +0 -0
  136. /package/tests/cypress/e2e/uat/{billing → _core/billing}/feature-gates.bdd.md +0 -0
  137. /package/tests/cypress/e2e/uat/{billing → _core/billing}/page.bdd.md +0 -0
  138. /package/tests/cypress/e2e/uat/{billing → _core/billing}/status.bdd.md +0 -0
  139. /package/tests/cypress/e2e/uat/{billing → _core/billing}/team-switch.bdd.md +0 -0
  140. /package/tests/cypress/e2e/uat/{billing → _core/billing}/usage.bdd.md +0 -0
  141. /package/tests/cypress/e2e/uat/{blocks → _core/blocks}/hero.bdd.md +0 -0
  142. /package/tests/cypress/e2e/uat/{blocks → _core/blocks}/hero.cy.ts +0 -0
  143. /package/tests/cypress/e2e/uat/{scheduled-actions → _core/scheduled-actions}/devtools-ui.bdd.md +0 -0
  144. /package/tests/cypress/e2e/uat/{teams → _core/teams}/roles-matrix.bdd.md +0 -0
  145. /package/tests/cypress/e2e/uat/{teams → _core/teams}/switcher.bdd.md +0 -0
  146. /package/tests/cypress/e2e/uat/{teams → _core/teams}/team-switcher.md +0 -0
  147. /package/tests/cypress/e2e/uat/{roles → features/roles}/editor-role.bdd.md +0 -0
  148. /package/tests/cypress/e2e/uat/{roles → features/roles}/member-restrictions.bdd.md +0 -0
  149. /package/tests/cypress/e2e/uat/{roles → features/roles}/owner-full-crud.bdd.md +0 -0
@@ -0,0 +1,137 @@
1
+ /**
2
+ * UI Selectors Validation: Dashboard Mobile
3
+ *
4
+ * This test validates that dashboard mobile selectors exist in the DOM.
5
+ * This is a lightweight test that ONLY checks selector presence, not functionality.
6
+ *
7
+ * Purpose:
8
+ * - Validate DashboardPOM mobile selectors work correctly
9
+ * - Ensure all dashboard.mobile.* selectors are implemented
10
+ * - Run as Phase 12 sub-gate before functional tests
11
+ *
12
+ * Scope:
13
+ * - Navigate to dashboard (requires login)
14
+ * - Assert elements exist in DOM (no form submissions)
15
+ *
16
+ * Test IDs:
17
+ * - SEL_DMOB_DOC: Mobile Testing Documentation
18
+ * - SEL_DMOB_001: Mobile Topbar Selectors (skipped - requires mobile viewport)
19
+ * - SEL_DMOB_002: Mobile Bottom Nav Selectors (skipped - requires mobile viewport)
20
+ * - SEL_DMOB_003: Mobile More Sheet Selectors (skipped - requires mobile viewport)
21
+ * - SEL_DMOB_004: Mobile Quick Create Selectors (skipped - requires mobile viewport)
22
+ *
23
+ * IMPORTANT: Mobile selectors are ONLY visible on small viewports (< 1024px).
24
+ * All tests are marked as skip for desktop testing.
25
+ * To test mobile, use: cy.viewport('iphone-x') or similar.
26
+ */
27
+
28
+ import { DashboardPOM } from '../../../src/features/DashboardPOM'
29
+
30
+ describe('Dashboard Mobile Selectors Validation', { tags: ['@ui-selectors', '@mobile'] }, () => {
31
+ const dashboard = DashboardPOM.create()
32
+
33
+ // ============================================
34
+ // SEL_DMOB_DOC: DOCUMENTATION
35
+ // ============================================
36
+ describe('SEL_DMOB_DOC: Mobile Testing Documentation', { tags: '@SEL_DMOB_DOC' }, () => {
37
+ it('should document how to test mobile selectors', () => {
38
+ cy.log('=== DASHBOARD MOBILE SELECTORS ===')
39
+ cy.log('')
40
+ cy.log('IMPORTANT: Mobile selectors require viewport < 1024px')
41
+ cy.log('To test: Add cy.viewport("iphone-x") in beforeEach')
42
+ cy.log('Or run with: --config viewportWidth=375,viewportHeight=812')
43
+ cy.log('')
44
+ cy.log('Mobile Topbar (lg:hidden):')
45
+ cy.log('- mobile-topbar-header, mobile-topbar-user-profile')
46
+ cy.log('- mobile-topbar-notifications, mobile-topbar-theme-toggle')
47
+ cy.log('')
48
+ cy.log('Mobile Bottom Nav:')
49
+ cy.log('- mobile-bottom-nav, mobile-bottom-nav-item-{slug}')
50
+ cy.log('')
51
+ cy.log('Mobile More Sheet:')
52
+ cy.log('- mobile-more-sheet-content, mobile-more-sheet-item-{slug}')
53
+ cy.log('- mobile-more-sheet-superadmin, mobile-more-sheet-team-switcher')
54
+ cy.log('- mobile-more-sheet-signout')
55
+ cy.log('')
56
+ cy.log('Mobile Quick Create:')
57
+ cy.log('- mobile-quick-create-content, mobile-quick-create-item-{slug}')
58
+ cy.wrap(true).should('be.true')
59
+ })
60
+ })
61
+
62
+ // ============================================
63
+ // SEL_DMOB_001: MOBILE TOPBAR (4 selectors)
64
+ // NOTE: Only visible on mobile viewports
65
+ // ============================================
66
+ describe('SEL_DMOB_001: Mobile Topbar Selectors', { tags: '@SEL_DMOB_001' }, () => {
67
+ it.skip('should find mobile topbar header (requires mobile viewport)', () => {
68
+ // Requires: cy.viewport('iphone-x')
69
+ cy.get(dashboard.selectors.mobileTopbarHeader).should('exist')
70
+ })
71
+
72
+ it.skip('should find mobile user profile button (requires mobile viewport)', () => {
73
+ cy.get(dashboard.selectors.mobileTopbarUserProfile).should('exist')
74
+ })
75
+
76
+ it.skip('should find mobile notifications button (requires mobile viewport)', () => {
77
+ cy.get(dashboard.selectors.mobileTopbarNotifications).should('exist')
78
+ })
79
+
80
+ it.skip('should find mobile theme toggle (requires mobile viewport)', () => {
81
+ cy.get(dashboard.selectors.mobileTopbarThemeToggle).should('exist')
82
+ })
83
+ })
84
+
85
+ // ============================================
86
+ // SEL_DMOB_002: MOBILE BOTTOM NAV (2 selectors)
87
+ // ============================================
88
+ describe('SEL_DMOB_002: Mobile Bottom Nav Selectors', { tags: '@SEL_DMOB_002' }, () => {
89
+ it.skip('should find mobile bottom nav (requires mobile viewport)', () => {
90
+ cy.get(dashboard.selectors.mobileBottomNav).should('exist')
91
+ })
92
+
93
+ it.skip('should find mobile bottom nav item (requires mobile viewport)', () => {
94
+ // Example: dashboard, entities, create, more
95
+ cy.get(dashboard.selectors.mobileBottomNavItem('dashboard')).should('exist')
96
+ })
97
+ })
98
+
99
+ // ============================================
100
+ // SEL_DMOB_003: MOBILE MORE SHEET (5 selectors)
101
+ // ============================================
102
+ describe('SEL_DMOB_003: Mobile More Sheet Selectors', { tags: '@SEL_DMOB_003' }, () => {
103
+ it.skip('should find mobile more sheet content (requires mobile viewport)', () => {
104
+ cy.get(dashboard.selectors.mobileMoreSheetContent).should('exist')
105
+ })
106
+
107
+ it.skip('should find mobile more sheet item (requires mobile viewport)', () => {
108
+ cy.get(dashboard.selectors.mobileMoreSheetItem('settings')).should('exist')
109
+ })
110
+
111
+ it.skip('should find mobile more sheet sector7 link (requires mobile viewport)', () => {
112
+ cy.get(dashboard.selectors.mobileMoreSheetSuperadmin).should('exist')
113
+ })
114
+
115
+ it.skip('should find mobile more sheet team switcher (requires mobile viewport)', () => {
116
+ cy.get(dashboard.selectors.mobileMoreSheetTeamSwitcher).should('exist')
117
+ })
118
+
119
+ it.skip('should find mobile more sheet signout button (requires mobile viewport)', () => {
120
+ cy.get(dashboard.selectors.mobileMoreSheetSignout).should('exist')
121
+ })
122
+ })
123
+
124
+ // ============================================
125
+ // SEL_DMOB_004: MOBILE QUICK CREATE SHEET (2 selectors)
126
+ // ============================================
127
+ describe('SEL_DMOB_004: Mobile Quick Create Selectors', { tags: '@SEL_DMOB_004' }, () => {
128
+ it.skip('should find mobile quick create sheet content (requires mobile viewport)', () => {
129
+ cy.get(dashboard.selectors.mobileQuickCreateContent).should('exist')
130
+ })
131
+
132
+ it.skip('should find mobile quick create item (requires mobile viewport)', () => {
133
+ // Example: tasks, customers, posts, pages
134
+ cy.get(dashboard.selectors.mobileQuickCreateItem('tasks')).should('exist')
135
+ })
136
+ })
137
+ })
@@ -0,0 +1,147 @@
1
+ ---
2
+ feature: Dashboard Navigation UI Selectors Validation
3
+ priority: high
4
+ tags: [selectors, dashboard, navigation, ui-validation]
5
+ grepTags: [ui-selectors, dashboard, SEL_DASH_001, SEL_DASH_002, SEL_DASH_003]
6
+ coverage: 3
7
+ ---
8
+
9
+ # Dashboard Navigation UI Selectors Validation
10
+
11
+ > Validates that dashboard navigation 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_DASH_001: Navigation Structure
14
+
15
+ ### Metadata
16
+ - **Priority:** High
17
+ - **Type:** Selector Validation
18
+ - **Tags:** navigation, structure, sidebar
19
+ - **Grep:** `@ui-selectors` `@SEL_DASH_001`
20
+ - **Status:** Active
21
+
22
+ ```gherkin:en
23
+ Scenario: Dashboard navigation has complete structure
24
+
25
+ Given I am logged in as developer
26
+ And I navigate to the dashboard
27
+ Then I should find the main navigation container
28
+ And I should find the dashboard link
29
+ ```
30
+
31
+ ```gherkin:es
32
+ Scenario: Navegacion del dashboard tiene estructura completa
33
+
34
+ Given estoy logueado como developer
35
+ And navego al dashboard
36
+ Then deberia encontrar el contenedor principal de navegacion
37
+ And deberia encontrar el link de dashboard
38
+ ```
39
+
40
+ ### Expected Results
41
+ - `dashboard.navigation.main` selector exists (nav-main)
42
+ - `dashboard.navigation.dashboardLink` selector exists (nav-link-dashboard)
43
+
44
+ ---
45
+
46
+ ## @test SEL_DASH_002: Entity Links
47
+
48
+ ### Metadata
49
+ - **Priority:** High
50
+ - **Type:** Selector Validation
51
+ - **Tags:** navigation, entities, links
52
+ - **Grep:** `@ui-selectors` `@SEL_DASH_002`
53
+ - **Status:** Active
54
+
55
+ ```gherkin:en
56
+ Scenario: Dashboard navigation has entity links
57
+
58
+ Given I am logged in as developer
59
+ And I navigate to the dashboard
60
+ Then I should find the tasks entity link
61
+ And I should find the customers entity link
62
+ And I should find the posts entity link
63
+ And I should find the pages entity link
64
+ ```
65
+
66
+ ```gherkin:es
67
+ Scenario: Navegacion del dashboard tiene links de entidades
68
+
69
+ Given estoy logueado como developer
70
+ And navego al dashboard
71
+ Then deberia encontrar el link de entidad tasks
72
+ And deberia encontrar el link de entidad customers
73
+ And deberia encontrar el link de entidad posts
74
+ And deberia encontrar el link de entidad pages
75
+ ```
76
+
77
+ ### Expected Results
78
+ - `dashboard.navigation.entityLink` with slug `tasks` exists (nav-link-entity-tasks)
79
+ - `dashboard.navigation.entityLink` with slug `customers` exists (nav-link-entity-customers)
80
+ - `dashboard.navigation.entityLink` with slug `posts` exists (nav-link-entity-posts)
81
+ - `dashboard.navigation.entityLink` with slug `pages` exists (nav-link-entity-pages)
82
+
83
+ ### Notes
84
+ Entity links are dynamic based on:
85
+ - Entity configuration (enabled, showInMenu)
86
+ - User permissions
87
+ - Theme configuration
88
+
89
+ ---
90
+
91
+ ## @test SEL_DASH_003: Navigation Sections
92
+
93
+ ### Metadata
94
+ - **Priority:** Medium
95
+ - **Type:** Selector Validation
96
+ - **Tags:** navigation, sections, dynamic
97
+ - **Grep:** `@ui-selectors` `@SEL_DASH_003`
98
+ - **Status:** Skipped - requires customSidebarSections in app.config.ts
99
+
100
+ ```gherkin:en
101
+ Scenario: Dashboard navigation has section structure
102
+
103
+ Given I am logged in as developer
104
+ And I navigate to the dashboard
105
+ And the theme has custom sidebar sections configured
106
+ Then I should find section containers by ID
107
+ And I should find section labels
108
+ And I should find section items
109
+ ```
110
+
111
+ ```gherkin:es
112
+ Scenario: Navegacion del dashboard tiene estructura de secciones
113
+
114
+ Given estoy logueado como developer
115
+ And navego al dashboard
116
+ And el tema tiene secciones de sidebar personalizadas configuradas
117
+ Then deberia encontrar contenedores de seccion por ID
118
+ And deberia encontrar etiquetas de seccion
119
+ And deberia encontrar items de seccion
120
+ ```
121
+
122
+ ### Expected Results (when sections are configured)
123
+ - `dashboard.navigation.section` with ID exists (nav-section-{id})
124
+ - `dashboard.navigation.sectionLabel` with ID exists (nav-section-label-{id})
125
+ - `dashboard.navigation.sectionItem` with IDs exists (nav-section-item-{sectionId}-{itemId})
126
+
127
+ ### Notes
128
+ All tests in this section are skipped because:
129
+ - Requires `customSidebarSections` to be defined in `app.config.ts`
130
+ - **IMPORTANT:** Enabling `customSidebarSections` REPLACES the default entity-based navigation entirely
131
+ - The sidebar will only show items defined in the sections (no automatic entity links)
132
+ - Requires translation keys for each section and item (e.g., `navigation.content`, `navigation.posts`)
133
+ - For themes with custom sections (e.g., LMS themes), enable these tests with the actual section/item IDs
134
+
135
+ ---
136
+
137
+ ## Related Components
138
+
139
+ | Component | File | Selectors |
140
+ |-----------|------|-----------|
141
+ | DynamicNavigation | `packages/core/src/components/dashboard/navigation/DynamicNavigation.tsx` | nav-main, nav-link-dashboard, nav-link-entity-{slug}, nav-section-{id}, nav-section-label-{id}, nav-section-item-{sectionId}-{itemId} |
142
+
143
+ ## Related POMs
144
+
145
+ | POM | File | Usage |
146
+ |-----|------|-------|
147
+ | DashboardPOM | `themes/default/tests/cypress/src/features/DashboardPOM.ts` | Navigation selectors and methods |
@@ -0,0 +1,114 @@
1
+ /**
2
+ * UI Selectors Validation: Dashboard Navigation
3
+ *
4
+ * This test validates that dashboard navigation selectors exist in the DOM.
5
+ * This is a lightweight test that ONLY checks selector presence, not functionality.
6
+ *
7
+ * Purpose:
8
+ * - Validate DashboardPOM navigation selectors work correctly
9
+ * - Ensure all dashboard.navigation.* selectors are implemented
10
+ * - Run as Phase 12 sub-gate before functional tests
11
+ *
12
+ * Scope:
13
+ * - Navigate to dashboard (requires login)
14
+ * - Assert elements exist in DOM (no form submissions)
15
+ * - Fast execution (< 30 seconds per describe block)
16
+ *
17
+ * Test IDs:
18
+ * - SEL_DASH_001: Navigation Structure
19
+ * - SEL_DASH_002: Entity Links
20
+ * - SEL_DASH_003: Navigation Sections (skipped - requires customSidebarSections which replaces default nav)
21
+ *
22
+ * NOTE: Entity links are dynamic based on permissions.
23
+ * Section selectors require knowing the exact section IDs from theme config.
24
+ */
25
+
26
+ import { DashboardPOM } from '../../../src/features/DashboardPOM'
27
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
28
+
29
+ describe('Dashboard Navigation Selectors Validation', { tags: ['@ui-selectors', '@dashboard'] }, () => {
30
+ const dashboard = DashboardPOM.create()
31
+
32
+ beforeEach(() => {
33
+ loginAsDefaultDeveloper()
34
+ cy.visit('/dashboard', { timeout: 60000, failOnStatusCode: false })
35
+ cy.url().should('include', '/dashboard')
36
+ })
37
+
38
+ // ============================================
39
+ // SEL_DASH_001: NAVIGATION STRUCTURE
40
+ // ============================================
41
+ describe('SEL_DASH_001: Navigation Structure', { tags: '@SEL_DASH_001' }, () => {
42
+ it('should find nav main container', () => {
43
+ cy.get(dashboard.selectors.navMain).should('exist')
44
+ })
45
+
46
+ it('should find dashboard link', () => {
47
+ cy.get(dashboard.selectors.navDashboard).should('exist')
48
+ })
49
+ })
50
+
51
+ // ============================================
52
+ // SEL_DASH_002: ENTITY LINKS
53
+ // ============================================
54
+ describe('SEL_DASH_002: Entity Links', { tags: '@SEL_DASH_002' }, () => {
55
+ it('should find tasks entity link', () => {
56
+ cy.get(dashboard.selectors.navEntity('tasks')).should('exist')
57
+ })
58
+
59
+ it('should find customers entity link', () => {
60
+ cy.get(dashboard.selectors.navEntity('customers')).should('exist')
61
+ })
62
+
63
+ it('should find posts entity link', () => {
64
+ cy.get(dashboard.selectors.navEntity('posts')).should('exist')
65
+ })
66
+
67
+ it('should find pages entity link', () => {
68
+ cy.get(dashboard.selectors.navEntity('pages')).should('exist')
69
+ })
70
+ })
71
+
72
+ // ============================================
73
+ // SEL_DASH_003: NAVIGATION SECTIONS
74
+ // ============================================
75
+ /**
76
+ * SKIPPED: These tests require `customSidebarSections` in app.config.ts
77
+ *
78
+ * IMPORTANT: Enabling `customSidebarSections` REPLACES the default entity-based
79
+ * navigation entirely. The sidebar will only show what's defined in the sections.
80
+ *
81
+ * Requirements to enable these tests:
82
+ * 1. Add `customSidebarSections` array to app.config.ts
83
+ * 2. Add all required translation keys (navigation.{sectionId}, navigation.{itemId})
84
+ * 3. Update tests with the actual section/item IDs from your config
85
+ *
86
+ * Example config:
87
+ * ```
88
+ * customSidebarSections: [
89
+ * {
90
+ * id: 'content',
91
+ * labelKey: 'navigation.content',
92
+ * icon: 'FileText',
93
+ * order: 1,
94
+ * items: [
95
+ * { id: 'posts', labelKey: 'navigation.posts', href: '/dashboard/posts', icon: 'Newspaper' },
96
+ * ],
97
+ * },
98
+ * ]
99
+ * ```
100
+ */
101
+ describe('SEL_DASH_003: Navigation Sections', { tags: '@SEL_DASH_003' }, () => {
102
+ it.skip('should find section by ID (requires customSidebarSections in app.config.ts)', () => {
103
+ // cy.get(dashboard.selectors.navSection('content')).should('exist')
104
+ })
105
+
106
+ it.skip('should find section label (requires customSidebarSections in app.config.ts)', () => {
107
+ // cy.get(dashboard.selectors.navSectionLabel('content')).should('exist')
108
+ })
109
+
110
+ it.skip('should find section item (requires customSidebarSections in app.config.ts)', () => {
111
+ // cy.get(dashboard.selectors.navSectionItem('content', 'posts')).should('exist')
112
+ })
113
+ })
114
+ })
@@ -0,0 +1,111 @@
1
+ ---
2
+ feature: Dashboard Sidebar UI Selectors Validation
3
+ priority: medium
4
+ tags: [selectors, sidebar, dashboard, ui-validation]
5
+ grepTags: [ui-selectors, sidebar, SEL_DBAR_001, SEL_DBAR_DOC]
6
+ coverage: 2
7
+ ---
8
+
9
+ # Dashboard Sidebar UI Selectors Validation
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.
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.
14
+
15
+ ## @test SEL_DBAR_001: Sidebar Structure
16
+
17
+ ### Metadata
18
+ - **Priority:** High
19
+ - **Type:** Selector Validation
20
+ - **Tags:** sidebar, structure, desktop
21
+ - **Grep:** `@ui-selectors` `@SEL_DBAR_001`
22
+ - **Status:** Partial - 1 passing, 3 skipped
23
+
24
+ ```gherkin:en
25
+ Scenario: Dashboard sidebar has required structure selectors
26
+
27
+ Given I am logged in as a valid user
28
+ 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)
33
+ ```
34
+
35
+ ```gherkin:es
36
+ Scenario: Sidebar del dashboard tiene selectores de estructura requeridos
37
+
38
+ Given estoy logueado como usuario valido
39
+ 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)
44
+ ```
45
+
46
+ ### 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
+
52
+ ### 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
93
+
94
+ ---
95
+
96
+ ## Known Issues
97
+
98
+ ### Selector/Component Misalignment
99
+
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 |
106
+
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`)
@@ -14,30 +14,35 @@
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_DBAR_001: Sidebar Structure
19
+ * - SEL_DBAR_DOC: Sidebar Selector Documentation
20
+ *
17
21
  * NOTE: Sidebar is only visible on desktop viewports when authenticated.
22
+ * Some selectors are skipped due to misalignment between CORE_SELECTORS and component implementation.
18
23
  */
19
24
 
20
- import { DashboardPOM } from '../../src/features/DashboardPOM'
21
- import { loginAsDefaultOwner } from '../../src/session-helpers'
25
+ import { DashboardPOM } from '../../../src/features/DashboardPOM'
26
+ import { loginAsDefaultDeveloper } from '../../../src/session-helpers'
22
27
 
23
- describe('Dashboard Sidebar Selectors Validation', { tags: ['@ui-selectors'] }, () => {
28
+ describe('Dashboard Sidebar Selectors Validation', { tags: ['@ui-selectors', '@sidebar'] }, () => {
24
29
  const dashboard = DashboardPOM.create()
25
30
 
26
31
  beforeEach(() => {
27
- loginAsDefaultOwner()
32
+ loginAsDefaultDeveloper()
28
33
  cy.visit('/dashboard', { timeout: 60000, failOnStatusCode: false })
29
34
  cy.url().should('include', '/dashboard')
30
35
  })
31
36
 
32
37
  // ============================================
33
- // SIDEBAR STRUCTURE (4 selectors)
38
+ // SEL_DBAR_001: SIDEBAR STRUCTURE
34
39
  // NOTE: Component uses createCyId() with different values than CORE_SELECTORS
35
40
  // - sidebar-main: implemented correctly
36
41
  // - sidebar-header: NOT implemented (component uses sidebar-header-section)
37
42
  // - sidebar-content: NOT implemented
38
43
  // - sidebar-footer: NOT implemented
39
44
  // ============================================
40
- describe('Sidebar Structure', () => {
45
+ describe('SEL_DBAR_001: Sidebar Structure', { tags: '@SEL_DBAR_001' }, () => {
41
46
  it('should find sidebar main container', () => {
42
47
  cy.get(dashboard.selectors.sidebarMain).should('exist')
43
48
  })
@@ -57,4 +62,28 @@ describe('Dashboard Sidebar Selectors Validation', { tags: ['@ui-selectors'] },
57
62
  cy.get(dashboard.selectors.sidebarFooter).should('exist')
58
63
  })
59
64
  })
65
+
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')
87
+ })
88
+ })
60
89
  })