@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.
Files changed (220) hide show
  1. package/package.json +1 -1
  2. package/tests/cypress/e2e/_devtools/access.bdd.md +262 -0
  3. package/tests/cypress/e2e/_devtools/access.cy.ts +171 -0
  4. package/tests/cypress/e2e/_devtools/navigation.bdd.md +261 -0
  5. package/tests/cypress/e2e/_devtools/navigation.cy.ts +157 -0
  6. package/tests/cypress/e2e/_devtools/pages.bdd.md +303 -0
  7. package/tests/cypress/e2e/_devtools/pages.cy.ts +184 -0
  8. package/tests/cypress/e2e/_docs/README.md +215 -0
  9. package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin-teams.narration.json +155 -0
  10. package/tests/cypress/e2e/_docs/tutorials/sector7-superadmin.cy.ts +390 -0
  11. package/tests/cypress/e2e/_docs/tutorials/teams-system.doc.cy.ts +349 -0
  12. package/tests/cypress/e2e/_docs/tutorials/teams-system.narration.json +165 -0
  13. package/tests/cypress/e2e/_selectors/auth.cy.ts +306 -0
  14. package/tests/cypress/e2e/_selectors/billing.cy.ts +89 -0
  15. package/tests/cypress/e2e/_selectors/dashboard-mobile.cy.ts +113 -0
  16. package/tests/cypress/e2e/_selectors/dashboard-navigation.cy.ts +89 -0
  17. package/tests/cypress/e2e/_selectors/dashboard-sidebar.cy.ts +60 -0
  18. package/tests/cypress/e2e/_selectors/dashboard-topnav.cy.ts +146 -0
  19. package/tests/cypress/e2e/_selectors/devtools.cy.ts +210 -0
  20. package/tests/cypress/e2e/_selectors/global-search.cy.ts +88 -0
  21. package/tests/cypress/e2e/_selectors/pages-editor.cy.ts +179 -0
  22. package/tests/cypress/e2e/_selectors/posts-editor.cy.ts +282 -0
  23. package/tests/cypress/e2e/_selectors/public.cy.ts +112 -0
  24. package/tests/cypress/e2e/_selectors/settings-api-keys.cy.ts +228 -0
  25. package/tests/cypress/e2e/_selectors/settings-billing.cy.ts +105 -0
  26. package/tests/cypress/e2e/_selectors/settings-layout.cy.ts +119 -0
  27. package/tests/cypress/e2e/_selectors/settings-password.cy.ts +71 -0
  28. package/tests/cypress/e2e/_selectors/settings-profile.cy.ts +82 -0
  29. package/tests/cypress/e2e/_selectors/settings-teams.cy.ts +68 -0
  30. package/tests/cypress/e2e/_selectors/superadmin.cy.ts +185 -0
  31. package/tests/cypress/e2e/_selectors/tasks.cy.ts +242 -0
  32. package/tests/cypress/e2e/_selectors/taxonomies.cy.ts +126 -0
  33. package/tests/cypress/e2e/_selectors/teams.cy.ts +142 -0
  34. package/tests/cypress/e2e/_superadmin/all-teams.bdd.md +261 -0
  35. package/tests/cypress/e2e/_superadmin/all-teams.cy.ts +177 -0
  36. package/tests/cypress/e2e/_superadmin/all-users.bdd.md +406 -0
  37. package/tests/cypress/e2e/_superadmin/all-users.cy.ts +294 -0
  38. package/tests/cypress/e2e/_superadmin/dashboard.bdd.md +235 -0
  39. package/tests/cypress/e2e/_superadmin/dashboard.cy.ts +149 -0
  40. package/tests/cypress/e2e/_superadmin/subscriptions-overview.bdd.md +290 -0
  41. package/tests/cypress/e2e/_superadmin/subscriptions-overview.cy.ts +194 -0
  42. package/tests/cypress/e2e/ai/ai-usage.cy.ts +209 -0
  43. package/tests/cypress/e2e/ai/chat-api.cy.ts +107 -0
  44. package/tests/cypress/e2e/ai/guardrails.cy.ts +332 -0
  45. package/tests/cypress/e2e/api/billing/BillingAPIController.js +319 -0
  46. package/tests/cypress/e2e/api/billing/check-action.cy.ts +326 -0
  47. package/tests/cypress/e2e/api/billing/checkout.cy.ts +358 -0
  48. package/tests/cypress/e2e/api/billing/lifecycle.cy.ts +423 -0
  49. package/tests/cypress/e2e/api/billing/plans/README.md +345 -0
  50. package/tests/cypress/e2e/api/billing/plans/business.cy.ts +412 -0
  51. package/tests/cypress/e2e/api/billing/plans/downgrade.cy.ts +510 -0
  52. package/tests/cypress/e2e/api/billing/plans/fixtures/billing-plans.json +163 -0
  53. package/tests/cypress/e2e/api/billing/plans/free.cy.ts +500 -0
  54. package/tests/cypress/e2e/api/billing/plans/pro.cy.ts +497 -0
  55. package/tests/cypress/e2e/api/billing/plans/starter.cy.ts +342 -0
  56. package/tests/cypress/e2e/api/billing/portal.cy.ts +313 -0
  57. package/tests/cypress/e2e/api/devtools/registries.bdd.md +300 -0
  58. package/tests/cypress/e2e/api/devtools/registries.cy.ts +368 -0
  59. package/tests/cypress/e2e/api/entities/blocks-scope.cy.ts +396 -0
  60. package/tests/cypress/e2e/api/entities/customers-crud.cy.ts +648 -0
  61. package/tests/cypress/e2e/api/entities/customers-metas.cy.ts +839 -0
  62. package/tests/cypress/e2e/api/entities/pages-crud.cy.ts +425 -0
  63. package/tests/cypress/e2e/api/entities/pages-status.cy.ts +335 -0
  64. package/tests/cypress/e2e/api/entities/post-categories-crud.cy.ts +610 -0
  65. package/tests/cypress/e2e/api/entities/posts-crud.cy.ts +709 -0
  66. package/tests/cypress/e2e/api/entities/posts-status.cy.ts +396 -0
  67. package/tests/cypress/e2e/api/entities/tasks-crud.cy.ts +602 -0
  68. package/tests/cypress/e2e/api/entities/tasks-metas.cy.ts +878 -0
  69. package/tests/cypress/e2e/api/entities/users-crud.cy.ts +469 -0
  70. package/tests/cypress/e2e/api/entities/users-metas.cy.ts +913 -0
  71. package/tests/cypress/e2e/api/entities/users-security.cy.ts +375 -0
  72. package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.bdd.md +375 -0
  73. package/tests/cypress/e2e/api/scheduled-actions/cron-endpoint.cy.ts +346 -0
  74. package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.bdd.md +451 -0
  75. package/tests/cypress/e2e/api/scheduled-actions/devtools-endpoint.cy.ts +447 -0
  76. package/tests/cypress/e2e/api/scheduled-actions/scheduling.bdd.md +649 -0
  77. package/tests/cypress/e2e/api/scheduled-actions/scheduling.cy.ts +333 -0
  78. package/tests/cypress/e2e/api/settings/api-keys.crud.cy.ts +923 -0
  79. package/tests/cypress/e2e/uat/auth/app-roles/developer-login.bdd.md +231 -0
  80. package/tests/cypress/e2e/uat/auth/app-roles/developer-login.cy.ts +144 -0
  81. package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.bdd.md +118 -0
  82. package/tests/cypress/e2e/uat/auth/app-roles/superadmin-login.cy.ts +84 -0
  83. package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.bdd.md +288 -0
  84. package/tests/cypress/e2e/uat/auth/custom-roles/editor-login.cy.ts +188 -0
  85. package/tests/cypress/e2e/uat/auth/login-logout.bdd.md +160 -0
  86. package/tests/cypress/e2e/uat/auth/login-logout.cy.ts +116 -0
  87. package/tests/cypress/e2e/uat/auth/password-reset.bdd.md +289 -0
  88. package/tests/cypress/e2e/uat/auth/password-reset.cy.ts +200 -0
  89. package/tests/cypress/e2e/uat/auth/team-roles/admin-login.bdd.md +225 -0
  90. package/tests/cypress/e2e/uat/auth/team-roles/admin-login.cy.ts +148 -0
  91. package/tests/cypress/e2e/uat/auth/team-roles/member-login.bdd.md +251 -0
  92. package/tests/cypress/e2e/uat/auth/team-roles/member-login.cy.ts +163 -0
  93. package/tests/cypress/e2e/uat/auth/team-roles/owner-login.bdd.md +231 -0
  94. package/tests/cypress/e2e/uat/auth/team-roles/owner-login.cy.ts +141 -0
  95. package/tests/cypress/e2e/uat/billing/extended.bdd.md +273 -0
  96. package/tests/cypress/e2e/uat/billing/extended.cy.ts +209 -0
  97. package/tests/cypress/e2e/uat/billing/feature-gates.bdd.md +407 -0
  98. package/tests/cypress/e2e/uat/billing/feature-gates.cy.ts +307 -0
  99. package/tests/cypress/e2e/uat/billing/page.bdd.md +329 -0
  100. package/tests/cypress/e2e/uat/billing/page.cy.ts +250 -0
  101. package/tests/cypress/e2e/uat/billing/status.bdd.md +190 -0
  102. package/tests/cypress/e2e/uat/billing/status.cy.ts +145 -0
  103. package/tests/cypress/e2e/uat/billing/team-switch.bdd.md +156 -0
  104. package/tests/cypress/e2e/uat/billing/team-switch.cy.ts +122 -0
  105. package/tests/cypress/e2e/uat/billing/usage.bdd.md +218 -0
  106. package/tests/cypress/e2e/uat/billing/usage.cy.ts +176 -0
  107. package/tests/cypress/e2e/uat/blocks/hero.bdd.md +124 -0
  108. package/tests/cypress/e2e/uat/blocks/hero.cy.ts +56 -0
  109. package/tests/cypress/e2e/uat/devtools/api-tester.cy.ts +390 -0
  110. package/tests/cypress/e2e/uat/entities/customers/member.bdd.md +275 -0
  111. package/tests/cypress/e2e/uat/entities/customers/member.cy.ts +122 -0
  112. package/tests/cypress/e2e/uat/entities/customers/owner.bdd.md +243 -0
  113. package/tests/cypress/e2e/uat/entities/customers/owner.cy.ts +165 -0
  114. package/tests/cypress/e2e/uat/entities/pages/block-crud.bdd.md +476 -0
  115. package/tests/cypress/e2e/uat/entities/pages/block-crud.cy.ts +486 -0
  116. package/tests/cypress/e2e/uat/entities/pages/block-editor.bdd.md +460 -0
  117. package/tests/cypress/e2e/uat/entities/pages/block-editor.cy.ts +301 -0
  118. package/tests/cypress/e2e/uat/entities/pages/list.bdd.md +432 -0
  119. package/tests/cypress/e2e/uat/entities/pages/list.cy.ts +273 -0
  120. package/tests/cypress/e2e/uat/entities/pages/public-rendering.bdd.md +696 -0
  121. package/tests/cypress/e2e/uat/entities/pages/public-rendering.cy.ts +340 -0
  122. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.bdd.md +161 -0
  123. package/tests/cypress/e2e/uat/entities/posts/categories-api-aware.cy.ts +104 -0
  124. package/tests/cypress/e2e/uat/entities/posts/categories.bdd.md +375 -0
  125. package/tests/cypress/e2e/uat/entities/posts/categories.cy.ts +241 -0
  126. package/tests/cypress/e2e/uat/entities/posts/editor.bdd.md +429 -0
  127. package/tests/cypress/e2e/uat/entities/posts/editor.cy.ts +257 -0
  128. package/tests/cypress/e2e/uat/entities/posts/list.bdd.md +340 -0
  129. package/tests/cypress/e2e/uat/entities/posts/list.cy.ts +177 -0
  130. package/tests/cypress/e2e/uat/entities/posts/public.bdd.md +614 -0
  131. package/tests/cypress/e2e/uat/entities/posts/public.cy.ts +249 -0
  132. package/tests/cypress/e2e/uat/entities/tasks/member.bdd.md +222 -0
  133. package/tests/cypress/e2e/uat/entities/tasks/member.cy.ts +165 -0
  134. package/tests/cypress/e2e/uat/entities/tasks/owner.bdd.md +419 -0
  135. package/tests/cypress/e2e/uat/entities/tasks/owner.cy.ts +191 -0
  136. package/tests/cypress/e2e/uat/roles/editor-role.bdd.md +552 -0
  137. package/tests/cypress/e2e/uat/roles/editor-role.cy.ts +210 -0
  138. package/tests/cypress/e2e/uat/roles/member-restrictions.bdd.md +450 -0
  139. package/tests/cypress/e2e/uat/roles/member-restrictions.cy.ts +189 -0
  140. package/tests/cypress/e2e/uat/roles/owner-full-crud.bdd.md +530 -0
  141. package/tests/cypress/e2e/uat/roles/owner-full-crud.cy.ts +247 -0
  142. package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.bdd.md +736 -0
  143. package/tests/cypress/e2e/uat/scheduled-actions/devtools-ui.cy.ts +740 -0
  144. package/tests/cypress/e2e/uat/teams/roles-matrix.bdd.md +553 -0
  145. package/tests/cypress/e2e/uat/teams/roles-matrix.cy.ts +185 -0
  146. package/tests/cypress/e2e/uat/teams/switcher.bdd.md +1151 -0
  147. package/tests/cypress/e2e/uat/teams/switcher.cy.ts +497 -0
  148. package/tests/cypress/e2e/uat/teams/team-switcher.md +198 -0
  149. package/tests/cypress/fixtures/blocks.json +218 -0
  150. package/tests/cypress/fixtures/entities.json +78 -0
  151. package/tests/cypress/fixtures/page-builder.json +21 -0
  152. package/tests/cypress/src/components/CategoriesPOM.ts +382 -0
  153. package/tests/cypress/src/components/CustomersPOM.ts +439 -0
  154. package/tests/cypress/src/components/DevKeyringPOM.ts +160 -0
  155. package/tests/cypress/src/components/EntityForm.ts +375 -0
  156. package/tests/cypress/src/components/EntityList.ts +389 -0
  157. package/tests/cypress/src/components/PageBuilderPOM.ts +710 -0
  158. package/tests/cypress/src/components/PostEditorPOM.ts +370 -0
  159. package/tests/cypress/src/components/PostsListPOM.ts +223 -0
  160. package/tests/cypress/src/components/PublicPagePOM.ts +447 -0
  161. package/tests/cypress/src/components/PublicPostPOM.ts +146 -0
  162. package/tests/cypress/src/components/TasksPOM.ts +272 -0
  163. package/tests/cypress/src/components/TeamSwitcherPOM.ts +450 -0
  164. package/tests/cypress/src/components/index.ts +21 -0
  165. package/tests/cypress/src/controllers/ApiKeysAPIController.js +178 -0
  166. package/tests/cypress/src/controllers/BaseAPIController.js +317 -0
  167. package/tests/cypress/src/controllers/CustomerAPIController.js +251 -0
  168. package/tests/cypress/src/controllers/PagesAPIController.js +226 -0
  169. package/tests/cypress/src/controllers/PostsAPIController.js +250 -0
  170. package/tests/cypress/src/controllers/TaskAPIController.js +240 -0
  171. package/tests/cypress/src/controllers/UsersAPIController.js +242 -0
  172. package/tests/cypress/src/controllers/index.js +25 -0
  173. package/tests/cypress/src/core/AuthPOM.ts +450 -0
  174. package/tests/cypress/src/core/BasePOM.ts +86 -0
  175. package/tests/cypress/src/core/BlockEditorBasePOM.ts +576 -0
  176. package/tests/cypress/src/core/DashboardEntityPOM.ts +692 -0
  177. package/tests/cypress/src/core/index.ts +14 -0
  178. package/tests/cypress/src/entities/CustomersPOM.ts +172 -0
  179. package/tests/cypress/src/entities/PagesPOM.ts +137 -0
  180. package/tests/cypress/src/entities/PostsPOM.ts +137 -0
  181. package/tests/cypress/src/entities/TasksPOM.ts +176 -0
  182. package/tests/cypress/src/entities/index.ts +14 -0
  183. package/tests/cypress/src/features/BillingPOM.ts +385 -0
  184. package/tests/cypress/src/features/DashboardPOM.ts +245 -0
  185. package/tests/cypress/src/features/DevtoolsPOM.ts +739 -0
  186. package/tests/cypress/src/features/PageBuilderPOM.ts +263 -0
  187. package/tests/cypress/src/features/PostEditorPOM.ts +313 -0
  188. package/tests/cypress/src/features/ScheduledActionsPOM.ts +463 -0
  189. package/tests/cypress/src/features/SettingsPOM.ts +362 -0
  190. package/tests/cypress/src/features/SuperadminPOM.ts +331 -0
  191. package/tests/cypress/src/features/SuperadminTeamRolesPOM.ts +285 -0
  192. package/tests/cypress/src/features/index.ts +28 -0
  193. package/tests/cypress/src/helpers/ApiInterceptor.ts +177 -0
  194. package/tests/cypress/src/index.ts +101 -0
  195. package/tests/cypress/src/pages/dashboard/Dashboard.js +677 -0
  196. package/tests/cypress/src/pages/dashboard/DashboardPage.js +43 -0
  197. package/tests/cypress/src/pages/dashboard/DashboardStats.js +546 -0
  198. package/tests/cypress/src/pages/dashboard/index.js +6 -0
  199. package/tests/cypress/src/pages/index.js +5 -0
  200. package/tests/cypress/src/pages/public/FeaturesPage.js +28 -0
  201. package/tests/cypress/src/pages/public/LandingPage.js +69 -0
  202. package/tests/cypress/src/pages/public/PricingPage.js +33 -0
  203. package/tests/cypress/src/pages/public/index.js +6 -0
  204. package/tests/cypress/src/selectors.ts +46 -0
  205. package/tests/cypress/src/session-helpers.ts +500 -0
  206. package/tests/cypress/support/doc-commands.ts +260 -0
  207. package/tests/cypress.config.ts +150 -0
  208. package/tests/jest/components/post-header.test.tsx +377 -0
  209. package/tests/jest/config/role-config.test.ts +529 -0
  210. package/tests/jest/jest.config.ts +81 -0
  211. package/tests/jest/langchain/COVERAGE.md +372 -0
  212. package/tests/jest/langchain/guardrails.test.ts +465 -0
  213. package/tests/jest/langchain/streaming.test.ts +367 -0
  214. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  215. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  216. package/tests/jest/langchain/tracer.test.ts +823 -0
  217. package/tests/jest/user-roles/role-helpers.test.ts +432 -0
  218. package/tests/jest/validation/categories.test.ts +429 -0
  219. package/tests/jest/validation/posts.test.ts +546 -0
  220. 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
+ })