@nextsparkjs/theme-default 0.1.0-beta.20 → 0.1.0-beta.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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.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
|
@@ -0,0 +1,396 @@
|
|
|
1
|
+
/// <reference types="cypress" />
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Posts API - Status System Tests
|
|
5
|
+
*
|
|
6
|
+
* Test suite for validating the status system migration in Posts API.
|
|
7
|
+
* Tests status field behavior (draft, published, scheduled, archived)
|
|
8
|
+
* and interaction with taxonomy relations.
|
|
9
|
+
*
|
|
10
|
+
* Migrated from published: boolean to status: string system.
|
|
11
|
+
*
|
|
12
|
+
* Tags: @api, @feat-posts, @status-system, @regression
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
import * as allure from 'allure-cypress'
|
|
16
|
+
|
|
17
|
+
const PostsAPIController = require('../../src/controllers/PostsAPIController.js')
|
|
18
|
+
|
|
19
|
+
describe('Posts API - Status System', {
|
|
20
|
+
tags: ['@api', '@feat-posts', '@status-system', '@regression']
|
|
21
|
+
}, () => {
|
|
22
|
+
// Test constants
|
|
23
|
+
const SUPERADMIN_API_KEY = 'test_api_key_for_testing_purposes_only_not_a_real_secret_key_abc123'
|
|
24
|
+
const TEAM_ID = 'team-tmt-001'
|
|
25
|
+
const BASE_URL = Cypress.config('baseUrl') || 'http://localhost:5173'
|
|
26
|
+
|
|
27
|
+
// Controller instance
|
|
28
|
+
let postsAPI: InstanceType<typeof PostsAPIController>
|
|
29
|
+
|
|
30
|
+
// Track created posts for cleanup
|
|
31
|
+
let createdPosts: string[] = []
|
|
32
|
+
|
|
33
|
+
before(() => {
|
|
34
|
+
// Initialize controller with superadmin credentials and team context
|
|
35
|
+
postsAPI = new PostsAPIController(BASE_URL, SUPERADMIN_API_KEY, TEAM_ID)
|
|
36
|
+
cy.log('PostsAPIController initialized')
|
|
37
|
+
cy.log(`Base URL: ${BASE_URL}`)
|
|
38
|
+
cy.log(`Team ID: ${TEAM_ID}`)
|
|
39
|
+
})
|
|
40
|
+
|
|
41
|
+
beforeEach(() => {
|
|
42
|
+
allure.epic('API')
|
|
43
|
+
allure.feature('Posts Status System')
|
|
44
|
+
})
|
|
45
|
+
|
|
46
|
+
afterEach(() => {
|
|
47
|
+
// Cleanup: Delete posts created during tests
|
|
48
|
+
createdPosts.forEach((postId) => {
|
|
49
|
+
postsAPI.deletePost(postId)
|
|
50
|
+
})
|
|
51
|
+
createdPosts = []
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
// ============================================================
|
|
55
|
+
// POST /api/v1/posts - Create with Status
|
|
56
|
+
// ============================================================
|
|
57
|
+
describe('POST /api/v1/posts - Create with Status', () => {
|
|
58
|
+
it('POST_STATUS_001: Should create post with default status draft', { tags: '@smoke' }, () => {
|
|
59
|
+
allure.story('Status System')
|
|
60
|
+
allure.severity('critical')
|
|
61
|
+
|
|
62
|
+
const postData = PostsAPIController.generateRandomPostData({
|
|
63
|
+
title: 'Test Post Default Status'
|
|
64
|
+
})
|
|
65
|
+
delete postData.status // Remove to test default
|
|
66
|
+
|
|
67
|
+
postsAPI.createPost(postData).then((response: any) => {
|
|
68
|
+
postsAPI.validateSuccessResponse(response, 201)
|
|
69
|
+
|
|
70
|
+
const post = response.body.data
|
|
71
|
+
expect(post).to.have.property('status')
|
|
72
|
+
expect(post.status).to.eq('draft')
|
|
73
|
+
|
|
74
|
+
createdPosts.push(post.id)
|
|
75
|
+
cy.log(`Created post with default status: ${post.status}`)
|
|
76
|
+
})
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
it('POST_STATUS_002: Should create post with status published', () => {
|
|
80
|
+
const postData = PostsAPIController.generateRandomPostData({
|
|
81
|
+
title: 'Test Post Published',
|
|
82
|
+
status: 'published'
|
|
83
|
+
})
|
|
84
|
+
|
|
85
|
+
postsAPI.createPost(postData).then((response: any) => {
|
|
86
|
+
postsAPI.validateSuccessResponse(response, 201)
|
|
87
|
+
|
|
88
|
+
const post = response.body.data
|
|
89
|
+
expect(post.status).to.eq('published')
|
|
90
|
+
|
|
91
|
+
createdPosts.push(post.id)
|
|
92
|
+
cy.log(`Created post with status: published`)
|
|
93
|
+
})
|
|
94
|
+
})
|
|
95
|
+
|
|
96
|
+
it('POST_STATUS_003: Should create post with status scheduled', () => {
|
|
97
|
+
const postData = PostsAPIController.generateRandomPostData({
|
|
98
|
+
title: 'Test Post Scheduled',
|
|
99
|
+
status: 'scheduled'
|
|
100
|
+
})
|
|
101
|
+
|
|
102
|
+
postsAPI.createPost(postData).then((response: any) => {
|
|
103
|
+
postsAPI.validateSuccessResponse(response, 201)
|
|
104
|
+
|
|
105
|
+
const post = response.body.data
|
|
106
|
+
expect(post.status).to.eq('scheduled')
|
|
107
|
+
|
|
108
|
+
createdPosts.push(post.id)
|
|
109
|
+
cy.log(`Created post with status: scheduled`)
|
|
110
|
+
})
|
|
111
|
+
})
|
|
112
|
+
|
|
113
|
+
it('POST_STATUS_004: Should create post with excerpt and featured image', () => {
|
|
114
|
+
const postData = PostsAPIController.generateRandomPostData({
|
|
115
|
+
title: 'Test Post with Content',
|
|
116
|
+
status: 'draft',
|
|
117
|
+
excerpt: 'This is a test post excerpt',
|
|
118
|
+
featuredImage: 'https://example.com/images/test-featured.jpg'
|
|
119
|
+
})
|
|
120
|
+
|
|
121
|
+
postsAPI.createPost(postData).then((response: any) => {
|
|
122
|
+
postsAPI.validateSuccessResponse(response, 201)
|
|
123
|
+
|
|
124
|
+
const post = response.body.data
|
|
125
|
+
expect(post.status).to.eq('draft')
|
|
126
|
+
expect(post.excerpt).to.eq(postData.excerpt)
|
|
127
|
+
expect(post.featuredImage).to.eq(postData.featuredImage)
|
|
128
|
+
|
|
129
|
+
createdPosts.push(post.id)
|
|
130
|
+
cy.log(`Created post with excerpt and featured image`)
|
|
131
|
+
})
|
|
132
|
+
})
|
|
133
|
+
|
|
134
|
+
it('POST_STATUS_005: Should reject invalid status value', () => {
|
|
135
|
+
const postData = PostsAPIController.generateRandomPostData({
|
|
136
|
+
title: 'Test Post Invalid Status',
|
|
137
|
+
status: 'invalid-status'
|
|
138
|
+
})
|
|
139
|
+
|
|
140
|
+
postsAPI.createPost(postData).then((response: any) => {
|
|
141
|
+
expect(response.status).to.be.oneOf([400, 422])
|
|
142
|
+
expect(response.body.success).to.be.false
|
|
143
|
+
|
|
144
|
+
cy.log('Invalid status value rejected with 400/422')
|
|
145
|
+
})
|
|
146
|
+
})
|
|
147
|
+
})
|
|
148
|
+
|
|
149
|
+
// ============================================================
|
|
150
|
+
// PUT /api/v1/posts/:id - Update Status
|
|
151
|
+
// ============================================================
|
|
152
|
+
describe('PUT /api/v1/posts/:id - Update Status', () => {
|
|
153
|
+
let testPostId: string
|
|
154
|
+
|
|
155
|
+
beforeEach(() => {
|
|
156
|
+
// Create a test post with draft status
|
|
157
|
+
const postData = PostsAPIController.generateRandomPostData({
|
|
158
|
+
title: `Test Update Status ${Date.now()}`,
|
|
159
|
+
status: 'draft'
|
|
160
|
+
})
|
|
161
|
+
|
|
162
|
+
postsAPI.createPost(postData).then((response: any) => {
|
|
163
|
+
testPostId = response.body.data.id
|
|
164
|
+
createdPosts.push(testPostId)
|
|
165
|
+
})
|
|
166
|
+
})
|
|
167
|
+
|
|
168
|
+
it('POST_STATUS_010: Should update status from draft to published', { tags: '@smoke' }, () => {
|
|
169
|
+
allure.story('Status System')
|
|
170
|
+
allure.severity('critical')
|
|
171
|
+
|
|
172
|
+
cy.then(() => {
|
|
173
|
+
const updateData = {
|
|
174
|
+
status: 'published'
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
postsAPI.updatePost(testPostId, updateData).then((response: any) => {
|
|
178
|
+
postsAPI.validateSuccessResponse(response, 200)
|
|
179
|
+
expect(response.body.data.status).to.eq('published')
|
|
180
|
+
|
|
181
|
+
cy.log('Status updated from draft to published')
|
|
182
|
+
})
|
|
183
|
+
})
|
|
184
|
+
})
|
|
185
|
+
|
|
186
|
+
it('POST_STATUS_011: Should update status to scheduled', () => {
|
|
187
|
+
cy.then(() => {
|
|
188
|
+
const updateData = {
|
|
189
|
+
status: 'scheduled'
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
postsAPI.updatePost(testPostId, updateData).then((response: any) => {
|
|
193
|
+
postsAPI.validateSuccessResponse(response, 200)
|
|
194
|
+
expect(response.body.data.status).to.eq('scheduled')
|
|
195
|
+
|
|
196
|
+
cy.log('Status updated to scheduled')
|
|
197
|
+
})
|
|
198
|
+
})
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
it('POST_STATUS_012: Should update status to archived', () => {
|
|
202
|
+
cy.then(() => {
|
|
203
|
+
const updateData = {
|
|
204
|
+
status: 'archived'
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
postsAPI.updatePost(testPostId, updateData).then((response: any) => {
|
|
208
|
+
postsAPI.validateSuccessResponse(response, 200)
|
|
209
|
+
expect(response.body.data.status).to.eq('archived')
|
|
210
|
+
|
|
211
|
+
cy.log('Status updated to archived')
|
|
212
|
+
})
|
|
213
|
+
})
|
|
214
|
+
})
|
|
215
|
+
|
|
216
|
+
it('POST_STATUS_013: Should update excerpt and maintain status', () => {
|
|
217
|
+
cy.then(() => {
|
|
218
|
+
const updateData = {
|
|
219
|
+
excerpt: 'Updated excerpt text'
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
postsAPI.updatePost(testPostId, updateData).then((response: any) => {
|
|
223
|
+
postsAPI.validateSuccessResponse(response, 200)
|
|
224
|
+
expect(response.body.data.excerpt).to.eq(updateData.excerpt)
|
|
225
|
+
expect(response.body.data.status).to.eq('draft') // Status unchanged
|
|
226
|
+
|
|
227
|
+
cy.log('Excerpt updated, status maintained')
|
|
228
|
+
})
|
|
229
|
+
})
|
|
230
|
+
})
|
|
231
|
+
|
|
232
|
+
it('POST_STATUS_014: Should reject invalid status in update', () => {
|
|
233
|
+
cy.then(() => {
|
|
234
|
+
const updateData = {
|
|
235
|
+
status: 'invalid-status-update'
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
postsAPI.updatePost(testPostId, updateData).then((response: any) => {
|
|
239
|
+
expect(response.status).to.be.oneOf([400, 422])
|
|
240
|
+
expect(response.body.success).to.be.false
|
|
241
|
+
|
|
242
|
+
cy.log('Invalid status update rejected')
|
|
243
|
+
})
|
|
244
|
+
})
|
|
245
|
+
})
|
|
246
|
+
})
|
|
247
|
+
|
|
248
|
+
// ============================================================
|
|
249
|
+
// GET /api/v1/posts - Filter by Status
|
|
250
|
+
// ============================================================
|
|
251
|
+
describe('GET /api/v1/posts - Filter by Status', () => {
|
|
252
|
+
it('POST_STATUS_020: Should filter posts by status=published', { tags: '@smoke' }, () => {
|
|
253
|
+
allure.story('Status Filtering')
|
|
254
|
+
allure.severity('critical')
|
|
255
|
+
|
|
256
|
+
postsAPI.getPosts({ status: 'published' }).then((response: any) => {
|
|
257
|
+
postsAPI.validateSuccessResponse(response, 200)
|
|
258
|
+
expect(response.body.data).to.be.an('array')
|
|
259
|
+
|
|
260
|
+
// All returned posts should have status='published'
|
|
261
|
+
response.body.data.forEach((post: any) => {
|
|
262
|
+
expect(post.status).to.eq('published')
|
|
263
|
+
})
|
|
264
|
+
|
|
265
|
+
cy.log(`Found ${response.body.data.length} published posts`)
|
|
266
|
+
})
|
|
267
|
+
})
|
|
268
|
+
|
|
269
|
+
it('POST_STATUS_021: Should filter posts by status=draft', () => {
|
|
270
|
+
postsAPI.getPosts({ status: 'draft' }).then((response: any) => {
|
|
271
|
+
postsAPI.validateSuccessResponse(response, 200)
|
|
272
|
+
expect(response.body.data).to.be.an('array')
|
|
273
|
+
|
|
274
|
+
response.body.data.forEach((post: any) => {
|
|
275
|
+
expect(post.status).to.eq('draft')
|
|
276
|
+
})
|
|
277
|
+
|
|
278
|
+
cy.log(`Found ${response.body.data.length} draft posts`)
|
|
279
|
+
})
|
|
280
|
+
})
|
|
281
|
+
|
|
282
|
+
it('POST_STATUS_022: Should return posts with categories field', () => {
|
|
283
|
+
postsAPI.getPosts({ status: 'published' }).then((response: any) => {
|
|
284
|
+
postsAPI.validateSuccessResponse(response, 200)
|
|
285
|
+
|
|
286
|
+
if (response.body.data.length > 0) {
|
|
287
|
+
const post = response.body.data[0]
|
|
288
|
+
expect(post).to.have.property('categories')
|
|
289
|
+
expect(post.categories).to.be.an('array')
|
|
290
|
+
|
|
291
|
+
cy.log('Posts include categories field (taxonomy relations)')
|
|
292
|
+
}
|
|
293
|
+
})
|
|
294
|
+
})
|
|
295
|
+
})
|
|
296
|
+
|
|
297
|
+
// ============================================================
|
|
298
|
+
// Integration Test - Status with Taxonomies
|
|
299
|
+
// ============================================================
|
|
300
|
+
describe('Integration - Status with Taxonomies', () => {
|
|
301
|
+
it('POST_STATUS_100: Should create published post and retrieve with categories', () => {
|
|
302
|
+
const postData = PostsAPIController.generateRandomPostData({
|
|
303
|
+
title: `Integration Test ${Date.now()}`,
|
|
304
|
+
status: 'published',
|
|
305
|
+
excerpt: 'Integration test excerpt',
|
|
306
|
+
categoryIds: [] // Empty for now, can be extended with actual category IDs
|
|
307
|
+
})
|
|
308
|
+
|
|
309
|
+
// 1. CREATE published post
|
|
310
|
+
postsAPI.createPost(postData).then((createResponse: any) => {
|
|
311
|
+
postsAPI.validateSuccessResponse(createResponse, 201)
|
|
312
|
+
const createdPost = createResponse.body.data
|
|
313
|
+
expect(createdPost.status).to.eq('published')
|
|
314
|
+
cy.log(`1. Created published post: ${createdPost.id}`)
|
|
315
|
+
|
|
316
|
+
// 2. RETRIEVE by ID (verify categories included)
|
|
317
|
+
postsAPI.getPostById(createdPost.id).then((getResponse: any) => {
|
|
318
|
+
postsAPI.validateSuccessResponse(getResponse, 200)
|
|
319
|
+
expect(getResponse.body.data.status).to.eq('published')
|
|
320
|
+
expect(getResponse.body.data).to.have.property('categories')
|
|
321
|
+
expect(getResponse.body.data.categories).to.be.an('array')
|
|
322
|
+
cy.log(`2. Retrieved post with categories field`)
|
|
323
|
+
|
|
324
|
+
// 3. UPDATE to draft
|
|
325
|
+
postsAPI.updatePost(createdPost.id, { status: 'draft' })
|
|
326
|
+
.then((updateResponse: any) => {
|
|
327
|
+
postsAPI.validateSuccessResponse(updateResponse, 200)
|
|
328
|
+
expect(updateResponse.body.data.status).to.eq('draft')
|
|
329
|
+
cy.log(`3. Updated status to draft`)
|
|
330
|
+
|
|
331
|
+
// 4. VERIFY not in published filter
|
|
332
|
+
postsAPI.getPosts({ status: 'published' }).then((filterResponse: any) => {
|
|
333
|
+
const foundInPublished = filterResponse.body.data.some(
|
|
334
|
+
(p: any) => p.id === createdPost.id
|
|
335
|
+
)
|
|
336
|
+
expect(foundInPublished).to.be.false
|
|
337
|
+
cy.log('4. Verified post not in published filter')
|
|
338
|
+
cy.log('Integration test completed successfully')
|
|
339
|
+
|
|
340
|
+
// Cleanup
|
|
341
|
+
postsAPI.deletePost(createdPost.id)
|
|
342
|
+
})
|
|
343
|
+
})
|
|
344
|
+
})
|
|
345
|
+
})
|
|
346
|
+
})
|
|
347
|
+
})
|
|
348
|
+
|
|
349
|
+
// ============================================================
|
|
350
|
+
// Integration Test - Status Lifecycle
|
|
351
|
+
// ============================================================
|
|
352
|
+
describe('Integration - Status Lifecycle', () => {
|
|
353
|
+
it('POST_STATUS_200: Should complete status lifecycle: draft -> published -> archived', () => {
|
|
354
|
+
const postData = PostsAPIController.generateRandomPostData({
|
|
355
|
+
title: `Status Lifecycle Test ${Date.now()}`,
|
|
356
|
+
status: 'draft',
|
|
357
|
+
excerpt: 'Lifecycle test excerpt'
|
|
358
|
+
})
|
|
359
|
+
|
|
360
|
+
// 1. CREATE as draft
|
|
361
|
+
postsAPI.createPost(postData).then((createResponse: any) => {
|
|
362
|
+
postsAPI.validateSuccessResponse(createResponse, 201)
|
|
363
|
+
const createdPost = createResponse.body.data
|
|
364
|
+
expect(createdPost.status).to.eq('draft')
|
|
365
|
+
cy.log(`1. Created post with status: draft`)
|
|
366
|
+
|
|
367
|
+
// 2. UPDATE to published
|
|
368
|
+
postsAPI.updatePost(createdPost.id, { status: 'published' })
|
|
369
|
+
.then((publishResponse: any) => {
|
|
370
|
+
postsAPI.validateSuccessResponse(publishResponse, 200)
|
|
371
|
+
expect(publishResponse.body.data.status).to.eq('published')
|
|
372
|
+
cy.log(`2. Updated status to: published`)
|
|
373
|
+
|
|
374
|
+
// 3. UPDATE to archived
|
|
375
|
+
postsAPI.updatePost(createdPost.id, { status: 'archived' })
|
|
376
|
+
.then((archiveResponse: any) => {
|
|
377
|
+
postsAPI.validateSuccessResponse(archiveResponse, 200)
|
|
378
|
+
expect(archiveResponse.body.data.status).to.eq('archived')
|
|
379
|
+
cy.log(`3. Updated status to: archived`)
|
|
380
|
+
|
|
381
|
+
// 4. VERIFY final status
|
|
382
|
+
postsAPI.getPostById(createdPost.id).then((finalResponse: any) => {
|
|
383
|
+
postsAPI.validateSuccessResponse(finalResponse, 200)
|
|
384
|
+
expect(finalResponse.body.data.status).to.eq('archived')
|
|
385
|
+
cy.log('4. Verified final status: archived')
|
|
386
|
+
cy.log('Full status lifecycle completed successfully')
|
|
387
|
+
|
|
388
|
+
// Cleanup
|
|
389
|
+
postsAPI.deletePost(createdPost.id)
|
|
390
|
+
})
|
|
391
|
+
})
|
|
392
|
+
})
|
|
393
|
+
})
|
|
394
|
+
})
|
|
395
|
+
})
|
|
396
|
+
})
|