@nextsparkjs/theme-default 0.1.0-beta.2 → 0.1.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +8 -4
- package/templates/(public)/page.tsx +1 -1
- package/tests/cypress/e2e/_devtools/access.bdd.md +262 -0
- package/tests/cypress/e2e/_devtools/access.cy.ts +171 -0
- package/tests/cypress/e2e/_devtools/navigation.bdd.md +261 -0
- package/tests/cypress/e2e/_devtools/navigation.cy.ts +157 -0
- package/tests/cypress/e2e/_devtools/pages.bdd.md +303 -0
- package/tests/cypress/e2e/_devtools/pages.cy.ts +184 -0
- package/tests/cypress/e2e/_docs/README.md +215 -0
- package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin-teams.narration.json +155 -0
- package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin.cy.ts +390 -0
- package/tests/cypress/e2e/_docs/tutorials/teams-system.doc.cy.ts +349 -0
- package/tests/cypress/e2e/_docs/tutorials/teams-system.narration.json +165 -0
- package/tests/cypress/e2e/_selectors/auth.cy.ts +306 -0
- package/tests/cypress/e2e/_selectors/billing.cy.ts +89 -0
- package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +113 -0
- package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +89 -0
- package/tests/cypress/e2e/_selectors/dashboard-sidebar.cy.ts +60 -0
- package/tests/cypress/e2e/_selectors/dashboard-topnav.cy.ts +146 -0
- package/tests/cypress/e2e/_selectors/devtools.cy.ts +210 -0
- package/tests/cypress/e2e/_selectors/global-search.cy.ts +88 -0
- package/tests/cypress/e2e/_selectors/pages-editor.cy.ts +179 -0
- package/tests/cypress/e2e/_selectors/posts-editor.cy.ts +282 -0
- package/tests/cypress/e2e/_selectors/public.cy.ts +112 -0
- package/tests/cypress/e2e/_selectors/settings-api-keys.cy.ts +228 -0
- package/tests/cypress/e2e/_selectors/settings-billing.cy.ts +105 -0
- package/tests/cypress/e2e/_selectors/settings-layout.cy.ts +119 -0
- package/tests/cypress/e2e/_selectors/settings-password.cy.ts +71 -0
- package/tests/cypress/e2e/_selectors/settings-profile.cy.ts +82 -0
- package/tests/cypress/e2e/_selectors/settings-teams.cy.ts +68 -0
- package/tests/cypress/e2e/_selectors/superadmin.cy.ts +185 -0
- package/tests/cypress/e2e/_selectors/tasks.cy.ts +242 -0
- package/tests/cypress/e2e/_selectors/taxonomies.cy.ts +126 -0
- package/tests/cypress/e2e/_selectors/teams.cy.ts +142 -0
- package/tests/cypress/e2e/_superadmin/all-teams.bdd.md +261 -0
- package/tests/cypress/e2e/_superadmin/all-teams.cy.ts +177 -0
- package/tests/cypress/e2e/_superadmin/all-users.bdd.md +406 -0
- package/tests/cypress/e2e/_superadmin/all-users.cy.ts +294 -0
- package/tests/cypress/e2e/_superadmin/dashboard.bdd.md +235 -0
- package/tests/cypress/e2e/_superadmin/dashboard.cy.ts +149 -0
- package/tests/cypress/e2e/_superadmin/subscriptions-overview.bdd.md +290 -0
- package/tests/cypress/e2e/_superadmin/subscriptions-overview.cy.ts +194 -0
- package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
- package/tests/cypress/e2e/ai/chat-api.cy.ts +107 -0
- package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
- package/tests/cypress/e2e/api/billing/BillingAPIController.js +319 -0
- package/tests/cypress/e2e/api/billing/check-action.cy.ts +326 -0
- package/tests/cypress/e2e/api/billing/checkout.cy.ts +358 -0
- package/tests/cypress/e2e/api/billing/lifecycle.cy.ts +423 -0
- package/tests/cypress/e2e/api/billing/plans/README.md +345 -0
- package/tests/cypress/e2e/api/billing/plans/business.cy.ts +412 -0
- package/tests/cypress/e2e/api/billing/plans/downgrade.cy.ts +510 -0
- package/tests/cypress/e2e/api/billing/plans/fixtures/billing-plans.json +163 -0
- package/tests/cypress/e2e/api/billing/plans/free.cy.ts +500 -0
- package/tests/cypress/e2e/api/billing/plans/pro.cy.ts +497 -0
- package/tests/cypress/e2e/api/billing/plans/starter.cy.ts +342 -0
- package/tests/cypress/e2e/api/billing/portal.cy.ts +313 -0
- package/tests/cypress/e2e/api/devtools/registries.bdd.md +300 -0
- package/tests/cypress/e2e/api/devtools/registries.cy.ts +368 -0
- package/tests/cypress/e2e/api/entities/blocks-scope.cy.ts +396 -0
- package/tests/cypress/e2e/api/entities/customers-crud.cy.ts +648 -0
- package/tests/cypress/e2e/api/entities/customers-metas.cy.ts +839 -0
- package/tests/cypress/e2e/api/entities/pages-crud.cy.ts +425 -0
- package/tests/cypress/e2e/api/entities/pages-status.cy.ts +335 -0
- package/tests/cypress/e2e/api/entities/post-categories-crud.cy.ts +610 -0
- package/tests/cypress/e2e/api/entities/posts-crud.cy.ts +709 -0
- package/tests/cypress/e2e/api/entities/posts-status.cy.ts +396 -0
- package/tests/cypress/e2e/api/entities/tasks-crud.cy.ts +602 -0
- package/tests/cypress/e2e/api/entities/tasks-metas.cy.ts +878 -0
- package/tests/cypress/e2e/api/entities/users-crud.cy.ts +469 -0
- package/tests/cypress/e2e/api/entities/users-metas.cy.ts +913 -0
- package/tests/cypress/e2e/api/entities/users-security.cy.ts +375 -0
- package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.bdd.md +375 -0
- package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.cy.ts +346 -0
- package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.bdd.md +451 -0
- package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.cy.ts +447 -0
- package/tests/cypress/e2e/api/scheduled-actions/scheduling.bdd.md +649 -0
- package/tests/cypress/e2e/api/scheduled-actions/scheduling.cy.ts +333 -0
- package/tests/cypress/e2e/api/settings/api-keys.crud.cy.ts +923 -0
- package/tests/cypress/e2e/uat/auth/app-roles/developer-login.bdd.md +231 -0
- package/tests/cypress/e2e/uat/auth/app-roles/developer-login.cy.ts +144 -0
- package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.bdd.md +118 -0
- package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.cy.ts +84 -0
- package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.bdd.md +288 -0
- package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.cy.ts +188 -0
- package/tests/cypress/e2e/uat/auth/login-logout.bdd.md +160 -0
- package/tests/cypress/e2e/uat/auth/login-logout.cy.ts +116 -0
- package/tests/cypress/e2e/uat/auth/password-reset.bdd.md +289 -0
- package/tests/cypress/e2e/uat/auth/password-reset.cy.ts +200 -0
- package/tests/cypress/e2e/uat/auth/team-roles/admin-login.bdd.md +225 -0
- package/tests/cypress/e2e/uat/auth/team-roles/admin-login.cy.ts +148 -0
- package/tests/cypress/e2e/uat/auth/team-roles/member-login.bdd.md +251 -0
- package/tests/cypress/e2e/uat/auth/team-roles/member-login.cy.ts +163 -0
- package/tests/cypress/e2e/uat/auth/team-roles/owner-login.bdd.md +231 -0
- package/tests/cypress/e2e/uat/auth/team-roles/owner-login.cy.ts +141 -0
- package/tests/cypress/e2e/uat/billing/extended.bdd.md +273 -0
- package/tests/cypress/e2e/uat/billing/extended.cy.ts +209 -0
- package/tests/cypress/e2e/uat/billing/feature-gates.bdd.md +407 -0
- package/tests/cypress/e2e/uat/billing/feature-gates.cy.ts +307 -0
- package/tests/cypress/e2e/uat/billing/page.bdd.md +329 -0
- package/tests/cypress/e2e/uat/billing/page.cy.ts +250 -0
- package/tests/cypress/e2e/uat/billing/status.bdd.md +190 -0
- package/tests/cypress/e2e/uat/billing/status.cy.ts +145 -0
- package/tests/cypress/e2e/uat/billing/team-switch.bdd.md +156 -0
- package/tests/cypress/e2e/uat/billing/team-switch.cy.ts +122 -0
- package/tests/cypress/e2e/uat/billing/usage.bdd.md +218 -0
- package/tests/cypress/e2e/uat/billing/usage.cy.ts +176 -0
- package/tests/cypress/e2e/uat/blocks/hero.bdd.md +124 -0
- package/tests/cypress/e2e/uat/blocks/hero.cy.ts +56 -0
- package/tests/cypress/e2e/uat/devtools/api-tester.cy.ts +390 -0
- package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
- package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
- package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
- package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
- package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
- package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
- package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
- package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
- package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
- package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
- package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
- package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
- package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
- package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
- package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
- package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
- package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
- package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
- package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
- package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
- package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
- package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
- package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
- package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
- package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
- package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
- package/tests/cypress/e2e/uat/roles/editor-role.bdd.md +552 -0
- package/tests/cypress/e2e/uat/roles/editor-role.cy.ts +210 -0
- package/tests/cypress/e2e/uat/roles/member-restrictions.bdd.md +450 -0
- package/tests/cypress/e2e/uat/roles/member-restrictions.cy.ts +189 -0
- package/tests/cypress/e2e/uat/roles/owner-full-crud.bdd.md +530 -0
- package/tests/cypress/e2e/uat/roles/owner-full-crud.cy.ts +247 -0
- package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.bdd.md +736 -0
- package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.cy.ts +740 -0
- package/tests/cypress/e2e/uat/teams/roles-matrix.bdd.md +553 -0
- package/tests/cypress/e2e/uat/teams/roles-matrix.cy.ts +185 -0
- package/tests/cypress/e2e/uat/teams/switcher.bdd.md +1151 -0
- package/tests/cypress/e2e/uat/teams/switcher.cy.ts +497 -0
- package/tests/cypress/e2e/uat/teams/team-switcher.md +198 -0
- package/tests/cypress/fixtures/blocks.json +218 -0
- package/tests/cypress/fixtures/entities.json +78 -0
- package/tests/cypress/fixtures/page-builder.json +21 -0
- package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
- package/tests/cypress/src/components/CustomersPOM.ts +439 -0
- package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
- package/tests/cypress/src/components/EntityForm.ts +375 -0
- package/tests/cypress/src/components/EntityList.ts +389 -0
- package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
- package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
- package/tests/cypress/src/components/PostsListPOM.ts +223 -0
- package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
- package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
- package/tests/cypress/src/components/TasksPOM.ts +272 -0
- package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
- package/tests/cypress/src/components/index.ts +21 -0
- package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
- package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
- package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
- package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
- package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
- package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
- package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
- package/tests/cypress/src/controllers/index.js +25 -0
- package/tests/cypress/src/core/AuthPOM.ts +450 -0
- package/tests/cypress/src/core/BasePOM.ts +86 -0
- package/tests/cypress/src/core/BlockEditorBasePOM.ts +576 -0
- package/tests/cypress/src/core/DashboardEntityPOM.ts +692 -0
- package/tests/cypress/src/core/index.ts +14 -0
- package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
- package/tests/cypress/src/entities/PagesPOM.ts +137 -0
- package/tests/cypress/src/entities/PostsPOM.ts +137 -0
- package/tests/cypress/src/entities/TasksPOM.ts +176 -0
- package/tests/cypress/src/entities/index.ts +14 -0
- package/tests/cypress/src/features/BillingPOM.ts +385 -0
- package/tests/cypress/src/features/DashboardPOM.ts +245 -0
- package/tests/cypress/src/features/DevtoolsPOM.ts +739 -0
- package/tests/cypress/src/features/PageBuilderPOM.ts +263 -0
- package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
- package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
- package/tests/cypress/src/features/SettingsPOM.ts +362 -0
- package/tests/cypress/src/features/SuperadminPOM.ts +331 -0
- package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
- package/tests/cypress/src/features/index.ts +28 -0
- package/tests/cypress/src/helpers/ApiInterceptor.ts +177 -0
- package/tests/cypress/src/index.ts +101 -0
- package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
- package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
- package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
- package/tests/cypress/src/pages/dashboard/index.js +6 -0
- package/tests/cypress/src/pages/index.js +5 -0
- package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
- package/tests/cypress/src/pages/public/LandingPage.js +69 -0
- package/tests/cypress/src/pages/public/PricingPage.js +33 -0
- package/tests/cypress/src/pages/public/index.js +6 -0
- package/tests/cypress/src/selectors.ts +46 -0
- package/tests/cypress/src/session-helpers.ts +500 -0
- package/tests/cypress/support/doc-commands.ts +260 -0
- package/tests/cypress.config.ts +150 -0
- package/tests/jest/components/post-header.test.tsx +377 -0
- package/tests/jest/config/role-config.test.ts +529 -0
- package/tests/jest/jest.config.ts +81 -0
- package/tests/jest/langchain/COVERAGE.md +372 -0
- package/tests/jest/langchain/guardrails.test.ts +465 -0
- package/tests/jest/langchain/streaming.test.ts +367 -0
- package/tests/jest/langchain/token-tracker.test.ts +455 -0
- package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
- package/tests/jest/langchain/tracer.test.ts +823 -0
- package/tests/jest/user-roles/role-helpers.test.ts +432 -0
- package/tests/jest/validation/categories.test.ts +429 -0
- package/tests/jest/validation/posts.test.ts +546 -0
- package/tests/tsconfig.json +15 -0
- package/LICENSE +0 -21
|
@@ -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
|
+
})
|