@nextsparkjs/theme-default 0.1.0-beta.20 → 0.1.0-beta.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (221) 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/support/e2e.ts +89 -0
  208. package/tests/cypress.config.ts +165 -0
  209. package/tests/jest/components/post-header.test.tsx +377 -0
  210. package/tests/jest/config/role-config.test.ts +529 -0
  211. package/tests/jest/jest.config.ts +81 -0
  212. package/tests/jest/langchain/COVERAGE.md +372 -0
  213. package/tests/jest/langchain/guardrails.test.ts +465 -0
  214. package/tests/jest/langchain/streaming.test.ts +367 -0
  215. package/tests/jest/langchain/token-tracker.test.ts +455 -0
  216. package/tests/jest/langchain/tracer-callbacks.test.ts +881 -0
  217. package/tests/jest/langchain/tracer.test.ts +823 -0
  218. package/tests/jest/user-roles/role-helpers.test.ts +432 -0
  219. package/tests/jest/validation/categories.test.ts +429 -0
  220. package/tests/jest/validation/posts.test.ts +546 -0
  221. package/tests/tsconfig.json +15 -0
@@ -0,0 +1,407 @@
1
+ ---
2
+ feature: Feature Gates UAT
3
+ priority: high
4
+ tags: [billing, uat, feature-gates, fake-door]
5
+ grepTags: [uat, billing, feature-gates]
6
+ coverage: 12
7
+ ---
8
+
9
+ # Feature Gates - UAT Tests
10
+
11
+ > Browser-based tests that validate feature access control based on subscription plans (Free, Pro, Enterprise). These "fake door" feature pages test plan-based gating.
12
+
13
+ ## Features Under Test
14
+
15
+ | Feature | Feature Slug | Free | Pro | Enterprise |
16
+ |---------|--------------|------|-----|------------|
17
+ | Advanced Analytics | `advanced_analytics` | ❌ | ✅ | ✅ |
18
+ | Webhooks | `webhooks` | ❌ | ✅ | ✅ |
19
+ | Task Automation | `task_automation` | ❌ | ✅ | ✅ |
20
+
21
+ ---
22
+
23
+ ## @test FEAT-UAT-001: Free plan user sees placeholder for Advanced Analytics
24
+
25
+ ### Metadata
26
+ - **Priority:** Critical
27
+ - **Type:** Smoke
28
+ - **Tags:** free-plan, feature-gate, analytics
29
+ - **Grep:** `@smoke`
30
+
31
+ ```gherkin:en
32
+ Scenario: Free plan user cannot access Advanced Analytics
33
+
34
+ Given I am logged in as Carlos (Free plan team)
35
+ When I visit /dashboard/features/analytics
36
+ Then I should see the feature placeholder
37
+ And I should see the upgrade button
38
+ And I should NOT see the analytics content
39
+ ```
40
+
41
+ ```gherkin:es
42
+ Scenario: Usuario Free no puede acceder a Analytics Avanzados
43
+
44
+ Given estoy logueado como Carlos (team con plan Free)
45
+ When visito /dashboard/features/analytics
46
+ Then deberia ver el placeholder de la funcion
47
+ And deberia ver el boton de upgrade
48
+ And NO deberia ver el contenido de analytics
49
+ ```
50
+
51
+ ### Expected Results
52
+ - Feature placeholder is visible with `[data-cy="feature-placeholder-advanced_analytics"]`
53
+ - Upgrade button is visible with `[data-cy="placeholder-upgrade-btn"]`
54
+ - Analytics content NOT visible
55
+
56
+ ---
57
+
58
+ ## @test FEAT-UAT-002: Free plan user sees placeholder for Webhooks
59
+
60
+ ### Metadata
61
+ - **Priority:** Critical
62
+ - **Type:** Smoke
63
+ - **Tags:** free-plan, feature-gate, webhooks
64
+ - **Grep:** `@smoke`
65
+
66
+ ```gherkin:en
67
+ Scenario: Free plan user cannot access Webhooks
68
+
69
+ Given I am logged in as Carlos (Free plan team)
70
+ When I visit /dashboard/features/webhooks
71
+ Then I should see the feature placeholder
72
+ And I should see the upgrade button
73
+ And I should NOT see the webhooks content
74
+ ```
75
+
76
+ ```gherkin:es
77
+ Scenario: Usuario Free no puede acceder a Webhooks
78
+
79
+ Given estoy logueado como Carlos (team con plan Free)
80
+ When visito /dashboard/features/webhooks
81
+ Then deberia ver el placeholder de la funcion
82
+ And deberia ver el boton de upgrade
83
+ And NO deberia ver el contenido de webhooks
84
+ ```
85
+
86
+ ### Expected Results
87
+ - Feature placeholder is visible with `[data-cy="feature-placeholder-webhooks"]`
88
+ - Upgrade button visible
89
+ - Webhooks content NOT visible
90
+
91
+ ---
92
+
93
+ ## @test FEAT-UAT-003: Free plan user sees placeholder for Task Automation
94
+
95
+ ### Metadata
96
+ - **Priority:** Critical
97
+ - **Type:** Smoke
98
+ - **Tags:** free-plan, feature-gate, automation
99
+ - **Grep:** `@smoke`
100
+
101
+ ```gherkin:en
102
+ Scenario: Free plan user cannot access Task Automation
103
+
104
+ Given I am logged in as Carlos (Free plan team)
105
+ When I visit /dashboard/features/automation
106
+ Then I should see the feature placeholder
107
+ And I should see the upgrade button
108
+ And I should NOT see the automation content
109
+ ```
110
+
111
+ ```gherkin:es
112
+ Scenario: Usuario Free no puede acceder a Automatizacion de Tareas
113
+
114
+ Given estoy logueado como Carlos (team con plan Free)
115
+ When visito /dashboard/features/automation
116
+ Then deberia ver el placeholder de la funcion
117
+ And deberia ver el boton de upgrade
118
+ And NO deberia ver el contenido de automatizacion
119
+ ```
120
+
121
+ ### Expected Results
122
+ - Feature placeholder is visible with `[data-cy="feature-placeholder-task_automation"]`
123
+ - Upgrade button visible
124
+ - Automation content NOT visible
125
+
126
+ ---
127
+
128
+ ## @test FEAT-UAT-010: Pro plan user can access Advanced Analytics
129
+
130
+ ### Metadata
131
+ - **Priority:** Critical
132
+ - **Type:** Smoke
133
+ - **Tags:** pro-plan, feature-gate, analytics
134
+ - **Grep:** `@smoke`
135
+
136
+ ```gherkin:en
137
+ Scenario: Pro plan user can access Advanced Analytics
138
+
139
+ Given I am logged in as Carlos (Pro plan team - Everpoint)
140
+ When I visit /dashboard/features/analytics
141
+ Then I should see the analytics content
142
+ And I should NOT see the feature placeholder
143
+ ```
144
+
145
+ ```gherkin:es
146
+ Scenario: Usuario Pro puede acceder a Analytics Avanzados
147
+
148
+ Given estoy logueado como Carlos (team Pro - Everpoint)
149
+ When visito /dashboard/features/analytics
150
+ Then deberia ver el contenido de analytics
151
+ And NO deberia ver el placeholder de la funcion
152
+ ```
153
+
154
+ ### Expected Results
155
+ - Analytics content visible with `[data-cy="analytics-content"]`
156
+ - Feature placeholder NOT visible
157
+
158
+ ---
159
+
160
+ ## @test FEAT-UAT-011: Pro plan user can access Webhooks
161
+
162
+ ### Metadata
163
+ - **Priority:** Critical
164
+ - **Type:** Smoke
165
+ - **Tags:** pro-plan, feature-gate, webhooks
166
+ - **Grep:** `@smoke`
167
+
168
+ ```gherkin:en
169
+ Scenario: Pro plan user can access Webhooks
170
+
171
+ Given I am logged in as Carlos (Pro plan team - Everpoint)
172
+ When I visit /dashboard/features/webhooks
173
+ Then I should see the webhooks content
174
+ And I should NOT see the feature placeholder
175
+ ```
176
+
177
+ ```gherkin:es
178
+ Scenario: Usuario Pro puede acceder a Webhooks
179
+
180
+ Given estoy logueado como Carlos (team Pro - Everpoint)
181
+ When visito /dashboard/features/webhooks
182
+ Then deberia ver el contenido de webhooks
183
+ And NO deberia ver el placeholder de la funcion
184
+ ```
185
+
186
+ ### Expected Results
187
+ - Webhooks content visible with `[data-cy="webhooks-content"]`
188
+ - Feature placeholder NOT visible
189
+
190
+ ---
191
+
192
+ ## @test FEAT-UAT-012: Pro plan user can access Task Automation
193
+
194
+ ### Metadata
195
+ - **Priority:** Critical
196
+ - **Type:** Smoke
197
+ - **Tags:** pro-plan, feature-gate, automation
198
+ - **Grep:** `@smoke`
199
+
200
+ ```gherkin:en
201
+ Scenario: Pro plan user can access Task Automation
202
+
203
+ Given I am logged in as Carlos (Pro plan team - Everpoint)
204
+ When I visit /dashboard/features/automation
205
+ Then I should see the automation content
206
+ And I should NOT see the feature placeholder
207
+ ```
208
+
209
+ ```gherkin:es
210
+ Scenario: Usuario Pro puede acceder a Automatizacion de Tareas
211
+
212
+ Given estoy logueado como Carlos (team Pro - Everpoint)
213
+ When visito /dashboard/features/automation
214
+ Then deberia ver el contenido de automatizacion
215
+ And NO deberia ver el placeholder de la funcion
216
+ ```
217
+
218
+ ### Expected Results
219
+ - Automation content visible with `[data-cy="automation-content"]`
220
+ - Feature placeholder NOT visible
221
+
222
+ ---
223
+
224
+ ## @test FEAT-UAT-020: Enterprise plan user can access all features
225
+
226
+ ### Metadata
227
+ - **Priority:** Critical
228
+ - **Type:** Smoke
229
+ - **Tags:** enterprise-plan, feature-gate
230
+ - **Grep:** `@smoke`
231
+
232
+ ```gherkin:en
233
+ Scenario: Enterprise plan user can access all features
234
+
235
+ Given I am logged in as Ana (Enterprise plan team - Ironvale)
236
+ When I visit each feature page
237
+ Then I should see the feature content for all features
238
+ And I should NOT see any feature placeholders
239
+ ```
240
+
241
+ ```gherkin:es
242
+ Scenario: Usuario Enterprise puede acceder a todas las funciones
243
+
244
+ Given estoy logueado como Ana (team Enterprise - Ironvale)
245
+ When visito cada pagina de funcion
246
+ Then deberia ver el contenido de todas las funciones
247
+ And NO deberia ver ningun placeholder
248
+ ```
249
+
250
+ ### Expected Results
251
+ - All feature pages show content, not placeholders
252
+
253
+ ---
254
+
255
+ ## @test FEAT-UAT-030: Placeholder upgrade button navigates to pricing
256
+
257
+ ### Metadata
258
+ - **Priority:** Normal
259
+ - **Type:** Regression
260
+ - **Tags:** navigation, upgrade, placeholder
261
+ - **Grep:** `@regression`
262
+
263
+ ```gherkin:en
264
+ Scenario: Placeholder upgrade button works
265
+
266
+ Given I am logged in as Carlos (Free plan team)
267
+ And I am on a blocked feature page
268
+ When I click the upgrade button in the placeholder
269
+ Then I should be redirected to the pricing page
270
+ ```
271
+
272
+ ```gherkin:es
273
+ Scenario: Boton de upgrade en placeholder funciona
274
+
275
+ Given estoy logueado como Carlos (team con plan Free)
276
+ And estoy en una pagina de funcion bloqueada
277
+ When hago clic en el boton de upgrade del placeholder
278
+ Then deberia ser redirigido a la pagina de pricing
279
+ ```
280
+
281
+ ### Expected Results
282
+ - URL changes to include `/pricing` or `/settings/pricing`
283
+ - Pricing page loads
284
+
285
+ ---
286
+
287
+ ## @test FEAT-UAT-031: Feature page shows benefits list
288
+
289
+ ### Metadata
290
+ - **Priority:** Normal
291
+ - **Type:** Regression
292
+ - **Tags:** placeholder, benefits
293
+ - **Grep:** `@regression`
294
+
295
+ ```gherkin:en
296
+ Scenario: Placeholder shows feature benefits
297
+
298
+ Given I am logged in as Carlos (Free plan team)
299
+ When I visit a blocked feature page
300
+ Then I should see the benefits list for that feature
301
+ ```
302
+
303
+ ```gherkin:es
304
+ Scenario: Placeholder muestra beneficios de la funcion
305
+
306
+ Given estoy logueado como Carlos (team con plan Free)
307
+ When visito una pagina de funcion bloqueada
308
+ Then deberia ver la lista de beneficios de esa funcion
309
+ ```
310
+
311
+ ### Expected Results
312
+ - Benefits container is visible with `[data-cy="placeholder-benefits"]`
313
+ - List items are displayed
314
+
315
+ ---
316
+
317
+ ## @test FEAT-UAT-032: Feature page shows placeholder title
318
+
319
+ ### Metadata
320
+ - **Priority:** Normal
321
+ - **Type:** Regression
322
+ - **Tags:** placeholder, title
323
+ - **Grep:** `@regression`
324
+
325
+ ```gherkin:en
326
+ Scenario: Placeholder shows feature title
327
+
328
+ Given I am logged in as Carlos (Free plan team)
329
+ When I visit a blocked feature page
330
+ Then I should see the feature title in the placeholder
331
+ ```
332
+
333
+ ```gherkin:es
334
+ Scenario: Placeholder muestra titulo de la funcion
335
+
336
+ Given estoy logueado como Carlos (team con plan Free)
337
+ When visito una pagina de funcion bloqueada
338
+ Then deberia ver el titulo de la funcion en el placeholder
339
+ ```
340
+
341
+ ### Expected Results
342
+ - Title is visible with `[data-cy="placeholder-title"]`
343
+
344
+ ---
345
+
346
+ ## @test FEAT-UAT-033: Feature page shows placeholder description
347
+
348
+ ### Metadata
349
+ - **Priority:** Normal
350
+ - **Type:** Regression
351
+ - **Tags:** placeholder, description
352
+ - **Grep:** `@regression`
353
+
354
+ ```gherkin:en
355
+ Scenario: Placeholder shows feature description
356
+
357
+ Given I am logged in as Carlos (Free plan team)
358
+ When I visit a blocked feature page
359
+ Then I should see the feature description in the placeholder
360
+ ```
361
+
362
+ ```gherkin:es
363
+ Scenario: Placeholder muestra descripcion de la funcion
364
+
365
+ Given estoy logueado como Carlos (team con plan Free)
366
+ When visito una pagina de funcion bloqueada
367
+ Then deberia ver la descripcion de la funcion en el placeholder
368
+ ```
369
+
370
+ ### Expected Results
371
+ - Description is visible with `[data-cy="placeholder-description"]`
372
+
373
+ ---
374
+
375
+ ## UI Elements
376
+
377
+ | Element | Selector | Description |
378
+ |---------|----------|-------------|
379
+ | Analytics Page | `[data-cy="feature-analytics-page"]` | Analytics feature page container |
380
+ | Webhooks Page | `[data-cy="feature-webhooks-page"]` | Webhooks feature page container |
381
+ | Automation Page | `[data-cy="feature-automation-page"]` | Automation feature page container |
382
+ | Analytics Placeholder | `[data-cy="feature-placeholder-advanced_analytics"]` | Analytics placeholder |
383
+ | Webhooks Placeholder | `[data-cy="feature-placeholder-webhooks"]` | Webhooks placeholder |
384
+ | Automation Placeholder | `[data-cy="feature-placeholder-task_automation"]` | Automation placeholder |
385
+ | Analytics Content | `[data-cy="analytics-content"]` | Analytics feature content |
386
+ | Webhooks Content | `[data-cy="webhooks-content"]` | Webhooks feature content |
387
+ | Automation Content | `[data-cy="automation-content"]` | Automation feature content |
388
+ | Placeholder Title | `[data-cy="placeholder-title"]` | Feature title in placeholder |
389
+ | Placeholder Description | `[data-cy="placeholder-description"]` | Feature description |
390
+ | Placeholder Benefits | `[data-cy="placeholder-benefits"]` | Benefits list container |
391
+ | Upgrade Button | `[data-cy="placeholder-upgrade-btn"]` | Upgrade CTA button |
392
+
393
+ ## Summary
394
+
395
+ | Test ID | Plan | Feature | Type | Tags |
396
+ |---------|------|---------|------|------|
397
+ | FEAT-UAT-001 | Free | Analytics | Blocked | `@smoke` |
398
+ | FEAT-UAT-002 | Free | Webhooks | Blocked | `@smoke` |
399
+ | FEAT-UAT-003 | Free | Automation | Blocked | `@smoke` |
400
+ | FEAT-UAT-010 | Pro | Analytics | Accessible | `@smoke` |
401
+ | FEAT-UAT-011 | Pro | Webhooks | Accessible | `@smoke` |
402
+ | FEAT-UAT-012 | Pro | Automation | Accessible | `@smoke` |
403
+ | FEAT-UAT-020 | Enterprise | All | Accessible | `@smoke` |
404
+ | FEAT-UAT-030 | Free | Navigation | Upgrade CTA | `@regression` |
405
+ | FEAT-UAT-031 | Free | UI | Benefits | `@regression` |
406
+ | FEAT-UAT-032 | Free | UI | Title | `@regression` |
407
+ | FEAT-UAT-033 | Free | UI | Description | `@regression` |
@@ -0,0 +1,307 @@
1
+ /// <reference types="cypress" />
2
+
3
+ import * as allure from 'allure-cypress'
4
+ import { BillingPOM } from '../../../src/features/BillingPOM'
5
+ import {
6
+ loginAsFreePlanUser,
7
+ loginAsProPlanUser,
8
+ loginAsEnterprisePlanUser,
9
+ } from '../../../src/session-helpers'
10
+
11
+ /**
12
+ * Feature Gates UAT Tests
13
+ *
14
+ * Tests feature access control based on subscription plans:
15
+ * - Free Plan: Cannot access advanced_analytics, webhooks, task_automation
16
+ * - Pro Plan: Can access advanced_analytics, webhooks, task_automation
17
+ * - Enterprise Plan: Can access all features (*)
18
+ *
19
+ * These "fake door" pages validate plan-based gating using FeatureGate component.
20
+ *
21
+ * Session: 2025-12-20-subscriptions-system-v2
22
+ *
23
+ * KNOWN ISSUE (2025-12-28):
24
+ * Pro Plan User tests are skipped because feature content selectors are not implemented:
25
+ * - [data-cy="analytics-content"] not found
26
+ * - [data-cy="webhooks-content"] not found
27
+ * - [data-cy="automation-content"] not found
28
+ *
29
+ * The feature pages may only show placeholder content (fake door pages).
30
+ * TODO: Implement feature content selectors or update tests to match actual UI.
31
+ */
32
+
33
+ describe('Feature Gates - UAT Tests', {
34
+ tags: ['@uat', '@billing', '@feature-gates']
35
+ }, () => {
36
+ const billingPage = BillingPOM.create()
37
+
38
+ // ============================================================
39
+ // FREE PLAN USER - BLOCKED FEATURES
40
+ // ============================================================
41
+ describe('Free Plan User - Blocked Features', () => {
42
+ beforeEach(() => {
43
+ allure.epic('UAT')
44
+ allure.feature('Feature Gates')
45
+ allure.story('Free Plan Restrictions')
46
+
47
+ loginAsFreePlanUser()
48
+ })
49
+
50
+ it('FEAT-UAT-001: Free plan user sees placeholder for Advanced Analytics', () => {
51
+ allure.severity('critical')
52
+ allure.description(`
53
+ Scenario: Free plan user cannot access Advanced Analytics
54
+ Given I am logged in as Carlos (Free plan team)
55
+ When I visit /dashboard/features/analytics
56
+ Then I should see the feature placeholder
57
+ And I should see the upgrade button
58
+ And I should NOT see the analytics content
59
+ `)
60
+
61
+ // Visit analytics feature page
62
+ billingPage.visitAnalyticsFeature()
63
+
64
+ // Assert placeholder is visible (feature blocked)
65
+ billingPage.assertFeaturePlaceholderVisible('advanced_analytics')
66
+
67
+ // Assert upgrade button is visible
68
+ billingPage.getPlaceholderUpgradeButton().should('be.visible')
69
+
70
+ // Assert actual content is NOT visible
71
+ cy.get('[data-cy="analytics-content"]').should('not.exist')
72
+
73
+ cy.log('✅ Free plan user sees analytics placeholder correctly')
74
+ })
75
+
76
+ it('FEAT-UAT-002: Free plan user sees placeholder for Webhooks', () => {
77
+ allure.severity('critical')
78
+ allure.description(`
79
+ Scenario: Free plan user cannot access Webhooks
80
+ Given I am logged in as Carlos (Free plan team)
81
+ When I visit /dashboard/features/webhooks
82
+ Then I should see the feature placeholder
83
+ And I should see the upgrade button
84
+ And I should NOT see the webhooks content
85
+ `)
86
+
87
+ billingPage.visitWebhooksFeature()
88
+
89
+ billingPage.assertFeaturePlaceholderVisible('webhooks')
90
+ billingPage.getPlaceholderUpgradeButton().should('be.visible')
91
+ cy.get('[data-cy="webhooks-content"]').should('not.exist')
92
+
93
+ cy.log('✅ Free plan user sees webhooks placeholder correctly')
94
+ })
95
+
96
+ it('FEAT-UAT-003: Free plan user sees placeholder for Task Automation', () => {
97
+ allure.severity('critical')
98
+ allure.description(`
99
+ Scenario: Free plan user cannot access Task Automation
100
+ Given I am logged in as Carlos (Free plan team)
101
+ When I visit /dashboard/features/automation
102
+ Then I should see the feature placeholder
103
+ And I should see the upgrade button
104
+ And I should NOT see the automation content
105
+ `)
106
+
107
+ billingPage.visitAutomationFeature()
108
+
109
+ billingPage.assertFeaturePlaceholderVisible('task_automation')
110
+ billingPage.getPlaceholderUpgradeButton().should('be.visible')
111
+ cy.get('[data-cy="automation-content"]').should('not.exist')
112
+
113
+ cy.log('✅ Free plan user sees automation placeholder correctly')
114
+ })
115
+ })
116
+
117
+ // ============================================================
118
+ // PRO PLAN USER - ACCESSIBLE FEATURES
119
+ // ============================================================
120
+ describe('Pro Plan User - Accessible Features', () => {
121
+ beforeEach(() => {
122
+ allure.epic('UAT')
123
+ allure.feature('Feature Gates')
124
+ allure.story('Pro Plan Access')
125
+
126
+ loginAsProPlanUser()
127
+ })
128
+
129
+ it.skip('FEAT-UAT-010: Pro plan user can access Advanced Analytics (PENDING: selector not implemented)', () => {
130
+ allure.severity('critical')
131
+ allure.description(`
132
+ Scenario: Pro plan user can access Advanced Analytics
133
+ Given I am logged in as Carlos (Pro plan team - Everpoint)
134
+ When I visit /dashboard/features/analytics
135
+ Then I should see the analytics content
136
+ And I should NOT see the feature placeholder
137
+
138
+ SKIPPED: [data-cy="analytics-content"] selector not implemented
139
+ `)
140
+
141
+ billingPage.visitAnalyticsFeature()
142
+ billingPage.assertFeatureContentVisible('analytics')
143
+ cy.get('[data-cy="feature-placeholder-advanced_analytics"]').should('not.exist')
144
+ })
145
+
146
+ it.skip('FEAT-UAT-011: Pro plan user can access Webhooks (PENDING: selector not implemented)', () => {
147
+ allure.severity('critical')
148
+ allure.description(`
149
+ Scenario: Pro plan user can access Webhooks
150
+ Given I am logged in as Carlos (Pro plan team - Everpoint)
151
+ When I visit /dashboard/features/webhooks
152
+ Then I should see the webhooks content
153
+ And I should NOT see the feature placeholder
154
+
155
+ SKIPPED: [data-cy="webhooks-content"] selector not implemented
156
+ `)
157
+
158
+ billingPage.visitWebhooksFeature()
159
+ billingPage.assertFeatureContentVisible('webhooks')
160
+ cy.get('[data-cy="feature-placeholder-webhooks"]').should('not.exist')
161
+ })
162
+
163
+ it.skip('FEAT-UAT-012: Pro plan user can access Task Automation (PENDING: selector not implemented)', () => {
164
+ allure.severity('critical')
165
+ allure.description(`
166
+ Scenario: Pro plan user can access Task Automation
167
+ Given I am logged in as Carlos (Pro plan team - Everpoint)
168
+ When I visit /dashboard/features/automation
169
+ Then I should see the automation content
170
+ And I should NOT see the feature placeholder
171
+
172
+ SKIPPED: [data-cy="automation-content"] selector not implemented
173
+ `)
174
+
175
+ billingPage.visitAutomationFeature()
176
+ billingPage.assertFeatureContentVisible('automation')
177
+ cy.get('[data-cy="feature-placeholder-task_automation"]').should('not.exist')
178
+ })
179
+ })
180
+
181
+ // ============================================================
182
+ // ENTERPRISE PLAN USER - ALL FEATURES
183
+ // ============================================================
184
+ describe('Enterprise Plan User - All Features', () => {
185
+ beforeEach(() => {
186
+ allure.epic('UAT')
187
+ allure.feature('Feature Gates')
188
+ allure.story('Enterprise Plan Access')
189
+
190
+ loginAsEnterprisePlanUser()
191
+ })
192
+
193
+ it('FEAT-UAT-020: Enterprise plan user can access all features', () => {
194
+ allure.severity('critical')
195
+ allure.description(`
196
+ Scenario: Enterprise plan user can access all features
197
+ Given I am logged in as Ana (Enterprise plan team - Ironvale)
198
+ When I visit each feature page
199
+ Then I should see the feature content for all features
200
+ And I should NOT see any feature placeholders
201
+ `)
202
+
203
+ // Analytics
204
+ billingPage.visitAnalyticsFeature()
205
+ billingPage.assertFeatureContentVisible('analytics')
206
+ cy.get('[data-cy="feature-placeholder-advanced_analytics"]').should('not.exist')
207
+
208
+ // Webhooks
209
+ billingPage.visitWebhooksFeature()
210
+ billingPage.assertFeatureContentVisible('webhooks')
211
+ cy.get('[data-cy="feature-placeholder-webhooks"]').should('not.exist')
212
+
213
+ // Automation
214
+ billingPage.visitAutomationFeature()
215
+ billingPage.assertFeatureContentVisible('automation')
216
+ cy.get('[data-cy="feature-placeholder-task_automation"]').should('not.exist')
217
+
218
+ cy.log('✅ Enterprise plan user can access all features')
219
+ })
220
+ })
221
+
222
+ // ============================================================
223
+ // PLACEHOLDER UI TESTS
224
+ // ============================================================
225
+ describe('Feature Placeholder UI', () => {
226
+ beforeEach(() => {
227
+ allure.epic('UAT')
228
+ allure.feature('Feature Gates')
229
+ allure.story('Placeholder UI')
230
+
231
+ loginAsFreePlanUser()
232
+ })
233
+
234
+ it('FEAT-UAT-030: Placeholder upgrade button navigates to pricing', () => {
235
+ allure.severity('normal')
236
+ allure.description(`
237
+ Scenario: Placeholder upgrade button works
238
+ Given I am logged in as Carlos (Free plan team)
239
+ And I am on a blocked feature page
240
+ When I click the upgrade button in the placeholder
241
+ Then I should be redirected to the pricing page
242
+ `)
243
+
244
+ billingPage.visitAnalyticsFeature()
245
+
246
+ // Click the upgrade button
247
+ billingPage.clickPlaceholderUpgrade()
248
+
249
+ // Should navigate to pricing page
250
+ cy.url().should('include', '/pricing')
251
+
252
+ cy.log('✅ Upgrade button navigates to pricing page')
253
+ })
254
+
255
+ it('FEAT-UAT-031: Feature page shows benefits list', () => {
256
+ allure.severity('normal')
257
+ allure.description(`
258
+ Scenario: Placeholder shows feature benefits
259
+ Given I am logged in as Carlos (Free plan team)
260
+ When I visit a blocked feature page
261
+ Then I should see the benefits list for that feature
262
+ `)
263
+
264
+ billingPage.visitAnalyticsFeature()
265
+
266
+ // Assert benefits list is visible
267
+ cy.get('[data-cy="placeholder-benefits"]').should('be.visible')
268
+ cy.get('[data-cy="placeholder-benefits"] li').should('have.length.at.least', 1)
269
+
270
+ cy.log('✅ Benefits list is displayed in placeholder')
271
+ })
272
+
273
+ it('FEAT-UAT-032: Feature page shows placeholder title', () => {
274
+ allure.severity('normal')
275
+ allure.description(`
276
+ Scenario: Placeholder shows feature title
277
+ Given I am logged in as Carlos (Free plan team)
278
+ When I visit a blocked feature page
279
+ Then I should see the feature title in the placeholder
280
+ `)
281
+
282
+ billingPage.visitWebhooksFeature()
283
+
284
+ // Assert title is visible
285
+ cy.get('[data-cy="placeholder-title"]').should('be.visible')
286
+
287
+ cy.log('✅ Placeholder title is displayed')
288
+ })
289
+
290
+ it('FEAT-UAT-033: Feature page shows placeholder description', () => {
291
+ allure.severity('normal')
292
+ allure.description(`
293
+ Scenario: Placeholder shows feature description
294
+ Given I am logged in as Carlos (Free plan team)
295
+ When I visit a blocked feature page
296
+ Then I should see the feature description in the placeholder
297
+ `)
298
+
299
+ billingPage.visitAutomationFeature()
300
+
301
+ // Assert description is visible
302
+ cy.get('[data-cy="placeholder-description"]').should('be.visible')
303
+
304
+ cy.log('✅ Placeholder description is displayed')
305
+ })
306
+ })
307
+ })