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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (220) 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.config.ts +150 -0
  208. package/tests/jest/components/post-header.test.tsx +377 -0
  209. package/tests/jest/config/role-config.test.ts +529 -0
  210. package/tests/jest/jest.config.ts +81 -0
  211. package/tests/jest/langchain/COVERAGE.md +372 -0
  212. package/tests/jest/langchain/guardrails.test.ts +465 -0
  213. package/tests/jest/langchain/streaming.test.ts +367 -0
  214. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  215. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  216. package/tests/jest/langchain/tracer.test.ts +823 -0
  217. package/tests/jest/user-roles/role-helpers.test.ts +432 -0
  218. package/tests/jest/validation/categories.test.ts +429 -0
  219. package/tests/jest/validation/posts.test.ts +546 -0
  220. package/tests/tsconfig.json +15 -0
@@ -0,0 +1,247 @@
1
+ /// <reference types="cypress" />
2
+
3
+ /**
4
+ * Owner Role - Full CRUD Permissions
5
+ *
6
+ * Tests to verify that Owner role maintains full CRUD access to customers.
7
+ * This validates that extensible roles don't break existing owner capabilities.
8
+ *
9
+ * Test user: Carlos Mendoza (carlos.mendoza@nextspark.dev) - Everpoint Labs
10
+ */
11
+
12
+ import * as allure from 'allure-cypress'
13
+
14
+ import { CustomersPOM } from '../../../src/entities/CustomersPOM'
15
+ import { loginAsDefaultOwner } from '../../../src/session-helpers'
16
+
17
+ describe('Owner Role - Full CRUD Permissions', {
18
+ tags: ['@uat', '@feat-teams', '@security', '@role-owner', '@regression']
19
+ }, () => {
20
+ const customers = CustomersPOM.create()
21
+
22
+ beforeEach(() => {
23
+ allure.epic('UAT')
24
+ allure.feature('Permissions')
25
+ allure.story('Owner Full CRUD')
26
+ customers.setupApiIntercepts()
27
+ loginAsDefaultOwner()
28
+ })
29
+
30
+ describe('UI Access - All Buttons Visible', { tags: '@smoke' }, () => {
31
+ it('OWNER_CRUD_001: Owner sees Add button on customers list', { tags: '@smoke' }, () => {
32
+ allure.severity('critical')
33
+
34
+ customers.visitList()
35
+ customers.api.waitForList()
36
+ customers.waitForList()
37
+
38
+ // Owner should see the Add button
39
+ cy.get(customers.selectors.addButton).should('be.visible')
40
+
41
+ cy.log('✅ Owner can see Add button')
42
+ })
43
+
44
+ it('OWNER_CRUD_002: Owner sees row actions menu on customer rows', { tags: '@smoke' }, () => {
45
+ allure.severity('critical')
46
+
47
+ customers.visitList()
48
+ customers.api.waitForList()
49
+ customers.waitForList()
50
+
51
+ cy.get('body').then($body => {
52
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
53
+ // Row actions menu trigger should be visible (Owner has edit/delete permissions)
54
+ cy.get(`[data-cy^="${customers.entitySlug}-menu-"]`).first().should('be.visible')
55
+
56
+ cy.log('✅ Owner can see row actions menu on rows')
57
+ } else {
58
+ cy.log('⚠️ No customers to check row actions')
59
+ }
60
+ })
61
+ })
62
+
63
+ it('OWNER_CRUD_003: Owner sees Edit and Delete options in row menu', () => {
64
+ allure.severity('critical')
65
+
66
+ customers.visitList()
67
+ customers.api.waitForList()
68
+ customers.waitForList()
69
+
70
+ cy.get('body').then($body => {
71
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
72
+ // Open the first row's menu
73
+ cy.get(`[data-cy^="${customers.entitySlug}-menu-"]`).first().click()
74
+
75
+ // Edit and Delete options should be visible in the dropdown
76
+ cy.get('[role="menuitem"]').contains('Edit').should('be.visible')
77
+ cy.get('[role="menuitem"]').contains('Delete').should('be.visible')
78
+
79
+ // Close dropdown by pressing escape
80
+ cy.get('body').type('{esc}')
81
+
82
+ cy.log('✅ Owner can see Edit and Delete in row menu')
83
+ } else {
84
+ cy.log('⚠️ No customers to check row menu')
85
+ }
86
+ })
87
+ })
88
+ })
89
+
90
+ describe('CRUD Operations - Full Access', () => {
91
+ it('OWNER_CRUD_004: Owner can access customer create form', () => {
92
+ allure.severity('critical')
93
+
94
+ customers.visitList()
95
+ customers.api.waitForList()
96
+
97
+ // Click Add button
98
+ cy.get(customers.selectors.addButton).click()
99
+
100
+ // Should navigate to create form
101
+ cy.url().should('include', '/create')
102
+ customers.waitForForm()
103
+
104
+ cy.log('✅ Owner can access customer create form')
105
+ })
106
+
107
+ it('OWNER_CRUD_005: Owner can access create form and see submit button', () => {
108
+ allure.severity('critical')
109
+
110
+ customers.visitCreate()
111
+ customers.waitForForm()
112
+
113
+ // Owner should see the form fields
114
+ cy.get(`[data-cy="${customers.entitySlug}-field-name"]`).should('be.visible')
115
+ cy.get(`[data-cy="${customers.entitySlug}-field-account"]`).should('be.visible')
116
+
117
+ // Owner should see the submit button
118
+ cy.get(`[data-cy="${customers.entitySlug}-form-submit"]`).should('be.visible')
119
+
120
+ cy.log('✅ Owner can access create form with submit capability')
121
+ })
122
+
123
+ it('OWNER_CRUD_006: Owner can access customer edit form', () => {
124
+ allure.severity('critical')
125
+
126
+ customers.visitList()
127
+ customers.api.waitForList()
128
+ customers.waitForList()
129
+
130
+ cy.get('body').then($body => {
131
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
132
+ // Open the first row's menu and click Edit
133
+ cy.get(`[data-cy^="${customers.entitySlug}-menu-"]`).first().click()
134
+ cy.get('[role="menuitem"]').contains('Edit').click()
135
+
136
+ // Should navigate to edit form
137
+ cy.url().should('include', '/edit')
138
+ customers.waitForForm()
139
+
140
+ cy.log('✅ Owner can access customer edit form')
141
+ } else {
142
+ cy.log('⚠️ No customers to test edit access')
143
+ }
144
+ })
145
+ })
146
+
147
+ it('OWNER_CRUD_007: Owner can access edit form with submit capability', () => {
148
+ allure.severity('critical')
149
+
150
+ customers.visitList()
151
+ customers.api.waitForList()
152
+ customers.waitForList()
153
+
154
+ cy.get('body').then($body => {
155
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
156
+ // Open the first row's menu and click Edit
157
+ cy.get(`[data-cy^="${customers.entitySlug}-menu-"]`).first().click()
158
+ cy.get('[role="menuitem"]').contains('Edit').click()
159
+ customers.waitForForm()
160
+
161
+ // Owner should see the form fields
162
+ cy.get(`[data-cy="${customers.entitySlug}-field-name"]`).should('be.visible')
163
+
164
+ // Owner should see the submit button
165
+ cy.get(`[data-cy="${customers.entitySlug}-form-submit"]`).should('be.visible')
166
+
167
+ cy.log('✅ Owner can access edit form with submit capability')
168
+ } else {
169
+ cy.log('⚠️ No customers to test edit access')
170
+ }
171
+ })
172
+ })
173
+
174
+ it('OWNER_CRUD_008: Owner can see Delete option in row menu', () => {
175
+ allure.severity('critical')
176
+
177
+ customers.visitList()
178
+ customers.api.waitForList()
179
+ customers.waitForList()
180
+
181
+ cy.get('body').then($body => {
182
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
183
+ // Open the first row's menu
184
+ cy.get(`[data-cy^="${customers.entitySlug}-menu-"]`).first().click()
185
+
186
+ // Owner should see the Delete option (this verifies delete permission)
187
+ cy.get('[role="menuitem"]').contains('Delete').should('be.visible')
188
+
189
+ // Close dropdown
190
+ cy.get('body').type('{esc}')
191
+
192
+ cy.log('✅ Owner can see Delete option in row menu')
193
+ } else {
194
+ cy.log('⚠️ No customers to test delete capability')
195
+ }
196
+ })
197
+ })
198
+ })
199
+
200
+ describe('Direct URL Access - Full Access', () => {
201
+ it('OWNER_CRUD_009: Owner can access /customers/create via URL', () => {
202
+ cy.visit(`/dashboard/${customers.entitySlug}/create`)
203
+
204
+ // Should NOT show permission denied
205
+ cy.get('[data-cy="permission-denied"]').should('not.exist')
206
+
207
+ // Should show form
208
+ customers.waitForForm()
209
+
210
+ cy.log('✅ Owner can access create via direct URL')
211
+ })
212
+
213
+ it('OWNER_CRUD_010: Owner can access /customers/[id]/edit via URL', () => {
214
+ customers.visitList()
215
+ customers.api.waitForList()
216
+
217
+ cy.get('body').then($body => {
218
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
219
+ // Extract customer ID
220
+ cy.get(customers.selectors.rowGeneric).first()
221
+ .invoke('attr', 'data-cy')
222
+ .then((dataCy) => {
223
+ const customerId = dataCy?.replace(`${customers.entitySlug}-row-`, '')
224
+
225
+ if (customerId) {
226
+ cy.visit(`/dashboard/${customers.entitySlug}/${customerId}/edit`)
227
+
228
+ // Should NOT show permission denied
229
+ cy.get('[data-cy="permission-denied"]').should('not.exist')
230
+
231
+ // Should show form
232
+ customers.waitForForm()
233
+
234
+ cy.log('✅ Owner can access edit via direct URL')
235
+ }
236
+ })
237
+ } else {
238
+ cy.log('⚠️ No customers to test direct URL edit')
239
+ }
240
+ })
241
+ })
242
+ })
243
+
244
+ after(() => {
245
+ cy.log('✅ Owner CRUD permission tests completed')
246
+ })
247
+ })