@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.
- package/LICENSE +21 -0
- package/README.md +115 -0
- package/claude/_docs/workflows-optimizations.md +359 -0
- package/claude/agents/api-tester.md +634 -0
- package/claude/agents/architecture-supervisor.md +1351 -0
- package/claude/agents/backend-developer.md +997 -0
- package/claude/agents/backend-validator.md +417 -0
- package/claude/agents/bdd-docs-writer.md +737 -0
- package/claude/agents/block-developer.md +677 -0
- package/claude/agents/code-reviewer.md +1432 -0
- package/claude/agents/db-developer.md +721 -0
- package/claude/agents/db-validator.md +407 -0
- package/claude/agents/demo-video-generator.md +493 -0
- package/claude/agents/documentation-writer.md +1268 -0
- package/claude/agents/frontend-developer.md +1234 -0
- package/claude/agents/frontend-validator.md +777 -0
- package/claude/agents/functional-validator.md +630 -0
- package/claude/agents/mock-analyst.md +387 -0
- package/claude/agents/product-manager.md +963 -0
- package/claude/agents/qa-automation.md +1762 -0
- package/claude/agents/release-manager.md +634 -0
- package/claude/agents/selectors-translator.md +262 -0
- package/claude/agents/unit-test-writer.md +785 -0
- package/claude/agents/visual-comparator.md +329 -0
- package/claude/agents/workflow-maintainer.md +352 -0
- package/claude/commands/do/README.md +88 -0
- package/claude/commands/do/create-api.md +64 -0
- package/claude/commands/do/create-entity.md +66 -0
- package/claude/commands/do/create-migration.md +64 -0
- package/claude/commands/do/create-plugin.md +56 -0
- package/claude/commands/do/create-theme.md +70 -0
- package/claude/commands/do/mock-data.md +67 -0
- package/claude/commands/do/reset-db.md +71 -0
- package/claude/commands/do/setup-scheduled-action.md +75 -0
- package/claude/commands/do/sync-code-review.md +117 -0
- package/claude/commands/do/update-selectors.md +112 -0
- package/claude/commands/do/use-skills.md +90 -0
- package/claude/commands/do/validate-blocks.md +69 -0
- package/claude/commands/how-to/README.md +261 -0
- package/claude/commands/how-to/add-metadata.md +692 -0
- package/claude/commands/how-to/add-taxonomies.md +806 -0
- package/claude/commands/how-to/add-translations.md +571 -0
- package/claude/commands/how-to/create-api.md +577 -0
- package/claude/commands/how-to/create-block.md +575 -0
- package/claude/commands/how-to/create-child-entities.md +771 -0
- package/claude/commands/how-to/create-entity.md +597 -0
- package/claude/commands/how-to/create-migrations.md +605 -0
- package/claude/commands/how-to/create-plugin.md +654 -0
- package/claude/commands/how-to/customize-app.md +481 -0
- package/claude/commands/how-to/customize-dashboard.md +553 -0
- package/claude/commands/how-to/customize-theme.md +438 -0
- package/claude/commands/how-to/define-features-flows.md +632 -0
- package/claude/commands/how-to/deploy.md +507 -0
- package/claude/commands/how-to/handle-file-uploads.md +746 -0
- package/claude/commands/how-to/implement-search.md +1001 -0
- package/claude/commands/how-to/install-plugins.md +352 -0
- package/claude/commands/how-to/manage-test-coverage.md +984 -0
- package/claude/commands/how-to/run-tests.md +400 -0
- package/claude/commands/how-to/set-app-languages.md +601 -0
- package/claude/commands/how-to/set-plans-and-permissions.md +575 -0
- package/claude/commands/how-to/set-scheduled-actions.md +527 -0
- package/claude/commands/how-to/set-user-roles-and-permissions.md +550 -0
- package/claude/commands/how-to/setup-authentication.md +388 -0
- package/claude/commands/how-to/setup-claude-code.md +440 -0
- package/claude/commands/how-to/setup-database.md +274 -0
- package/claude/commands/how-to/setup-email-providers.md +598 -0
- package/claude/commands/how-to/setup-mobile-dev.md +627 -0
- package/claude/commands/how-to/start.md +500 -0
- package/claude/commands/how-to/use-devtools.md +639 -0
- package/claude/commands/how-to/use-superadmin.md +622 -0
- package/claude/commands/session/README.md +193 -0
- package/claude/commands/session/block-create.md +190 -0
- package/claude/commands/session/block-list.md +203 -0
- package/claude/commands/session/block-update.md +192 -0
- package/claude/commands/session/block-validate.md +218 -0
- package/claude/commands/session/changelog.md +115 -0
- package/claude/commands/session/close.md +225 -0
- package/claude/commands/session/commit.md +174 -0
- package/claude/commands/session/db-entity.md +206 -0
- package/claude/commands/session/db-fix.md +212 -0
- package/claude/commands/session/db-sample.md +206 -0
- package/claude/commands/session/demo.md +178 -0
- package/claude/commands/session/doc-bdd.md +207 -0
- package/claude/commands/session/doc-feature.md +218 -0
- package/claude/commands/session/doc-read.md +225 -0
- package/claude/commands/session/execute.md +204 -0
- package/claude/commands/session/explain.md +202 -0
- package/claude/commands/session/fix-bug.md +210 -0
- package/claude/commands/session/fix-build.md +182 -0
- package/claude/commands/session/fix-test.md +189 -0
- package/claude/commands/session/pending.md +232 -0
- package/claude/commands/session/refine.md +188 -0
- package/claude/commands/session/resume.md +192 -0
- package/claude/commands/session/review.md +192 -0
- package/claude/commands/session/scope-change.md +181 -0
- package/claude/commands/session/start-blocks.md +347 -0
- package/claude/commands/session/start.md +604 -0
- package/claude/commands/session/status.md +169 -0
- package/claude/commands/session/test-fix.md +221 -0
- package/claude/commands/session/test-run.md +203 -0
- package/claude/commands/session/test-write.md +242 -0
- package/claude/commands/session/validate.md +162 -0
- package/claude/config/context.json +40 -0
- package/claude/config/github.json +69 -0
- package/claude/config/github.schema.json +106 -0
- package/claude/config/team.json +46 -0
- package/claude/config/team.schema.json +106 -0
- package/claude/config/workspace.json +43 -0
- package/claude/config/workspace.schema.json +75 -0
- package/claude/skills/README.md +228 -0
- package/claude/skills/accessibility/SKILL.md +573 -0
- package/claude/skills/api-bypass-layers/SKILL.md +550 -0
- package/claude/skills/asana-integration/SKILL.md +499 -0
- package/claude/skills/better-auth/SKILL.md +666 -0
- package/claude/skills/billing-subscriptions/SKILL.md +660 -0
- package/claude/skills/block-decision-matrix/SKILL.md +359 -0
- package/claude/skills/clickup-integration/SKILL.md +434 -0
- package/claude/skills/core-theme-responsibilities/SKILL.md +485 -0
- package/claude/skills/create-plugin/SKILL.md +425 -0
- package/claude/skills/create-theme/SKILL.md +331 -0
- package/claude/skills/cypress-api/SKILL.md +511 -0
- package/claude/skills/cypress-api/scripts/generate-api-controller.py +329 -0
- package/claude/skills/cypress-api/scripts/generate-api-test.py +930 -0
- package/claude/skills/cypress-e2e/SKILL.md +526 -0
- package/claude/skills/cypress-e2e/scripts/extract-selectors.py +383 -0
- package/claude/skills/cypress-e2e/scripts/generate-uat-test.py +788 -0
- package/claude/skills/cypress-selectors/SKILL.md +309 -0
- package/claude/skills/cypress-selectors/scripts/extract-missing.py +243 -0
- package/claude/skills/cypress-selectors/scripts/generate-block-selectors.py +283 -0
- package/claude/skills/cypress-selectors/scripts/validate-selectors.py +145 -0
- package/claude/skills/database-migrations/SKILL.md +335 -0
- package/claude/skills/database-migrations/scripts/generate-sample-data.py +284 -0
- package/claude/skills/database-migrations/scripts/validate-migration.py +323 -0
- package/claude/skills/design-system/SKILL.md +682 -0
- package/claude/skills/documentation/SKILL.md +540 -0
- package/claude/skills/entity-api/SKILL.md +482 -0
- package/claude/skills/entity-system/SKILL.md +635 -0
- package/claude/skills/entity-system/scripts/generate-child-migration.py +298 -0
- package/claude/skills/entity-system/scripts/generate-metas-migration.py +233 -0
- package/claude/skills/entity-system/scripts/generate-migration.py +382 -0
- package/claude/skills/entity-system/scripts/generate-sample-data.py +418 -0
- package/claude/skills/entity-system/scripts/scaffold-entity.py +661 -0
- package/claude/skills/github/SKILL.md +467 -0
- package/claude/skills/i18n-nextintl/SKILL.md +302 -0
- package/claude/skills/i18n-nextintl/scripts/add-translation.py +243 -0
- package/claude/skills/i18n-nextintl/scripts/extract-hardcoded.py +246 -0
- package/claude/skills/i18n-nextintl/scripts/validate-translations.py +260 -0
- package/claude/skills/impact-analysis/SKILL.md +203 -0
- package/claude/skills/jest-unit/SKILL.md +306 -0
- package/claude/skills/jest-unit/references/component-testing.md +371 -0
- package/claude/skills/jest-unit/references/mocking-patterns.md +380 -0
- package/claude/skills/jest-unit/references/service-hook-testing.md +454 -0
- package/claude/skills/jira-integration/SKILL.md +539 -0
- package/claude/skills/media-library/SKILL.md +743 -0
- package/claude/skills/mock-analysis/SKILL.md +276 -0
- package/claude/skills/monorepo-architecture/SKILL.md +162 -0
- package/claude/skills/nextjs-api-development/SKILL.md +364 -0
- package/claude/skills/nextjs-api-development/scripts/generate-crud-tests.py +456 -0
- package/claude/skills/nextjs-api-development/scripts/scaffold-endpoint.py +481 -0
- package/claude/skills/nextjs-api-development/scripts/validate-api.py +283 -0
- package/claude/skills/notion-integration/SKILL.md +641 -0
- package/claude/skills/npm-development-workflow/SKILL.md +480 -0
- package/claude/skills/page-builder-blocks/SKILL.md +530 -0
- package/claude/skills/page-builder-blocks/scripts/scaffold-block.py +444 -0
- package/claude/skills/permissions-system/SKILL.md +619 -0
- package/claude/skills/plugins/SKILL.md +340 -0
- package/claude/skills/plugins/references/plugin-templates.md +414 -0
- package/claude/skills/plugins/references/plugin-testing.md +353 -0
- package/claude/skills/plugins/references/plugin-types.md +198 -0
- package/claude/skills/plugins/scripts/scaffold-plugin.py +443 -0
- package/claude/skills/pom-patterns/SKILL.md +452 -0
- package/claude/skills/pom-patterns/scripts/generate-pom.py +392 -0
- package/claude/skills/rate-limiting/SKILL.md +342 -0
- package/claude/skills/react-best-practices/AGENTS.md +2410 -0
- package/claude/skills/react-best-practices/README.md +123 -0
- package/claude/skills/react-best-practices/SKILL.md +125 -0
- package/claude/skills/react-best-practices/metadata.json +15 -0
- package/claude/skills/react-best-practices/rules/_sections.md +46 -0
- package/claude/skills/react-best-practices/rules/_template.md +28 -0
- package/claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/claude/skills/react-best-practices/rules/advanced-use-latest.md +49 -0
- package/claude/skills/react-best-practices/rules/async-api-routes.md +38 -0
- package/claude/skills/react-best-practices/rules/async-defer-await.md +80 -0
- package/claude/skills/react-best-practices/rules/async-dependencies.md +36 -0
- package/claude/skills/react-best-practices/rules/async-parallel.md +28 -0
- package/claude/skills/react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/claude/skills/react-best-practices/rules/bundle-barrel-imports.md +59 -0
- package/claude/skills/react-best-practices/rules/bundle-conditional.md +31 -0
- package/claude/skills/react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/claude/skills/react-best-practices/rules/bundle-preload.md +50 -0
- package/claude/skills/react-best-practices/rules/client-event-listeners.md +74 -0
- package/claude/skills/react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/claude/skills/react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/claude/skills/react-best-practices/rules/client-swr-dedup.md +56 -0
- package/claude/skills/react-best-practices/rules/js-batch-dom-css.md +82 -0
- package/claude/skills/react-best-practices/rules/js-cache-function-results.md +80 -0
- package/claude/skills/react-best-practices/rules/js-cache-property-access.md +28 -0
- package/claude/skills/react-best-practices/rules/js-cache-storage.md +70 -0
- package/claude/skills/react-best-practices/rules/js-combine-iterations.md +32 -0
- package/claude/skills/react-best-practices/rules/js-early-exit.md +50 -0
- package/claude/skills/react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/claude/skills/react-best-practices/rules/js-index-maps.md +37 -0
- package/claude/skills/react-best-practices/rules/js-length-check-first.md +49 -0
- package/claude/skills/react-best-practices/rules/js-min-max-loop.md +82 -0
- package/claude/skills/react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/claude/skills/react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/claude/skills/react-best-practices/rules/rendering-activity.md +26 -0
- package/claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/claude/skills/react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/claude/skills/react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/claude/skills/react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/claude/skills/react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/claude/skills/react-best-practices/rules/rerender-dependencies.md +45 -0
- package/claude/skills/react-best-practices/rules/rerender-derived-state.md +29 -0
- package/claude/skills/react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/claude/skills/react-best-practices/rules/rerender-memo.md +44 -0
- package/claude/skills/react-best-practices/rules/rerender-transitions.md +40 -0
- package/claude/skills/react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/claude/skills/react-best-practices/rules/server-cache-lru.md +41 -0
- package/claude/skills/react-best-practices/rules/server-cache-react.md +76 -0
- package/claude/skills/react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/claude/skills/react-best-practices/rules/server-serialization.md +38 -0
- package/claude/skills/react-patterns/SKILL.md +688 -0
- package/claude/skills/registry-system/SKILL.md +331 -0
- package/claude/skills/scheduled-actions/SKILL.md +671 -0
- package/claude/skills/scope-enforcement/SKILL.md +542 -0
- package/claude/skills/scope-enforcement/scripts/validate-scope.py +357 -0
- package/claude/skills/server-actions/SKILL.md +493 -0
- package/claude/skills/service-layer/SKILL.md +587 -0
- package/claude/skills/session-management/SKILL.md +266 -0
- package/claude/skills/session-management/scripts/create-session.py +166 -0
- package/claude/skills/session-management/scripts/iteration-close.sh +105 -0
- package/claude/skills/session-management/scripts/iteration-init.sh +180 -0
- package/claude/skills/session-management/scripts/session-archive.sh +87 -0
- package/claude/skills/session-management/scripts/session-close.sh +133 -0
- package/claude/skills/session-management/scripts/session-init.sh +225 -0
- package/claude/skills/session-management/scripts/session-list.sh +163 -0
- package/claude/skills/session-management/scripts/split-plan.sh +116 -0
- package/claude/skills/shadcn-components/SKILL.md +586 -0
- package/claude/skills/shadcn-theming/SKILL.md +446 -0
- package/claude/skills/suspense-loading/SKILL.md +280 -0
- package/claude/skills/tailwind-theming/SKILL.md +507 -0
- package/claude/skills/tanstack-query/SKILL.md +608 -0
- package/claude/skills/test-coverage/SKILL.md +239 -0
- package/claude/skills/web-design-guidelines/SKILL.md +39 -0
- package/claude/skills/zod-validation/SKILL.md +537 -0
- package/claude/templates/blocks/progress.md +86 -0
- package/claude/templates/iteration/changes.md +61 -0
- package/claude/templates/iteration/progress.md +55 -0
- package/claude/templates/log.md +31 -0
- package/claude/templates/story/context.md +77 -0
- package/claude/templates/story/pendings.md +37 -0
- package/claude/templates/story/plan.md +299 -0
- package/claude/templates/story/requirements.md +109 -0
- package/claude/templates/story/scope.json +10 -0
- package/claude/templates/story/tests.md +91 -0
- package/claude/templates/task/progress.md +58 -0
- package/claude/templates/task/requirements.md +54 -0
- package/claude/workflows/README.md +154 -0
- package/claude/workflows/blocks.md +614 -0
- package/claude/workflows/story.md +1207 -0
- package/claude/workflows/task.md +927 -0
- package/claude/workflows/tweak.md +527 -0
- package/cursor/.gitkeep +0 -0
- package/package.json +35 -0
- package/scripts/postinstall.mjs +198 -0
- package/scripts/setup.mjs +282 -0
- 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) |
|