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