@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,335 @@
1
+ /// <reference types="cypress" />
2
+
3
+ /**
4
+ * Pages API - Status System Tests
5
+ *
6
+ * Test suite for validating the status system migration in Pages API.
7
+ * Tests status field behavior (draft, published, scheduled, archived)
8
+ * and visibility rules for public routes.
9
+ *
10
+ * Migrated from published: boolean to status: string system.
11
+ *
12
+ * Tags: @api, @feat-pages, @status-system, @regression
13
+ */
14
+
15
+ import * as allure from 'allure-cypress'
16
+
17
+ const PagesAPIController = require('../../src/controllers/PagesAPIController.js')
18
+
19
+ describe('Pages API - Status System', {
20
+ tags: ['@api', '@feat-pages', '@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 pagesAPI: InstanceType<typeof PagesAPIController>
29
+
30
+ // Track created pages for cleanup
31
+ let createdPages: string[] = []
32
+
33
+ before(() => {
34
+ // Initialize controller with superadmin credentials and team context
35
+ pagesAPI = new PagesAPIController(BASE_URL, SUPERADMIN_API_KEY, TEAM_ID)
36
+ cy.log('PagesAPIController 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('Pages Status System')
44
+ })
45
+
46
+ afterEach(() => {
47
+ // Cleanup: Delete pages created during tests
48
+ createdPages.forEach((pageId) => {
49
+ pagesAPI.deletePage(pageId)
50
+ })
51
+ createdPages = []
52
+ })
53
+
54
+ // ============================================================
55
+ // POST /api/v1/pages - Create with Status
56
+ // ============================================================
57
+ describe('POST /api/v1/pages - Create with Status', () => {
58
+ it('PAGE_STATUS_001: Should create page with default status draft', { tags: '@smoke' }, () => {
59
+ allure.story('Status System')
60
+ allure.severity('critical')
61
+
62
+ const pageData = PagesAPIController.generateRandomPageData({
63
+ title: 'Test Page Default Status'
64
+ })
65
+ delete pageData.status // Remove to test default
66
+
67
+ pagesAPI.createPage(pageData).then((response: any) => {
68
+ pagesAPI.validateSuccessResponse(response, 201)
69
+
70
+ const page = response.body.data
71
+ expect(page).to.have.property('status')
72
+ expect(page.status).to.eq('draft')
73
+
74
+ createdPages.push(page.id)
75
+ cy.log(`Created page with default status: ${page.status}`)
76
+ })
77
+ })
78
+
79
+ it('PAGE_STATUS_002: Should create page with status published', () => {
80
+ const pageData = PagesAPIController.generateRandomPageData({
81
+ title: 'Test Page Published',
82
+ status: 'published'
83
+ })
84
+
85
+ pagesAPI.createPage(pageData).then((response: any) => {
86
+ pagesAPI.validateSuccessResponse(response, 201)
87
+
88
+ const page = response.body.data
89
+ expect(page.status).to.eq('published')
90
+
91
+ createdPages.push(page.id)
92
+ cy.log(`Created page with status: published`)
93
+ })
94
+ })
95
+
96
+ it('PAGE_STATUS_003: Should create page with status scheduled', () => {
97
+ const pageData = PagesAPIController.generateRandomPageData({
98
+ title: 'Test Page Scheduled',
99
+ status: 'scheduled'
100
+ })
101
+
102
+ pagesAPI.createPage(pageData).then((response: any) => {
103
+ pagesAPI.validateSuccessResponse(response, 201)
104
+
105
+ const page = response.body.data
106
+ expect(page.status).to.eq('scheduled')
107
+
108
+ createdPages.push(page.id)
109
+ cy.log(`Created page with status: scheduled`)
110
+ })
111
+ })
112
+
113
+ it('PAGE_STATUS_004: Should create page with status archived', () => {
114
+ const pageData = PagesAPIController.generateRandomPageData({
115
+ title: 'Test Page Archived',
116
+ status: 'archived'
117
+ })
118
+
119
+ pagesAPI.createPage(pageData).then((response: any) => {
120
+ pagesAPI.validateSuccessResponse(response, 201)
121
+
122
+ const page = response.body.data
123
+ expect(page.status).to.eq('archived')
124
+
125
+ createdPages.push(page.id)
126
+ cy.log(`Created page with status: archived`)
127
+ })
128
+ })
129
+
130
+ it('PAGE_STATUS_005: Should reject invalid status value', () => {
131
+ const pageData = PagesAPIController.generateRandomPageData({
132
+ title: 'Test Page Invalid Status',
133
+ status: 'invalid-status'
134
+ })
135
+
136
+ pagesAPI.createPage(pageData).then((response: any) => {
137
+ expect(response.status).to.be.oneOf([400, 422])
138
+ expect(response.body.success).to.be.false
139
+
140
+ cy.log('Invalid status value rejected with 400/422')
141
+ })
142
+ })
143
+ })
144
+
145
+ // ============================================================
146
+ // PATCH /api/v1/pages/:id - Update Status
147
+ // ============================================================
148
+ describe('PATCH /api/v1/pages/:id - Update Status', () => {
149
+ let testPageId: string
150
+
151
+ beforeEach(() => {
152
+ // Create a test page with draft status
153
+ const pageData = PagesAPIController.generateRandomPageData({
154
+ title: `Test Update Status ${Date.now()}`,
155
+ status: 'draft'
156
+ })
157
+
158
+ pagesAPI.createPage(pageData).then((response: any) => {
159
+ testPageId = response.body.data.id
160
+ createdPages.push(testPageId)
161
+ })
162
+ })
163
+
164
+ it('PAGE_STATUS_010: Should update status from draft to published', { tags: '@smoke' }, () => {
165
+ allure.story('Status System')
166
+ allure.severity('critical')
167
+
168
+ cy.then(() => {
169
+ const updateData = {
170
+ status: 'published'
171
+ }
172
+
173
+ pagesAPI.updatePage(testPageId, updateData).then((response: any) => {
174
+ pagesAPI.validateSuccessResponse(response, 200)
175
+ expect(response.body.data.status).to.eq('published')
176
+
177
+ cy.log('Status updated from draft to published')
178
+ })
179
+ })
180
+ })
181
+
182
+ it('PAGE_STATUS_011: Should update status to scheduled', () => {
183
+ cy.then(() => {
184
+ const updateData = {
185
+ status: 'scheduled'
186
+ }
187
+
188
+ pagesAPI.updatePage(testPageId, updateData).then((response: any) => {
189
+ pagesAPI.validateSuccessResponse(response, 200)
190
+ expect(response.body.data.status).to.eq('scheduled')
191
+
192
+ cy.log('Status updated to scheduled')
193
+ })
194
+ })
195
+ })
196
+
197
+ it('PAGE_STATUS_012: Should update status to archived', () => {
198
+ cy.then(() => {
199
+ const updateData = {
200
+ status: 'archived'
201
+ }
202
+
203
+ pagesAPI.updatePage(testPageId, updateData).then((response: any) => {
204
+ pagesAPI.validateSuccessResponse(response, 200)
205
+ expect(response.body.data.status).to.eq('archived')
206
+
207
+ cy.log('Status updated to archived')
208
+ })
209
+ })
210
+ })
211
+
212
+ it('PAGE_STATUS_013: Should reject invalid status in update', () => {
213
+ cy.then(() => {
214
+ const updateData = {
215
+ status: 'invalid-status-update'
216
+ }
217
+
218
+ pagesAPI.updatePage(testPageId, updateData).then((response: any) => {
219
+ expect(response.status).to.be.oneOf([400, 422])
220
+ expect(response.body.success).to.be.false
221
+
222
+ cy.log('Invalid status update rejected')
223
+ })
224
+ })
225
+ })
226
+ })
227
+
228
+ // ============================================================
229
+ // GET /api/v1/pages - Filter by Status
230
+ // ============================================================
231
+ describe('GET /api/v1/pages - Filter by Status', () => {
232
+ it('PAGE_STATUS_020: Should filter pages by status=published', { tags: '@smoke' }, () => {
233
+ allure.story('Status Filtering')
234
+ allure.severity('critical')
235
+
236
+ pagesAPI.getPages({ status: 'published' }).then((response: any) => {
237
+ pagesAPI.validateSuccessResponse(response, 200)
238
+ expect(response.body.data).to.be.an('array')
239
+
240
+ // All returned pages should have status='published'
241
+ response.body.data.forEach((page: any) => {
242
+ expect(page.status).to.eq('published')
243
+ })
244
+
245
+ cy.log(`Found ${response.body.data.length} published pages`)
246
+ })
247
+ })
248
+
249
+ it('PAGE_STATUS_021: Should filter pages by status=draft', () => {
250
+ pagesAPI.getPages({ status: 'draft' }).then((response: any) => {
251
+ pagesAPI.validateSuccessResponse(response, 200)
252
+ expect(response.body.data).to.be.an('array')
253
+
254
+ response.body.data.forEach((page: any) => {
255
+ expect(page.status).to.eq('draft')
256
+ })
257
+
258
+ cy.log(`Found ${response.body.data.length} draft pages`)
259
+ })
260
+ })
261
+
262
+ it('PAGE_STATUS_022: Should filter pages by status=scheduled', () => {
263
+ pagesAPI.getPages({ status: 'scheduled' }).then((response: any) => {
264
+ pagesAPI.validateSuccessResponse(response, 200)
265
+ expect(response.body.data).to.be.an('array')
266
+
267
+ response.body.data.forEach((page: any) => {
268
+ expect(page.status).to.eq('scheduled')
269
+ })
270
+
271
+ cy.log(`Found ${response.body.data.length} scheduled pages`)
272
+ })
273
+ })
274
+
275
+ it('PAGE_STATUS_023: Should filter pages by status=archived', () => {
276
+ pagesAPI.getPages({ status: 'archived' }).then((response: any) => {
277
+ pagesAPI.validateSuccessResponse(response, 200)
278
+ expect(response.body.data).to.be.an('array')
279
+
280
+ response.body.data.forEach((page: any) => {
281
+ expect(page.status).to.eq('archived')
282
+ })
283
+
284
+ cy.log(`Found ${response.body.data.length} archived pages`)
285
+ })
286
+ })
287
+ })
288
+
289
+ // ============================================================
290
+ // Integration Test - Status Lifecycle
291
+ // ============================================================
292
+ describe('Integration - Status Lifecycle', () => {
293
+ it('PAGE_STATUS_100: Should complete status lifecycle: draft -> published -> archived', () => {
294
+ const pageData = PagesAPIController.generateRandomPageData({
295
+ title: `Status Lifecycle Test ${Date.now()}`,
296
+ status: 'draft'
297
+ })
298
+
299
+ // 1. CREATE as draft
300
+ pagesAPI.createPage(pageData).then((createResponse: any) => {
301
+ pagesAPI.validateSuccessResponse(createResponse, 201)
302
+ const createdPage = createResponse.body.data
303
+ expect(createdPage.status).to.eq('draft')
304
+ cy.log(`1. Created page with status: draft`)
305
+
306
+ // 2. UPDATE to published
307
+ pagesAPI.updatePage(createdPage.id, { status: 'published' })
308
+ .then((publishResponse: any) => {
309
+ pagesAPI.validateSuccessResponse(publishResponse, 200)
310
+ expect(publishResponse.body.data.status).to.eq('published')
311
+ cy.log(`2. Updated status to: published`)
312
+
313
+ // 3. UPDATE to archived
314
+ pagesAPI.updatePage(createdPage.id, { status: 'archived' })
315
+ .then((archiveResponse: any) => {
316
+ pagesAPI.validateSuccessResponse(archiveResponse, 200)
317
+ expect(archiveResponse.body.data.status).to.eq('archived')
318
+ cy.log(`3. Updated status to: archived`)
319
+
320
+ // 4. VERIFY final status
321
+ pagesAPI.getPageById(createdPage.id).then((finalResponse: any) => {
322
+ pagesAPI.validateSuccessResponse(finalResponse, 200)
323
+ expect(finalResponse.body.data.status).to.eq('archived')
324
+ cy.log('4. Verified final status: archived')
325
+ cy.log('Full status lifecycle completed successfully')
326
+
327
+ // Cleanup
328
+ pagesAPI.deletePage(createdPage.id)
329
+ })
330
+ })
331
+ })
332
+ })
333
+ })
334
+ })
335
+ })