@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,242 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* POC Test: Tasks Entity Selectors Validation
|
|
3
|
+
*
|
|
4
|
+
* This test validates that the new POM architecture with dynamic selectors
|
|
5
|
+
* works correctly for entity CRUD operations.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Validate selectors from DashboardEntityPOM work correctly
|
|
9
|
+
* - Ensure dynamic selector generation produces valid CSS selectors
|
|
10
|
+
* - Test before migrating existing tests to new architecture
|
|
11
|
+
*
|
|
12
|
+
* Scope:
|
|
13
|
+
* - Only login and navigate
|
|
14
|
+
* - Assert elements exist in DOM (no full CRUD operations)
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
import { TasksPOM } from '../../src/entities/TasksPOM'
|
|
18
|
+
import { loginAsDefaultOwner } from '../../src/session-helpers'
|
|
19
|
+
|
|
20
|
+
describe('Tasks Entity Selectors Validation', { tags: ['@ui-selectors'] }, () => {
|
|
21
|
+
const tasks = TasksPOM.create()
|
|
22
|
+
|
|
23
|
+
beforeEach(() => {
|
|
24
|
+
loginAsDefaultOwner()
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
describe('List Page Selectors', () => {
|
|
28
|
+
beforeEach(() => {
|
|
29
|
+
tasks.visitList()
|
|
30
|
+
tasks.waitForList()
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
it('should find table container element', () => {
|
|
34
|
+
cy.get(tasks.selectors.tableContainer).should('exist')
|
|
35
|
+
})
|
|
36
|
+
|
|
37
|
+
// NOTE: entities.table.element selector not implemented in EntityTable component
|
|
38
|
+
// The component uses {slug}-table-container on wrapper, not {slug}-table on <table>
|
|
39
|
+
// Test removed as redundant with tableContainer test above
|
|
40
|
+
|
|
41
|
+
it('should find add button', () => {
|
|
42
|
+
cy.get(tasks.selectors.addButton).should('exist')
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('should find search input', () => {
|
|
46
|
+
cy.get(tasks.selectors.search).should('exist')
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it('should find search container', () => {
|
|
50
|
+
cy.get(tasks.selectors.searchContainer).should('exist')
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
it('should find select all checkbox', () => {
|
|
54
|
+
cy.get(tasks.selectors.selectAll).should('exist')
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it('should find pagination container', () => {
|
|
58
|
+
cy.get(tasks.selectors.pagination).should('exist')
|
|
59
|
+
})
|
|
60
|
+
|
|
61
|
+
it('should find pagination controls', () => {
|
|
62
|
+
cy.get(tasks.selectors.pageFirst).should('exist')
|
|
63
|
+
cy.get(tasks.selectors.pagePrev).should('exist')
|
|
64
|
+
cy.get(tasks.selectors.pageNext).should('exist')
|
|
65
|
+
cy.get(tasks.selectors.pageLast).should('exist')
|
|
66
|
+
})
|
|
67
|
+
|
|
68
|
+
it('should find page size selector', () => {
|
|
69
|
+
cy.get(tasks.selectors.pageSize).should('exist')
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
it('should find page info', () => {
|
|
73
|
+
cy.get(tasks.selectors.pageInfo).should('exist')
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
it('should find at least one row with dynamic selector', () => {
|
|
77
|
+
cy.get(tasks.selectors.rowGeneric).should('have.length.at.least', 1)
|
|
78
|
+
})
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
describe('Filter Selectors', () => {
|
|
82
|
+
beforeEach(() => {
|
|
83
|
+
tasks.visitList()
|
|
84
|
+
tasks.waitForList()
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
it('should find status filter trigger', () => {
|
|
88
|
+
cy.get(tasks.selectors.filterTrigger('status')).should('exist')
|
|
89
|
+
})
|
|
90
|
+
|
|
91
|
+
it('should find priority filter trigger', () => {
|
|
92
|
+
cy.get(tasks.selectors.filterTrigger('priority')).should('exist')
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
it('should find filter options when opened', () => {
|
|
96
|
+
tasks.openFilter('status')
|
|
97
|
+
cy.get(tasks.selectors.filterContent('status')).should('be.visible')
|
|
98
|
+
})
|
|
99
|
+
})
|
|
100
|
+
|
|
101
|
+
describe('Row Dynamic Selectors', () => {
|
|
102
|
+
beforeEach(() => {
|
|
103
|
+
tasks.visitList()
|
|
104
|
+
tasks.waitForList()
|
|
105
|
+
})
|
|
106
|
+
|
|
107
|
+
it('should find row elements with dynamic ID', () => {
|
|
108
|
+
// Get any row and extract its ID to test dynamic selectors
|
|
109
|
+
cy.get(tasks.selectors.rowGeneric)
|
|
110
|
+
.first()
|
|
111
|
+
.invoke('attr', 'data-cy')
|
|
112
|
+
.then((dataCy) => {
|
|
113
|
+
// Extract ID from data-cy="tasks-row-{id}"
|
|
114
|
+
const id = dataCy?.replace('tasks-row-', '') || ''
|
|
115
|
+
expect(id).to.not.be.empty
|
|
116
|
+
|
|
117
|
+
// Test dynamic selector functions work
|
|
118
|
+
cy.get(tasks.selectors.row(id)).should('exist')
|
|
119
|
+
cy.get(tasks.selectors.rowSelect(id)).should('exist')
|
|
120
|
+
cy.get(tasks.selectors.rowMenu(id)).should('exist')
|
|
121
|
+
})
|
|
122
|
+
})
|
|
123
|
+
})
|
|
124
|
+
|
|
125
|
+
describe('Create Page Selectors', () => {
|
|
126
|
+
beforeEach(() => {
|
|
127
|
+
tasks.visitCreate()
|
|
128
|
+
tasks.waitForForm()
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
it('should find form container', () => {
|
|
132
|
+
cy.get(tasks.selectors.form).should('exist')
|
|
133
|
+
})
|
|
134
|
+
|
|
135
|
+
it('should find submit button', () => {
|
|
136
|
+
cy.get(tasks.selectors.submitButton).should('exist')
|
|
137
|
+
})
|
|
138
|
+
|
|
139
|
+
it('should find create header', () => {
|
|
140
|
+
cy.get(tasks.selectors.createHeader).should('exist')
|
|
141
|
+
})
|
|
142
|
+
|
|
143
|
+
it('should find back button', () => {
|
|
144
|
+
cy.get(tasks.selectors.backButton).should('exist')
|
|
145
|
+
})
|
|
146
|
+
|
|
147
|
+
it('should find title field', () => {
|
|
148
|
+
cy.get(tasks.selectors.field('title')).should('exist')
|
|
149
|
+
})
|
|
150
|
+
|
|
151
|
+
it('should find description field', () => {
|
|
152
|
+
cy.get(tasks.selectors.field('description')).should('exist')
|
|
153
|
+
})
|
|
154
|
+
|
|
155
|
+
it('should find status field', () => {
|
|
156
|
+
cy.get(tasks.selectors.field('status')).should('exist')
|
|
157
|
+
})
|
|
158
|
+
|
|
159
|
+
it('should find priority field', () => {
|
|
160
|
+
cy.get(tasks.selectors.field('priority')).should('exist')
|
|
161
|
+
})
|
|
162
|
+
})
|
|
163
|
+
|
|
164
|
+
describe('Detail Page Selectors', () => {
|
|
165
|
+
it('should find detail page elements after navigating to a task', () => {
|
|
166
|
+
// First get a task ID from the list
|
|
167
|
+
tasks.visitList()
|
|
168
|
+
tasks.waitForList()
|
|
169
|
+
|
|
170
|
+
cy.get(tasks.selectors.rowGeneric)
|
|
171
|
+
.first()
|
|
172
|
+
.invoke('attr', 'data-cy')
|
|
173
|
+
.then((dataCy) => {
|
|
174
|
+
const id = dataCy?.replace('tasks-row-', '') || ''
|
|
175
|
+
|
|
176
|
+
// Navigate to detail page
|
|
177
|
+
tasks.visitDetail(id)
|
|
178
|
+
tasks.waitForDetail()
|
|
179
|
+
|
|
180
|
+
// Validate detail page selectors
|
|
181
|
+
cy.get(tasks.selectors.viewHeader).should('exist')
|
|
182
|
+
cy.get(tasks.selectors.editButton).should('exist')
|
|
183
|
+
cy.get(tasks.selectors.deleteButton).should('exist')
|
|
184
|
+
cy.get(tasks.selectors.backButton).should('exist')
|
|
185
|
+
})
|
|
186
|
+
})
|
|
187
|
+
})
|
|
188
|
+
|
|
189
|
+
describe('Bulk Actions Selectors', () => {
|
|
190
|
+
beforeEach(() => {
|
|
191
|
+
tasks.visitList()
|
|
192
|
+
tasks.waitForList()
|
|
193
|
+
})
|
|
194
|
+
|
|
195
|
+
it('should show bulk bar after selecting rows', () => {
|
|
196
|
+
// Select first row
|
|
197
|
+
cy.get(tasks.selectors.rowGeneric)
|
|
198
|
+
.first()
|
|
199
|
+
.invoke('attr', 'data-cy')
|
|
200
|
+
.then((dataCy) => {
|
|
201
|
+
const id = dataCy?.replace('tasks-row-', '') || ''
|
|
202
|
+
cy.get(tasks.selectors.rowSelect(id)).click()
|
|
203
|
+
|
|
204
|
+
// Bulk bar should appear
|
|
205
|
+
cy.get(tasks.selectors.bulkBar).should('be.visible')
|
|
206
|
+
cy.get(tasks.selectors.bulkCount).should('exist')
|
|
207
|
+
cy.get(tasks.selectors.bulkDelete).should('exist')
|
|
208
|
+
cy.get(tasks.selectors.bulkClear).should('exist')
|
|
209
|
+
// Note: bulkStatus not tested - enableChangeStatus not enabled in EntityListWrapper
|
|
210
|
+
})
|
|
211
|
+
})
|
|
212
|
+
})
|
|
213
|
+
|
|
214
|
+
describe('Delete Dialog Selectors', () => {
|
|
215
|
+
it('should find delete dialog elements', () => {
|
|
216
|
+
// Navigate to a task detail
|
|
217
|
+
tasks.visitList()
|
|
218
|
+
tasks.waitForList()
|
|
219
|
+
|
|
220
|
+
cy.get(tasks.selectors.rowGeneric)
|
|
221
|
+
.first()
|
|
222
|
+
.invoke('attr', 'data-cy')
|
|
223
|
+
.then((dataCy) => {
|
|
224
|
+
const id = dataCy?.replace('tasks-row-', '') || ''
|
|
225
|
+
|
|
226
|
+
tasks.visitDetail(id)
|
|
227
|
+
tasks.waitForDetail()
|
|
228
|
+
|
|
229
|
+
// Click delete to open dialog
|
|
230
|
+
tasks.clickDelete()
|
|
231
|
+
|
|
232
|
+
// Validate dialog selectors
|
|
233
|
+
cy.get(tasks.selectors.deleteDialog).should('be.visible')
|
|
234
|
+
cy.get(tasks.selectors.deleteConfirm).should('exist')
|
|
235
|
+
cy.get(tasks.selectors.deleteCancel).should('exist')
|
|
236
|
+
|
|
237
|
+
// Close without deleting
|
|
238
|
+
tasks.cancelDelete()
|
|
239
|
+
})
|
|
240
|
+
})
|
|
241
|
+
})
|
|
242
|
+
})
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Selectors Validation: Taxonomies (Categories)
|
|
3
|
+
*
|
|
4
|
+
* This test validates that taxonomies selectors exist in the DOM.
|
|
5
|
+
* This is a lightweight test that ONLY checks selector presence, not functionality.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Validate CategoriesPOM taxonomies selectors work correctly
|
|
9
|
+
* - Ensure all taxonomies.* selectors are implemented
|
|
10
|
+
* - Run as Phase 12 sub-gate before functional tests
|
|
11
|
+
*
|
|
12
|
+
* IMPORTANT: The /dashboard/taxonomies page does NOT exist yet.
|
|
13
|
+
* Taxonomies are defined in CORE_SELECTORS but the UI is not implemented.
|
|
14
|
+
* All tests are marked as skip until the page is created.
|
|
15
|
+
*
|
|
16
|
+
* NOTE: There IS an API at /api/v1/post-categories but no UI page.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
import { CategoriesPOM } from '../../src/components/CategoriesPOM'
|
|
20
|
+
|
|
21
|
+
describe('Taxonomies Selectors Validation', { tags: ['@ui-selectors'] }, () => {
|
|
22
|
+
// ============================================
|
|
23
|
+
// DOCUMENTATION (no login needed)
|
|
24
|
+
// ============================================
|
|
25
|
+
describe('Taxonomies Page Status', () => {
|
|
26
|
+
it('documents that taxonomies page is not implemented', () => {
|
|
27
|
+
cy.log('The /dashboard/taxonomies page does NOT exist')
|
|
28
|
+
cy.log('Taxonomies selectors are defined in CORE_SELECTORS')
|
|
29
|
+
cy.log('API exists at /api/v1/post-categories')
|
|
30
|
+
cy.log('UI page needs to be created to test these selectors')
|
|
31
|
+
})
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
// ============================================
|
|
35
|
+
// LIST PAGE (5 selectors)
|
|
36
|
+
// NOTE: Page not implemented
|
|
37
|
+
// ============================================
|
|
38
|
+
describe('List Page', () => {
|
|
39
|
+
it.skip('should find list container (page not implemented)', () => {
|
|
40
|
+
cy.get(CategoriesPOM.listSelectors.page).should('exist')
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
it.skip('should find create button (page not implemented)', () => {
|
|
44
|
+
cy.get(CategoriesPOM.listSelectors.createBtn).should('exist')
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
it.skip('should find category row (page not implemented)', () => {
|
|
48
|
+
// Example: cy.get(CategoriesPOM.listSelectors.row('cat-123')).should('exist')
|
|
49
|
+
cy.wrap(true).should('be.true')
|
|
50
|
+
})
|
|
51
|
+
|
|
52
|
+
it.skip('should find edit button (page not implemented)', () => {
|
|
53
|
+
// Example: cy.get(CategoriesPOM.listSelectors.editBtn('cat-123')).should('exist')
|
|
54
|
+
cy.wrap(true).should('be.true')
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
it.skip('should find delete button (page not implemented)', () => {
|
|
58
|
+
// Example: cy.get(CategoriesPOM.listSelectors.deleteBtn('cat-123')).should('exist')
|
|
59
|
+
cy.wrap(true).should('be.true')
|
|
60
|
+
})
|
|
61
|
+
})
|
|
62
|
+
|
|
63
|
+
// ============================================
|
|
64
|
+
// FORM DIALOG (10 selectors)
|
|
65
|
+
// NOTE: Page not implemented
|
|
66
|
+
// ============================================
|
|
67
|
+
describe('Form Dialog', () => {
|
|
68
|
+
it.skip('should find form dialog (page not implemented)', () => {
|
|
69
|
+
cy.get(CategoriesPOM.formSelectors.dialog).should('exist')
|
|
70
|
+
})
|
|
71
|
+
|
|
72
|
+
it.skip('should find name input (page not implemented)', () => {
|
|
73
|
+
cy.get(CategoriesPOM.formSelectors.nameInput).should('exist')
|
|
74
|
+
})
|
|
75
|
+
|
|
76
|
+
it.skip('should find slug input (page not implemented)', () => {
|
|
77
|
+
cy.get(CategoriesPOM.formSelectors.slugInput).should('exist')
|
|
78
|
+
})
|
|
79
|
+
|
|
80
|
+
it.skip('should find description input (page not implemented)', () => {
|
|
81
|
+
cy.get(CategoriesPOM.formSelectors.descriptionInput).should('exist')
|
|
82
|
+
})
|
|
83
|
+
|
|
84
|
+
it.skip('should find icon input (page not implemented)', () => {
|
|
85
|
+
cy.get(CategoriesPOM.formSelectors.iconInput).should('exist')
|
|
86
|
+
})
|
|
87
|
+
|
|
88
|
+
it.skip('should find color input (page not implemented)', () => {
|
|
89
|
+
cy.get(CategoriesPOM.formSelectors.colorInput).should('exist')
|
|
90
|
+
})
|
|
91
|
+
|
|
92
|
+
it.skip('should find parent select (page not implemented)', () => {
|
|
93
|
+
cy.get(CategoriesPOM.formSelectors.parentSelect).should('exist')
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
it.skip('should find order input (page not implemented)', () => {
|
|
97
|
+
cy.get(CategoriesPOM.formSelectors.orderInput).should('exist')
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
it.skip('should find save button (page not implemented)', () => {
|
|
101
|
+
cy.get(CategoriesPOM.formSelectors.saveButton).should('exist')
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
it.skip('should find cancel button (page not implemented)', () => {
|
|
105
|
+
cy.get(CategoriesPOM.formSelectors.cancelButton).should('exist')
|
|
106
|
+
})
|
|
107
|
+
})
|
|
108
|
+
|
|
109
|
+
// ============================================
|
|
110
|
+
// CONFIRM DELETE DIALOG (3 selectors)
|
|
111
|
+
// NOTE: Page not implemented
|
|
112
|
+
// ============================================
|
|
113
|
+
describe('Confirm Delete Dialog', () => {
|
|
114
|
+
it.skip('should find delete confirmation dialog (page not implemented)', () => {
|
|
115
|
+
cy.get(CategoriesPOM.confirmDeleteSelectors.dialog).should('exist')
|
|
116
|
+
})
|
|
117
|
+
|
|
118
|
+
it.skip('should find confirm delete button (page not implemented)', () => {
|
|
119
|
+
cy.get(CategoriesPOM.confirmDeleteSelectors.confirmButton).should('exist')
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
it.skip('should find cancel delete button (page not implemented)', () => {
|
|
123
|
+
cy.get(CategoriesPOM.confirmDeleteSelectors.cancelButton).should('exist')
|
|
124
|
+
})
|
|
125
|
+
})
|
|
126
|
+
})
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* UI Selectors Validation: Teams
|
|
3
|
+
*
|
|
4
|
+
* This test validates that teams selectors exist in the DOM.
|
|
5
|
+
* This is a lightweight test that ONLY checks selector presence, not functionality.
|
|
6
|
+
*
|
|
7
|
+
* Purpose:
|
|
8
|
+
* - Validate TeamSwitcherPOM selectors work correctly
|
|
9
|
+
* - Ensure all teams.* selectors are implemented
|
|
10
|
+
* - Run as Phase 12 sub-gate before functional tests
|
|
11
|
+
*
|
|
12
|
+
* Scope:
|
|
13
|
+
* - Navigate to dashboard (requires login)
|
|
14
|
+
* - Assert elements exist in DOM (no form submissions)
|
|
15
|
+
* - Fast execution (< 30 seconds per describe block)
|
|
16
|
+
*
|
|
17
|
+
* NOTE: Some selectors require specific states (dialog open, team selected).
|
|
18
|
+
* Many selectors from CORE_SELECTORS are dynamically scoped.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { TeamSwitcherPOM } from '../../src/components/TeamSwitcherPOM'
|
|
22
|
+
import { loginAsDefaultOwner } from '../../src/session-helpers'
|
|
23
|
+
|
|
24
|
+
describe('Teams Selectors Validation', { tags: ['@ui-selectors'] }, () => {
|
|
25
|
+
const teamSwitcher = TeamSwitcherPOM.create()
|
|
26
|
+
|
|
27
|
+
beforeEach(() => {
|
|
28
|
+
loginAsDefaultOwner()
|
|
29
|
+
cy.visit('/dashboard', { timeout: 60000, failOnStatusCode: false })
|
|
30
|
+
cy.url().should('include', '/dashboard')
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
// ============================================
|
|
34
|
+
// TEAM SWITCHER SELECTORS (6 selectors)
|
|
35
|
+
// ============================================
|
|
36
|
+
describe('Team Switcher Selectors', () => {
|
|
37
|
+
beforeEach(() => {
|
|
38
|
+
teamSwitcher.ensureSidebarExpanded()
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
it('should find team switcher compact trigger', () => {
|
|
42
|
+
cy.get(teamSwitcher.selectors.trigger).should('exist')
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
it('should find team switcher dropdown when opened', () => {
|
|
46
|
+
teamSwitcher.open()
|
|
47
|
+
cy.get(teamSwitcher.selectors.dropdown).should('be.visible')
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
it('should find team option in dropdown', () => {
|
|
51
|
+
teamSwitcher.open()
|
|
52
|
+
cy.get(teamSwitcher.selectors.teamOption).should('have.length.at.least', 1)
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
it('should find manage teams link', () => {
|
|
56
|
+
teamSwitcher.open()
|
|
57
|
+
cy.get(teamSwitcher.selectors.manageTeamsLink).should('exist')
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
// NOTE: Create team button is NOT in TeamSwitcherCompact
|
|
61
|
+
// It is in the full TeamSwitcher (used in settings/teams page)
|
|
62
|
+
// That button is tested in settings-teams.cy.ts
|
|
63
|
+
it('should document that create button is in settings', () => {
|
|
64
|
+
cy.log('Create Team button is in TeamSwitcher (full version)')
|
|
65
|
+
cy.log('Tested at: /dashboard/settings/teams via settings-teams.cy.ts')
|
|
66
|
+
cy.wrap(true).should('be.true')
|
|
67
|
+
})
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
// ============================================
|
|
71
|
+
// TEAM SWITCH MODAL SELECTORS (1 selector)
|
|
72
|
+
// ============================================
|
|
73
|
+
describe('Team Switch Modal Selectors', () => {
|
|
74
|
+
// Note: Switch modal only appears when switching to a different team
|
|
75
|
+
// This test validates the selector exists by attempting a switch
|
|
76
|
+
it.skip('should find switch modal during team change (requires multiple teams)', () => {
|
|
77
|
+
cy.get(teamSwitcher.selectors.switchModal).should('exist')
|
|
78
|
+
})
|
|
79
|
+
})
|
|
80
|
+
|
|
81
|
+
// ============================================
|
|
82
|
+
// CREATE TEAM DIALOG SELECTORS (7 selectors)
|
|
83
|
+
// NOTE: Create Team Dialog is opened from settings/teams page
|
|
84
|
+
// Those selectors are tested in settings-teams.cy.ts
|
|
85
|
+
// ============================================
|
|
86
|
+
describe('Create Team Dialog Selectors', () => {
|
|
87
|
+
it('should document that Create Team Dialog is in settings', () => {
|
|
88
|
+
cy.log('Create Team Dialog selectors:')
|
|
89
|
+
cy.log('- create-team-dialog')
|
|
90
|
+
cy.log('- team-name-input')
|
|
91
|
+
cy.log('- team-slug-input')
|
|
92
|
+
cy.log('- team-description-input')
|
|
93
|
+
cy.log('- cancel-create-team')
|
|
94
|
+
cy.log('- submit-create-team')
|
|
95
|
+
cy.log('Tested at: /dashboard/settings/teams')
|
|
96
|
+
cy.wrap(true).should('be.true')
|
|
97
|
+
})
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
// ============================================
|
|
101
|
+
// SIDEBAR SELECTORS (2 selectors)
|
|
102
|
+
// ============================================
|
|
103
|
+
describe('Dashboard Sidebar Selectors', () => {
|
|
104
|
+
it('should find sidebar main container', () => {
|
|
105
|
+
cy.get(teamSwitcher.selectors.sidebar).should('exist')
|
|
106
|
+
})
|
|
107
|
+
|
|
108
|
+
it('should find sidebar toggle button', () => {
|
|
109
|
+
cy.get(teamSwitcher.selectors.sidebarToggle).should('exist')
|
|
110
|
+
})
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
// ============================================
|
|
114
|
+
// MOBILE SELECTORS (3 selectors) - SKIP for desktop
|
|
115
|
+
// ============================================
|
|
116
|
+
describe('Mobile Team Switcher Selectors', () => {
|
|
117
|
+
// Note: Mobile selectors only visible on small viewports
|
|
118
|
+
it.skip('should find mobile more button (mobile viewport only)', () => {
|
|
119
|
+
cy.get(teamSwitcher.selectors.mobileMoreButton).should('exist')
|
|
120
|
+
})
|
|
121
|
+
|
|
122
|
+
it.skip('should find mobile more sheet (mobile viewport only)', () => {
|
|
123
|
+
cy.get(teamSwitcher.selectors.mobileMoreSheet).should('exist')
|
|
124
|
+
})
|
|
125
|
+
|
|
126
|
+
it.skip('should find mobile team switcher (mobile viewport only)', () => {
|
|
127
|
+
cy.get(teamSwitcher.selectors.mobileTeamSwitcher).should('exist')
|
|
128
|
+
})
|
|
129
|
+
})
|
|
130
|
+
|
|
131
|
+
// ============================================
|
|
132
|
+
// TEAM MEMBERS SELECTORS (Section at settings)
|
|
133
|
+
// These are tested in settings-teams.cy.ts
|
|
134
|
+
// ============================================
|
|
135
|
+
describe('Team Members Selectors', () => {
|
|
136
|
+
it('should document team members are in settings', () => {
|
|
137
|
+
cy.log('Team members selectors are tested in settings-teams.cy.ts')
|
|
138
|
+
cy.log('Path: /dashboard/settings/teams')
|
|
139
|
+
cy.wrap(true).should('be.true')
|
|
140
|
+
})
|
|
141
|
+
})
|
|
142
|
+
})
|