@nextsparkjs/ai-workflow 0.1.0-beta.100

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 (272) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +115 -0
  3. package/claude/_docs/workflows-optimizations.md +359 -0
  4. package/claude/agents/api-tester.md +634 -0
  5. package/claude/agents/architecture-supervisor.md +1351 -0
  6. package/claude/agents/backend-developer.md +997 -0
  7. package/claude/agents/backend-validator.md +417 -0
  8. package/claude/agents/bdd-docs-writer.md +737 -0
  9. package/claude/agents/block-developer.md +677 -0
  10. package/claude/agents/code-reviewer.md +1432 -0
  11. package/claude/agents/db-developer.md +721 -0
  12. package/claude/agents/db-validator.md +407 -0
  13. package/claude/agents/demo-video-generator.md +493 -0
  14. package/claude/agents/documentation-writer.md +1268 -0
  15. package/claude/agents/frontend-developer.md +1234 -0
  16. package/claude/agents/frontend-validator.md +777 -0
  17. package/claude/agents/functional-validator.md +630 -0
  18. package/claude/agents/mock-analyst.md +387 -0
  19. package/claude/agents/product-manager.md +963 -0
  20. package/claude/agents/qa-automation.md +1762 -0
  21. package/claude/agents/release-manager.md +634 -0
  22. package/claude/agents/selectors-translator.md +262 -0
  23. package/claude/agents/unit-test-writer.md +785 -0
  24. package/claude/agents/visual-comparator.md +329 -0
  25. package/claude/agents/workflow-maintainer.md +352 -0
  26. package/claude/commands/do/README.md +88 -0
  27. package/claude/commands/do/create-api.md +64 -0
  28. package/claude/commands/do/create-entity.md +66 -0
  29. package/claude/commands/do/create-migration.md +64 -0
  30. package/claude/commands/do/create-plugin.md +56 -0
  31. package/claude/commands/do/create-theme.md +70 -0
  32. package/claude/commands/do/mock-data.md +67 -0
  33. package/claude/commands/do/reset-db.md +71 -0
  34. package/claude/commands/do/setup-scheduled-action.md +75 -0
  35. package/claude/commands/do/sync-code-review.md +117 -0
  36. package/claude/commands/do/update-selectors.md +112 -0
  37. package/claude/commands/do/use-skills.md +90 -0
  38. package/claude/commands/do/validate-blocks.md +69 -0
  39. package/claude/commands/how-to/README.md +261 -0
  40. package/claude/commands/how-to/add-metadata.md +692 -0
  41. package/claude/commands/how-to/add-taxonomies.md +806 -0
  42. package/claude/commands/how-to/add-translations.md +571 -0
  43. package/claude/commands/how-to/create-api.md +577 -0
  44. package/claude/commands/how-to/create-block.md +575 -0
  45. package/claude/commands/how-to/create-child-entities.md +771 -0
  46. package/claude/commands/how-to/create-entity.md +597 -0
  47. package/claude/commands/how-to/create-migrations.md +605 -0
  48. package/claude/commands/how-to/create-plugin.md +654 -0
  49. package/claude/commands/how-to/customize-app.md +481 -0
  50. package/claude/commands/how-to/customize-dashboard.md +553 -0
  51. package/claude/commands/how-to/customize-theme.md +438 -0
  52. package/claude/commands/how-to/define-features-flows.md +632 -0
  53. package/claude/commands/how-to/deploy.md +507 -0
  54. package/claude/commands/how-to/handle-file-uploads.md +746 -0
  55. package/claude/commands/how-to/implement-search.md +1001 -0
  56. package/claude/commands/how-to/install-plugins.md +352 -0
  57. package/claude/commands/how-to/manage-test-coverage.md +984 -0
  58. package/claude/commands/how-to/run-tests.md +400 -0
  59. package/claude/commands/how-to/set-app-languages.md +601 -0
  60. package/claude/commands/how-to/set-plans-and-permissions.md +575 -0
  61. package/claude/commands/how-to/set-scheduled-actions.md +527 -0
  62. package/claude/commands/how-to/set-user-roles-and-permissions.md +550 -0
  63. package/claude/commands/how-to/setup-authentication.md +388 -0
  64. package/claude/commands/how-to/setup-claude-code.md +440 -0
  65. package/claude/commands/how-to/setup-database.md +274 -0
  66. package/claude/commands/how-to/setup-email-providers.md +598 -0
  67. package/claude/commands/how-to/setup-mobile-dev.md +627 -0
  68. package/claude/commands/how-to/start.md +500 -0
  69. package/claude/commands/how-to/use-devtools.md +639 -0
  70. package/claude/commands/how-to/use-superadmin.md +622 -0
  71. package/claude/commands/session/README.md +193 -0
  72. package/claude/commands/session/block-create.md +190 -0
  73. package/claude/commands/session/block-list.md +203 -0
  74. package/claude/commands/session/block-update.md +192 -0
  75. package/claude/commands/session/block-validate.md +218 -0
  76. package/claude/commands/session/changelog.md +115 -0
  77. package/claude/commands/session/close.md +225 -0
  78. package/claude/commands/session/commit.md +174 -0
  79. package/claude/commands/session/db-entity.md +206 -0
  80. package/claude/commands/session/db-fix.md +212 -0
  81. package/claude/commands/session/db-sample.md +206 -0
  82. package/claude/commands/session/demo.md +178 -0
  83. package/claude/commands/session/doc-bdd.md +207 -0
  84. package/claude/commands/session/doc-feature.md +218 -0
  85. package/claude/commands/session/doc-read.md +225 -0
  86. package/claude/commands/session/execute.md +204 -0
  87. package/claude/commands/session/explain.md +202 -0
  88. package/claude/commands/session/fix-bug.md +210 -0
  89. package/claude/commands/session/fix-build.md +182 -0
  90. package/claude/commands/session/fix-test.md +189 -0
  91. package/claude/commands/session/pending.md +232 -0
  92. package/claude/commands/session/refine.md +188 -0
  93. package/claude/commands/session/resume.md +192 -0
  94. package/claude/commands/session/review.md +192 -0
  95. package/claude/commands/session/scope-change.md +181 -0
  96. package/claude/commands/session/start-blocks.md +347 -0
  97. package/claude/commands/session/start.md +604 -0
  98. package/claude/commands/session/status.md +169 -0
  99. package/claude/commands/session/test-fix.md +221 -0
  100. package/claude/commands/session/test-run.md +203 -0
  101. package/claude/commands/session/test-write.md +242 -0
  102. package/claude/commands/session/validate.md +162 -0
  103. package/claude/config/context.json +40 -0
  104. package/claude/config/github.json +69 -0
  105. package/claude/config/github.schema.json +106 -0
  106. package/claude/config/team.json +46 -0
  107. package/claude/config/team.schema.json +106 -0
  108. package/claude/config/workspace.json +43 -0
  109. package/claude/config/workspace.schema.json +75 -0
  110. package/claude/skills/README.md +228 -0
  111. package/claude/skills/accessibility/SKILL.md +573 -0
  112. package/claude/skills/api-bypass-layers/SKILL.md +550 -0
  113. package/claude/skills/asana-integration/SKILL.md +499 -0
  114. package/claude/skills/better-auth/SKILL.md +666 -0
  115. package/claude/skills/billing-subscriptions/SKILL.md +660 -0
  116. package/claude/skills/block-decision-matrix/SKILL.md +359 -0
  117. package/claude/skills/clickup-integration/SKILL.md +434 -0
  118. package/claude/skills/core-theme-responsibilities/SKILL.md +485 -0
  119. package/claude/skills/create-plugin/SKILL.md +425 -0
  120. package/claude/skills/create-theme/SKILL.md +331 -0
  121. package/claude/skills/cypress-api/SKILL.md +511 -0
  122. package/claude/skills/cypress-api/scripts/generate-api-controller.py +329 -0
  123. package/claude/skills/cypress-api/scripts/generate-api-test.py +930 -0
  124. package/claude/skills/cypress-e2e/SKILL.md +526 -0
  125. package/claude/skills/cypress-e2e/scripts/extract-selectors.py +383 -0
  126. package/claude/skills/cypress-e2e/scripts/generate-uat-test.py +788 -0
  127. package/claude/skills/cypress-selectors/SKILL.md +309 -0
  128. package/claude/skills/cypress-selectors/scripts/extract-missing.py +243 -0
  129. package/claude/skills/cypress-selectors/scripts/generate-block-selectors.py +283 -0
  130. package/claude/skills/cypress-selectors/scripts/validate-selectors.py +145 -0
  131. package/claude/skills/database-migrations/SKILL.md +335 -0
  132. package/claude/skills/database-migrations/scripts/generate-sample-data.py +284 -0
  133. package/claude/skills/database-migrations/scripts/validate-migration.py +323 -0
  134. package/claude/skills/design-system/SKILL.md +682 -0
  135. package/claude/skills/documentation/SKILL.md +540 -0
  136. package/claude/skills/entity-api/SKILL.md +482 -0
  137. package/claude/skills/entity-system/SKILL.md +635 -0
  138. package/claude/skills/entity-system/scripts/generate-child-migration.py +298 -0
  139. package/claude/skills/entity-system/scripts/generate-metas-migration.py +233 -0
  140. package/claude/skills/entity-system/scripts/generate-migration.py +382 -0
  141. package/claude/skills/entity-system/scripts/generate-sample-data.py +418 -0
  142. package/claude/skills/entity-system/scripts/scaffold-entity.py +661 -0
  143. package/claude/skills/github/SKILL.md +467 -0
  144. package/claude/skills/i18n-nextintl/SKILL.md +302 -0
  145. package/claude/skills/i18n-nextintl/scripts/add-translation.py +243 -0
  146. package/claude/skills/i18n-nextintl/scripts/extract-hardcoded.py +246 -0
  147. package/claude/skills/i18n-nextintl/scripts/validate-translations.py +260 -0
  148. package/claude/skills/impact-analysis/SKILL.md +203 -0
  149. package/claude/skills/jest-unit/SKILL.md +306 -0
  150. package/claude/skills/jest-unit/references/component-testing.md +371 -0
  151. package/claude/skills/jest-unit/references/mocking-patterns.md +380 -0
  152. package/claude/skills/jest-unit/references/service-hook-testing.md +454 -0
  153. package/claude/skills/jira-integration/SKILL.md +539 -0
  154. package/claude/skills/media-library/SKILL.md +743 -0
  155. package/claude/skills/mock-analysis/SKILL.md +276 -0
  156. package/claude/skills/monorepo-architecture/SKILL.md +162 -0
  157. package/claude/skills/nextjs-api-development/SKILL.md +364 -0
  158. package/claude/skills/nextjs-api-development/scripts/generate-crud-tests.py +456 -0
  159. package/claude/skills/nextjs-api-development/scripts/scaffold-endpoint.py +481 -0
  160. package/claude/skills/nextjs-api-development/scripts/validate-api.py +283 -0
  161. package/claude/skills/notion-integration/SKILL.md +641 -0
  162. package/claude/skills/npm-development-workflow/SKILL.md +480 -0
  163. package/claude/skills/page-builder-blocks/SKILL.md +530 -0
  164. package/claude/skills/page-builder-blocks/scripts/scaffold-block.py +444 -0
  165. package/claude/skills/permissions-system/SKILL.md +619 -0
  166. package/claude/skills/plugins/SKILL.md +340 -0
  167. package/claude/skills/plugins/references/plugin-templates.md +414 -0
  168. package/claude/skills/plugins/references/plugin-testing.md +353 -0
  169. package/claude/skills/plugins/references/plugin-types.md +198 -0
  170. package/claude/skills/plugins/scripts/scaffold-plugin.py +443 -0
  171. package/claude/skills/pom-patterns/SKILL.md +452 -0
  172. package/claude/skills/pom-patterns/scripts/generate-pom.py +392 -0
  173. package/claude/skills/rate-limiting/SKILL.md +342 -0
  174. package/claude/skills/react-best-practices/AGENTS.md +2410 -0
  175. package/claude/skills/react-best-practices/README.md +123 -0
  176. package/claude/skills/react-best-practices/SKILL.md +125 -0
  177. package/claude/skills/react-best-practices/metadata.json +15 -0
  178. package/claude/skills/react-best-practices/rules/_sections.md +46 -0
  179. package/claude/skills/react-best-practices/rules/_template.md +28 -0
  180. package/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
  181. package/claude/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
  182. package/claude/skills/react-best-practices/rules/async-api-routes.md +38 -0
  183. package/claude/skills/react-best-practices/rules/async-defer-await.md +80 -0
  184. package/claude/skills/react-best-practices/rules/async-dependencies.md +36 -0
  185. package/claude/skills/react-best-practices/rules/async-parallel.md +28 -0
  186. package/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
  187. package/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
  188. package/claude/skills/react-best-practices/rules/bundle-conditional.md +31 -0
  189. package/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
  190. package/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
  191. package/claude/skills/react-best-practices/rules/bundle-preload.md +50 -0
  192. package/claude/skills/react-best-practices/rules/client-event-listeners.md +74 -0
  193. package/claude/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
  194. package/claude/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
  195. package/claude/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
  196. package/claude/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
  197. package/claude/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
  198. package/claude/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
  199. package/claude/skills/react-best-practices/rules/js-cache-storage.md +70 -0
  200. package/claude/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
  201. package/claude/skills/react-best-practices/rules/js-early-exit.md +50 -0
  202. package/claude/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
  203. package/claude/skills/react-best-practices/rules/js-index-maps.md +37 -0
  204. package/claude/skills/react-best-practices/rules/js-length-check-first.md +49 -0
  205. package/claude/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
  206. package/claude/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
  207. package/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
  208. package/claude/skills/react-best-practices/rules/rendering-activity.md +26 -0
  209. package/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
  210. package/claude/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
  211. package/claude/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
  212. package/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
  213. package/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
  214. package/claude/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
  215. package/claude/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
  216. package/claude/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
  217. package/claude/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
  218. package/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
  219. package/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
  220. package/claude/skills/react-best-practices/rules/rerender-memo.md +44 -0
  221. package/claude/skills/react-best-practices/rules/rerender-transitions.md +40 -0
  222. package/claude/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
  223. package/claude/skills/react-best-practices/rules/server-cache-lru.md +41 -0
  224. package/claude/skills/react-best-practices/rules/server-cache-react.md +76 -0
  225. package/claude/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
  226. package/claude/skills/react-best-practices/rules/server-serialization.md +38 -0
  227. package/claude/skills/react-patterns/SKILL.md +688 -0
  228. package/claude/skills/registry-system/SKILL.md +331 -0
  229. package/claude/skills/scheduled-actions/SKILL.md +671 -0
  230. package/claude/skills/scope-enforcement/SKILL.md +542 -0
  231. package/claude/skills/scope-enforcement/scripts/validate-scope.py +357 -0
  232. package/claude/skills/server-actions/SKILL.md +493 -0
  233. package/claude/skills/service-layer/SKILL.md +587 -0
  234. package/claude/skills/session-management/SKILL.md +266 -0
  235. package/claude/skills/session-management/scripts/create-session.py +166 -0
  236. package/claude/skills/session-management/scripts/iteration-close.sh +105 -0
  237. package/claude/skills/session-management/scripts/iteration-init.sh +180 -0
  238. package/claude/skills/session-management/scripts/session-archive.sh +87 -0
  239. package/claude/skills/session-management/scripts/session-close.sh +133 -0
  240. package/claude/skills/session-management/scripts/session-init.sh +225 -0
  241. package/claude/skills/session-management/scripts/session-list.sh +163 -0
  242. package/claude/skills/session-management/scripts/split-plan.sh +116 -0
  243. package/claude/skills/shadcn-components/SKILL.md +586 -0
  244. package/claude/skills/shadcn-theming/SKILL.md +446 -0
  245. package/claude/skills/suspense-loading/SKILL.md +280 -0
  246. package/claude/skills/tailwind-theming/SKILL.md +507 -0
  247. package/claude/skills/tanstack-query/SKILL.md +608 -0
  248. package/claude/skills/test-coverage/SKILL.md +239 -0
  249. package/claude/skills/web-design-guidelines/SKILL.md +39 -0
  250. package/claude/skills/zod-validation/SKILL.md +537 -0
  251. package/claude/templates/blocks/progress.md +86 -0
  252. package/claude/templates/iteration/changes.md +61 -0
  253. package/claude/templates/iteration/progress.md +55 -0
  254. package/claude/templates/log.md +31 -0
  255. package/claude/templates/story/context.md +77 -0
  256. package/claude/templates/story/pendings.md +37 -0
  257. package/claude/templates/story/plan.md +299 -0
  258. package/claude/templates/story/requirements.md +109 -0
  259. package/claude/templates/story/scope.json +10 -0
  260. package/claude/templates/story/tests.md +91 -0
  261. package/claude/templates/task/progress.md +58 -0
  262. package/claude/templates/task/requirements.md +54 -0
  263. package/claude/workflows/README.md +154 -0
  264. package/claude/workflows/blocks.md +614 -0
  265. package/claude/workflows/story.md +1207 -0
  266. package/claude/workflows/task.md +927 -0
  267. package/claude/workflows/tweak.md +527 -0
  268. package/cursor/.gitkeep +0 -0
  269. package/package.json +35 -0
  270. package/scripts/postinstall.mjs +198 -0
  271. package/scripts/setup.mjs +282 -0
  272. package/scripts/sync.mjs +209 -0
@@ -0,0 +1,400 @@
1
+ # /how-to:run-tests
2
+
3
+ Interactive guide to run tests in NextSpark.
4
+
5
+ ---
6
+
7
+ ## Required Skills
8
+
9
+ Before executing, these skills provide deeper context:
10
+ - `.claude/skills/cypress-api/SKILL.md` - API testing patterns
11
+ - `.claude/skills/cypress-e2e/SKILL.md` - E2E testing patterns
12
+ - `.claude/skills/jest-unit/SKILL.md` - Unit testing patterns
13
+
14
+ ---
15
+
16
+ ## Syntax
17
+
18
+ ```
19
+ /how-to:run-tests
20
+ ```
21
+
22
+ ---
23
+
24
+ ## Behavior
25
+
26
+ Guides the user through running API tests, E2E tests, and unit tests.
27
+
28
+ ---
29
+
30
+ ## Tutorial Overview
31
+
32
+ ```
33
+ STEPS OVERVIEW (4 steps)
34
+
35
+ Step 1: Understanding Test Types
36
+ └── API, E2E, Unit tests
37
+
38
+ Step 2: Run API Tests
39
+ └── Cypress API tests
40
+
41
+ Step 3: Run E2E/UAT Tests
42
+ └── Cypress browser tests
43
+
44
+ Step 4: Run Unit Tests
45
+ └── Jest unit tests
46
+ ```
47
+
48
+ ---
49
+
50
+ ## Step 1: Understanding Test Types
51
+
52
+ ```
53
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
54
+ 📚 HOW TO: RUN TESTS
55
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
56
+
57
+ STEP 1 OF 4: Understanding Test Types
58
+
59
+ NextSpark uses three types of tests:
60
+
61
+ ┌─────────────────────────────────────────────┐
62
+ │ TEST TYPES │
63
+ │ ───────────────────────────────────────── │
64
+ │ │
65
+ │ 1. API TESTS (Cypress) │
66
+ │ Test API endpoints directly │
67
+ │ Fast, no browser needed │
68
+ │ │
69
+ │ 2. E2E/UAT TESTS (Cypress) │
70
+ │ Test user flows in browser │
71
+ │ Slower, but comprehensive │
72
+ │ │
73
+ │ 3. UNIT TESTS (Jest) │
74
+ │ Test individual functions │
75
+ │ Fastest, isolated │
76
+ │ │
77
+ └─────────────────────────────────────────────┘
78
+
79
+ ```
80
+
81
+ **📂 Test File Locations:**
82
+
83
+ ```
84
+ contents/themes/your-theme/tests/
85
+ ├── cypress/
86
+ │ ├── e2e/
87
+ │ │ ├── api/ # API tests
88
+ │ │ │ └── products.cy.ts
89
+ │ │ └── uat/ # E2E tests
90
+ │ │ └── products.cy.ts
91
+ │ └── support/
92
+ │ └── commands.ts
93
+ └── jest/
94
+ └── unit/ # Unit tests
95
+ └── services/
96
+ ```
97
+
98
+ ```
99
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
100
+
101
+ What type of tests would you like to run?
102
+
103
+ [1] API Tests (fastest)
104
+ [2] E2E/UAT Tests (browser)
105
+ [3] Unit Tests (Jest)
106
+ [4] Run all tests
107
+ ```
108
+
109
+ ---
110
+
111
+ ## Step 2: Run API Tests
112
+
113
+ ```
114
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
115
+ STEP 2 OF 4: Run API Tests
116
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
117
+ ```
118
+
119
+ **📋 Run All API Tests:**
120
+
121
+ ```bash
122
+ # Make sure dev server is running
123
+ pnpm dev
124
+
125
+ # In another terminal, run API tests
126
+ pnpm test:api
127
+
128
+ # Or run with UI
129
+ pnpm test:api:open
130
+ ```
131
+
132
+ **📋 Run Specific API Tests:**
133
+
134
+ ```bash
135
+ # Run tests for a specific entity
136
+ pnpm test:api --spec "**/api/products.cy.ts"
137
+
138
+ # Run tests by grep pattern
139
+ pnpm test:api --env grepTags="@smoke"
140
+
141
+ # Run tests by priority
142
+ pnpm test:api --env grepTags="@P0"
143
+ ```
144
+
145
+ **📋 API Test Example:**
146
+
147
+ ```typescript
148
+ // contents/themes/default/tests/cypress/e2e/api/products.cy.ts
149
+ describe('Products API', { tags: ['@api', '@products'] }, () => {
150
+ beforeEach(() => {
151
+ cy.getApiKey().as('apiKey')
152
+ })
153
+
154
+ it('should list products', { tags: ['@P0', '@smoke'] }, function() {
155
+ cy.request({
156
+ method: 'GET',
157
+ url: '/api/v1/entities/products',
158
+ headers: { Authorization: `Bearer ${this.apiKey}` },
159
+ }).then((response) => {
160
+ expect(response.status).to.eq(200)
161
+ expect(response.body.success).to.be.true
162
+ expect(response.body.data).to.be.an('array')
163
+ })
164
+ })
165
+
166
+ it('should create product', { tags: ['@P1'] }, function() {
167
+ cy.request({
168
+ method: 'POST',
169
+ url: '/api/v1/entities/products',
170
+ headers: { Authorization: `Bearer ${this.apiKey}` },
171
+ body: {
172
+ name: 'Test Product',
173
+ price: 99.99,
174
+ sku: 'TEST-001',
175
+ },
176
+ }).then((response) => {
177
+ expect(response.status).to.eq(201)
178
+ })
179
+ })
180
+ })
181
+ ```
182
+
183
+ ```
184
+ What would you like to do?
185
+
186
+ [1] Continue to Step 3 (E2E Tests)
187
+ [2] Show me how to write API tests
188
+ [3] How do I debug failing tests?
189
+ ```
190
+
191
+ ---
192
+
193
+ ## Step 3: Run E2E/UAT Tests
194
+
195
+ ```
196
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
197
+ STEP 3 OF 4: Run E2E/UAT Tests
198
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
199
+ ```
200
+
201
+ **📋 Run All E2E Tests:**
202
+
203
+ ```bash
204
+ # Run in headless mode
205
+ pnpm test:e2e
206
+
207
+ # Run with Cypress UI (recommended for debugging)
208
+ pnpm test:e2e:open
209
+ ```
210
+
211
+ **📋 Run Specific E2E Tests:**
212
+
213
+ ```bash
214
+ # Run tests for specific feature
215
+ pnpm test:e2e --spec "**/uat/products.cy.ts"
216
+
217
+ # Run smoke tests only
218
+ pnpm test:e2e --env grepTags="@smoke"
219
+
220
+ # Run tests in specific browser
221
+ pnpm test:e2e --browser chrome
222
+ ```
223
+
224
+ **📋 E2E Test Example:**
225
+
226
+ ```typescript
227
+ // contents/themes/default/tests/cypress/e2e/uat/products.cy.ts
228
+ import { ProductsPOM } from '../../support/pom/ProductsPOM'
229
+
230
+ describe('Products Management', { tags: ['@uat', '@products'] }, () => {
231
+ let pom: ProductsPOM
232
+
233
+ beforeEach(() => {
234
+ // Login with session caching
235
+ cy.session('admin', () => {
236
+ cy.login('admin@test.com', 'Test1234')
237
+ })
238
+
239
+ cy.visit('/dashboard/products')
240
+ pom = new ProductsPOM()
241
+ })
242
+
243
+ it('should display products list', { tags: ['@P0', '@smoke'] }, () => {
244
+ pom.shouldBeVisible()
245
+ pom.shouldHaveProducts()
246
+ })
247
+
248
+ it('should create a new product', { tags: ['@P1'] }, () => {
249
+ pom.clickCreateButton()
250
+ pom.fillProductForm({
251
+ name: 'New Product',
252
+ price: 49.99,
253
+ sku: 'NEW-001',
254
+ })
255
+ pom.submitForm()
256
+ pom.shouldShowSuccess('Product created')
257
+ })
258
+
259
+ it('should edit existing product', { tags: ['@P1'] }, () => {
260
+ pom.clickFirstProduct()
261
+ pom.clickEditButton()
262
+ pom.updateField('name', 'Updated Product')
263
+ pom.submitForm()
264
+ pom.shouldShowSuccess('Product updated')
265
+ })
266
+ })
267
+ ```
268
+
269
+ **📋 Test Tags:**
270
+
271
+ | Tag | Purpose |
272
+ |-----|---------|
273
+ | @smoke | Critical path tests |
274
+ | @P0 | Highest priority |
275
+ | @P1 | High priority |
276
+ | @P2 | Medium priority |
277
+ | @api | API tests |
278
+ | @uat | User acceptance tests |
279
+
280
+ ```
281
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
282
+
283
+ What would you like to do?
284
+
285
+ [1] Continue to Step 4 (Unit Tests)
286
+ [2] Show me how to write E2E tests
287
+ [3] How do I use Page Object Models?
288
+ ```
289
+
290
+ ---
291
+
292
+ ## Step 4: Run Unit Tests
293
+
294
+ ```
295
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
296
+ STEP 4 OF 4: Run Unit Tests
297
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
298
+ ```
299
+
300
+ **📋 Run All Unit Tests:**
301
+
302
+ ```bash
303
+ # Run all Jest tests
304
+ pnpm test:unit
305
+
306
+ # Run with coverage
307
+ pnpm test:unit --coverage
308
+
309
+ # Run in watch mode
310
+ pnpm test:unit --watch
311
+ ```
312
+
313
+ **📋 Run Specific Unit Tests:**
314
+
315
+ ```bash
316
+ # Run tests for specific file
317
+ pnpm test:unit -- products.test.ts
318
+
319
+ # Run tests matching pattern
320
+ pnpm test:unit -- --testNamePattern="should calculate"
321
+
322
+ # Run tests in specific directory
323
+ pnpm test:unit -- services/
324
+ ```
325
+
326
+ **📋 Unit Test Example:**
327
+
328
+ ```typescript
329
+ // contents/themes/default/tests/jest/unit/services/products.test.ts
330
+ import { ProductsService } from '@/core/lib/services/products.service'
331
+
332
+ describe('ProductsService', () => {
333
+ describe('calculateDiscount', () => {
334
+ it('should calculate percentage discount', () => {
335
+ const result = ProductsService.calculateDiscount(100, 20)
336
+ expect(result).toBe(80)
337
+ })
338
+
339
+ it('should handle zero discount', () => {
340
+ const result = ProductsService.calculateDiscount(100, 0)
341
+ expect(result).toBe(100)
342
+ })
343
+
344
+ it('should round to 2 decimal places', () => {
345
+ const result = ProductsService.calculateDiscount(99.99, 15)
346
+ expect(result).toBe(84.99)
347
+ })
348
+ })
349
+
350
+ describe('validateSKU', () => {
351
+ it('should accept valid SKU format', () => {
352
+ expect(ProductsService.validateSKU('PROD-001')).toBe(true)
353
+ })
354
+
355
+ it('should reject invalid SKU', () => {
356
+ expect(ProductsService.validateSKU('')).toBe(false)
357
+ expect(ProductsService.validateSKU('invalid sku')).toBe(false)
358
+ })
359
+ })
360
+ })
361
+ ```
362
+
363
+ **📋 Run All Tests:**
364
+
365
+ ```bash
366
+ # Run complete test suite
367
+ pnpm test
368
+
369
+ # This runs:
370
+ # 1. Unit tests (Jest)
371
+ # 2. API tests (Cypress)
372
+ # 3. E2E tests (Cypress)
373
+ ```
374
+
375
+ ```
376
+ ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
377
+
378
+ ✅ TUTORIAL STORY!
379
+
380
+ You've learned:
381
+ • API tests with Cypress
382
+ • E2E/UAT tests with Cypress
383
+ • Unit tests with Jest
384
+ • Test tags and filtering
385
+
386
+ 📚 Related tutorials:
387
+ • /session:test:write - Write new tests
388
+ • /session:test:fix - Fix failing tests
389
+
390
+ 🔙 Back to menu: /how-to:start
391
+ ```
392
+
393
+ ---
394
+
395
+ ## Related Commands
396
+
397
+ | Command | Action |
398
+ |---------|--------|
399
+ | `/session:test:write` | Write tests |
400
+ | `/session:test:run` | Run tests (workflow) |