@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.
Files changed (221) 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/support/e2e.ts +89 -0
  208. package/tests/cypress.config.ts +165 -0
  209. package/tests/jest/components/post-header.test.tsx +377 -0
  210. package/tests/jest/config/role-config.test.ts +529 -0
  211. package/tests/jest/jest.config.ts +81 -0
  212. package/tests/jest/langchain/COVERAGE.md +372 -0
  213. package/tests/jest/langchain/guardrails.test.ts +465 -0
  214. package/tests/jest/langchain/streaming.test.ts +367 -0
  215. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  216. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  217. package/tests/jest/langchain/tracer.test.ts +823 -0
  218. package/tests/jest/user-roles/role-helpers.test.ts +432 -0
  219. package/tests/jest/validation/categories.test.ts +429 -0
  220. package/tests/jest/validation/posts.test.ts +546 -0
  221. 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
+ })