@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.
- package/package.json +1 -1
- package/tests/cypress/e2e/_devtools/access.bdd.md +262 -0
- package/tests/cypress/e2e/_devtools/access.cy.ts +171 -0
- package/tests/cypress/e2e/_devtools/navigation.bdd.md +261 -0
- package/tests/cypress/e2e/_devtools/navigation.cy.ts +157 -0
- package/tests/cypress/e2e/_devtools/pages.bdd.md +303 -0
- package/tests/cypress/e2e/_devtools/pages.cy.ts +184 -0
- package/tests/cypress/e2e/_docs/README.md +215 -0
- package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin-teams.narration.json +155 -0
- package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin.cy.ts +390 -0
- package/tests/cypress/e2e/_docs/tutorials/teams-system.doc.cy.ts +349 -0
- package/tests/cypress/e2e/_docs/tutorials/teams-system.narration.json +165 -0
- package/tests/cypress/e2e/_selectors/auth.cy.ts +306 -0
- package/tests/cypress/e2e/_selectors/billing.cy.ts +89 -0
- package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +113 -0
- package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +89 -0
- package/tests/cypress/e2e/_selectors/dashboard-sidebar.cy.ts +60 -0
- package/tests/cypress/e2e/_selectors/dashboard-topnav.cy.ts +146 -0
- package/tests/cypress/e2e/_selectors/devtools.cy.ts +210 -0
- package/tests/cypress/e2e/_selectors/global-search.cy.ts +88 -0
- package/tests/cypress/e2e/_selectors/pages-editor.cy.ts +179 -0
- package/tests/cypress/e2e/_selectors/posts-editor.cy.ts +282 -0
- package/tests/cypress/e2e/_selectors/public.cy.ts +112 -0
- package/tests/cypress/e2e/_selectors/settings-api-keys.cy.ts +228 -0
- package/tests/cypress/e2e/_selectors/settings-billing.cy.ts +105 -0
- package/tests/cypress/e2e/_selectors/settings-layout.cy.ts +119 -0
- package/tests/cypress/e2e/_selectors/settings-password.cy.ts +71 -0
- package/tests/cypress/e2e/_selectors/settings-profile.cy.ts +82 -0
- package/tests/cypress/e2e/_selectors/settings-teams.cy.ts +68 -0
- package/tests/cypress/e2e/_selectors/superadmin.cy.ts +185 -0
- package/tests/cypress/e2e/_selectors/tasks.cy.ts +242 -0
- package/tests/cypress/e2e/_selectors/taxonomies.cy.ts +126 -0
- package/tests/cypress/e2e/_selectors/teams.cy.ts +142 -0
- package/tests/cypress/e2e/_superadmin/all-teams.bdd.md +261 -0
- package/tests/cypress/e2e/_superadmin/all-teams.cy.ts +177 -0
- package/tests/cypress/e2e/_superadmin/all-users.bdd.md +406 -0
- package/tests/cypress/e2e/_superadmin/all-users.cy.ts +294 -0
- package/tests/cypress/e2e/_superadmin/dashboard.bdd.md +235 -0
- package/tests/cypress/e2e/_superadmin/dashboard.cy.ts +149 -0
- package/tests/cypress/e2e/_superadmin/subscriptions-overview.bdd.md +290 -0
- package/tests/cypress/e2e/_superadmin/subscriptions-overview.cy.ts +194 -0
- package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
- package/tests/cypress/e2e/ai/chat-api.cy.ts +107 -0
- package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
- package/tests/cypress/e2e/api/billing/BillingAPIController.js +319 -0
- package/tests/cypress/e2e/api/billing/check-action.cy.ts +326 -0
- package/tests/cypress/e2e/api/billing/checkout.cy.ts +358 -0
- package/tests/cypress/e2e/api/billing/lifecycle.cy.ts +423 -0
- package/tests/cypress/e2e/api/billing/plans/README.md +345 -0
- package/tests/cypress/e2e/api/billing/plans/business.cy.ts +412 -0
- package/tests/cypress/e2e/api/billing/plans/downgrade.cy.ts +510 -0
- package/tests/cypress/e2e/api/billing/plans/fixtures/billing-plans.json +163 -0
- package/tests/cypress/e2e/api/billing/plans/free.cy.ts +500 -0
- package/tests/cypress/e2e/api/billing/plans/pro.cy.ts +497 -0
- package/tests/cypress/e2e/api/billing/plans/starter.cy.ts +342 -0
- package/tests/cypress/e2e/api/billing/portal.cy.ts +313 -0
- package/tests/cypress/e2e/api/devtools/registries.bdd.md +300 -0
- package/tests/cypress/e2e/api/devtools/registries.cy.ts +368 -0
- package/tests/cypress/e2e/api/entities/blocks-scope.cy.ts +396 -0
- package/tests/cypress/e2e/api/entities/customers-crud.cy.ts +648 -0
- package/tests/cypress/e2e/api/entities/customers-metas.cy.ts +839 -0
- package/tests/cypress/e2e/api/entities/pages-crud.cy.ts +425 -0
- package/tests/cypress/e2e/api/entities/pages-status.cy.ts +335 -0
- package/tests/cypress/e2e/api/entities/post-categories-crud.cy.ts +610 -0
- package/tests/cypress/e2e/api/entities/posts-crud.cy.ts +709 -0
- package/tests/cypress/e2e/api/entities/posts-status.cy.ts +396 -0
- package/tests/cypress/e2e/api/entities/tasks-crud.cy.ts +602 -0
- package/tests/cypress/e2e/api/entities/tasks-metas.cy.ts +878 -0
- package/tests/cypress/e2e/api/entities/users-crud.cy.ts +469 -0
- package/tests/cypress/e2e/api/entities/users-metas.cy.ts +913 -0
- package/tests/cypress/e2e/api/entities/users-security.cy.ts +375 -0
- package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.bdd.md +375 -0
- package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.cy.ts +346 -0
- package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.bdd.md +451 -0
- package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.cy.ts +447 -0
- package/tests/cypress/e2e/api/scheduled-actions/scheduling.bdd.md +649 -0
- package/tests/cypress/e2e/api/scheduled-actions/scheduling.cy.ts +333 -0
- package/tests/cypress/e2e/api/settings/api-keys.crud.cy.ts +923 -0
- package/tests/cypress/e2e/uat/auth/app-roles/developer-login.bdd.md +231 -0
- package/tests/cypress/e2e/uat/auth/app-roles/developer-login.cy.ts +144 -0
- package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.bdd.md +118 -0
- package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.cy.ts +84 -0
- package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.bdd.md +288 -0
- package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.cy.ts +188 -0
- package/tests/cypress/e2e/uat/auth/login-logout.bdd.md +160 -0
- package/tests/cypress/e2e/uat/auth/login-logout.cy.ts +116 -0
- package/tests/cypress/e2e/uat/auth/password-reset.bdd.md +289 -0
- package/tests/cypress/e2e/uat/auth/password-reset.cy.ts +200 -0
- package/tests/cypress/e2e/uat/auth/team-roles/admin-login.bdd.md +225 -0
- package/tests/cypress/e2e/uat/auth/team-roles/admin-login.cy.ts +148 -0
- package/tests/cypress/e2e/uat/auth/team-roles/member-login.bdd.md +251 -0
- package/tests/cypress/e2e/uat/auth/team-roles/member-login.cy.ts +163 -0
- package/tests/cypress/e2e/uat/auth/team-roles/owner-login.bdd.md +231 -0
- package/tests/cypress/e2e/uat/auth/team-roles/owner-login.cy.ts +141 -0
- package/tests/cypress/e2e/uat/billing/extended.bdd.md +273 -0
- package/tests/cypress/e2e/uat/billing/extended.cy.ts +209 -0
- package/tests/cypress/e2e/uat/billing/feature-gates.bdd.md +407 -0
- package/tests/cypress/e2e/uat/billing/feature-gates.cy.ts +307 -0
- package/tests/cypress/e2e/uat/billing/page.bdd.md +329 -0
- package/tests/cypress/e2e/uat/billing/page.cy.ts +250 -0
- package/tests/cypress/e2e/uat/billing/status.bdd.md +190 -0
- package/tests/cypress/e2e/uat/billing/status.cy.ts +145 -0
- package/tests/cypress/e2e/uat/billing/team-switch.bdd.md +156 -0
- package/tests/cypress/e2e/uat/billing/team-switch.cy.ts +122 -0
- package/tests/cypress/e2e/uat/billing/usage.bdd.md +218 -0
- package/tests/cypress/e2e/uat/billing/usage.cy.ts +176 -0
- package/tests/cypress/e2e/uat/blocks/hero.bdd.md +124 -0
- package/tests/cypress/e2e/uat/blocks/hero.cy.ts +56 -0
- package/tests/cypress/e2e/uat/devtools/api-tester.cy.ts +390 -0
- package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
- package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
- package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
- package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
- package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
- package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
- package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
- package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
- package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
- package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
- package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
- package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
- package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
- package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
- package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
- package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
- package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
- package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
- package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
- package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
- package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
- package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
- package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
- package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
- package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
- package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
- package/tests/cypress/e2e/uat/roles/editor-role.bdd.md +552 -0
- package/tests/cypress/e2e/uat/roles/editor-role.cy.ts +210 -0
- package/tests/cypress/e2e/uat/roles/member-restrictions.bdd.md +450 -0
- package/tests/cypress/e2e/uat/roles/member-restrictions.cy.ts +189 -0
- package/tests/cypress/e2e/uat/roles/owner-full-crud.bdd.md +530 -0
- package/tests/cypress/e2e/uat/roles/owner-full-crud.cy.ts +247 -0
- package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.bdd.md +736 -0
- package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.cy.ts +740 -0
- package/tests/cypress/e2e/uat/teams/roles-matrix.bdd.md +553 -0
- package/tests/cypress/e2e/uat/teams/roles-matrix.cy.ts +185 -0
- package/tests/cypress/e2e/uat/teams/switcher.bdd.md +1151 -0
- package/tests/cypress/e2e/uat/teams/switcher.cy.ts +497 -0
- package/tests/cypress/e2e/uat/teams/team-switcher.md +198 -0
- package/tests/cypress/fixtures/blocks.json +218 -0
- package/tests/cypress/fixtures/entities.json +78 -0
- package/tests/cypress/fixtures/page-builder.json +21 -0
- package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
- package/tests/cypress/src/components/CustomersPOM.ts +439 -0
- package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
- package/tests/cypress/src/components/EntityForm.ts +375 -0
- package/tests/cypress/src/components/EntityList.ts +389 -0
- package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
- package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
- package/tests/cypress/src/components/PostsListPOM.ts +223 -0
- package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
- package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
- package/tests/cypress/src/components/TasksPOM.ts +272 -0
- package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
- package/tests/cypress/src/components/index.ts +21 -0
- package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
- package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
- package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
- package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
- package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
- package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
- package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
- package/tests/cypress/src/controllers/index.js +25 -0
- package/tests/cypress/src/core/AuthPOM.ts +450 -0
- package/tests/cypress/src/core/BasePOM.ts +86 -0
- package/tests/cypress/src/core/BlockEditorBasePOM.ts +576 -0
- package/tests/cypress/src/core/DashboardEntityPOM.ts +692 -0
- package/tests/cypress/src/core/index.ts +14 -0
- package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
- package/tests/cypress/src/entities/PagesPOM.ts +137 -0
- package/tests/cypress/src/entities/PostsPOM.ts +137 -0
- package/tests/cypress/src/entities/TasksPOM.ts +176 -0
- package/tests/cypress/src/entities/index.ts +14 -0
- package/tests/cypress/src/features/BillingPOM.ts +385 -0
- package/tests/cypress/src/features/DashboardPOM.ts +245 -0
- package/tests/cypress/src/features/DevtoolsPOM.ts +739 -0
- package/tests/cypress/src/features/PageBuilderPOM.ts +263 -0
- package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
- package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
- package/tests/cypress/src/features/SettingsPOM.ts +362 -0
- package/tests/cypress/src/features/SuperadminPOM.ts +331 -0
- package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
- package/tests/cypress/src/features/index.ts +28 -0
- package/tests/cypress/src/helpers/ApiInterceptor.ts +177 -0
- package/tests/cypress/src/index.ts +101 -0
- package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
- package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
- package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
- package/tests/cypress/src/pages/dashboard/index.js +6 -0
- package/tests/cypress/src/pages/index.js +5 -0
- package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
- package/tests/cypress/src/pages/public/LandingPage.js +69 -0
- package/tests/cypress/src/pages/public/PricingPage.js +33 -0
- package/tests/cypress/src/pages/public/index.js +6 -0
- package/tests/cypress/src/selectors.ts +46 -0
- package/tests/cypress/src/session-helpers.ts +500 -0
- package/tests/cypress/support/doc-commands.ts +260 -0
- package/tests/cypress.config.ts +150 -0
- package/tests/jest/components/post-header.test.tsx +377 -0
- package/tests/jest/config/role-config.test.ts +529 -0
- package/tests/jest/jest.config.ts +81 -0
- package/tests/jest/langchain/COVERAGE.md +372 -0
- package/tests/jest/langchain/guardrails.test.ts +465 -0
- package/tests/jest/langchain/streaming.test.ts +367 -0
- package/tests/jest/langchain/token-tracker.test.ts +455 -0
- package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
- package/tests/jest/langchain/tracer.test.ts +823 -0
- package/tests/jest/user-roles/role-helpers.test.ts +432 -0
- package/tests/jest/validation/categories.test.ts +429 -0
- package/tests/jest/validation/posts.test.ts +546 -0
- 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,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
|
+
}
|