@nextsparkjs/theme-default 0.1.0-beta.20 → 0.1.0-beta.21

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 (220) hide show
  1. package/package.json +1 -1
  2. package/tests/cypress/e2e/_devtools/access.bdd.md +262 -0
  3. package/tests/cypress/e2e/_devtools/access.cy.ts +171 -0
  4. package/tests/cypress/e2e/_devtools/navigation.bdd.md +261 -0
  5. package/tests/cypress/e2e/_devtools/navigation.cy.ts +157 -0
  6. package/tests/cypress/e2e/_devtools/pages.bdd.md +303 -0
  7. package/tests/cypress/e2e/_devtools/pages.cy.ts +184 -0
  8. package/tests/cypress/e2e/_docs/README.md +215 -0
  9. package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin-teams.narration.json +155 -0
  10. package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin.cy.ts +390 -0
  11. package/tests/cypress/e2e/_docs/tutorials/teams-system.doc.cy.ts +349 -0
  12. package/tests/cypress/e2e/_docs/tutorials/teams-system.narration.json +165 -0
  13. package/tests/cypress/e2e/_selectors/auth.cy.ts +306 -0
  14. package/tests/cypress/e2e/_selectors/billing.cy.ts +89 -0
  15. package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +113 -0
  16. package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +89 -0
  17. package/tests/cypress/e2e/_selectors/dashboard-sidebar.cy.ts +60 -0
  18. package/tests/cypress/e2e/_selectors/dashboard-topnav.cy.ts +146 -0
  19. package/tests/cypress/e2e/_selectors/devtools.cy.ts +210 -0
  20. package/tests/cypress/e2e/_selectors/global-search.cy.ts +88 -0
  21. package/tests/cypress/e2e/_selectors/pages-editor.cy.ts +179 -0
  22. package/tests/cypress/e2e/_selectors/posts-editor.cy.ts +282 -0
  23. package/tests/cypress/e2e/_selectors/public.cy.ts +112 -0
  24. package/tests/cypress/e2e/_selectors/settings-api-keys.cy.ts +228 -0
  25. package/tests/cypress/e2e/_selectors/settings-billing.cy.ts +105 -0
  26. package/tests/cypress/e2e/_selectors/settings-layout.cy.ts +119 -0
  27. package/tests/cypress/e2e/_selectors/settings-password.cy.ts +71 -0
  28. package/tests/cypress/e2e/_selectors/settings-profile.cy.ts +82 -0
  29. package/tests/cypress/e2e/_selectors/settings-teams.cy.ts +68 -0
  30. package/tests/cypress/e2e/_selectors/superadmin.cy.ts +185 -0
  31. package/tests/cypress/e2e/_selectors/tasks.cy.ts +242 -0
  32. package/tests/cypress/e2e/_selectors/taxonomies.cy.ts +126 -0
  33. package/tests/cypress/e2e/_selectors/teams.cy.ts +142 -0
  34. package/tests/cypress/e2e/_superadmin/all-teams.bdd.md +261 -0
  35. package/tests/cypress/e2e/_superadmin/all-teams.cy.ts +177 -0
  36. package/tests/cypress/e2e/_superadmin/all-users.bdd.md +406 -0
  37. package/tests/cypress/e2e/_superadmin/all-users.cy.ts +294 -0
  38. package/tests/cypress/e2e/_superadmin/dashboard.bdd.md +235 -0
  39. package/tests/cypress/e2e/_superadmin/dashboard.cy.ts +149 -0
  40. package/tests/cypress/e2e/_superadmin/subscriptions-overview.bdd.md +290 -0
  41. package/tests/cypress/e2e/_superadmin/subscriptions-overview.cy.ts +194 -0
  42. package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
  43. package/tests/cypress/e2e/ai/chat-api.cy.ts +107 -0
  44. package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
  45. package/tests/cypress/e2e/api/billing/BillingAPIController.js +319 -0
  46. package/tests/cypress/e2e/api/billing/check-action.cy.ts +326 -0
  47. package/tests/cypress/e2e/api/billing/checkout.cy.ts +358 -0
  48. package/tests/cypress/e2e/api/billing/lifecycle.cy.ts +423 -0
  49. package/tests/cypress/e2e/api/billing/plans/README.md +345 -0
  50. package/tests/cypress/e2e/api/billing/plans/business.cy.ts +412 -0
  51. package/tests/cypress/e2e/api/billing/plans/downgrade.cy.ts +510 -0
  52. package/tests/cypress/e2e/api/billing/plans/fixtures/billing-plans.json +163 -0
  53. package/tests/cypress/e2e/api/billing/plans/free.cy.ts +500 -0
  54. package/tests/cypress/e2e/api/billing/plans/pro.cy.ts +497 -0
  55. package/tests/cypress/e2e/api/billing/plans/starter.cy.ts +342 -0
  56. package/tests/cypress/e2e/api/billing/portal.cy.ts +313 -0
  57. package/tests/cypress/e2e/api/devtools/registries.bdd.md +300 -0
  58. package/tests/cypress/e2e/api/devtools/registries.cy.ts +368 -0
  59. package/tests/cypress/e2e/api/entities/blocks-scope.cy.ts +396 -0
  60. package/tests/cypress/e2e/api/entities/customers-crud.cy.ts +648 -0
  61. package/tests/cypress/e2e/api/entities/customers-metas.cy.ts +839 -0
  62. package/tests/cypress/e2e/api/entities/pages-crud.cy.ts +425 -0
  63. package/tests/cypress/e2e/api/entities/pages-status.cy.ts +335 -0
  64. package/tests/cypress/e2e/api/entities/post-categories-crud.cy.ts +610 -0
  65. package/tests/cypress/e2e/api/entities/posts-crud.cy.ts +709 -0
  66. package/tests/cypress/e2e/api/entities/posts-status.cy.ts +396 -0
  67. package/tests/cypress/e2e/api/entities/tasks-crud.cy.ts +602 -0
  68. package/tests/cypress/e2e/api/entities/tasks-metas.cy.ts +878 -0
  69. package/tests/cypress/e2e/api/entities/users-crud.cy.ts +469 -0
  70. package/tests/cypress/e2e/api/entities/users-metas.cy.ts +913 -0
  71. package/tests/cypress/e2e/api/entities/users-security.cy.ts +375 -0
  72. package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.bdd.md +375 -0
  73. package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.cy.ts +346 -0
  74. package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.bdd.md +451 -0
  75. package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.cy.ts +447 -0
  76. package/tests/cypress/e2e/api/scheduled-actions/scheduling.bdd.md +649 -0
  77. package/tests/cypress/e2e/api/scheduled-actions/scheduling.cy.ts +333 -0
  78. package/tests/cypress/e2e/api/settings/api-keys.crud.cy.ts +923 -0
  79. package/tests/cypress/e2e/uat/auth/app-roles/developer-login.bdd.md +231 -0
  80. package/tests/cypress/e2e/uat/auth/app-roles/developer-login.cy.ts +144 -0
  81. package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.bdd.md +118 -0
  82. package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.cy.ts +84 -0
  83. package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.bdd.md +288 -0
  84. package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.cy.ts +188 -0
  85. package/tests/cypress/e2e/uat/auth/login-logout.bdd.md +160 -0
  86. package/tests/cypress/e2e/uat/auth/login-logout.cy.ts +116 -0
  87. package/tests/cypress/e2e/uat/auth/password-reset.bdd.md +289 -0
  88. package/tests/cypress/e2e/uat/auth/password-reset.cy.ts +200 -0
  89. package/tests/cypress/e2e/uat/auth/team-roles/admin-login.bdd.md +225 -0
  90. package/tests/cypress/e2e/uat/auth/team-roles/admin-login.cy.ts +148 -0
  91. package/tests/cypress/e2e/uat/auth/team-roles/member-login.bdd.md +251 -0
  92. package/tests/cypress/e2e/uat/auth/team-roles/member-login.cy.ts +163 -0
  93. package/tests/cypress/e2e/uat/auth/team-roles/owner-login.bdd.md +231 -0
  94. package/tests/cypress/e2e/uat/auth/team-roles/owner-login.cy.ts +141 -0
  95. package/tests/cypress/e2e/uat/billing/extended.bdd.md +273 -0
  96. package/tests/cypress/e2e/uat/billing/extended.cy.ts +209 -0
  97. package/tests/cypress/e2e/uat/billing/feature-gates.bdd.md +407 -0
  98. package/tests/cypress/e2e/uat/billing/feature-gates.cy.ts +307 -0
  99. package/tests/cypress/e2e/uat/billing/page.bdd.md +329 -0
  100. package/tests/cypress/e2e/uat/billing/page.cy.ts +250 -0
  101. package/tests/cypress/e2e/uat/billing/status.bdd.md +190 -0
  102. package/tests/cypress/e2e/uat/billing/status.cy.ts +145 -0
  103. package/tests/cypress/e2e/uat/billing/team-switch.bdd.md +156 -0
  104. package/tests/cypress/e2e/uat/billing/team-switch.cy.ts +122 -0
  105. package/tests/cypress/e2e/uat/billing/usage.bdd.md +218 -0
  106. package/tests/cypress/e2e/uat/billing/usage.cy.ts +176 -0
  107. package/tests/cypress/e2e/uat/blocks/hero.bdd.md +124 -0
  108. package/tests/cypress/e2e/uat/blocks/hero.cy.ts +56 -0
  109. package/tests/cypress/e2e/uat/devtools/api-tester.cy.ts +390 -0
  110. package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
  111. package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
  112. package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
  113. package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
  114. package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
  115. package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
  116. package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
  117. package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
  118. package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
  119. package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
  120. package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
  121. package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
  122. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
  123. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
  124. package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
  125. package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
  126. package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
  127. package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
  128. package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
  129. package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
  130. package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
  131. package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
  132. package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
  133. package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
  134. package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
  135. package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
  136. package/tests/cypress/e2e/uat/roles/editor-role.bdd.md +552 -0
  137. package/tests/cypress/e2e/uat/roles/editor-role.cy.ts +210 -0
  138. package/tests/cypress/e2e/uat/roles/member-restrictions.bdd.md +450 -0
  139. package/tests/cypress/e2e/uat/roles/member-restrictions.cy.ts +189 -0
  140. package/tests/cypress/e2e/uat/roles/owner-full-crud.bdd.md +530 -0
  141. package/tests/cypress/e2e/uat/roles/owner-full-crud.cy.ts +247 -0
  142. package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.bdd.md +736 -0
  143. package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.cy.ts +740 -0
  144. package/tests/cypress/e2e/uat/teams/roles-matrix.bdd.md +553 -0
  145. package/tests/cypress/e2e/uat/teams/roles-matrix.cy.ts +185 -0
  146. package/tests/cypress/e2e/uat/teams/switcher.bdd.md +1151 -0
  147. package/tests/cypress/e2e/uat/teams/switcher.cy.ts +497 -0
  148. package/tests/cypress/e2e/uat/teams/team-switcher.md +198 -0
  149. package/tests/cypress/fixtures/blocks.json +218 -0
  150. package/tests/cypress/fixtures/entities.json +78 -0
  151. package/tests/cypress/fixtures/page-builder.json +21 -0
  152. package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
  153. package/tests/cypress/src/components/CustomersPOM.ts +439 -0
  154. package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
  155. package/tests/cypress/src/components/EntityForm.ts +375 -0
  156. package/tests/cypress/src/components/EntityList.ts +389 -0
  157. package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
  158. package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
  159. package/tests/cypress/src/components/PostsListPOM.ts +223 -0
  160. package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
  161. package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
  162. package/tests/cypress/src/components/TasksPOM.ts +272 -0
  163. package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
  164. package/tests/cypress/src/components/index.ts +21 -0
  165. package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
  166. package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
  167. package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
  168. package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
  169. package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
  170. package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
  171. package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
  172. package/tests/cypress/src/controllers/index.js +25 -0
  173. package/tests/cypress/src/core/AuthPOM.ts +450 -0
  174. package/tests/cypress/src/core/BasePOM.ts +86 -0
  175. package/tests/cypress/src/core/BlockEditorBasePOM.ts +576 -0
  176. package/tests/cypress/src/core/DashboardEntityPOM.ts +692 -0
  177. package/tests/cypress/src/core/index.ts +14 -0
  178. package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
  179. package/tests/cypress/src/entities/PagesPOM.ts +137 -0
  180. package/tests/cypress/src/entities/PostsPOM.ts +137 -0
  181. package/tests/cypress/src/entities/TasksPOM.ts +176 -0
  182. package/tests/cypress/src/entities/index.ts +14 -0
  183. package/tests/cypress/src/features/BillingPOM.ts +385 -0
  184. package/tests/cypress/src/features/DashboardPOM.ts +245 -0
  185. package/tests/cypress/src/features/DevtoolsPOM.ts +739 -0
  186. package/tests/cypress/src/features/PageBuilderPOM.ts +263 -0
  187. package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
  188. package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
  189. package/tests/cypress/src/features/SettingsPOM.ts +362 -0
  190. package/tests/cypress/src/features/SuperadminPOM.ts +331 -0
  191. package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
  192. package/tests/cypress/src/features/index.ts +28 -0
  193. package/tests/cypress/src/helpers/ApiInterceptor.ts +177 -0
  194. package/tests/cypress/src/index.ts +101 -0
  195. package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
  196. package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
  197. package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
  198. package/tests/cypress/src/pages/dashboard/index.js +6 -0
  199. package/tests/cypress/src/pages/index.js +5 -0
  200. package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
  201. package/tests/cypress/src/pages/public/LandingPage.js +69 -0
  202. package/tests/cypress/src/pages/public/PricingPage.js +33 -0
  203. package/tests/cypress/src/pages/public/index.js +6 -0
  204. package/tests/cypress/src/selectors.ts +46 -0
  205. package/tests/cypress/src/session-helpers.ts +500 -0
  206. package/tests/cypress/support/doc-commands.ts +260 -0
  207. package/tests/cypress.config.ts +150 -0
  208. package/tests/jest/components/post-header.test.tsx +377 -0
  209. package/tests/jest/config/role-config.test.ts +529 -0
  210. package/tests/jest/jest.config.ts +81 -0
  211. package/tests/jest/langchain/COVERAGE.md +372 -0
  212. package/tests/jest/langchain/guardrails.test.ts +465 -0
  213. package/tests/jest/langchain/streaming.test.ts +367 -0
  214. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  215. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  216. package/tests/jest/langchain/tracer.test.ts +823 -0
  217. package/tests/jest/user-roles/role-helpers.test.ts +432 -0
  218. package/tests/jest/validation/categories.test.ts +429 -0
  219. package/tests/jest/validation/posts.test.ts +546 -0
  220. package/tests/tsconfig.json +15 -0
@@ -0,0 +1,546 @@
1
+ /**
2
+ * DashboardStats - Page Object Model Class
3
+ *
4
+ * Encapsula funcionalidad específica de las estadísticas del dashboard
5
+ * Mapea test cases: DASH_009-016 de dashboard-main.cy.md
6
+ */
7
+ export class DashboardStats {
8
+ static selectors = {
9
+ // Grid principal de estadísticas - selector correcto del dashboard real
10
+ statsGrid: '.grid.gap-4.md\\:grid-cols-2.lg\\:grid-cols-4',
11
+
12
+ // Tarjetas individuales
13
+ statCard: '.rounded-lg.border',
14
+ statTitle: '.text-sm.font-medium',
15
+ statValue: '.text-2xl.font-bold',
16
+ statIcon: '.h-4.w-4',
17
+ statTrend: '.text-xs.text-muted-foreground',
18
+
19
+ // Estadísticas específicas (usando data attributes cuando estén disponibles)
20
+ accountStatus: '[data-stat="account-status"]',
21
+ planInfo: '[data-stat="plan"]',
22
+ teamMembers: '[data-stat="team-members"]',
23
+ usage: '[data-stat="usage"]',
24
+
25
+ // Estados de las tarjetas
26
+ loadingCard: '.animate-pulse',
27
+ errorCard: '.border-destructive',
28
+ successCard: '.border-green-500',
29
+
30
+ // Elementos interactivos
31
+ clickableCard: '.cursor-pointer',
32
+ cardHover: '.hover\\:shadow-md',
33
+
34
+ // Métricas específicas (usando contenido de texto como fallback)
35
+ activeStatus: ':contains("Active")',
36
+ verifiedBadge: ':contains("Verified")',
37
+ premiumPlan: ':contains("Premium")',
38
+ memberCount: '[data-metric="member-count"]',
39
+ usagePercentage: '[data-metric="usage-percentage"]',
40
+ }
41
+
42
+ /**
43
+ * Valida que las estadísticas están cargadas
44
+ */
45
+ validateStatsLoaded() {
46
+ cy.get(DashboardStats.selectors.statsGrid).should('be.visible')
47
+ cy.get(DashboardStats.selectors.statCard).should('have.length.at.least', 3)
48
+
49
+ return this
50
+ }
51
+
52
+ /**
53
+ * Valida estadística de estado de cuenta
54
+ */
55
+ validateAccountStatus(expectedStatus = 'Active') {
56
+ cy.get(DashboardStats.selectors.accountStatus).within(() => {
57
+ cy.get(DashboardStats.selectors.statTitle).should('contain.text', 'Account Status')
58
+ cy.get(DashboardStats.selectors.statValue).should('contain.text', expectedStatus)
59
+ cy.get(DashboardStats.selectors.statIcon).should('be.visible')
60
+ })
61
+
62
+ return this
63
+ }
64
+
65
+ /**
66
+ * Valida información del plan
67
+ */
68
+ validatePlanInfo(expectedPlan = 'Premium') {
69
+ cy.get(DashboardStats.selectors.planInfo).within(() => {
70
+ cy.get(DashboardStats.selectors.statTitle).should('contain.text', 'Plan')
71
+ cy.get(DashboardStats.selectors.statValue).should('contain.text', expectedPlan)
72
+ })
73
+
74
+ return this
75
+ }
76
+
77
+ /**
78
+ * Valida estadística de miembros del equipo
79
+ */
80
+ validateTeamMembers(expectedCount) {
81
+ cy.get(DashboardStats.selectors.teamMembers).within(() => {
82
+ cy.get(DashboardStats.selectors.statTitle).should('contain.text', 'Team Members')
83
+ if (expectedCount) {
84
+ cy.get(DashboardStats.selectors.statValue).should('contain.text', expectedCount)
85
+ }
86
+ })
87
+
88
+ return this
89
+ }
90
+
91
+ /**
92
+ * Valida estadística de uso
93
+ */
94
+ validateUsageStats(expectedUsage) {
95
+ cy.get(DashboardStats.selectors.usage).within(() => {
96
+ cy.get(DashboardStats.selectors.statTitle).should('contain.text', 'Usage')
97
+ if (expectedUsage) {
98
+ cy.get(DashboardStats.selectors.statValue).should('contain.text', expectedUsage)
99
+ }
100
+ })
101
+
102
+ return this
103
+ }
104
+
105
+ /**
106
+ * Valida todos los componentes básicos de una tarjeta de estadística
107
+ */
108
+ validateStatCardStructure(cardSelector) {
109
+ cy.get(cardSelector).within(() => {
110
+ cy.get(DashboardStats.selectors.statTitle).should('be.visible')
111
+ cy.get(DashboardStats.selectors.statValue).should('be.visible')
112
+ cy.get(DashboardStats.selectors.statIcon).should('be.visible')
113
+ })
114
+
115
+ return this
116
+ }
117
+
118
+ /**
119
+ * Valida estados de loading en las estadísticas
120
+ */
121
+ validateLoadingState() {
122
+ cy.get(DashboardStats.selectors.loadingCard).should('be.visible')
123
+
124
+ return this
125
+ }
126
+
127
+ /**
128
+ * Valida que el loading ha terminado
129
+ */
130
+ validateLoadingCompleted() {
131
+ cy.get(DashboardStats.selectors.loadingCard).should('not.exist')
132
+ cy.get(DashboardStats.selectors.statValue).should('not.be.empty')
133
+
134
+ return this
135
+ }
136
+
137
+ /**
138
+ * Valida comportamiento de hover en tarjetas
139
+ */
140
+ validateHoverEffects() {
141
+ cy.get(DashboardStats.selectors.statCard).first().trigger('mouseover')
142
+ cy.get(DashboardStats.selectors.cardHover).should('exist')
143
+
144
+ return this
145
+ }
146
+
147
+ /**
148
+ * Valida clicks en tarjetas interactivas
149
+ */
150
+ validateCardInteractivity() {
151
+ cy.get(DashboardStats.selectors.clickableCard).first().click()
152
+ // Verificar que navega o abre modal según el comportamiento esperado
153
+
154
+ return this
155
+ }
156
+
157
+ /**
158
+ * Valida estadísticas para diferentes roles de usuario
159
+ */
160
+ validateStatsForRole(userRole) {
161
+ this.validateStatsLoaded()
162
+
163
+ if (userRole === 'superadmin') {
164
+ // Superadmin ve estadísticas adicionales
165
+ cy.get(DashboardStats.selectors.statsGrid).within(() => {
166
+ cy.get(DashboardStats.selectors.statCard).should('have.length.at.least', 4)
167
+ })
168
+ } else if (userRole === 'member') {
169
+ // Member ve estadísticas básicas
170
+ cy.get(DashboardStats.selectors.statsGrid).within(() => {
171
+ cy.get(DashboardStats.selectors.statCard).should('have.length.at.least', 3)
172
+ })
173
+ }
174
+
175
+ return this
176
+ }
177
+
178
+ /**
179
+ * Valida trends y métricas de cambio
180
+ */
181
+ validateTrends() {
182
+ cy.get(DashboardStats.selectors.statTrend).should('be.visible')
183
+
184
+ // Verificar que los trends muestran información útil
185
+ cy.get(DashboardStats.selectors.statTrend).each(($trend) => {
186
+ cy.wrap($trend).should('not.be.empty')
187
+ })
188
+
189
+ return this
190
+ }
191
+
192
+ /**
193
+ * Valida estado de error en estadísticas
194
+ */
195
+ validateErrorState() {
196
+ cy.get(DashboardStats.selectors.errorCard).should('be.visible')
197
+ cy.get(DashboardStats.selectors.errorCard).within(() => {
198
+ cy.contains('Error loading stats').should('be.visible')
199
+ })
200
+
201
+ return this
202
+ }
203
+
204
+ /**
205
+ * Valida actualización de estadísticas en tiempo real
206
+ */
207
+ validateRealTimeUpdates() {
208
+ // Capturar valor inicial
209
+ cy.get(DashboardStats.selectors.statValue).first().then(($value) => {
210
+ const initialValue = $value.text()
211
+
212
+ // Simular actualización (esto dependería de la implementación real)
213
+ cy.wait(1000)
214
+
215
+ // Verificar que puede haber cambiado o permanecido igual
216
+ cy.get(DashboardStats.selectors.statValue).first().should('exist')
217
+ })
218
+
219
+ return this
220
+ }
221
+
222
+ /**
223
+ * Valida comportamiento responsive de las estadísticas
224
+ */
225
+ validateResponsiveBehavior() {
226
+ // Desktop: 4 columnas
227
+ cy.viewport(1200, 800)
228
+ cy.get(DashboardStats.selectors.statsGrid)
229
+ .should('have.class', 'lg:grid-cols-4')
230
+
231
+ // Tablet: 2 columnas
232
+ cy.viewport(768, 1024)
233
+ cy.get(DashboardStats.selectors.statsGrid)
234
+ .should('have.class', 'sm:grid-cols-2')
235
+
236
+ // Mobile: 1 columna
237
+ cy.viewport(375, 667)
238
+ cy.get(DashboardStats.selectors.statsGrid)
239
+ .should('have.class', 'grid-cols-1')
240
+
241
+ return this
242
+ }
243
+
244
+ /**
245
+ * Valida accesibilidad de las estadísticas
246
+ */
247
+ validateAccessibility() {
248
+ cy.get(DashboardStats.selectors.statCard).each(($card) => {
249
+ cy.wrap($card).within(() => {
250
+ // Verificar que tienen estructura semántica apropiada
251
+ cy.get(DashboardStats.selectors.statTitle).should('have.attr', 'role')
252
+ .or('be.focused')
253
+
254
+ // Verificar que los iconos tienen labels apropiados
255
+ cy.get(DashboardStats.selectors.statIcon).should('have.attr', 'aria-label')
256
+ .or('have.attr', 'aria-hidden', 'true')
257
+ })
258
+ })
259
+
260
+ return this
261
+ }
262
+
263
+ /**
264
+ * Valida datos mock vs datos reales
265
+ */
266
+ validateDataAccuracy() {
267
+ // Verificar que los valores no son placeholders
268
+ cy.get(DashboardStats.selectors.statValue).each(($value) => {
269
+ cy.wrap($value).should('not.contain.text', 'Loading...')
270
+ cy.wrap($value).should('not.contain.text', '--')
271
+ cy.wrap($value).should('not.be.empty')
272
+ })
273
+
274
+ return this
275
+ }
276
+
277
+ /**
278
+ * Valida colores y temas en las estadísticas
279
+ */
280
+ validateThemeSupport() {
281
+ // Verificar que las tarjetas respetan el tema actual
282
+ cy.get(DashboardStats.selectors.statCard).should('have.css', 'background-color')
283
+
284
+ // Si hay toggle de tema disponible, probarlo
285
+ cy.get('[data-cy="topnav-theme-toggle"]').then(($toggle) => {
286
+ if ($toggle.length > 0) {
287
+ cy.wrap($toggle).click()
288
+ cy.get(DashboardStats.selectors.statCard).should('have.css', 'background-color')
289
+ }
290
+ })
291
+
292
+ return this
293
+ }
294
+
295
+ /**
296
+ * Valida exportación de datos de estadísticas
297
+ */
298
+ validateDataExport() {
299
+ // Si hay funcionalidad de export, validarla
300
+ cy.get('[data-cy="export-stats"]').then(($export) => {
301
+ if ($export.length > 0) {
302
+ cy.wrap($export).click()
303
+ // Verificar descarga o modal de export
304
+ }
305
+ })
306
+
307
+ return this
308
+ }
309
+
310
+ /**
311
+ * Valida badges y indicadores especiales
312
+ */
313
+ validateBadges() {
314
+ cy.get(DashboardStats.selectors.verifiedBadge).should('be.visible')
315
+
316
+ return this
317
+ }
318
+
319
+ /**
320
+ * Valida métricas numéricas específicas
321
+ */
322
+ validateNumericMetrics() {
323
+ // Verificar que los números son válidos
324
+ cy.get(DashboardStats.selectors.memberCount).then(($count) => {
325
+ if ($count.length > 0) {
326
+ const count = parseInt($count.text())
327
+ expect(count).to.be.a('number')
328
+ expect(count).to.be.at.least(0)
329
+ }
330
+ })
331
+
332
+ cy.get(DashboardStats.selectors.usagePercentage).then(($usage) => {
333
+ if ($usage.length > 0) {
334
+ const usage = parseInt($usage.text())
335
+ expect(usage).to.be.a('number')
336
+ expect(usage).to.be.within(0, 100)
337
+ }
338
+ })
339
+
340
+ return this
341
+ }
342
+
343
+ // ========================================
344
+ // MÉTODOS REQUERIDOS POR LOS TESTS
345
+ // ========================================
346
+
347
+ /**
348
+ * Valida que las estadísticas se actualizaron
349
+ */
350
+ validateUpdatedStats() {
351
+ cy.get(DashboardStats.selectors.container).should('be.visible')
352
+ cy.get(DashboardStats.selectors.loadingIndicator).should('not.exist')
353
+ cy.get(DashboardStats.selectors.memberCount).should('be.visible')
354
+ cy.get(DashboardStats.selectors.taskCompletedCount).should('be.visible')
355
+ cy.get(DashboardStats.selectors.usagePercentage).should('be.visible')
356
+ return this
357
+ }
358
+
359
+ /**
360
+ * Valida error en estadísticas
361
+ */
362
+ validateStatsError() {
363
+ cy.get(DashboardStats.selectors.errorCard).should('be.visible')
364
+ return this
365
+ }
366
+
367
+ // ========================================
368
+ // MÉTODOS FALTANTES REQUERIDOS POR LOS TESTS
369
+ // ========================================
370
+
371
+ /**
372
+ * Valida sección de estadísticas
373
+ */
374
+ validateStatsSection() {
375
+ cy.get(DashboardStats.selectors.statsGrid).should('be.visible')
376
+ return this
377
+ }
378
+
379
+ /**
380
+ * Valida todas las tarjetas de stats
381
+ */
382
+ validateAllStatsCards() {
383
+ cy.get(DashboardStats.selectors.statCard).should('have.length.at.least', 3)
384
+ return this
385
+ }
386
+
387
+ /**
388
+ * Valida loading de stats
389
+ */
390
+ validateStatsLoading() {
391
+ cy.get(DashboardStats.selectors.loadingCard).should('be.visible')
392
+ return this
393
+ }
394
+
395
+ /**
396
+ * Valida datos de stats
397
+ */
398
+ validateStatsData() {
399
+ cy.get(DashboardStats.selectors.statValue).should('not.be.empty')
400
+ return this
401
+ }
402
+
403
+ /**
404
+ * Valida tarjeta de total tasks
405
+ */
406
+ validateTasksStatCard() {
407
+ cy.get(DashboardStats.selectors.statCard).first().should('be.visible')
408
+ return this
409
+ }
410
+
411
+ /**
412
+ * Valida contador de tasks
413
+ */
414
+ validateTasksCount() {
415
+ cy.get(DashboardStats.selectors.statValue).first().should('be.visible')
416
+ return this
417
+ }
418
+
419
+ /**
420
+ * Valida icono de tasks stat
421
+ */
422
+ validateTasksStatIcon() {
423
+ cy.get(DashboardStats.selectors.statIcon).first().should('be.visible')
424
+ return this
425
+ }
426
+
427
+ /**
428
+ * Valida link de tasks stat
429
+ */
430
+ validateTasksStatLink() {
431
+ cy.get(DashboardStats.selectors.statCard).first().should('be.visible')
432
+ return this
433
+ }
434
+
435
+ /**
436
+ * Valida tarjeta de tasks completadas
437
+ */
438
+ validateCompletedTasksCard() {
439
+ cy.get(DashboardStats.selectors.statCard).eq(1).should('be.visible')
440
+ return this
441
+ }
442
+
443
+ /**
444
+ * Valida contador de tasks completadas
445
+ */
446
+ validateCompletedTasksCount() {
447
+ cy.get(DashboardStats.selectors.statValue).eq(1).should('be.visible')
448
+ return this
449
+ }
450
+
451
+ /**
452
+ * Valida porcentaje de tasks completadas
453
+ */
454
+ validateCompletedTasksPercentage() {
455
+ cy.get(DashboardStats.selectors.statBadge).should('be.visible')
456
+ return this
457
+ }
458
+
459
+ /**
460
+ * Valida tarjeta de tasks pendientes
461
+ */
462
+ validatePendingTasksCard() {
463
+ cy.get(DashboardStats.selectors.statCard).eq(2).should('be.visible')
464
+ return this
465
+ }
466
+
467
+ /**
468
+ * Valida contador de tasks pendientes
469
+ */
470
+ validatePendingTasksCount() {
471
+ cy.get(DashboardStats.selectors.statValue).eq(2).should('be.visible')
472
+ return this
473
+ }
474
+
475
+ /**
476
+ * Valida prioridad de tasks pendientes
477
+ */
478
+ validatePendingTasksPriority() {
479
+ cy.get(DashboardStats.selectors.statBadge).should('be.visible')
480
+ return this
481
+ }
482
+
483
+ /**
484
+ * Valida tarjeta de productividad
485
+ */
486
+ validateProductivityCard() {
487
+ cy.get(DashboardStats.selectors.statCard).eq(3).should('be.visible')
488
+ return this
489
+ }
490
+
491
+ /**
492
+ * Valida score de productividad
493
+ */
494
+ validateProductivityScore() {
495
+ cy.get(DashboardStats.selectors.statValue).eq(3).should('be.visible')
496
+ return this
497
+ }
498
+
499
+ /**
500
+ * Valida trend de productividad
501
+ */
502
+ validateProductivityTrend() {
503
+ cy.get(DashboardStats.selectors.statBadge).should('be.visible')
504
+ return this
505
+ }
506
+
507
+ /**
508
+ * Click en tarjeta de tasks stat
509
+ */
510
+ clickTasksStatCard() {
511
+ cy.get(DashboardStats.selectors.statCard).first().click()
512
+ return this
513
+ }
514
+
515
+ /**
516
+ * Valida estadísticas iniciales
517
+ */
518
+ validateInitialStats() {
519
+ cy.get(DashboardStats.selectors.statsGrid).should('be.visible')
520
+ return this
521
+ }
522
+
523
+ /**
524
+ * Refresca stats
525
+ */
526
+ refreshStats() {
527
+ cy.reload()
528
+ return this
529
+ }
530
+
531
+ /**
532
+ * Valida que stats se refrescaron
533
+ */
534
+ validateStatsRefreshed() {
535
+ cy.get(DashboardStats.selectors.statsGrid).should('be.visible')
536
+ return this
537
+ }
538
+
539
+ /**
540
+ * Valida mensaje de error específico
541
+ */
542
+ validateErrorMessage(message) {
543
+ cy.get(DashboardStats.selectors.errorCard).should('contain.text', message)
544
+ return this
545
+ }
546
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Dashboard Pages - Page Object Model Classes
3
+ */
4
+ export { Dashboard } from './Dashboard.js'
5
+ export { DashboardPage } from './DashboardPage.js'
6
+ export { DashboardStats } from './DashboardStats.js'
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Theme Default Pages - Page Object Model Classes
3
+ */
4
+ export * from './dashboard/index.js'
5
+ export * from './public/index.js'
@@ -0,0 +1,28 @@
1
+ /**
2
+ * FeaturesPage - Page Object Model Class
3
+ */
4
+ export class FeaturesPage {
5
+ static selectors = {
6
+ container: '.features-page',
7
+ featuresList: '.features-list',
8
+ featureItem: '.feature-item',
9
+ demoButton: '[data-cy="feature-demo"]'
10
+ }
11
+
12
+ validateFeaturesPageLoaded() {
13
+ cy.get(FeaturesPage.selectors.container).should('be.visible')
14
+ cy.url().should('include', '/features')
15
+ return this
16
+ }
17
+
18
+ validateFeaturesList() {
19
+ cy.get(FeaturesPage.selectors.featuresList).should('be.visible')
20
+ cy.get(FeaturesPage.selectors.featureItem).should('have.length.at.least', 1)
21
+ return this
22
+ }
23
+
24
+ clickFeatureDemo() {
25
+ cy.get(FeaturesPage.selectors.demoButton).first().click()
26
+ return this
27
+ }
28
+ }
@@ -0,0 +1,69 @@
1
+ /**
2
+ * LandingPage - Page Object Model Class
3
+ *
4
+ * Encapsula funcionalidad de la página principal pública
5
+ * Mapea test cases: PUB_001-008 de public-pages.cy.md
6
+ */
7
+ export class LandingPage {
8
+ static selectors = {
9
+ // Hero section
10
+ heroSection: '.hero-section',
11
+ heroTitle: 'h1',
12
+ heroSubtitle: '.subtitle',
13
+ ctaButton: '[data-cy="cta-signup"]',
14
+
15
+ // Navigation
16
+ navbar: '[data-cy="public-navbar"]',
17
+ loginLink: '[data-cy="nav-login"]',
18
+ signupLink: '[data-cy="nav-signup"]',
19
+
20
+ // Features section
21
+ featuresSection: '.features-section',
22
+ featureCard: '.feature-card',
23
+
24
+ // Footer
25
+ footer: '[data-cy="public-footer"]',
26
+ footerLinks: '.footer-links a',
27
+ }
28
+
29
+ visit() {
30
+ cy.visit('/')
31
+ return this
32
+ }
33
+
34
+ validateLandingPageLoaded() {
35
+ cy.get(LandingPage.selectors.heroSection).should('be.visible')
36
+ cy.get(LandingPage.selectors.heroTitle).should('be.visible')
37
+ cy.url().should('eq', Cypress.config().baseUrl + '/')
38
+ return this
39
+ }
40
+
41
+ clickSignupCTA() {
42
+ cy.get(LandingPage.selectors.ctaButton).click()
43
+ cy.url().should('include', '/signup')
44
+ return this
45
+ }
46
+
47
+ clickSignupButton() {
48
+ // Alias for clickSignupCTA for consistency
49
+ return this.clickSignupCTA()
50
+ }
51
+
52
+ navigateToLogin() {
53
+ cy.get(LandingPage.selectors.loginLink).click()
54
+ cy.url().should('include', '/login')
55
+ return this
56
+ }
57
+
58
+ validateFeatures() {
59
+ cy.get(LandingPage.selectors.featuresSection).should('be.visible')
60
+ cy.get(LandingPage.selectors.featureCard).should('have.length.at.least', 3)
61
+ return this
62
+ }
63
+
64
+ validateFooter() {
65
+ cy.get(LandingPage.selectors.footer).should('be.visible')
66
+ cy.get(LandingPage.selectors.footerLinks).should('have.length.at.least', 1)
67
+ return this
68
+ }
69
+ }
@@ -0,0 +1,33 @@
1
+ /**
2
+ * PricingPage - Page Object Model Class
3
+ */
4
+ export class PricingPage {
5
+ static selectors = {
6
+ container: '.pricing-page',
7
+ pricingCards: '.pricing-card',
8
+ selectPlanButton: '[data-cy="select-plan"]',
9
+ monthlyToggle: '[data-cy="monthly-toggle"]',
10
+ yearlyToggle: '[data-cy="yearly-toggle"]'
11
+ }
12
+
13
+ validatePricingPageLoaded() {
14
+ cy.get(PricingPage.selectors.container).should('be.visible')
15
+ cy.url().should('include', '/pricing')
16
+ return this
17
+ }
18
+
19
+ validatePricingCards() {
20
+ cy.get(PricingPage.selectors.pricingCards).should('have.length.at.least', 2)
21
+ return this
22
+ }
23
+
24
+ selectPlan(planIndex = 0) {
25
+ cy.get(PricingPage.selectors.selectPlanButton).eq(planIndex).click()
26
+ return this
27
+ }
28
+
29
+ toggleToYearly() {
30
+ cy.get(PricingPage.selectors.yearlyToggle).click()
31
+ return this
32
+ }
33
+ }
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Public Pages - Page Object Model Classes
3
+ */
4
+ export { FeaturesPage } from './FeaturesPage.js'
5
+ export { LandingPage } from './LandingPage.js'
6
+ export { PricingPage } from './PricingPage.js'