@nextsparkjs/theme-default 0.1.0-beta.20 → 0.1.0-beta.22
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/support/e2e.ts +89 -0
- package/tests/cypress.config.ts +165 -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,486 @@
|
|
|
1
|
+
/// <reference types="cypress" />
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Block CRUD - Admin UI Tests
|
|
5
|
+
*
|
|
6
|
+
* Tests for adding, editing, duplicating, removing, and reordering
|
|
7
|
+
* blocks within the page editor.
|
|
8
|
+
*
|
|
9
|
+
* Tags: @uat, @feat-pages, @block-crud, @page-builder, @regression
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import * as allure from 'allure-cypress'
|
|
13
|
+
import { PageBuilderPOM, loginAsOwner } from '../../../../src'
|
|
14
|
+
|
|
15
|
+
// Team ID for logged-in user (carlos.mendoza is owner of team-everpoint-001)
|
|
16
|
+
const OWNER_TEAM_ID = 'team-everpoint-001'
|
|
17
|
+
|
|
18
|
+
describe('Block CRUD - Admin UI', {
|
|
19
|
+
tags: ['@uat', '@feat-pages', '@block-crud', '@page-builder', '@regression']
|
|
20
|
+
}, () => {
|
|
21
|
+
let testPageId: string
|
|
22
|
+
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
allure.epic('Page Builder')
|
|
25
|
+
allure.feature('Block CRUD')
|
|
26
|
+
|
|
27
|
+
// Setup API intercepts BEFORE login
|
|
28
|
+
PageBuilderPOM.setupApiIntercepts()
|
|
29
|
+
loginAsOwner()
|
|
30
|
+
|
|
31
|
+
// Visit dashboard first to ensure session cookies are active
|
|
32
|
+
cy.visit('/dashboard', { timeout: 30000 })
|
|
33
|
+
cy.url().should('include', '/dashboard')
|
|
34
|
+
|
|
35
|
+
// Create a test page for each test via session auth
|
|
36
|
+
// x-team-id header is required by API even with session auth
|
|
37
|
+
const timestamp = Date.now()
|
|
38
|
+
cy.request({
|
|
39
|
+
method: 'POST',
|
|
40
|
+
url: '/api/v1/pages',
|
|
41
|
+
headers: {
|
|
42
|
+
'x-team-id': OWNER_TEAM_ID,
|
|
43
|
+
'Content-Type': 'application/json'
|
|
44
|
+
},
|
|
45
|
+
body: {
|
|
46
|
+
title: `Block CRUD Test ${timestamp}`,
|
|
47
|
+
slug: `block-crud-test-${timestamp}`,
|
|
48
|
+
locale: 'en',
|
|
49
|
+
published: false,
|
|
50
|
+
blocks: []
|
|
51
|
+
}
|
|
52
|
+
}).then((response) => {
|
|
53
|
+
testPageId = response.body.data.id
|
|
54
|
+
})
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
afterEach(() => {
|
|
58
|
+
// Cleanup test page
|
|
59
|
+
if (testPageId) {
|
|
60
|
+
cy.request({
|
|
61
|
+
method: 'DELETE',
|
|
62
|
+
url: `/api/v1/pages/${testPageId}`,
|
|
63
|
+
headers: { 'x-team-id': OWNER_TEAM_ID },
|
|
64
|
+
failOnStatusCode: false
|
|
65
|
+
})
|
|
66
|
+
}
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
// ============================================================
|
|
70
|
+
// Add Block Tests
|
|
71
|
+
// ============================================================
|
|
72
|
+
describe('Add Block', () => {
|
|
73
|
+
it('PB-BLOCK-001: Should add Hero block', { tags: '@smoke' }, () => {
|
|
74
|
+
allure.story('Add Block')
|
|
75
|
+
allure.severity('critical')
|
|
76
|
+
|
|
77
|
+
cy.then(() => {
|
|
78
|
+
PageBuilderPOM.visitEdit(testPageId)
|
|
79
|
+
PageBuilderPOM.waitForEditorLoad()
|
|
80
|
+
|
|
81
|
+
// Switch to layout mode (editor defaults to preview mode)
|
|
82
|
+
PageBuilderPOM.switchToLayoutMode()
|
|
83
|
+
|
|
84
|
+
// Initially canvas should be empty
|
|
85
|
+
PageBuilderPOM.assertCanvasEmpty()
|
|
86
|
+
|
|
87
|
+
// Add hero block
|
|
88
|
+
PageBuilderPOM.addBlock('hero')
|
|
89
|
+
|
|
90
|
+
// Verify block was added
|
|
91
|
+
PageBuilderPOM.assertBlockCount(1)
|
|
92
|
+
|
|
93
|
+
cy.log('Hero block added successfully')
|
|
94
|
+
})
|
|
95
|
+
})
|
|
96
|
+
|
|
97
|
+
it('PB-BLOCK-002: Should add Features Grid block', () => {
|
|
98
|
+
allure.story('Add Block')
|
|
99
|
+
allure.severity('normal')
|
|
100
|
+
|
|
101
|
+
cy.then(() => {
|
|
102
|
+
PageBuilderPOM.visitEdit(testPageId)
|
|
103
|
+
PageBuilderPOM.waitForEditorLoad()
|
|
104
|
+
|
|
105
|
+
PageBuilderPOM.switchToLayoutMode()
|
|
106
|
+
PageBuilderPOM.addBlock('features-grid')
|
|
107
|
+
PageBuilderPOM.assertBlockCount(1)
|
|
108
|
+
|
|
109
|
+
cy.log('Features Grid block added')
|
|
110
|
+
})
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
it('PB-BLOCK-003: Should add CTA Section block', () => {
|
|
114
|
+
allure.story('Add Block')
|
|
115
|
+
allure.severity('normal')
|
|
116
|
+
|
|
117
|
+
cy.then(() => {
|
|
118
|
+
PageBuilderPOM.visitEdit(testPageId)
|
|
119
|
+
PageBuilderPOM.waitForEditorLoad()
|
|
120
|
+
|
|
121
|
+
PageBuilderPOM.switchToLayoutMode()
|
|
122
|
+
PageBuilderPOM.addBlock('cta-section')
|
|
123
|
+
PageBuilderPOM.assertBlockCount(1)
|
|
124
|
+
|
|
125
|
+
cy.log('CTA Section block added')
|
|
126
|
+
})
|
|
127
|
+
})
|
|
128
|
+
|
|
129
|
+
it('PB-BLOCK-004: Should add Testimonials block', () => {
|
|
130
|
+
allure.story('Add Block')
|
|
131
|
+
allure.severity('normal')
|
|
132
|
+
|
|
133
|
+
cy.then(() => {
|
|
134
|
+
PageBuilderPOM.visitEdit(testPageId)
|
|
135
|
+
PageBuilderPOM.waitForEditorLoad()
|
|
136
|
+
|
|
137
|
+
PageBuilderPOM.switchToLayoutMode()
|
|
138
|
+
PageBuilderPOM.addBlock('testimonials')
|
|
139
|
+
PageBuilderPOM.assertBlockCount(1)
|
|
140
|
+
|
|
141
|
+
cy.log('Testimonials block added')
|
|
142
|
+
})
|
|
143
|
+
})
|
|
144
|
+
|
|
145
|
+
it('PB-BLOCK-005: Should add Text Content block', () => {
|
|
146
|
+
allure.story('Add Block')
|
|
147
|
+
allure.severity('normal')
|
|
148
|
+
|
|
149
|
+
cy.then(() => {
|
|
150
|
+
PageBuilderPOM.visitEdit(testPageId)
|
|
151
|
+
PageBuilderPOM.waitForEditorLoad()
|
|
152
|
+
|
|
153
|
+
PageBuilderPOM.switchToLayoutMode()
|
|
154
|
+
PageBuilderPOM.addBlock('text-content')
|
|
155
|
+
PageBuilderPOM.assertBlockCount(1)
|
|
156
|
+
|
|
157
|
+
cy.log('Text Content block added')
|
|
158
|
+
})
|
|
159
|
+
})
|
|
160
|
+
|
|
161
|
+
it('PB-BLOCK-006: Should add multiple blocks', { tags: '@smoke' }, () => {
|
|
162
|
+
allure.story('Add Block')
|
|
163
|
+
allure.severity('normal')
|
|
164
|
+
|
|
165
|
+
cy.then(() => {
|
|
166
|
+
PageBuilderPOM.visitEdit(testPageId)
|
|
167
|
+
PageBuilderPOM.waitForEditorLoad()
|
|
168
|
+
|
|
169
|
+
PageBuilderPOM.switchToLayoutMode()
|
|
170
|
+
|
|
171
|
+
// Add multiple blocks
|
|
172
|
+
PageBuilderPOM.addBlock('hero')
|
|
173
|
+
PageBuilderPOM.addBlock('features-grid')
|
|
174
|
+
PageBuilderPOM.addBlock('cta-section')
|
|
175
|
+
|
|
176
|
+
// Verify all blocks added
|
|
177
|
+
PageBuilderPOM.assertBlockCount(3)
|
|
178
|
+
|
|
179
|
+
cy.log('Multiple blocks added successfully')
|
|
180
|
+
})
|
|
181
|
+
})
|
|
182
|
+
})
|
|
183
|
+
|
|
184
|
+
// ============================================================
|
|
185
|
+
// Edit Block Props Tests
|
|
186
|
+
// ============================================================
|
|
187
|
+
describe('Edit Block Props', () => {
|
|
188
|
+
it('PB-BLOCK-007: Should edit block title prop', { tags: '@smoke' }, () => {
|
|
189
|
+
allure.story('Edit Props')
|
|
190
|
+
allure.severity('normal')
|
|
191
|
+
|
|
192
|
+
cy.then(() => {
|
|
193
|
+
PageBuilderPOM.visitEdit(testPageId)
|
|
194
|
+
PageBuilderPOM.waitForEditorLoad()
|
|
195
|
+
|
|
196
|
+
PageBuilderPOM.switchToLayoutMode()
|
|
197
|
+
PageBuilderPOM.addBlock('hero')
|
|
198
|
+
|
|
199
|
+
// Edit title in settings panel
|
|
200
|
+
cy.get(PageBuilderPOM.editorSelectors.fieldInput('title')).then(($field) => {
|
|
201
|
+
if ($field.length > 0) {
|
|
202
|
+
PageBuilderPOM.fillField('title', 'Custom Hero Title')
|
|
203
|
+
|
|
204
|
+
// Save and wait for API
|
|
205
|
+
PageBuilderPOM.savePage()
|
|
206
|
+
PageBuilderPOM.api.waitForUpdate()
|
|
207
|
+
|
|
208
|
+
// Verify via API (session auth with team header)
|
|
209
|
+
cy.request({
|
|
210
|
+
method: 'GET',
|
|
211
|
+
url: `/api/v1/pages/${testPageId}`,
|
|
212
|
+
headers: { 'x-team-id': OWNER_TEAM_ID }
|
|
213
|
+
}).then((response) => {
|
|
214
|
+
const heroBlock = response.body.data.blocks[0]
|
|
215
|
+
expect(heroBlock.props.title).to.eq('Custom Hero Title')
|
|
216
|
+
|
|
217
|
+
cy.log('Block props edited and saved')
|
|
218
|
+
})
|
|
219
|
+
} else {
|
|
220
|
+
cy.log('Title field not found - block may have different field structure')
|
|
221
|
+
}
|
|
222
|
+
})
|
|
223
|
+
})
|
|
224
|
+
})
|
|
225
|
+
})
|
|
226
|
+
|
|
227
|
+
// ============================================================
|
|
228
|
+
// Duplicate Block Tests
|
|
229
|
+
// ============================================================
|
|
230
|
+
describe('Duplicate Block', () => {
|
|
231
|
+
it('PB-BLOCK-008: Should duplicate existing block', () => {
|
|
232
|
+
allure.story('Duplicate Block')
|
|
233
|
+
allure.severity('normal')
|
|
234
|
+
|
|
235
|
+
cy.then(() => {
|
|
236
|
+
PageBuilderPOM.visitEdit(testPageId)
|
|
237
|
+
PageBuilderPOM.waitForEditorLoad()
|
|
238
|
+
|
|
239
|
+
PageBuilderPOM.switchToLayoutMode()
|
|
240
|
+
PageBuilderPOM.addBlock('hero')
|
|
241
|
+
|
|
242
|
+
// Get the block ID
|
|
243
|
+
cy.get(PageBuilderPOM.editorSelectors.sortableBlockGeneric).first()
|
|
244
|
+
.invoke('attr', 'data-cy')
|
|
245
|
+
.then((dataCy) => {
|
|
246
|
+
if (dataCy) {
|
|
247
|
+
const blockId = dataCy.replace('sortable-block-', '')
|
|
248
|
+
|
|
249
|
+
// Duplicate the block
|
|
250
|
+
PageBuilderPOM.duplicateBlock(blockId)
|
|
251
|
+
|
|
252
|
+
// Verify we now have 2 blocks
|
|
253
|
+
PageBuilderPOM.assertBlockCount(2)
|
|
254
|
+
|
|
255
|
+
cy.log('Block duplicated successfully')
|
|
256
|
+
}
|
|
257
|
+
})
|
|
258
|
+
})
|
|
259
|
+
})
|
|
260
|
+
})
|
|
261
|
+
|
|
262
|
+
// ============================================================
|
|
263
|
+
// Remove Block Tests
|
|
264
|
+
// ============================================================
|
|
265
|
+
describe('Remove Block', () => {
|
|
266
|
+
it('PB-BLOCK-009: Should remove block from canvas', { tags: '@smoke' }, () => {
|
|
267
|
+
allure.story('Remove Block')
|
|
268
|
+
allure.severity('normal')
|
|
269
|
+
|
|
270
|
+
cy.then(() => {
|
|
271
|
+
PageBuilderPOM.visitEdit(testPageId)
|
|
272
|
+
PageBuilderPOM.waitForEditorLoad()
|
|
273
|
+
|
|
274
|
+
PageBuilderPOM.switchToLayoutMode()
|
|
275
|
+
PageBuilderPOM.addBlock('hero')
|
|
276
|
+
|
|
277
|
+
// Verify block exists
|
|
278
|
+
PageBuilderPOM.assertBlockCount(1)
|
|
279
|
+
|
|
280
|
+
// Get block ID and remove
|
|
281
|
+
cy.get(PageBuilderPOM.editorSelectors.sortableBlockGeneric).first()
|
|
282
|
+
.invoke('attr', 'data-cy')
|
|
283
|
+
.then((dataCy) => {
|
|
284
|
+
if (dataCy) {
|
|
285
|
+
const blockId = dataCy.replace('sortable-block-', '')
|
|
286
|
+
|
|
287
|
+
PageBuilderPOM.removeBlock(blockId)
|
|
288
|
+
|
|
289
|
+
// Verify block removed
|
|
290
|
+
PageBuilderPOM.assertCanvasEmpty()
|
|
291
|
+
|
|
292
|
+
cy.log('Block removed successfully')
|
|
293
|
+
}
|
|
294
|
+
})
|
|
295
|
+
})
|
|
296
|
+
})
|
|
297
|
+
})
|
|
298
|
+
|
|
299
|
+
// ============================================================
|
|
300
|
+
// Reorder Block Tests - Edit Mode (Drag & Drop)
|
|
301
|
+
// ============================================================
|
|
302
|
+
describe('Reorder Blocks - Edit Mode', () => {
|
|
303
|
+
it('PB-BLOCK-010: Should reorder blocks with drag and drop', () => {
|
|
304
|
+
allure.story('Reorder Blocks')
|
|
305
|
+
allure.severity('normal')
|
|
306
|
+
|
|
307
|
+
cy.then(() => {
|
|
308
|
+
PageBuilderPOM.visitEdit(testPageId)
|
|
309
|
+
PageBuilderPOM.waitForEditorLoad()
|
|
310
|
+
|
|
311
|
+
PageBuilderPOM.switchToLayoutMode()
|
|
312
|
+
|
|
313
|
+
// Add multiple blocks
|
|
314
|
+
PageBuilderPOM.addBlock('hero')
|
|
315
|
+
PageBuilderPOM.addBlock('cta-section')
|
|
316
|
+
|
|
317
|
+
// Get first block slug before reorder
|
|
318
|
+
cy.get(PageBuilderPOM.editorSelectors.sortableBlockGeneric).first()
|
|
319
|
+
.should('contain.text', 'hero')
|
|
320
|
+
|
|
321
|
+
// Note: Actual drag and drop testing requires special handling
|
|
322
|
+
// This test validates the structure for drag and drop
|
|
323
|
+
cy.get(PageBuilderPOM.editorSelectors.sortableBlockGeneric)
|
|
324
|
+
.should('have.length', 2)
|
|
325
|
+
|
|
326
|
+
cy.log('Blocks ready for drag and drop reordering')
|
|
327
|
+
})
|
|
328
|
+
})
|
|
329
|
+
})
|
|
330
|
+
|
|
331
|
+
// ============================================================
|
|
332
|
+
// Reorder Block Tests - Preview Mode (Buttons)
|
|
333
|
+
// ============================================================
|
|
334
|
+
describe('Reorder Blocks - Preview Mode', () => {
|
|
335
|
+
it('PB-BLOCK-011: Should reorder blocks with move buttons in Preview mode', () => {
|
|
336
|
+
allure.story('Reorder Blocks')
|
|
337
|
+
allure.severity('normal')
|
|
338
|
+
|
|
339
|
+
cy.then(() => {
|
|
340
|
+
PageBuilderPOM.visitEdit(testPageId)
|
|
341
|
+
PageBuilderPOM.waitForEditorLoad()
|
|
342
|
+
|
|
343
|
+
// Switch to layout mode first to add blocks
|
|
344
|
+
PageBuilderPOM.switchToLayoutMode()
|
|
345
|
+
|
|
346
|
+
// Add multiple blocks
|
|
347
|
+
PageBuilderPOM.addBlock('hero')
|
|
348
|
+
PageBuilderPOM.addBlock('cta-section')
|
|
349
|
+
|
|
350
|
+
// Switch to preview mode
|
|
351
|
+
PageBuilderPOM.switchToPreviewMode()
|
|
352
|
+
|
|
353
|
+
// Get first block and try to move down
|
|
354
|
+
cy.get(PageBuilderPOM.editorSelectors.previewBlockGeneric).first()
|
|
355
|
+
.invoke('attr', 'data-cy')
|
|
356
|
+
.then((dataCy) => {
|
|
357
|
+
if (dataCy) {
|
|
358
|
+
const blockId = dataCy.replace('preview-block-', '')
|
|
359
|
+
|
|
360
|
+
// Hover to show controls
|
|
361
|
+
cy.get(PageBuilderPOM.editorSelectors.previewBlock(blockId)).trigger('mouseenter')
|
|
362
|
+
|
|
363
|
+
// Click move down
|
|
364
|
+
cy.get(PageBuilderPOM.editorSelectors.moveDownBtn(blockId)).then(($btn) => {
|
|
365
|
+
if ($btn.length > 0 && !$btn.is(':disabled')) {
|
|
366
|
+
PageBuilderPOM.moveBlockDown(blockId)
|
|
367
|
+
|
|
368
|
+
cy.log('Block moved down in Preview mode')
|
|
369
|
+
} else {
|
|
370
|
+
cy.log('Move button not available or disabled')
|
|
371
|
+
}
|
|
372
|
+
})
|
|
373
|
+
}
|
|
374
|
+
})
|
|
375
|
+
})
|
|
376
|
+
})
|
|
377
|
+
|
|
378
|
+
it('PB-BLOCK-012: Should disable move up for first block', () => {
|
|
379
|
+
allure.story('Reorder Blocks')
|
|
380
|
+
allure.severity('minor')
|
|
381
|
+
|
|
382
|
+
cy.then(() => {
|
|
383
|
+
PageBuilderPOM.visitEdit(testPageId)
|
|
384
|
+
PageBuilderPOM.waitForEditorLoad()
|
|
385
|
+
|
|
386
|
+
// Switch to layout mode first to add blocks
|
|
387
|
+
PageBuilderPOM.switchToLayoutMode()
|
|
388
|
+
|
|
389
|
+
// Add blocks
|
|
390
|
+
PageBuilderPOM.addBlock('hero')
|
|
391
|
+
PageBuilderPOM.addBlock('cta-section')
|
|
392
|
+
|
|
393
|
+
// Switch to preview mode
|
|
394
|
+
PageBuilderPOM.switchToPreviewMode()
|
|
395
|
+
|
|
396
|
+
// Get first block
|
|
397
|
+
cy.get(PageBuilderPOM.editorSelectors.previewBlockGeneric).first()
|
|
398
|
+
.invoke('attr', 'data-cy')
|
|
399
|
+
.then((dataCy) => {
|
|
400
|
+
if (dataCy) {
|
|
401
|
+
const blockId = dataCy.replace('preview-block-', '')
|
|
402
|
+
|
|
403
|
+
// Hover to show controls
|
|
404
|
+
cy.get(PageBuilderPOM.editorSelectors.previewBlock(blockId)).trigger('mouseenter')
|
|
405
|
+
|
|
406
|
+
// Move up should be disabled for first block
|
|
407
|
+
cy.get(PageBuilderPOM.editorSelectors.moveUpBtn(blockId)).should('be.disabled')
|
|
408
|
+
|
|
409
|
+
cy.log('Move up correctly disabled for first block')
|
|
410
|
+
}
|
|
411
|
+
})
|
|
412
|
+
})
|
|
413
|
+
})
|
|
414
|
+
})
|
|
415
|
+
|
|
416
|
+
// ============================================================
|
|
417
|
+
// Reset Props Tests
|
|
418
|
+
// ============================================================
|
|
419
|
+
describe('Reset Block Props', () => {
|
|
420
|
+
it('PB-BLOCK-013: Should reset block props to defaults', () => {
|
|
421
|
+
allure.story('Reset Props')
|
|
422
|
+
allure.severity('minor')
|
|
423
|
+
|
|
424
|
+
cy.then(() => {
|
|
425
|
+
PageBuilderPOM.visitEdit(testPageId)
|
|
426
|
+
PageBuilderPOM.waitForEditorLoad()
|
|
427
|
+
|
|
428
|
+
PageBuilderPOM.switchToLayoutMode()
|
|
429
|
+
PageBuilderPOM.addBlock('hero')
|
|
430
|
+
|
|
431
|
+
// Modify a field
|
|
432
|
+
cy.get(PageBuilderPOM.editorSelectors.fieldInput('title')).then(($field) => {
|
|
433
|
+
if ($field.length > 0) {
|
|
434
|
+
PageBuilderPOM.fillField('title', 'Modified Title')
|
|
435
|
+
|
|
436
|
+
// Reset props
|
|
437
|
+
cy.get(PageBuilderPOM.editorSelectors.resetPropsBtn).then(($btn) => {
|
|
438
|
+
if ($btn.length > 0) {
|
|
439
|
+
PageBuilderPOM.resetBlockProps()
|
|
440
|
+
|
|
441
|
+
cy.log('Block props reset to defaults')
|
|
442
|
+
} else {
|
|
443
|
+
cy.log('Reset button not available')
|
|
444
|
+
}
|
|
445
|
+
})
|
|
446
|
+
}
|
|
447
|
+
})
|
|
448
|
+
})
|
|
449
|
+
})
|
|
450
|
+
})
|
|
451
|
+
|
|
452
|
+
// ============================================================
|
|
453
|
+
// Array Field Tests
|
|
454
|
+
// ============================================================
|
|
455
|
+
describe('Array Fields', () => {
|
|
456
|
+
it('PB-BLOCK-014: Should add items to array field', () => {
|
|
457
|
+
allure.story('Array Fields')
|
|
458
|
+
allure.severity('normal')
|
|
459
|
+
|
|
460
|
+
cy.then(() => {
|
|
461
|
+
PageBuilderPOM.visitEdit(testPageId)
|
|
462
|
+
PageBuilderPOM.waitForEditorLoad()
|
|
463
|
+
|
|
464
|
+
PageBuilderPOM.switchToLayoutMode()
|
|
465
|
+
|
|
466
|
+
// Add features-grid block (has array field)
|
|
467
|
+
PageBuilderPOM.addBlock('features-grid')
|
|
468
|
+
|
|
469
|
+
// Look for array add button
|
|
470
|
+
cy.get('[data-cy*="add-item"]').then(($btn) => {
|
|
471
|
+
if ($btn.length > 0) {
|
|
472
|
+
// Add an item
|
|
473
|
+
cy.get('[data-cy*="add-item"]').first().click()
|
|
474
|
+
|
|
475
|
+
// Verify item was added
|
|
476
|
+
cy.get('[data-cy*="item-"]').should('have.length.at.least', 1)
|
|
477
|
+
|
|
478
|
+
cy.log('Array item added successfully')
|
|
479
|
+
} else {
|
|
480
|
+
cy.log('Array add button not found - checking alternative selectors')
|
|
481
|
+
}
|
|
482
|
+
})
|
|
483
|
+
})
|
|
484
|
+
})
|
|
485
|
+
})
|
|
486
|
+
})
|