@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,210 @@
1
+ /// <reference types="cypress" />
2
+
3
+ /**
4
+ * Editor Role - Permission Restrictions
5
+ *
6
+ * Tests for the custom "editor" role (hierarchy level 5).
7
+ * Editor has limited permissions:
8
+ * - customers: list, read only (no create/update/delete)
9
+ * - Cannot access Superadmin (superadmin only)
10
+ * - Cannot access Dev Zone (restricted zone)
11
+ *
12
+ * Test user: Diego Ramírez (diego.ramirez@nextspark.dev) - Everpoint Labs
13
+ */
14
+
15
+ import * as allure from 'allure-cypress'
16
+
17
+ import { CustomersPOM } from '../../../src/entities/CustomersPOM'
18
+ import { loginAsDefaultEditor } from '../../../src/session-helpers'
19
+
20
+ describe('Editor Role - Permission Restrictions', {
21
+ tags: ['@uat', '@feat-teams', '@security', '@role-editor', '@regression']
22
+ }, () => {
23
+ const customers = CustomersPOM.create()
24
+
25
+ beforeEach(() => {
26
+ allure.epic('UAT')
27
+ allure.feature('Permissions')
28
+ allure.story('Editor Role Restrictions')
29
+ customers.setupApiIntercepts()
30
+ loginAsDefaultEditor()
31
+ })
32
+
33
+ describe('UI Restrictions - Buttons Hidden', { tags: '@smoke' }, () => {
34
+ it('EDIT_ROLE_001: Editor can view customers list', { tags: '@smoke' }, () => {
35
+ allure.severity('critical')
36
+
37
+ customers.visitList()
38
+ customers.api.waitForList()
39
+ customers.waitForList()
40
+
41
+ // Editor should see the customers table
42
+ cy.get(customers.selectors.table).should('be.visible')
43
+
44
+ cy.log('✅ Editor can view customers list')
45
+ })
46
+
47
+ it('EDIT_ROLE_002: Create Customer button not visible for Editor', { tags: '@smoke' }, () => {
48
+ allure.severity('critical')
49
+
50
+ customers.visitList()
51
+ customers.api.waitForList()
52
+ customers.waitForList()
53
+
54
+ // Create button should NOT exist for Editor (no create permission)
55
+ cy.get(customers.selectors.addButton).should('not.exist')
56
+
57
+ cy.log('✅ Create button correctly hidden for Editor')
58
+ })
59
+
60
+ it('EDIT_ROLE_003: Edit/Delete buttons not visible for Editor', () => {
61
+ allure.severity('critical')
62
+
63
+ customers.visitList()
64
+ customers.api.waitForList()
65
+ customers.waitForList()
66
+
67
+ cy.get('body').then($body => {
68
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
69
+ // Edit action buttons should NOT exist for Editor
70
+ cy.get(customers.selectors.rowActionEditGeneric).should('not.exist')
71
+
72
+ // Delete action buttons should NOT exist for Editor
73
+ cy.get(customers.selectors.rowActionDeleteGeneric).should('not.exist')
74
+
75
+ cy.log('✅ Edit/Delete buttons correctly hidden for Editor')
76
+ } else {
77
+ cy.log('⚠️ No customers to check edit/delete permissions')
78
+ }
79
+ })
80
+ })
81
+
82
+ it('EDIT_ROLE_004: Editor has no row actions menu (no edit/delete permissions)', () => {
83
+ customers.visitList()
84
+ customers.api.waitForList()
85
+ customers.waitForList()
86
+
87
+ cy.get('body').then($body => {
88
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
89
+ // Row actions menu should NOT exist for Editor
90
+ // EntityList only shows actions menu if user has canUpdate or canDelete
91
+ // Editor has neither, so the menu trigger should not exist
92
+ cy.get('[data-cy^="customers-actions-"]').should('not.exist')
93
+
94
+ cy.log('✅ Row actions menu correctly hidden for Editor (no edit/delete permissions)')
95
+ } else {
96
+ cy.log('⚠️ No customers to check row actions')
97
+ }
98
+ })
99
+ })
100
+ })
101
+
102
+ describe('URL Access Restrictions - Permission Denied', () => {
103
+ it('EDIT_ROLE_005: Direct URL to /customers/create shows Permission Denied', () => {
104
+ allure.severity('critical')
105
+
106
+ cy.visit(`/dashboard/${customers.entitySlug}/create`)
107
+
108
+ // Check for permission denied component OR redirect
109
+ cy.get('body').then($body => {
110
+ if ($body.find('[data-cy="permission-denied"]').length > 0) {
111
+ cy.get('[data-cy="permission-denied"]').should('be.visible')
112
+ cy.log('✅ Permission Denied component shown for /create')
113
+ } else {
114
+ // App redirects to permission-denied page
115
+ cy.url().should('include', 'permission-denied')
116
+ cy.log('✅ Redirected to permission denied page')
117
+ }
118
+ })
119
+ })
120
+
121
+ it('EDIT_ROLE_006: Direct URL to /customers/[id]/edit shows Permission Denied', () => {
122
+ allure.severity('critical')
123
+
124
+ customers.visitList()
125
+ customers.api.waitForList()
126
+
127
+ cy.get('body').then($body => {
128
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
129
+ // Extract customer ID from first row
130
+ cy.get(customers.selectors.rowGeneric).first()
131
+ .invoke('attr', 'data-cy')
132
+ .then((dataCy) => {
133
+ const customerId = dataCy?.replace(`${customers.entitySlug}-row-`, '')
134
+
135
+ if (customerId) {
136
+ // Try to access edit URL directly
137
+ cy.visit(`/dashboard/${customers.entitySlug}/${customerId}/edit`)
138
+
139
+ // Should show permission denied or redirect
140
+ cy.get('body').then($body2 => {
141
+ if ($body2.find('[data-cy="permission-denied"]').length > 0) {
142
+ cy.get('[data-cy="permission-denied"]').should('be.visible')
143
+ cy.log('✅ Permission Denied shown for /edit')
144
+ } else {
145
+ cy.url().should('not.include', '/edit')
146
+ cy.log('✅ Redirected away from /edit (no permission)')
147
+ }
148
+ })
149
+ }
150
+ })
151
+ } else {
152
+ cy.log('⚠️ No customers to test edit URL restriction')
153
+ }
154
+ })
155
+ })
156
+ })
157
+
158
+ describe('Restricted Zones - Access Denied', () => {
159
+ it('EDIT_ROLE_007: Editor cannot access Superadmin', () => {
160
+ allure.severity('blocker')
161
+
162
+ cy.visit('/superadmin', { failOnStatusCode: false })
163
+
164
+ // Should be redirected to dashboard with access_denied error
165
+ cy.url().should('include', '/dashboard')
166
+ cy.url().should('include', 'error=access_denied')
167
+
168
+ cy.log('✅ Editor correctly blocked from Superadmin')
169
+ })
170
+
171
+ it('EDIT_ROLE_008: Editor cannot access Dev Zone', () => {
172
+ allure.severity('blocker')
173
+
174
+ cy.visit('/devtools', { failOnStatusCode: false })
175
+
176
+ // Should be redirected to dashboard with access_denied error
177
+ cy.url().should('include', '/dashboard')
178
+ cy.url().should('include', 'error=access_denied')
179
+
180
+ cy.log('✅ Editor correctly blocked from Dev Zone')
181
+ })
182
+
183
+ it('EDIT_ROLE_009: Editor UI does not show Superadmin button', () => {
184
+ allure.severity('critical')
185
+
186
+ cy.visit('/dashboard')
187
+
188
+ // Superadmin button should NOT exist in toolbar/header for Editor
189
+ cy.get('[data-cy="sector7-button"]').should('not.exist')
190
+ cy.get('[data-cy="admin-toolbar"]').should('not.exist')
191
+
192
+ cy.log('✅ Superadmin button not visible for Editor')
193
+ })
194
+
195
+ it('EDIT_ROLE_010: Editor UI does not show Dev Zone button', () => {
196
+ allure.severity('critical')
197
+
198
+ cy.visit('/dashboard')
199
+
200
+ // Dev Zone button should NOT exist for Editor
201
+ cy.get('[data-cy="dev-zone-button"]').should('not.exist')
202
+
203
+ cy.log('✅ Dev Zone button not visible for Editor')
204
+ })
205
+ })
206
+
207
+ after(() => {
208
+ cy.log('✅ Editor role restriction tests completed')
209
+ })
210
+ })
@@ -0,0 +1,450 @@
1
+ # Member Role - Permission Restrictions (Format: BDD/Gherkin - Bilingual)
2
+
3
+ > **Test File:** `member-restrictions.cy.ts`
4
+ > **Format:** Behavior-Driven Development (BDD) with Given/When/Then
5
+ > **Languages:** English / Spanish (side-by-side)
6
+ > **Total Tests:** 8
7
+
8
+ ---
9
+
10
+ ## Feature: Member Role Permission Restrictions
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 a **Member**
21
+ I want to **be restricted from unauthorized actions**
22
+ So that **the system enforces proper role-based access control**
23
+
24
+ **Security Focus:** These tests validate that UI buttons are hidden and direct URL access is blocked for unauthorized operations.
25
+
26
+ </td>
27
+ <td>
28
+
29
+ Como **Member**
30
+ Quiero **estar restringido de acciones no autorizadas**
31
+ Para que **el sistema aplique control de acceso basado en roles**
32
+
33
+ **Enfoque de Seguridad:** Estos tests validan que los botones UI estan ocultos y el acceso directo por URL esta bloqueado para operaciones no autorizadas.
34
+
35
+ </td>
36
+ </tr>
37
+ </table>
38
+
39
+ ### Background
40
+
41
+ <table>
42
+ <tr>
43
+ <th width="50%">English</th>
44
+ <th width="50%">Español</th>
45
+ </tr>
46
+ <tr>
47
+ <td>
48
+
49
+ ```gherkin
50
+ Given I am logged in as Member (member@nextspark.dev)
51
+ And the API intercepts are set up
52
+ And the application is running
53
+ ```
54
+
55
+ </td>
56
+ <td>
57
+
58
+ ```gherkin
59
+ Given estoy logueado como Member (member@nextspark.dev)
60
+ And los intercepts de API estan configurados
61
+ And la aplicacion esta corriendo
62
+ ```
63
+
64
+ </td>
65
+ </tr>
66
+ </table>
67
+
68
+ ---
69
+
70
+ ## UI Restrictions - Buttons Hidden/Disabled `@smoke`
71
+
72
+ ### PERM_UI_001: Create Customer button not visible for Member `@smoke`
73
+
74
+ <table>
75
+ <tr>
76
+ <th width="50%">English</th>
77
+ <th width="50%">Español</th>
78
+ </tr>
79
+ <tr>
80
+ <td>
81
+
82
+ ```gherkin
83
+ Scenario: Create button is hidden for Member role
84
+
85
+ Given I am logged in as a Member
86
+ When I navigate to the Customers list page
87
+ And the customer list loads successfully
88
+ Then the "Add" button should NOT exist
89
+ And there should be no way to access the create form
90
+ ```
91
+
92
+ **Security Verification:**
93
+ The create button must be completely absent from the DOM.
94
+
95
+ </td>
96
+ <td>
97
+
98
+ ```gherkin
99
+ Scenario: Boton crear esta oculto para rol Member
100
+
101
+ Given estoy logueado como Member
102
+ When navego a la pagina de lista de Clientes
103
+ And la lista de clientes carga exitosamente
104
+ Then el boton "Agregar" NO deberia existir
105
+ And no deberia haber forma de acceder al formulario de creacion
106
+ ```
107
+
108
+ **Verificacion de Seguridad:**
109
+ El boton crear debe estar completamente ausente del DOM.
110
+
111
+ </td>
112
+ </tr>
113
+ </table>
114
+
115
+ ---
116
+
117
+ ### PERM_UI_002: Delete Customer buttons not visible for Member
118
+
119
+ <table>
120
+ <tr>
121
+ <th width="50%">English</th>
122
+ <th width="50%">Español</th>
123
+ </tr>
124
+ <tr>
125
+ <td>
126
+
127
+ ```gherkin
128
+ Scenario: Delete buttons are hidden in list view
129
+
130
+ Given I am logged in as a Member
131
+ When I navigate to the Customers list page
132
+ And the customer list loads successfully
133
+ And there are customers in the list
134
+ Then delete action buttons should NOT exist in table rows
135
+ ```
136
+
137
+ </td>
138
+ <td>
139
+
140
+ ```gherkin
141
+ Scenario: Botones eliminar estan ocultos en vista de lista
142
+
143
+ Given estoy logueado como Member
144
+ When navego a la pagina de lista de Clientes
145
+ And la lista de clientes carga exitosamente
146
+ And hay clientes en la lista
147
+ Then los botones de accion eliminar NO deberian existir en las filas
148
+ ```
149
+
150
+ </td>
151
+ </tr>
152
+ </table>
153
+
154
+ ---
155
+
156
+ ### PERM_UI_003: Edit Customer buttons not visible for Member
157
+
158
+ <table>
159
+ <tr>
160
+ <th width="50%">English</th>
161
+ <th width="50%">Español</th>
162
+ </tr>
163
+ <tr>
164
+ <td>
165
+
166
+ ```gherkin
167
+ Scenario: Edit buttons are hidden in list view
168
+
169
+ Given I am logged in as a Member
170
+ When I navigate to the Customers list page
171
+ And the customer list loads successfully
172
+ And there are customers in the list
173
+ Then edit action buttons should NOT exist in table rows
174
+ ```
175
+
176
+ **Note:** Based on real system behavior, Member CANNOT edit customers.
177
+
178
+ </td>
179
+ <td>
180
+
181
+ ```gherkin
182
+ Scenario: Botones editar estan ocultos en vista de lista
183
+
184
+ Given estoy logueado como Member
185
+ When navego a la pagina de lista de Clientes
186
+ And la lista de clientes carga exitosamente
187
+ And hay clientes en la lista
188
+ Then los botones de accion editar NO deberian existir en las filas
189
+ ```
190
+
191
+ **Nota:** Basado en el comportamiento real del sistema, Member NO puede editar clientes.
192
+
193
+ </td>
194
+ </tr>
195
+ </table>
196
+
197
+ ---
198
+
199
+ ## URL Access Restrictions - Permission Denied Component
200
+
201
+ ### PERM_URL_001: Direct URL to /customers/create shows Permission Denied
202
+
203
+ <table>
204
+ <tr>
205
+ <th width="50%">English</th>
206
+ <th width="50%">Español</th>
207
+ </tr>
208
+ <tr>
209
+ <td>
210
+
211
+ ```gherkin
212
+ Scenario: Direct URL access to create is blocked
213
+
214
+ Given I am logged in as a Member
215
+ When I navigate directly to /dashboard/customers/create
216
+ Then I should see a "Permission Denied" component
217
+ Or I should be redirected to a permission-denied page
218
+ ```
219
+
220
+ **Verification:**
221
+ Either `[data-cy="permission-denied"]` is visible or URL contains "permission-denied".
222
+
223
+ </td>
224
+ <td>
225
+
226
+ ```gherkin
227
+ Scenario: Acceso directo por URL a crear esta bloqueado
228
+
229
+ Given estoy logueado como Member
230
+ When navego directamente a /dashboard/customers/create
231
+ Then deberia ver un componente de "Permiso Denegado"
232
+ Or deberia ser redirigido a una pagina de permiso-denegado
233
+ ```
234
+
235
+ **Verificacion:**
236
+ O bien `[data-cy="permission-denied"]` es visible o la URL contiene "permission-denied".
237
+
238
+ </td>
239
+ </tr>
240
+ </table>
241
+
242
+ ---
243
+
244
+ ### PERM_URL_002: Delete button not visible on customer detail for Member
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: Delete button hidden on detail page
256
+
257
+ Given I am logged in as a Member
258
+ And there is at least one customer in the list
259
+ When I click on a customer row to view details
260
+ Then I should navigate to the customer detail page
261
+ And the "Delete" button should NOT exist
262
+ ```
263
+
264
+ **Note:** The /delete URL route doesn't exist - delete is done from detail page.
265
+
266
+ </td>
267
+ <td>
268
+
269
+ ```gherkin
270
+ Scenario: Boton eliminar oculto en pagina de detalle
271
+
272
+ Given estoy logueado como Member
273
+ And existe al menos un cliente en la lista
274
+ When hago clic en una fila de cliente para ver detalles
275
+ Then deberia navegar a la pagina de detalle del cliente
276
+ And el boton "Eliminar" NO deberia existir
277
+ ```
278
+
279
+ **Nota:** La ruta URL /delete no existe - eliminar se hace desde la pagina de detalle.
280
+
281
+ </td>
282
+ </tr>
283
+ </table>
284
+
285
+ ---
286
+
287
+ ### PERM_URL_003: Direct URL to /customers/[id]/edit shows Permission Denied
288
+
289
+ <table>
290
+ <tr>
291
+ <th width="50%">English</th>
292
+ <th width="50%">Español</th>
293
+ </tr>
294
+ <tr>
295
+ <td>
296
+
297
+ ```gherkin
298
+ Scenario: Direct URL access to edit is blocked
299
+
300
+ Given I am logged in as a Member
301
+ And there is at least one customer in the list
302
+ When I extract a customer ID from the list
303
+ And I navigate directly to /dashboard/customers/{id}/edit
304
+ Then I should see a "Permission Denied" component
305
+ Or I should be redirected away from /edit
306
+ ```
307
+
308
+ </td>
309
+ <td>
310
+
311
+ ```gherkin
312
+ Scenario: Acceso directo por URL a editar esta bloqueado
313
+
314
+ Given estoy logueado como Member
315
+ And existe al menos un cliente en la lista
316
+ When extraigo un ID de cliente de la lista
317
+ And navego directamente a /dashboard/customers/{id}/edit
318
+ Then deberia ver un componente de "Permiso Denegado"
319
+ Or deberia ser redirigido fuera de /edit
320
+ ```
321
+
322
+ </td>
323
+ </tr>
324
+ </table>
325
+
326
+ ---
327
+
328
+ ### PERM_URL_004: Direct URL to /tasks routes is ALLOWED for Member
329
+
330
+ <table>
331
+ <tr>
332
+ <th width="50%">English</th>
333
+ <th width="50%">Español</th>
334
+ </tr>
335
+ <tr>
336
+ <td>
337
+
338
+ ```gherkin
339
+ Scenario: Tasks routes are accessible for Member
340
+
341
+ Given I am logged in as a Member
342
+ When I navigate directly to /dashboard/tasks/create
343
+ Then I should NOT see a "Permission Denied" component
344
+ And the task creation form should be visible
345
+ ```
346
+
347
+ **Note:** Member has full CRUD access to Tasks entity.
348
+
349
+ </td>
350
+ <td>
351
+
352
+ ```gherkin
353
+ Scenario: Rutas de tareas son accesibles para Member
354
+
355
+ Given estoy logueado como Member
356
+ When navego directamente a /dashboard/tasks/create
357
+ Then NO deberia ver un componente de "Permiso Denegado"
358
+ And el formulario de creacion de tareas deberia estar visible
359
+ ```
360
+
361
+ **Nota:** Member tiene acceso CRUD completo a la entidad Tasks.
362
+
363
+ </td>
364
+ </tr>
365
+ </table>
366
+
367
+ ---
368
+
369
+ ## Permission Messages - User Feedback
370
+
371
+ ### PERM_MSG_001: Permission denied message is user-friendly
372
+
373
+ <table>
374
+ <tr>
375
+ <th width="50%">English</th>
376
+ <th width="50%">Español</th>
377
+ </tr>
378
+ <tr>
379
+ <td>
380
+
381
+ ```gherkin
382
+ Scenario: Permission denied shows user-friendly message
383
+
384
+ Given I am logged in as a Member
385
+ When I navigate directly to /dashboard/customers/create
386
+ Then I should see a permission denied indication
387
+ And the message should contain "permission", "access", or "not allowed"
388
+ And the message should be user-friendly (not technical error)
389
+ ```
390
+
391
+ </td>
392
+ <td>
393
+
394
+ ```gherkin
395
+ Scenario: Permiso denegado muestra mensaje amigable
396
+
397
+ Given estoy logueado como Member
398
+ When navego directamente a /dashboard/customers/create
399
+ Then deberia ver una indicacion de permiso denegado
400
+ And el mensaje deberia contener "permiso", "acceso", o "no permitido"
401
+ And el mensaje deberia ser amigable (no error tecnico)
402
+ ```
403
+
404
+ </td>
405
+ </tr>
406
+ </table>
407
+
408
+ ---
409
+
410
+ ## Permission Matrix / Matriz de Permisos
411
+
412
+ | Entity / Entidad | Operation / Operación | Member | Owner | Admin |
413
+ |------------------|----------------------|:------:|:-----:|:-----:|
414
+ | **Customers** | CREATE | **No** | Yes | Yes |
415
+ | **Customers** | READ | Yes | Yes | Yes |
416
+ | **Customers** | UPDATE | **No** | Yes | Yes |
417
+ | **Customers** | DELETE | **No** | Yes | Yes |
418
+ | **Tasks** | CREATE | Yes | Yes | Yes |
419
+ | **Tasks** | READ | Yes | Yes | Yes |
420
+ | **Tasks** | UPDATE | Yes | Yes | Yes |
421
+ | **Tasks** | DELETE | **No** | Yes | Yes |
422
+
423
+ ---
424
+
425
+ ## UI Elements / Elementos UI
426
+
427
+ ### Permission Components
428
+
429
+ | Element | Selector | Description / Descripción |
430
+ |---------|----------|---------------------------|
431
+ | Permission Denied | `[data-cy="permission-denied"]` | Permission denied component |
432
+ | Add Button | `[data-cy="customers-add"]` | Create button (should not exist) |
433
+ | Delete Button | `[data-cy="customers-delete-btn"]` | Delete button on detail |
434
+ | Edit Button | `[data-cy="customers-edit-btn"]` | Edit button on detail |
435
+ | Row Actions | `[data-cy^="customers-row-action-"]` | Row action buttons |
436
+
437
+ ---
438
+
439
+ ## Summary / Resumen
440
+
441
+ | Test ID | Block | Description / Descripción | Tags |
442
+ |---------|-------|---------------------------|------|
443
+ | PERM_UI_001 | UI Restrictions | Create button hidden | `@smoke` |
444
+ | PERM_UI_002 | UI Restrictions | Delete buttons hidden | |
445
+ | PERM_UI_003 | UI Restrictions | Edit buttons hidden | |
446
+ | PERM_URL_001 | URL Access | /create blocked | |
447
+ | PERM_URL_002 | URL Access | Delete hidden on detail | |
448
+ | PERM_URL_003 | URL Access | /edit blocked | |
449
+ | PERM_URL_004 | URL Access | /tasks allowed | |
450
+ | PERM_MSG_001 | Messages | User-friendly message | |