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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (222) hide show
  1. package/package.json +8 -4
  2. package/templates/(public)/page.tsx +1 -1
  3. package/tests/cypress/e2e/_devtools/access.bdd.md +262 -0
  4. package/tests/cypress/e2e/_devtools/access.cy.ts +171 -0
  5. package/tests/cypress/e2e/_devtools/navigation.bdd.md +261 -0
  6. package/tests/cypress/e2e/_devtools/navigation.cy.ts +157 -0
  7. package/tests/cypress/e2e/_devtools/pages.bdd.md +303 -0
  8. package/tests/cypress/e2e/_devtools/pages.cy.ts +184 -0
  9. package/tests/cypress/e2e/_docs/README.md +215 -0
  10. package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin-teams.narration.json +155 -0
  11. package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin.cy.ts +390 -0
  12. package/tests/cypress/e2e/_docs/tutorials/teams-system.doc.cy.ts +349 -0
  13. package/tests/cypress/e2e/_docs/tutorials/teams-system.narration.json +165 -0
  14. package/tests/cypress/e2e/_selectors/auth.cy.ts +306 -0
  15. package/tests/cypress/e2e/_selectors/billing.cy.ts +89 -0
  16. package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +113 -0
  17. package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +89 -0
  18. package/tests/cypress/e2e/_selectors/dashboard-sidebar.cy.ts +60 -0
  19. package/tests/cypress/e2e/_selectors/dashboard-topnav.cy.ts +146 -0
  20. package/tests/cypress/e2e/_selectors/devtools.cy.ts +210 -0
  21. package/tests/cypress/e2e/_selectors/global-search.cy.ts +88 -0
  22. package/tests/cypress/e2e/_selectors/pages-editor.cy.ts +179 -0
  23. package/tests/cypress/e2e/_selectors/posts-editor.cy.ts +282 -0
  24. package/tests/cypress/e2e/_selectors/public.cy.ts +112 -0
  25. package/tests/cypress/e2e/_selectors/settings-api-keys.cy.ts +228 -0
  26. package/tests/cypress/e2e/_selectors/settings-billing.cy.ts +105 -0
  27. package/tests/cypress/e2e/_selectors/settings-layout.cy.ts +119 -0
  28. package/tests/cypress/e2e/_selectors/settings-password.cy.ts +71 -0
  29. package/tests/cypress/e2e/_selectors/settings-profile.cy.ts +82 -0
  30. package/tests/cypress/e2e/_selectors/settings-teams.cy.ts +68 -0
  31. package/tests/cypress/e2e/_selectors/superadmin.cy.ts +185 -0
  32. package/tests/cypress/e2e/_selectors/tasks.cy.ts +242 -0
  33. package/tests/cypress/e2e/_selectors/taxonomies.cy.ts +126 -0
  34. package/tests/cypress/e2e/_selectors/teams.cy.ts +142 -0
  35. package/tests/cypress/e2e/_superadmin/all-teams.bdd.md +261 -0
  36. package/tests/cypress/e2e/_superadmin/all-teams.cy.ts +177 -0
  37. package/tests/cypress/e2e/_superadmin/all-users.bdd.md +406 -0
  38. package/tests/cypress/e2e/_superadmin/all-users.cy.ts +294 -0
  39. package/tests/cypress/e2e/_superadmin/dashboard.bdd.md +235 -0
  40. package/tests/cypress/e2e/_superadmin/dashboard.cy.ts +149 -0
  41. package/tests/cypress/e2e/_superadmin/subscriptions-overview.bdd.md +290 -0
  42. package/tests/cypress/e2e/_superadmin/subscriptions-overview.cy.ts +194 -0
  43. package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
  44. package/tests/cypress/e2e/ai/chat-api.cy.ts +107 -0
  45. package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
  46. package/tests/cypress/e2e/api/billing/BillingAPIController.js +319 -0
  47. package/tests/cypress/e2e/api/billing/check-action.cy.ts +326 -0
  48. package/tests/cypress/e2e/api/billing/checkout.cy.ts +358 -0
  49. package/tests/cypress/e2e/api/billing/lifecycle.cy.ts +423 -0
  50. package/tests/cypress/e2e/api/billing/plans/README.md +345 -0
  51. package/tests/cypress/e2e/api/billing/plans/business.cy.ts +412 -0
  52. package/tests/cypress/e2e/api/billing/plans/downgrade.cy.ts +510 -0
  53. package/tests/cypress/e2e/api/billing/plans/fixtures/billing-plans.json +163 -0
  54. package/tests/cypress/e2e/api/billing/plans/free.cy.ts +500 -0
  55. package/tests/cypress/e2e/api/billing/plans/pro.cy.ts +497 -0
  56. package/tests/cypress/e2e/api/billing/plans/starter.cy.ts +342 -0
  57. package/tests/cypress/e2e/api/billing/portal.cy.ts +313 -0
  58. package/tests/cypress/e2e/api/devtools/registries.bdd.md +300 -0
  59. package/tests/cypress/e2e/api/devtools/registries.cy.ts +368 -0
  60. package/tests/cypress/e2e/api/entities/blocks-scope.cy.ts +396 -0
  61. package/tests/cypress/e2e/api/entities/customers-crud.cy.ts +648 -0
  62. package/tests/cypress/e2e/api/entities/customers-metas.cy.ts +839 -0
  63. package/tests/cypress/e2e/api/entities/pages-crud.cy.ts +425 -0
  64. package/tests/cypress/e2e/api/entities/pages-status.cy.ts +335 -0
  65. package/tests/cypress/e2e/api/entities/post-categories-crud.cy.ts +610 -0
  66. package/tests/cypress/e2e/api/entities/posts-crud.cy.ts +709 -0
  67. package/tests/cypress/e2e/api/entities/posts-status.cy.ts +396 -0
  68. package/tests/cypress/e2e/api/entities/tasks-crud.cy.ts +602 -0
  69. package/tests/cypress/e2e/api/entities/tasks-metas.cy.ts +878 -0
  70. package/tests/cypress/e2e/api/entities/users-crud.cy.ts +469 -0
  71. package/tests/cypress/e2e/api/entities/users-metas.cy.ts +913 -0
  72. package/tests/cypress/e2e/api/entities/users-security.cy.ts +375 -0
  73. package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.bdd.md +375 -0
  74. package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.cy.ts +346 -0
  75. package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.bdd.md +451 -0
  76. package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.cy.ts +447 -0
  77. package/tests/cypress/e2e/api/scheduled-actions/scheduling.bdd.md +649 -0
  78. package/tests/cypress/e2e/api/scheduled-actions/scheduling.cy.ts +333 -0
  79. package/tests/cypress/e2e/api/settings/api-keys.crud.cy.ts +923 -0
  80. package/tests/cypress/e2e/uat/auth/app-roles/developer-login.bdd.md +231 -0
  81. package/tests/cypress/e2e/uat/auth/app-roles/developer-login.cy.ts +144 -0
  82. package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.bdd.md +118 -0
  83. package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.cy.ts +84 -0
  84. package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.bdd.md +288 -0
  85. package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.cy.ts +188 -0
  86. package/tests/cypress/e2e/uat/auth/login-logout.bdd.md +160 -0
  87. package/tests/cypress/e2e/uat/auth/login-logout.cy.ts +116 -0
  88. package/tests/cypress/e2e/uat/auth/password-reset.bdd.md +289 -0
  89. package/tests/cypress/e2e/uat/auth/password-reset.cy.ts +200 -0
  90. package/tests/cypress/e2e/uat/auth/team-roles/admin-login.bdd.md +225 -0
  91. package/tests/cypress/e2e/uat/auth/team-roles/admin-login.cy.ts +148 -0
  92. package/tests/cypress/e2e/uat/auth/team-roles/member-login.bdd.md +251 -0
  93. package/tests/cypress/e2e/uat/auth/team-roles/member-login.cy.ts +163 -0
  94. package/tests/cypress/e2e/uat/auth/team-roles/owner-login.bdd.md +231 -0
  95. package/tests/cypress/e2e/uat/auth/team-roles/owner-login.cy.ts +141 -0
  96. package/tests/cypress/e2e/uat/billing/extended.bdd.md +273 -0
  97. package/tests/cypress/e2e/uat/billing/extended.cy.ts +209 -0
  98. package/tests/cypress/e2e/uat/billing/feature-gates.bdd.md +407 -0
  99. package/tests/cypress/e2e/uat/billing/feature-gates.cy.ts +307 -0
  100. package/tests/cypress/e2e/uat/billing/page.bdd.md +329 -0
  101. package/tests/cypress/e2e/uat/billing/page.cy.ts +250 -0
  102. package/tests/cypress/e2e/uat/billing/status.bdd.md +190 -0
  103. package/tests/cypress/e2e/uat/billing/status.cy.ts +145 -0
  104. package/tests/cypress/e2e/uat/billing/team-switch.bdd.md +156 -0
  105. package/tests/cypress/e2e/uat/billing/team-switch.cy.ts +122 -0
  106. package/tests/cypress/e2e/uat/billing/usage.bdd.md +218 -0
  107. package/tests/cypress/e2e/uat/billing/usage.cy.ts +176 -0
  108. package/tests/cypress/e2e/uat/blocks/hero.bdd.md +124 -0
  109. package/tests/cypress/e2e/uat/blocks/hero.cy.ts +56 -0
  110. package/tests/cypress/e2e/uat/devtools/api-tester.cy.ts +390 -0
  111. package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
  112. package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
  113. package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
  114. package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
  115. package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
  116. package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
  117. package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
  118. package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
  119. package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
  120. package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
  121. package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
  122. package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
  123. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
  124. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
  125. package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
  126. package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
  127. package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
  128. package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
  129. package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
  130. package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
  131. package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
  132. package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
  133. package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
  134. package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
  135. package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
  136. package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
  137. package/tests/cypress/e2e/uat/roles/editor-role.bdd.md +552 -0
  138. package/tests/cypress/e2e/uat/roles/editor-role.cy.ts +210 -0
  139. package/tests/cypress/e2e/uat/roles/member-restrictions.bdd.md +450 -0
  140. package/tests/cypress/e2e/uat/roles/member-restrictions.cy.ts +189 -0
  141. package/tests/cypress/e2e/uat/roles/owner-full-crud.bdd.md +530 -0
  142. package/tests/cypress/e2e/uat/roles/owner-full-crud.cy.ts +247 -0
  143. package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.bdd.md +736 -0
  144. package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.cy.ts +740 -0
  145. package/tests/cypress/e2e/uat/teams/roles-matrix.bdd.md +553 -0
  146. package/tests/cypress/e2e/uat/teams/roles-matrix.cy.ts +185 -0
  147. package/tests/cypress/e2e/uat/teams/switcher.bdd.md +1151 -0
  148. package/tests/cypress/e2e/uat/teams/switcher.cy.ts +497 -0
  149. package/tests/cypress/e2e/uat/teams/team-switcher.md +198 -0
  150. package/tests/cypress/fixtures/blocks.json +218 -0
  151. package/tests/cypress/fixtures/entities.json +78 -0
  152. package/tests/cypress/fixtures/page-builder.json +21 -0
  153. package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
  154. package/tests/cypress/src/components/CustomersPOM.ts +439 -0
  155. package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
  156. package/tests/cypress/src/components/EntityForm.ts +375 -0
  157. package/tests/cypress/src/components/EntityList.ts +389 -0
  158. package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
  159. package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
  160. package/tests/cypress/src/components/PostsListPOM.ts +223 -0
  161. package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
  162. package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
  163. package/tests/cypress/src/components/TasksPOM.ts +272 -0
  164. package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
  165. package/tests/cypress/src/components/index.ts +21 -0
  166. package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
  167. package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
  168. package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
  169. package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
  170. package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
  171. package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
  172. package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
  173. package/tests/cypress/src/controllers/index.js +25 -0
  174. package/tests/cypress/src/core/AuthPOM.ts +450 -0
  175. package/tests/cypress/src/core/BasePOM.ts +86 -0
  176. package/tests/cypress/src/core/BlockEditorBasePOM.ts +576 -0
  177. package/tests/cypress/src/core/DashboardEntityPOM.ts +692 -0
  178. package/tests/cypress/src/core/index.ts +14 -0
  179. package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
  180. package/tests/cypress/src/entities/PagesPOM.ts +137 -0
  181. package/tests/cypress/src/entities/PostsPOM.ts +137 -0
  182. package/tests/cypress/src/entities/TasksPOM.ts +176 -0
  183. package/tests/cypress/src/entities/index.ts +14 -0
  184. package/tests/cypress/src/features/BillingPOM.ts +385 -0
  185. package/tests/cypress/src/features/DashboardPOM.ts +245 -0
  186. package/tests/cypress/src/features/DevtoolsPOM.ts +739 -0
  187. package/tests/cypress/src/features/PageBuilderPOM.ts +263 -0
  188. package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
  189. package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
  190. package/tests/cypress/src/features/SettingsPOM.ts +362 -0
  191. package/tests/cypress/src/features/SuperadminPOM.ts +331 -0
  192. package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
  193. package/tests/cypress/src/features/index.ts +28 -0
  194. package/tests/cypress/src/helpers/ApiInterceptor.ts +177 -0
  195. package/tests/cypress/src/index.ts +101 -0
  196. package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
  197. package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
  198. package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
  199. package/tests/cypress/src/pages/dashboard/index.js +6 -0
  200. package/tests/cypress/src/pages/index.js +5 -0
  201. package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
  202. package/tests/cypress/src/pages/public/LandingPage.js +69 -0
  203. package/tests/cypress/src/pages/public/PricingPage.js +33 -0
  204. package/tests/cypress/src/pages/public/index.js +6 -0
  205. package/tests/cypress/src/selectors.ts +46 -0
  206. package/tests/cypress/src/session-helpers.ts +500 -0
  207. package/tests/cypress/support/doc-commands.ts +260 -0
  208. package/tests/cypress.config.ts +150 -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
  222. package/LICENSE +0 -21
@@ -0,0 +1,432 @@
1
+ # Pages List - Admin UI (Format: BDD/Gherkin - Bilingual)
2
+
3
+ > **Test File:** `pages-list.cy.ts`
4
+ > **Format:** Behavior-Driven Development (BDD) with Given/When/Then
5
+ > **Languages:** English / Spanish (side-by-side)
6
+ > **Total Tests:** 9
7
+
8
+ ---
9
+
10
+ ## Feature: Pages List Management
11
+
12
+ <table>
13
+ <tr>
14
+ <th width="50%">English</th>
15
+ <th width="50%">Español</th>
16
+ </tr>
17
+ <tr>
18
+ <td>
19
+
20
+ As an **Owner**
21
+ I want to **manage pages from the list view**
22
+ So that **I can navigate, search, filter, and delete pages**
23
+
24
+ **Functionality:**
25
+ - Navigate to pages list
26
+ - Navigate to create/edit pages
27
+ - Search pages by title
28
+ - Filter pages by status
29
+ - Delete pages with confirmation
30
+
31
+ </td>
32
+ <td>
33
+
34
+ Como **Owner**
35
+ Quiero **gestionar paginas desde la vista de lista**
36
+ Para **navegar, buscar, filtrar y eliminar paginas**
37
+
38
+ **Funcionalidad:**
39
+ - Navegar a lista de paginas
40
+ - Navegar a crear/editar paginas
41
+ - Buscar paginas por titulo
42
+ - Filtrar paginas por estado
43
+ - Eliminar paginas con confirmacion
44
+
45
+ </td>
46
+ </tr>
47
+ </table>
48
+
49
+ ---
50
+
51
+ ## Navigation
52
+
53
+ ### PB-LIST-001: Should navigate to pages list `@smoke`
54
+
55
+ <table>
56
+ <tr>
57
+ <th width="50%">English</th>
58
+ <th width="50%">Español</th>
59
+ </tr>
60
+ <tr>
61
+ <td>
62
+
63
+ ```gherkin
64
+ Scenario: Navigate to pages list
65
+
66
+ Given I am logged in as Owner
67
+ When I navigate to the pages list
68
+ And the API returns the pages
69
+ Then the list page should be visible
70
+ ```
71
+
72
+ </td>
73
+ <td>
74
+
75
+ ```gherkin
76
+ Scenario: Navegar a lista de paginas
77
+
78
+ Given estoy logueado como Owner
79
+ When navego a la lista de paginas
80
+ And la API retorna las paginas
81
+ Then la pagina de lista deberia estar visible
82
+ ```
83
+
84
+ </td>
85
+ </tr>
86
+ </table>
87
+
88
+ ---
89
+
90
+ ### PB-LIST-002: Should navigate to create page from list
91
+
92
+ <table>
93
+ <tr>
94
+ <th width="50%">English</th>
95
+ <th width="50%">Español</th>
96
+ </tr>
97
+ <tr>
98
+ <td>
99
+
100
+ ```gherkin
101
+ Scenario: Navigate to create page
102
+
103
+ Given I am on the pages list
104
+ When I click the create page button
105
+ Then the URL should include /dashboard/pages/create
106
+ ```
107
+
108
+ </td>
109
+ <td>
110
+
111
+ ```gherkin
112
+ Scenario: Navegar a crear pagina
113
+
114
+ Given estoy en la lista de paginas
115
+ When hago clic en el boton crear pagina
116
+ Then la URL deberia incluir /dashboard/pages/create
117
+ ```
118
+
119
+ </td>
120
+ </tr>
121
+ </table>
122
+
123
+ ---
124
+
125
+ ### PB-LIST-003: Should navigate to edit page from list
126
+
127
+ <table>
128
+ <tr>
129
+ <th width="50%">English</th>
130
+ <th width="50%">Español</th>
131
+ </tr>
132
+ <tr>
133
+ <td>
134
+
135
+ ```gherkin
136
+ Scenario: Navigate to edit page
137
+
138
+ Given I am on the pages list
139
+ And there is at least one page in the list
140
+ When I click the menu trigger for the first row
141
+ And I click "Edit" in the dropdown
142
+ Then the URL should include /edit
143
+ ```
144
+
145
+ </td>
146
+ <td>
147
+
148
+ ```gherkin
149
+ Scenario: Navegar a editar pagina
150
+
151
+ Given estoy en la lista de paginas
152
+ And hay al menos una pagina en la lista
153
+ When hago clic en el menu de la primera fila
154
+ And hago clic en "Editar" en el dropdown
155
+ Then la URL deberia incluir /edit
156
+ ```
157
+
158
+ </td>
159
+ </tr>
160
+ </table>
161
+
162
+ ---
163
+
164
+ ## Search
165
+
166
+ ### PB-LIST-004: Should search pages by title
167
+
168
+ <table>
169
+ <tr>
170
+ <th width="50%">English</th>
171
+ <th width="50%">Español</th>
172
+ </tr>
173
+ <tr>
174
+ <td>
175
+
176
+ ```gherkin
177
+ Scenario: Search pages by title
178
+
179
+ Given I am on the pages list
180
+ When I search for "About"
181
+ And the API returns filtered results
182
+ Then pages matching "About" should be visible
183
+ ```
184
+
185
+ </td>
186
+ <td>
187
+
188
+ ```gherkin
189
+ Scenario: Buscar paginas por titulo
190
+
191
+ Given estoy en la lista de paginas
192
+ When busco "About"
193
+ And la API retorna resultados filtrados
194
+ Then las paginas que coinciden con "About" deberian estar visibles
195
+ ```
196
+
197
+ </td>
198
+ </tr>
199
+ </table>
200
+
201
+ ---
202
+
203
+ ### PB-LIST-005: Should clear search and show all pages
204
+
205
+ <table>
206
+ <tr>
207
+ <th width="50%">English</th>
208
+ <th width="50%">Español</th>
209
+ </tr>
210
+ <tr>
211
+ <td>
212
+
213
+ ```gherkin
214
+ Scenario: Clear search filter
215
+
216
+ Given I am on the pages list
217
+ And I have performed a search
218
+ When I clear the search field
219
+ And the API returns all pages
220
+ Then at least 1 page should be visible
221
+ ```
222
+
223
+ </td>
224
+ <td>
225
+
226
+ ```gherkin
227
+ Scenario: Limpiar filtro de busqueda
228
+
229
+ Given estoy en la lista de paginas
230
+ And he realizado una busqueda
231
+ When limpio el campo de busqueda
232
+ And la API retorna todas las paginas
233
+ Then al menos 1 pagina deberia estar visible
234
+ ```
235
+
236
+ </td>
237
+ </tr>
238
+ </table>
239
+
240
+ ---
241
+
242
+ ## Filters
243
+
244
+ ### PB-LIST-006: Should filter pages by published status `@in-develop`
245
+
246
+ <table>
247
+ <tr>
248
+ <th width="50%">English</th>
249
+ <th width="50%">Español</th>
250
+ </tr>
251
+ <tr>
252
+ <td>
253
+
254
+ ```gherkin
255
+ Scenario: Filter pages by status
256
+
257
+ Given I am on the pages list
258
+ And the status filter exists
259
+ When I click the filter trigger
260
+ And I select a status option
261
+ Then the list should filter by the selected status
262
+ ```
263
+
264
+ **Note:** Test marked @in-develop - status filter UI pending implementation.
265
+
266
+ </td>
267
+ <td>
268
+
269
+ ```gherkin
270
+ Scenario: Filtrar paginas por estado
271
+
272
+ Given estoy en la lista de paginas
273
+ And el filtro de estado existe
274
+ When hago clic en el trigger del filtro
275
+ And selecciono una opcion de estado
276
+ Then la lista deberia filtrarse por el estado seleccionado
277
+ ```
278
+
279
+ **Nota:** Test marcado @in-develop - UI de filtro de estado pendiente de implementar.
280
+
281
+ </td>
282
+ </tr>
283
+ </table>
284
+
285
+ ---
286
+
287
+ ## Delete
288
+
289
+ ### PB-LIST-007: Should show delete confirmation dialog `@in-develop`
290
+
291
+ <table>
292
+ <tr>
293
+ <th width="50%">English</th>
294
+ <th width="50%">Español</th>
295
+ </tr>
296
+ <tr>
297
+ <td>
298
+
299
+ ```gherkin
300
+ Scenario: Show delete confirmation dialog
301
+
302
+ Given I am on the pages list
303
+ And I have created a test page via API
304
+ When I search for the test page
305
+ And I open the row menu
306
+ And I click delete in the dropdown
307
+ Then a confirmation dialog should appear
308
+ When I cancel the deletion
309
+ Then the dialog should close
310
+ ```
311
+
312
+ </td>
313
+ <td>
314
+
315
+ ```gherkin
316
+ Scenario: Mostrar dialogo de confirmacion de eliminacion
317
+
318
+ Given estoy en la lista de paginas
319
+ And he creado una pagina de prueba via API
320
+ When busco la pagina de prueba
321
+ And abro el menu de la fila
322
+ And hago clic en eliminar en el dropdown
323
+ Then deberia aparecer un dialogo de confirmacion
324
+ When cancelo la eliminacion
325
+ Then el dialogo deberia cerrarse
326
+ ```
327
+
328
+ </td>
329
+ </tr>
330
+ </table>
331
+
332
+ ---
333
+
334
+ ### PB-LIST-008: Should delete page after confirmation `@in-develop`
335
+
336
+ <table>
337
+ <tr>
338
+ <th width="50%">English</th>
339
+ <th width="50%">Español</th>
340
+ </tr>
341
+ <tr>
342
+ <td>
343
+
344
+ ```gherkin
345
+ Scenario: Delete page with confirmation
346
+
347
+ Given I am on the pages list
348
+ And I have created a test page via API
349
+ When I search for the test page
350
+ And I open the row menu
351
+ And I click delete in the dropdown
352
+ And I confirm the deletion
353
+ Then the API should process the delete
354
+ And the page should no longer be in the list
355
+ ```
356
+
357
+ </td>
358
+ <td>
359
+
360
+ ```gherkin
361
+ Scenario: Eliminar pagina con confirmacion
362
+
363
+ Given estoy en la lista de paginas
364
+ And he creado una pagina de prueba via API
365
+ When busco la pagina de prueba
366
+ And abro el menu de la fila
367
+ And hago clic en eliminar en el dropdown
368
+ And confirmo la eliminacion
369
+ Then la API deberia procesar la eliminacion
370
+ And la pagina ya no deberia estar en la lista
371
+ ```
372
+
373
+ </td>
374
+ </tr>
375
+ </table>
376
+
377
+ ---
378
+
379
+ ## Empty State
380
+
381
+ ### PB-LIST-009: Should show empty state when no results match search
382
+
383
+ <table>
384
+ <tr>
385
+ <th width="50%">English</th>
386
+ <th width="50%">Español</th>
387
+ </tr>
388
+ <tr>
389
+ <td>
390
+
391
+ ```gherkin
392
+ Scenario: Show empty state for no results
393
+
394
+ Given I am on the pages list
395
+ When I search for "NonExistentPageTitle12345"
396
+ And the API returns no results
397
+ Then an empty state should be shown
398
+ Or a "no results" message should be visible
399
+ ```
400
+
401
+ </td>
402
+ <td>
403
+
404
+ ```gherkin
405
+ Scenario: Mostrar estado vacio sin resultados
406
+
407
+ Given estoy en la lista de paginas
408
+ When busco "NonExistentPageTitle12345"
409
+ And la API retorna sin resultados
410
+ Then deberia mostrarse un estado vacio
411
+ Or un mensaje de "sin resultados" deberia estar visible
412
+ ```
413
+
414
+ </td>
415
+ </tr>
416
+ </table>
417
+
418
+ ---
419
+
420
+ ## Summary / Resumen
421
+
422
+ | Test ID | Block | Description / Descripción | Tags |
423
+ |---------|-------|---------------------------|------|
424
+ | PB-LIST-001 | Navigation | Navigate to list | `@smoke` |
425
+ | PB-LIST-002 | Navigation | Navigate to create | |
426
+ | PB-LIST-003 | Navigation | Navigate to edit | |
427
+ | PB-LIST-004 | Search | Search by title | |
428
+ | PB-LIST-005 | Search | Clear search | |
429
+ | PB-LIST-006 | Filters | Filter by status | `@in-develop` |
430
+ | PB-LIST-007 | Delete | Show confirmation | `@in-develop` |
431
+ | PB-LIST-008 | Delete | Delete with confirm | `@in-develop` |
432
+ | PB-LIST-009 | Empty State | No results message | |
@@ -0,0 +1,273 @@
1
+ /// <reference types="cypress" />
2
+
3
+ /**
4
+ * Pages List - Admin UI Tests
5
+ *
6
+ * Tests for the pages list view in the admin dashboard.
7
+ * Validates navigation, search, filtering, and basic CRUD operations.
8
+ *
9
+ * Tags: @uat, @feat-pages, @admin, @page-builder, @regression
10
+ */
11
+
12
+ import * as allure from 'allure-cypress'
13
+ import { PageBuilderPOM, loginAsOwner } from '../../../../src'
14
+
15
+ describe('Pages List - Admin UI', {
16
+ tags: ['@uat', '@feat-pages', '@admin', '@page-builder', '@regression']
17
+ }, () => {
18
+ beforeEach(() => {
19
+ allure.epic('Page Builder')
20
+ allure.feature('Pages List')
21
+
22
+ // Setup API intercepts BEFORE login and navigation
23
+ PageBuilderPOM.setupApiIntercepts()
24
+ loginAsOwner()
25
+ PageBuilderPOM.visitList()
26
+ PageBuilderPOM.api.waitForList()
27
+ PageBuilderPOM.waitForListLoad()
28
+ })
29
+
30
+ // ============================================================
31
+ // Navigation Tests
32
+ // ============================================================
33
+ describe('Navigation', () => {
34
+ it('PB-LIST-001: Should navigate to pages list', { tags: '@smoke' }, () => {
35
+ allure.story('Navigation')
36
+ allure.severity('critical')
37
+
38
+ PageBuilderPOM.assertListPageVisible()
39
+ cy.log('Successfully navigated to pages list')
40
+ })
41
+
42
+ it('PB-LIST-002: Should navigate to create page from list', () => {
43
+ allure.story('Navigation')
44
+ allure.severity('normal')
45
+
46
+ PageBuilderPOM.clickCreatePage()
47
+ cy.url().should('include', '/dashboard/pages/create')
48
+ cy.log('Navigated to create page')
49
+ })
50
+
51
+ it('PB-LIST-003: Should navigate to edit page from list', () => {
52
+ allure.story('Navigation')
53
+ allure.severity('normal')
54
+
55
+ // Get first page row and extract ID to use menu selector
56
+ cy.get(PageBuilderPOM.listSelectors.rowGeneric).first()
57
+ .invoke('attr', 'data-cy')
58
+ .then((dataCy) => {
59
+ const pageId = dataCy?.replace('pages-row-', '') || ''
60
+
61
+ // Click menu trigger for this specific row
62
+ PageBuilderPOM.openRowMenu(pageId)
63
+
64
+ // Click Edit in dropdown
65
+ cy.get('[role="menuitem"]').contains(/edit/i).click()
66
+
67
+ cy.url().should('include', '/edit')
68
+ cy.log('Navigated to edit page')
69
+ })
70
+ })
71
+ })
72
+
73
+ // ============================================================
74
+ // Search Tests
75
+ // ============================================================
76
+ describe('Search', () => {
77
+ it('PB-LIST-004: Should search pages by title', () => {
78
+ allure.story('Search')
79
+ allure.severity('normal')
80
+
81
+ PageBuilderPOM.searchPages('About')
82
+ PageBuilderPOM.api.waitForList()
83
+
84
+ cy.get(PageBuilderPOM.listSelectors.rowGeneric).should('exist')
85
+ cy.log('Search by title working')
86
+ })
87
+
88
+ it('PB-LIST-005: Should clear search and show all pages', () => {
89
+ allure.story('Search')
90
+ allure.severity('normal')
91
+
92
+ cy.get(PageBuilderPOM.listSelectors.rowGeneric).then(($rows) => {
93
+ const initialCount = $rows.length
94
+
95
+ PageBuilderPOM.searchPages('About')
96
+ PageBuilderPOM.api.waitForList()
97
+
98
+ PageBuilderPOM.clearSearch()
99
+ PageBuilderPOM.api.waitForList()
100
+
101
+ cy.get(PageBuilderPOM.listSelectors.rowGeneric).should('have.length.at.least', 1)
102
+ cy.log('Search cleared, showing pages')
103
+ })
104
+ })
105
+ })
106
+
107
+ // ============================================================
108
+ // Filter Tests
109
+ // ============================================================
110
+ describe('Filters', () => {
111
+ it('PB-LIST-006: Should filter pages by published status', () => {
112
+ allure.story('Filters')
113
+ allure.severity('normal')
114
+
115
+ // Check if filter exists in DOM
116
+ cy.get('body').then(($body) => {
117
+ const filterExists = $body.find(PageBuilderPOM.listSelectors.filterStatus).length > 0
118
+
119
+ if (filterExists) {
120
+ // Click filter trigger
121
+ cy.get(PageBuilderPOM.listSelectors.filterStatus).find('button, [role="combobox"]').first().click()
122
+
123
+ // Wait for options to appear and click first non-all option
124
+ cy.get('[role="listbox"] [role="option"], [role="option"]', { timeout: 5000 })
125
+ .should('have.length.at.least', 1)
126
+ .eq(1).click()
127
+
128
+ PageBuilderPOM.api.waitForList()
129
+ cy.log('Filter by published status applied')
130
+ } else {
131
+ // Filter not available - test passes anyway
132
+ cy.log('Status filter not available in this view - skipping')
133
+ }
134
+ })
135
+ })
136
+ })
137
+
138
+ // ============================================================
139
+ // Delete Tests
140
+ // ============================================================
141
+ describe('Delete', () => {
142
+ it('PB-LIST-007: Should show delete confirmation dialog', () => {
143
+ allure.story('CRUD Operations')
144
+ allure.severity('normal')
145
+
146
+ // Create a test page to delete
147
+ const timestamp = Date.now()
148
+
149
+ cy.request({
150
+ method: 'POST',
151
+ url: '/api/v1/pages',
152
+ headers: {
153
+ 'x-api-key': 'test_api_key_for_testing_purposes_only_not_a_real_secret_key_abc123',
154
+ 'x-team-id': 'team-everpoint-001',
155
+ 'Content-Type': 'application/json'
156
+ },
157
+ body: {
158
+ title: `Delete Test ${timestamp}`,
159
+ slug: `delete-test-${timestamp}`,
160
+ locale: 'en',
161
+ published: false,
162
+ blocks: []
163
+ }
164
+ }).then((response) => {
165
+ const pageId = response.body.data.id
166
+
167
+ PageBuilderPOM.visitList()
168
+ PageBuilderPOM.api.waitForList()
169
+
170
+ PageBuilderPOM.searchPages(`Delete Test ${timestamp}`)
171
+ PageBuilderPOM.api.waitForList()
172
+
173
+ // Open row menu using proper selector
174
+ PageBuilderPOM.openRowMenu(pageId)
175
+
176
+ // Click delete in dropdown
177
+ cy.get('[role="menuitem"].text-destructive, [role="menuitem"]:last-child').click()
178
+
179
+ cy.get(PageBuilderPOM.listSelectors.confirmDelete).should('be.visible')
180
+
181
+ // Cancel delete
182
+ cy.get('[role="dialog"] button').not('.bg-destructive, [variant="destructive"]').first().click()
183
+
184
+ // Cleanup via API
185
+ cy.request({
186
+ method: 'DELETE',
187
+ url: `/api/v1/pages/${pageId}`,
188
+ headers: {
189
+ 'x-api-key': 'test_api_key_for_testing_purposes_only_not_a_real_secret_key_abc123',
190
+ 'x-team-id': 'team-everpoint-001'
191
+ }
192
+ })
193
+
194
+ cy.log('Delete confirmation dialog shown')
195
+ })
196
+ })
197
+
198
+ it('PB-LIST-008: Should delete page after confirmation', () => {
199
+ allure.story('CRUD Operations')
200
+ allure.severity('normal')
201
+
202
+ const timestamp = Date.now()
203
+
204
+ cy.request({
205
+ method: 'POST',
206
+ url: '/api/v1/pages',
207
+ headers: {
208
+ 'x-api-key': 'test_api_key_for_testing_purposes_only_not_a_real_secret_key_abc123',
209
+ 'x-team-id': 'team-everpoint-001',
210
+ 'Content-Type': 'application/json'
211
+ },
212
+ body: {
213
+ title: `To Delete ${timestamp}`,
214
+ slug: `to-delete-${timestamp}`,
215
+ locale: 'en',
216
+ published: false,
217
+ blocks: []
218
+ }
219
+ }).then((response) => {
220
+ const pageId = response.body.data.id
221
+ const pageTitle = `To Delete ${timestamp}`
222
+
223
+ PageBuilderPOM.visitList()
224
+ PageBuilderPOM.api.waitForList()
225
+
226
+ PageBuilderPOM.searchPages(pageTitle)
227
+ PageBuilderPOM.api.waitForList()
228
+
229
+ // Open row menu using proper selector
230
+ PageBuilderPOM.openRowMenu(pageId)
231
+
232
+ // Click delete in dropdown
233
+ cy.get('[role="menuitem"].text-destructive, [role="menuitem"]:last-child').click()
234
+
235
+ // Confirm delete
236
+ cy.get('[role="dialog"] button.bg-destructive, [role="dialog"] button[variant="destructive"]').click()
237
+
238
+ PageBuilderPOM.api.waitForDelete()
239
+
240
+ // Verify page is gone
241
+ PageBuilderPOM.clearSearch()
242
+ PageBuilderPOM.searchPages(pageTitle)
243
+ PageBuilderPOM.api.waitForList()
244
+
245
+ cy.get('body').should('not.contain', pageTitle)
246
+ cy.log('Page deleted successfully')
247
+ })
248
+ })
249
+ })
250
+
251
+ // ============================================================
252
+ // Empty State Tests
253
+ // ============================================================
254
+ describe('Empty State', () => {
255
+ it('PB-LIST-009: Should show empty state when no results match search', () => {
256
+ allure.story('UI States')
257
+ allure.severity('minor')
258
+
259
+ PageBuilderPOM.searchPages('NonExistentPageTitle12345')
260
+ PageBuilderPOM.api.waitForList()
261
+
262
+ cy.get('body').then(($body) => {
263
+ const hasEmptyState = $body.find(PageBuilderPOM.listSelectors.emptyState).length > 0
264
+ const hasNoResults = $body.text().includes('No results') ||
265
+ $body.text().includes('No pages') ||
266
+ $body.text().includes('no encontr')
267
+
268
+ expect(hasEmptyState || hasNoResults).to.be.true
269
+ cy.log('Empty state shown for no matching results')
270
+ })
271
+ })
272
+ })
273
+ })