@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,122 @@
1
+ /// <reference types="cypress" />
2
+
3
+ import * as allure from 'allure-cypress'
4
+
5
+ import { CustomersPOM } from '../../../../src/entities/CustomersPOM'
6
+ import { loginAsDefaultMember } from '../../../../src/session-helpers'
7
+
8
+ describe('Customers CRUD - Member Role (Restricted: View Only)', {
9
+ tags: ['@uat', '@feat-customers', '@crud', '@role-member', '@regression']
10
+ }, () => {
11
+ const customers = CustomersPOM.create()
12
+
13
+ beforeEach(() => {
14
+ allure.epic('UAT')
15
+ allure.feature('Customers')
16
+ allure.story('Member Permissions')
17
+
18
+ // Setup API intercepts BEFORE login and navigation
19
+ customers.setupApiIntercepts()
20
+ loginAsDefaultMember()
21
+ customers.visitList()
22
+ customers.api.waitForList()
23
+ customers.waitForList()
24
+ })
25
+
26
+ describe('READ - Member CAN view customers', { tags: '@smoke' }, () => {
27
+ it('CUST-MEMBER-001: should view customer list', { tags: '@smoke' }, () => {
28
+ allure.severity('critical')
29
+
30
+ cy.get(customers.selectors.page).should('be.visible')
31
+ customers.assertTableVisible()
32
+
33
+ cy.log('✅ Member can view customer list')
34
+ })
35
+
36
+ it('CUST-MEMBER-002: should view customer details', () => {
37
+ allure.severity('normal')
38
+
39
+ cy.get('body').then($body => {
40
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
41
+ cy.get(customers.selectors.rowGeneric).first().click()
42
+
43
+ // Wait for detail page URL (not using waitForDetail because edit button may not be visible for Member)
44
+ cy.url().should('match', new RegExp(`/dashboard/${customers.entitySlug}/[a-z0-9-]+`))
45
+ cy.get(customers.selectors.viewHeader, { timeout: 15000 }).should('be.visible')
46
+
47
+ cy.log('✅ Member can view customer details')
48
+ } else {
49
+ cy.log('⚠️ No customers available to view')
50
+ }
51
+ })
52
+ })
53
+ })
54
+
55
+ describe('UPDATE - Member CANNOT edit customers', () => {
56
+ it('CUST-MEMBER-003: edit button should be hidden', () => {
57
+ allure.severity('normal')
58
+
59
+ cy.get('body').then($body => {
60
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
61
+ // Navigate to detail page
62
+ cy.get(customers.selectors.rowGeneric).first().click()
63
+ cy.url().should('match', new RegExp(`/dashboard/${customers.entitySlug}/[a-z0-9-]+`))
64
+ cy.get(customers.selectors.viewHeader, { timeout: 15000 }).should('be.visible')
65
+
66
+ // Verify edit button does NOT exist for Member (Members cannot edit customers)
67
+ cy.get(customers.selectors.editButton).should('not.exist')
68
+
69
+ cy.log('✅ Edit button correctly hidden for Member')
70
+ } else {
71
+ cy.log('⚠️ No customers available to check edit button')
72
+ }
73
+ })
74
+ })
75
+ })
76
+
77
+ describe('CREATE - Member CANNOT create customers', () => {
78
+ it('CUST-MEMBER-004: create button should be hidden', { tags: '@smoke' }, () => {
79
+ allure.severity('critical')
80
+
81
+ cy.get(customers.selectors.addButton).should('not.exist')
82
+ cy.log('✅ Create button correctly hidden for Member')
83
+ })
84
+
85
+ it('CUST-MEMBER-005: should not access create form via UI', () => {
86
+ allure.severity('normal')
87
+
88
+ cy.get(customers.selectors.addButton).should('not.exist')
89
+ cy.log('✅ No UI access to create form for Member')
90
+ })
91
+ })
92
+
93
+ describe('DELETE - Member CANNOT delete customers', () => {
94
+ it('CUST-MEMBER-006: delete buttons should be hidden', { tags: '@smoke' }, () => {
95
+ allure.severity('critical')
96
+
97
+ // Delete action buttons should not exist for Member
98
+ cy.get(customers.selectors.rowActionDeleteGeneric).should('not.exist')
99
+ cy.log('✅ Delete buttons correctly hidden for Member')
100
+ })
101
+
102
+ it('CUST-MEMBER-007: should not see delete action in detail view', () => {
103
+ allure.severity('normal')
104
+
105
+ cy.get('body').then($body => {
106
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
107
+ cy.get(customers.selectors.rowGeneric).first().click()
108
+
109
+ // Wait for detail page (without checking for edit button)
110
+ cy.url().should('match', new RegExp(`/dashboard/${customers.entitySlug}/[a-z0-9-]+`))
111
+ cy.get(customers.selectors.viewHeader, { timeout: 15000 }).should('be.visible')
112
+
113
+ // Delete button should not exist on detail page for Member
114
+ cy.get(customers.selectors.deleteButton).should('not.exist')
115
+ cy.log('✅ No delete action visible in detail view for Member')
116
+ } else {
117
+ cy.log('⚠️ No customers available to check delete action')
118
+ }
119
+ })
120
+ })
121
+ })
122
+ })
@@ -0,0 +1,243 @@
1
+ ---
2
+ feature: Customers Management - Owner Role
3
+ priority: high
4
+ tags: [customers, owner, crud, dashboard]
5
+ grepTags: [uat, feat-customers, role-owner]
6
+ coverage: 5
7
+ ---
8
+
9
+ # Customers Management - Owner Role (Full CRUD Access)
10
+
11
+ > Test suite for Owner role managing customers through the dashboard UI. Covers full CRUD operations: create, view, update, and delete customer records.
12
+
13
+ ## Background
14
+
15
+ ```gherkin:en
16
+ Given I am logged in as Owner (owner@nextspark.dev)
17
+ And I have navigated to the Customers dashboard
18
+ And the customers list has loaded successfully
19
+ ```
20
+
21
+ ```gherkin:es
22
+ Given estoy logueado como Owner (owner@nextspark.dev)
23
+ And he navegado al dashboard de Clientes
24
+ And la lista de clientes ha cargado exitosamente
25
+ ```
26
+
27
+ ---
28
+
29
+ ## @test CUST-001: Create new customer with all required fields
30
+
31
+ ### Metadata
32
+ - **Priority:** Critical
33
+ - **Type:** Smoke
34
+ - **Tags:** create, customer, form
35
+ - **Grep:** `@smoke` `@critical`
36
+
37
+ ```gherkin:en
38
+ Scenario: Owner creates a new customer
39
+
40
+ Given I am logged in as an Owner
41
+ And I am on the Customers list page
42
+ When I click the "Add" button
43
+ Then the customer creation form should appear
44
+
45
+ When I fill in the following fields:
46
+ | Field | Value |
47
+ | Name | "Test Customer [timestamp]" |
48
+ | Account | "123456" |
49
+ | Office | "Main Office" |
50
+ And I click the "Save" button
51
+ Then the form should submit successfully
52
+ And I should be redirected to the customers list
53
+ And I should see "Test Customer" in the list
54
+ ```
55
+
56
+ ```gherkin:es
57
+ Scenario: Owner crea un nuevo cliente
58
+
59
+ Given estoy logueado como Owner
60
+ And estoy en la pagina de lista de Clientes
61
+ When hago clic en el boton "Agregar"
62
+ Then deberia aparecer el formulario de creacion
63
+
64
+ When completo los siguientes campos:
65
+ | Campo | Valor |
66
+ | Nombre | "Cliente de Prueba [timestamp]" |
67
+ | Cuenta | "123456" |
68
+ | Oficina | "Oficina Principal" |
69
+ And hago clic en el boton "Guardar"
70
+ Then el formulario deberia enviarse exitosamente
71
+ And deberia ser redirigido a la lista de clientes
72
+ And deberia ver "Cliente de Prueba" en la lista
73
+ ```
74
+
75
+ ### Expected Results
76
+ - Add button is visible and clickable
77
+ - Customer creation form displays all required fields
78
+ - Form validation works correctly
79
+ - Customer is created and appears in the list
80
+ - Redirect to customers list after successful creation
81
+
82
+ ---
83
+
84
+ ## @test CUST-002: View customer list
85
+
86
+ ### Metadata
87
+ - **Priority:** Critical
88
+ - **Type:** Smoke
89
+ - **Tags:** read, list, table
90
+ - **Grep:** `@smoke` `@critical`
91
+
92
+ ```gherkin:en
93
+ Scenario: Owner can view the customers table
94
+
95
+ Given I am logged in as an Owner
96
+ When I navigate to the Customers dashboard
97
+ Then the customers page should be visible
98
+ And the customers table should be displayed
99
+ ```
100
+
101
+ ```gherkin:es
102
+ Scenario: Owner puede ver la tabla de clientes
103
+
104
+ Given estoy logueado como Owner
105
+ When navego al dashboard de Clientes
106
+ Then la pagina de clientes deberia estar visible
107
+ And la tabla de clientes deberia mostrarse
108
+ ```
109
+
110
+ ### Expected Results
111
+ - Customers dashboard is accessible
112
+ - Customers table displays with data
113
+ - Table shows customer information columns
114
+
115
+ ---
116
+
117
+ ## @test CUST-003: View customer details
118
+
119
+ ### Metadata
120
+ - **Priority:** High
121
+ - **Type:** Regression
122
+ - **Tags:** read, details, navigation
123
+
124
+ ```gherkin:en
125
+ Scenario: Owner can view individual customer details
126
+
127
+ Given I am logged in as an Owner
128
+ And there is at least one customer in the list
129
+ When I click on a customer row
130
+ Then I should be navigated to the customer detail page
131
+ And the URL should match /dashboard/customers/{id}
132
+ ```
133
+
134
+ ```gherkin:es
135
+ Scenario: Owner puede ver detalles de un cliente
136
+
137
+ Given estoy logueado como Owner
138
+ And existe al menos un cliente en la lista
139
+ When hago clic en una fila de cliente
140
+ Then deberia ser navegado a la pagina de detalle
141
+ And la URL deberia coincidir con /dashboard/customers/{id}
142
+ ```
143
+
144
+ ### Expected Results
145
+ - Customer rows are clickable
146
+ - Navigation to detail page works
147
+ - URL contains customer ID
148
+ - Customer details are displayed
149
+
150
+ ---
151
+
152
+ ## @test CUST-004: Edit existing customer
153
+
154
+ ### Metadata
155
+ - **Priority:** High
156
+ - **Type:** Regression
157
+ - **Tags:** update, edit, form
158
+
159
+ ```gherkin:en
160
+ Scenario: Owner can modify customer information
161
+
162
+ Given I am logged in as an Owner
163
+ And there is at least one customer in the list
164
+ When I click on a customer row to view details
165
+ And I click the "Edit" button
166
+ Then the customer edit form should appear
167
+ And the form should be pre-filled with current data
168
+
169
+ When I change the Name to "Updated Customer [timestamp]"
170
+ And I click the "Save" button
171
+ Then the changes should be saved successfully
172
+ And I should see "Updated Customer" in the list
173
+ ```
174
+
175
+ ```gherkin:es
176
+ Scenario: Owner puede modificar informacion del cliente
177
+
178
+ Given estoy logueado como Owner
179
+ And existe al menos un cliente en la lista
180
+ When hago clic en una fila para ver detalles
181
+ And hago clic en el boton "Editar"
182
+ Then deberia aparecer el formulario de edicion
183
+ And el formulario deberia estar pre-llenado con datos actuales
184
+
185
+ When cambio el Nombre a "Cliente Actualizado [timestamp]"
186
+ And hago clic en el boton "Guardar"
187
+ Then los cambios deberian guardarse exitosamente
188
+ And deberia ver "Cliente Actualizado" en la lista
189
+ ```
190
+
191
+ ### Expected Results
192
+ - Edit button is accessible from detail page
193
+ - Edit form pre-fills with existing data
194
+ - Changes can be saved successfully
195
+ - Updated data reflects in the list
196
+
197
+ ---
198
+
199
+ ## @test CUST-005: Delete customer
200
+
201
+ ### Metadata
202
+ - **Priority:** High
203
+ - **Type:** Regression
204
+ - **Tags:** delete, confirmation, dialog
205
+
206
+ ```gherkin:en
207
+ Scenario: Owner can permanently delete a customer
208
+
209
+ Given I am logged in as an Owner
210
+ And I have created a customer called "Delete Test [timestamp]"
211
+ When I click on that customer to view details
212
+ And I click the "Delete" button
213
+ Then a confirmation dialog should appear
214
+
215
+ When I confirm the deletion
216
+ Then a second confirmation dialog should appear
217
+ When I confirm again
218
+ Then the customer should be deleted
219
+ And "Delete Test" should no longer appear in the list
220
+ ```
221
+
222
+ ```gherkin:es
223
+ Scenario: Owner puede eliminar permanentemente un cliente
224
+
225
+ Given estoy logueado como Owner
226
+ And he creado un cliente llamado "Prueba Eliminar [timestamp]"
227
+ When hago clic en ese cliente para ver detalles
228
+ And hago clic en el boton "Eliminar"
229
+ Then deberia aparecer un dialogo de confirmacion
230
+
231
+ When confirmo la eliminacion
232
+ Then deberia aparecer un segundo dialogo de confirmacion
233
+ When confirmo nuevamente
234
+ Then el cliente deberia ser eliminado
235
+ And "Prueba Eliminar" ya no deberia aparecer en la lista
236
+ ```
237
+
238
+ ### Expected Results
239
+ - Delete button is accessible from detail page
240
+ - First confirmation dialog appears
241
+ - Second confirmation dialog appears (2-step deletion)
242
+ - Customer is permanently removed
243
+ - Customer no longer appears in the list
@@ -0,0 +1,165 @@
1
+ /// <reference types="cypress" />
2
+
3
+ import * as allure from 'allure-cypress'
4
+
5
+ import { CustomersPOM } from '../../../../src/entities/CustomersPOM'
6
+ import { loginAsDefaultOwner } from '../../../../src/session-helpers'
7
+
8
+ describe('Customers CRUD - Owner Role (Full Access)', {
9
+ tags: ['@uat', '@feat-customers', '@crud', '@role-owner', '@regression']
10
+ }, () => {
11
+ const customers = CustomersPOM.create()
12
+
13
+ beforeEach(() => {
14
+ allure.epic('UAT')
15
+ allure.feature('Customers')
16
+ allure.story('Owner Permissions')
17
+
18
+ // Setup API intercepts BEFORE login and navigation
19
+ customers.setupApiIntercepts()
20
+ loginAsDefaultOwner()
21
+ customers.visitList()
22
+ customers.api.waitForList()
23
+ customers.waitForList()
24
+ })
25
+
26
+ describe('CREATE - Owner can create customers', { tags: '@smoke' }, () => {
27
+ it('CUST-001: should create new customer with all required fields', { tags: '@smoke' }, () => {
28
+ allure.severity('critical')
29
+ const timestamp = Date.now()
30
+ const customerData = {
31
+ name: `Test Customer ${timestamp}`,
32
+ account: String(Math.floor(Math.random() * 900000) + 100000),
33
+ office: 'Main Office'
34
+ }
35
+
36
+ // Use API-aware create flow
37
+ customers.clickAdd()
38
+ customers.waitForForm()
39
+ customers.fillCustomerForm(customerData)
40
+ customers.submitForm()
41
+
42
+ // Wait for API response (deterministic)
43
+ customers.api.waitForCreate()
44
+
45
+ // Validate redirect and customer appears
46
+ cy.url().should('include', `/dashboard/${customers.entitySlug}`)
47
+ customers.assertCustomerInList(customerData.name)
48
+
49
+ cy.log('✅ Owner created customer successfully')
50
+ })
51
+ })
52
+
53
+ describe('READ - Owner can view customers', { tags: '@smoke' }, () => {
54
+ it('CUST-002: should view customer list', { tags: '@smoke' }, () => {
55
+ allure.severity('critical')
56
+
57
+ cy.get(customers.selectors.page).should('be.visible')
58
+ customers.assertTableVisible()
59
+
60
+ cy.log('✅ Owner can view customer list')
61
+ })
62
+
63
+ it('CUST-003: should view customer details', () => {
64
+ allure.severity('normal')
65
+
66
+ cy.get('body').then($body => {
67
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
68
+ // Click first row to view details
69
+ cy.get(customers.selectors.rowGeneric).first().click()
70
+ customers.waitForDetail()
71
+
72
+ cy.url().should('match', new RegExp(`/dashboard/${customers.entitySlug}/[a-z0-9-]+`))
73
+ cy.log('✅ Owner can view customer details')
74
+ } else {
75
+ cy.log('⚠️ No customers available to view details')
76
+ }
77
+ })
78
+ })
79
+ })
80
+
81
+ describe('UPDATE - Owner can update customers', () => {
82
+ it('CUST-004: should edit existing customer', () => {
83
+ allure.severity('normal')
84
+
85
+ cy.get('body').then($body => {
86
+ if ($body.find(customers.selectors.rowGeneric).length > 0) {
87
+ // Navigate to detail page
88
+ cy.get(customers.selectors.rowGeneric).first().click()
89
+ customers.waitForDetail()
90
+
91
+ // Edit flow with API wait
92
+ customers.clickEdit()
93
+ customers.waitForForm()
94
+
95
+ // Wait for form to be fully loaded (fields enabled)
96
+ cy.get(customers.selectors.field('name')).find('input').should('not.be.disabled')
97
+
98
+ const updatedName = `Updated Customer ${Date.now()}`
99
+ customers.fillTextField('name', updatedName)
100
+ customers.submitForm()
101
+
102
+ // Wait for API response (deterministic)
103
+ customers.api.waitForUpdate()
104
+
105
+ // Verify update by visiting list
106
+ customers.visitList()
107
+ customers.api.waitForList()
108
+ customers.assertCustomerInList(updatedName)
109
+
110
+ cy.log('✅ Owner updated customer successfully')
111
+ } else {
112
+ cy.log('⚠️ No customers available to edit')
113
+ }
114
+ })
115
+ })
116
+ })
117
+
118
+ describe('DELETE - Owner can delete customers', () => {
119
+ it('CUST-005: should delete customer', () => {
120
+ allure.severity('normal')
121
+
122
+ // Create a customer to delete (ensures test data exists)
123
+ const timestamp = Date.now()
124
+ const customerData = {
125
+ name: `Delete Test ${timestamp}`,
126
+ account: String(Math.floor(Math.random() * 900000) + 100000),
127
+ office: 'Test Office'
128
+ }
129
+
130
+ // Create customer with API wait
131
+ customers.clickAdd()
132
+ customers.waitForForm()
133
+ customers.fillCustomerForm(customerData)
134
+ customers.submitForm()
135
+ customers.api.waitForCreate()
136
+
137
+ // Navigate to list and verify
138
+ customers.visitList()
139
+ customers.api.waitForList()
140
+ customers.assertCustomerInList(customerData.name)
141
+
142
+ // Delete flow with API wait
143
+ customers.clickRowByText(customerData.name)
144
+ customers.waitForDetail()
145
+ customers.clickDelete()
146
+
147
+ // First dialog (EntityDetailHeader) - click confirm
148
+ cy.get(customers.selectors.deleteDialog, { timeout: 5000 }).should('be.visible')
149
+ cy.get(customers.selectors.deleteConfirm).should('be.visible').and('not.be.disabled').click()
150
+
151
+ // Second dialog (EntityDetailWrapper parent confirmation) - click confirm
152
+ cy.get(customers.selectors.parentDeleteConfirm, { timeout: 5000 }).should('be.visible').and('not.be.disabled').click()
153
+
154
+ // Wait for delete API response (deterministic)
155
+ customers.api.waitForDelete()
156
+
157
+ // Verify deletion
158
+ customers.visitList()
159
+ customers.api.waitForList()
160
+ customers.assertCustomerNotInList(customerData.name)
161
+
162
+ cy.log('✅ Owner deleted customer successfully')
163
+ })
164
+ })
165
+ })