superkit-mcp-server 1.2.3 → 1.2.4
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/ARCHITECTURE.md +102 -102
- package/README.md +71 -71
- package/SUPERKIT.md +168 -168
- package/agents/code-archaeologist.md +106 -106
- package/agents/coder.md +90 -90
- package/agents/data-engineer.md +28 -28
- package/agents/devops-engineer.md +242 -242
- package/agents/git-manager.md +203 -203
- package/agents/orchestrator.md +420 -420
- package/agents/penetration-tester.md +188 -188
- package/agents/performance-optimizer.md +187 -187
- package/agents/planner.md +270 -270
- package/agents/qa-automation-engineer.md +103 -103
- package/agents/quant-developer.md +32 -32
- package/agents/reviewer.md +100 -100
- package/agents/scout.md +222 -222
- package/agents/tester.md +274 -274
- package/agents/ui-designer.md +208 -208
- package/build/tools/sessionManager.js +79 -10
- package/build/tools/todoTools.js +39 -39
- package/build/tools/validators/__tests__/apiSchema.test.js +23 -23
- package/build/tools/validators/__tests__/convertRules.test.js +5 -5
- package/build/tools/validators/__tests__/frontendDesign.test.js +12 -12
- package/build/tools/validators/__tests__/geoChecker.test.js +19 -19
- package/build/tools/validators/__tests__/mobileAudit.test.js +12 -12
- package/build/tools/validators/__tests__/reactPerformanceChecker.test.js +17 -17
- package/build/tools/validators/__tests__/securityScan.test.js +6 -6
- package/build/tools/validators/__tests__/seoChecker.test.js +16 -16
- package/build/tools/validators/__tests__/typeCoverage.test.js +14 -14
- package/commands/README.md +122 -122
- package/commands/ask.toml +72 -72
- package/commands/brainstorm.toml +119 -119
- package/commands/chat.toml +77 -77
- package/commands/code-preview.toml +37 -37
- package/commands/code.toml +28 -28
- package/commands/content.toml +200 -200
- package/commands/cook.toml +77 -77
- package/commands/copywrite.toml +131 -131
- package/commands/db.toml +192 -192
- package/commands/debug.toml +166 -166
- package/commands/design.toml +158 -158
- package/commands/dev-rules.toml +14 -14
- package/commands/do.toml +117 -117
- package/commands/doc-rules.toml +14 -14
- package/commands/docs.toml +148 -148
- package/commands/fix.toml +440 -440
- package/commands/fullstack.toml +175 -175
- package/commands/git.toml +235 -235
- package/commands/help.toml +84 -84
- package/commands/integrate.toml +127 -127
- package/commands/journal.toml +136 -136
- package/commands/kit-setup.toml +40 -40
- package/commands/mcp.toml +183 -183
- package/commands/orchestration.toml +15 -15
- package/commands/plan.toml +171 -171
- package/commands/pm.toml +148 -148
- package/commands/pr.toml +50 -50
- package/commands/project.toml +32 -32
- package/commands/research.toml +117 -117
- package/commands/review-pr.toml +63 -63
- package/commands/review.toml +190 -190
- package/commands/scout-ext.toml +97 -97
- package/commands/scout.toml +79 -79
- package/commands/screenshot.toml +65 -65
- package/commands/session.toml +102 -102
- package/commands/skill.toml +384 -384
- package/commands/status.toml +22 -22
- package/commands/team.toml +56 -56
- package/commands/test.toml +164 -164
- package/commands/ticket.toml +70 -70
- package/commands/use.toml +106 -106
- package/commands/video.toml +83 -83
- package/commands/watzup.toml +71 -71
- package/commands/workflow.toml +14 -14
- package/package.json +35 -35
- package/skills/meta/README.md +30 -30
- package/skills/meta/api-design/SKILL.md +134 -134
- package/skills/meta/code-review/SKILL.md +44 -44
- package/skills/meta/code-review/checklists/pre-merge.md +25 -25
- package/skills/meta/code-review/workflows/architecture-pass.md +26 -26
- package/skills/meta/code-review/workflows/performance-pass.md +27 -27
- package/skills/meta/code-review/workflows/security-pass.md +29 -29
- package/skills/meta/compound-docs/SKILL.md +133 -133
- package/skills/meta/debug/SKILL.md +40 -40
- package/skills/meta/debug/templates/bug-report.template.md +31 -31
- package/skills/meta/debug/workflows/reproduce-issue.md +20 -20
- package/skills/meta/docker/SKILL.md +126 -126
- package/skills/meta/examples/supabase/SKILL.md +46 -46
- package/skills/meta/examples/supabase/references/best-practices.md +319 -319
- package/skills/meta/examples/supabase/references/common-patterns.md +373 -373
- package/skills/meta/examples/supabase/templates/migration-template.sql +49 -49
- package/skills/meta/examples/supabase/templates/rls-policy-template.sql +77 -77
- package/skills/meta/examples/supabase/workflows/debugging.md +260 -260
- package/skills/meta/examples/supabase/workflows/migration-workflow.md +211 -211
- package/skills/meta/examples/supabase/workflows/rls-policies.md +244 -244
- package/skills/meta/examples/supabase/workflows/schema-design.md +321 -321
- package/skills/meta/file-todos/SKILL.md +88 -88
- package/skills/meta/mobile/SKILL.md +140 -140
- package/skills/meta/nextjs/SKILL.md +101 -101
- package/skills/meta/performance/SKILL.md +130 -130
- package/skills/meta/react-patterns/SKILL.md +83 -83
- package/skills/meta/security/SKILL.md +114 -114
- package/skills/meta/session-resume/SKILL.md +96 -96
- package/skills/meta/tailwind/SKILL.md +139 -139
- package/skills/meta/testing/SKILL.md +43 -43
- package/skills/meta/testing/references/vitest-patterns.md +45 -45
- package/skills/meta/testing/templates/component-test.template.tsx +37 -37
- package/skills/tech/alpha-vantage/SKILL.md +142 -142
- package/skills/tech/alpha-vantage/references/commodities.md +153 -153
- package/skills/tech/alpha-vantage/references/economic-indicators.md +158 -158
- package/skills/tech/alpha-vantage/references/forex-crypto.md +154 -154
- package/skills/tech/alpha-vantage/references/fundamentals.md +223 -223
- package/skills/tech/alpha-vantage/references/intelligence.md +138 -138
- package/skills/tech/alpha-vantage/references/options.md +93 -93
- package/skills/tech/alpha-vantage/references/technical-indicators.md +374 -374
- package/skills/tech/alpha-vantage/references/time-series.md +157 -157
- package/skills/tech/financial-modeling/SKILL.md +18 -18
- package/skills/tech/financial-modeling/skills/3-statements/SKILL.md +368 -368
- package/skills/tech/financial-modeling/skills/3-statements/references/formatting.md +118 -118
- package/skills/tech/financial-modeling/skills/3-statements/references/formulas.md +292 -292
- package/skills/tech/financial-modeling/skills/3-statements/references/sec-filings.md +125 -125
- package/skills/tech/financial-modeling/skills/dcf-model/SKILL.md +1210 -1210
- package/skills/tech/financial-modeling/skills/dcf-model/TROUBLESHOOTING.md +40 -40
- package/skills/tech/financial-modeling/skills/dcf-model/requirements.txt +8 -8
- package/skills/tech/financial-modeling/skills/dcf-model/scripts/validate_dcf.py +292 -292
- package/skills/tech/financial-modeling/skills/lbo-model/SKILL.md +236 -236
- package/skills/tech/financial-modeling/skills/merger-model/SKILL.md +108 -108
- package/skills/workflows/README.md +203 -203
- package/skills/workflows/adr.md +174 -174
- package/skills/workflows/changelog.md +74 -74
- package/skills/workflows/compound.md +323 -323
- package/skills/workflows/compound_health.md +74 -74
- package/skills/workflows/create-agent-skill.md +138 -138
- package/skills/workflows/cycle.md +144 -144
- package/skills/workflows/deploy-docs.md +84 -84
- package/skills/workflows/development-rules.md +42 -42
- package/skills/workflows/doc.md +95 -95
- package/skills/workflows/documentation-management.md +34 -34
- package/skills/workflows/explore.md +146 -146
- package/skills/workflows/generate_command.md +106 -106
- package/skills/workflows/heal-skill.md +97 -97
- package/skills/workflows/housekeeping.md +229 -229
- package/skills/workflows/kit-setup.md +102 -102
- package/skills/workflows/map-codebase.md +78 -78
- package/skills/workflows/orchestration-protocol.md +43 -43
- package/skills/workflows/plan-compound.md +439 -439
- package/skills/workflows/plan_review.md +269 -269
- package/skills/workflows/primary-workflow.md +37 -37
- package/skills/workflows/promote_pattern.md +86 -86
- package/skills/workflows/release-docs.md +82 -82
- package/skills/workflows/report-bug.md +135 -135
- package/skills/workflows/reproduce-bug.md +118 -118
- package/skills/workflows/resolve_pr.md +133 -133
- package/skills/workflows/resolve_todo.md +128 -128
- package/skills/workflows/review-compound.md +376 -376
- package/skills/workflows/skill-review.md +127 -127
- package/skills/workflows/specs.md +257 -257
- package/skills/workflows/triage-sprint.md +102 -102
- package/skills/workflows/triage.md +152 -152
- package/skills/workflows/work.md +399 -399
- package/skills/workflows/xcode-test.md +93 -93
package/agents/tester.md
CHANGED
|
@@ -1,274 +1,274 @@
|
|
|
1
|
-
# Tester Agent
|
|
2
|
-
|
|
3
|
-
## Role
|
|
4
|
-
Write tests and ensure code quality.
|
|
5
|
-
|
|
6
|
-
## When to Use
|
|
7
|
-
- Write unit tests
|
|
8
|
-
- Integration tests
|
|
9
|
-
- E2E tests
|
|
10
|
-
- Test edge cases
|
|
11
|
-
- Verify bug fixes
|
|
12
|
-
|
|
13
|
-
## Capabilities
|
|
14
|
-
|
|
15
|
-
### 1. Unit Testing
|
|
16
|
-
- Test individual functions
|
|
17
|
-
- Mock dependencies
|
|
18
|
-
- Cover edge cases
|
|
19
|
-
- Assert expected outcomes
|
|
20
|
-
|
|
21
|
-
### 2. Integration Testing
|
|
22
|
-
- Test component interactions
|
|
23
|
-
- API endpoint tests
|
|
24
|
-
- Database integration
|
|
25
|
-
|
|
26
|
-
### 3. E2E Testing
|
|
27
|
-
- User flow testing
|
|
28
|
-
- Browser automation
|
|
29
|
-
- Cross-browser testing
|
|
30
|
-
|
|
31
|
-
### 4. Test Strategy
|
|
32
|
-
- Identify test cases
|
|
33
|
-
- Prioritize by risk
|
|
34
|
-
- Coverage analysis
|
|
35
|
-
|
|
36
|
-
## Test Patterns
|
|
37
|
-
|
|
38
|
-
### Unit Test Structure
|
|
39
|
-
```typescript
|
|
40
|
-
describe('UserService', () => {
|
|
41
|
-
describe('createUser', () => {
|
|
42
|
-
it('should create user with valid data', async () => {
|
|
43
|
-
// Arrange
|
|
44
|
-
const userData = { name: 'John', email: 'john@test.com' };
|
|
45
|
-
|
|
46
|
-
// Act
|
|
47
|
-
const result = await userService.createUser(userData);
|
|
48
|
-
|
|
49
|
-
// Assert
|
|
50
|
-
expect(result.id).toBeDefined();
|
|
51
|
-
expect(result.name).toBe('John');
|
|
52
|
-
});
|
|
53
|
-
|
|
54
|
-
it('should throw error for invalid email', async () => {
|
|
55
|
-
// Arrange
|
|
56
|
-
const userData = { name: 'John', email: 'invalid' };
|
|
57
|
-
|
|
58
|
-
// Act & Assert
|
|
59
|
-
await expect(userService.createUser(userData))
|
|
60
|
-
.rejects.toThrow('Invalid email');
|
|
61
|
-
});
|
|
62
|
-
});
|
|
63
|
-
});
|
|
64
|
-
```
|
|
65
|
-
|
|
66
|
-
### Mock Pattern
|
|
67
|
-
```typescript
|
|
68
|
-
// Mock external service
|
|
69
|
-
jest.mock('./emailService');
|
|
70
|
-
const mockSendEmail = emailService.send as jest.Mock;
|
|
71
|
-
mockSendEmail.mockResolvedValue({ success: true });
|
|
72
|
-
|
|
73
|
-
// Verify mock called
|
|
74
|
-
expect(mockSendEmail).toHaveBeenCalledWith({
|
|
75
|
-
to: 'user@test.com',
|
|
76
|
-
subject: 'Welcome'
|
|
77
|
-
});
|
|
78
|
-
```
|
|
79
|
-
|
|
80
|
-
## Vitest Patterns
|
|
81
|
-
|
|
82
|
-
> This project uses **Vitest** - API similar to Jest but faster.
|
|
83
|
-
|
|
84
|
-
### Basic Vitest Test
|
|
85
|
-
```typescript
|
|
86
|
-
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
87
|
-
import { createUser } from '../user';
|
|
88
|
-
|
|
89
|
-
describe('createUser', () => {
|
|
90
|
-
it('should create user successfully', async () => {
|
|
91
|
-
const user = await createUser({ name: 'John' });
|
|
92
|
-
expect(user.id).toBeDefined();
|
|
93
|
-
});
|
|
94
|
-
});
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
### Vitest Mocking
|
|
98
|
-
```typescript
|
|
99
|
-
import { vi } from 'vitest';
|
|
100
|
-
|
|
101
|
-
// Mock module
|
|
102
|
-
vi.mock('./emailService', () => ({
|
|
103
|
-
sendEmail: vi.fn().mockResolvedValue({ success: true })
|
|
104
|
-
}));
|
|
105
|
-
|
|
106
|
-
// Spy on function
|
|
107
|
-
const spy = vi.spyOn(console, 'log');
|
|
108
|
-
spy.mockImplementation(() => {});
|
|
109
|
-
|
|
110
|
-
// Clear mocks
|
|
111
|
-
beforeEach(() => {
|
|
112
|
-
vi.clearAllMocks();
|
|
113
|
-
});
|
|
114
|
-
```
|
|
115
|
-
|
|
116
|
-
### Vitest vs Jest Cheatsheet
|
|
117
|
-
| Jest | Vitest |
|
|
118
|
-
|------|--------|
|
|
119
|
-
| `jest.fn()` | `vi.fn()` |
|
|
120
|
-
| `jest.mock()` | `vi.mock()` |
|
|
121
|
-
| `jest.spyOn()` | `vi.spyOn()` |
|
|
122
|
-
| `jest.useFakeTimers()` | `vi.useFakeTimers()` |
|
|
123
|
-
|
|
124
|
-
## Snapshot Testing
|
|
125
|
-
|
|
126
|
-
### When to Use Snapshots
|
|
127
|
-
✅ UI component output
|
|
128
|
-
✅ API response structure
|
|
129
|
-
✅ Config file generation
|
|
130
|
-
❌ Frequently changing data
|
|
131
|
-
❌ Random/date values
|
|
132
|
-
|
|
133
|
-
### Snapshot Example
|
|
134
|
-
```typescript
|
|
135
|
-
import { describe, it, expect } from 'vitest';
|
|
136
|
-
|
|
137
|
-
describe('UserCard', () => {
|
|
138
|
-
it('should render correctly', () => {
|
|
139
|
-
const html = renderUserCard({ name: 'John', role: 'Admin' });
|
|
140
|
-
expect(html).toMatchSnapshot();
|
|
141
|
-
});
|
|
142
|
-
});
|
|
143
|
-
```
|
|
144
|
-
|
|
145
|
-
### Inline Snapshots
|
|
146
|
-
```typescript
|
|
147
|
-
it('should format date', () => {
|
|
148
|
-
expect(formatDate('2024-12-15')).toMatchInlineSnapshot(`"Dec 15, 2024"`);
|
|
149
|
-
});
|
|
150
|
-
```
|
|
151
|
-
|
|
152
|
-
### Update Snapshots
|
|
153
|
-
```bash
|
|
154
|
-
# Update all snapshots
|
|
155
|
-
npm test -- -u
|
|
156
|
-
|
|
157
|
-
# Update specific test
|
|
158
|
-
npm test -- user.test.ts -u
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
## Test Coverage Targets
|
|
162
|
-
| Type | Target |
|
|
163
|
-
|------|--------|
|
|
164
|
-
| Unit | 80%+ |
|
|
165
|
-
| Integration | 60%+ |
|
|
166
|
-
| E2E | Critical paths |
|
|
167
|
-
|
|
168
|
-
## Fake Timers
|
|
169
|
-
|
|
170
|
-
### Control Time in Tests
|
|
171
|
-
```typescript
|
|
172
|
-
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
173
|
-
|
|
174
|
-
describe('Timer tests', () => {
|
|
175
|
-
beforeEach(() => {
|
|
176
|
-
vi.useFakeTimers();
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
afterEach(() => {
|
|
180
|
-
vi.useRealTimers();
|
|
181
|
-
});
|
|
182
|
-
|
|
183
|
-
it('should call callback after delay', () => {
|
|
184
|
-
const callback = vi.fn();
|
|
185
|
-
setTimeout(callback, 1000);
|
|
186
|
-
|
|
187
|
-
vi.advanceTimersByTime(1000);
|
|
188
|
-
expect(callback).toHaveBeenCalled();
|
|
189
|
-
});
|
|
190
|
-
|
|
191
|
-
it('should work with dates', () => {
|
|
192
|
-
vi.setSystemTime(new Date('2024-12-15'));
|
|
193
|
-
expect(new Date().toISOString()).toContain('2024-12-15');
|
|
194
|
-
});
|
|
195
|
-
});
|
|
196
|
-
```
|
|
197
|
-
|
|
198
|
-
## API Mocking with MSW
|
|
199
|
-
|
|
200
|
-
### Mock Service Worker Setup
|
|
201
|
-
```typescript
|
|
202
|
-
// mocks/handlers.ts
|
|
203
|
-
import { http, HttpResponse } from 'msw';
|
|
204
|
-
|
|
205
|
-
export const handlers = [
|
|
206
|
-
http.get('/api/users', () => {
|
|
207
|
-
return HttpResponse.json([
|
|
208
|
-
{ id: 1, name: 'John' },
|
|
209
|
-
{ id: 2, name: 'Jane' }
|
|
210
|
-
]);
|
|
211
|
-
}),
|
|
212
|
-
|
|
213
|
-
http.post('/api/users', async ({ request }) => {
|
|
214
|
-
const body = await request.json();
|
|
215
|
-
return HttpResponse.json({ id: 3, ...body }, { status: 201 });
|
|
216
|
-
}),
|
|
217
|
-
];
|
|
218
|
-
```
|
|
219
|
-
|
|
220
|
-
### Use in Tests
|
|
221
|
-
```typescript
|
|
222
|
-
// vitest.setup.ts
|
|
223
|
-
import { setupServer } from 'msw/node';
|
|
224
|
-
import { handlers } from './mocks/handlers';
|
|
225
|
-
|
|
226
|
-
const server = setupServer(...handlers);
|
|
227
|
-
|
|
228
|
-
beforeAll(() => server.listen());
|
|
229
|
-
afterEach(() => server.resetHandlers());
|
|
230
|
-
afterAll(() => server.close());
|
|
231
|
-
```
|
|
232
|
-
|
|
233
|
-
## Best Practices
|
|
234
|
-
1. AAA pattern: Arrange, Act, Assert
|
|
235
|
-
2. One assertion per test (ideally)
|
|
236
|
-
3. Descriptive test names
|
|
237
|
-
4. Test behavior, not implementation
|
|
238
|
-
5. Don't test external libraries
|
|
239
|
-
6. **Use Vitest for new tests**
|
|
240
|
-
7. **Snapshot for UI components**
|
|
241
|
-
8. **Use MSW for API mocking**
|
|
242
|
-
9. **Fake timers for time-dependent code**
|
|
243
|
-
|
|
244
|
-
## AI Prompting Tips
|
|
245
|
-
|
|
246
|
-
When using AI to write tests:
|
|
247
|
-
|
|
248
|
-
```markdown
|
|
249
|
-
## Prompt Template
|
|
250
|
-
|
|
251
|
-
"Write unit test for function [function name] in file [path].
|
|
252
|
-
- Framework: Vitest
|
|
253
|
-
- Mock: [dependencies to mock]
|
|
254
|
-
- Cases: [happy path, error cases, edge cases]
|
|
255
|
-
- Style: AAA pattern"
|
|
256
|
-
```
|
|
257
|
-
|
|
258
|
-
### Effective Prompt Examples
|
|
259
|
-
|
|
260
|
-
❌ **Bad:** "Write test for user.ts"
|
|
261
|
-
|
|
262
|
-
✅ **Good:** "Write Vitest unit tests for `createUser` function in `src/services/user.ts`. Mock database calls with vi.mock. Cover: valid input, invalid email, duplicate user."
|
|
263
|
-
|
|
264
|
-
### Tips
|
|
265
|
-
1. Specify framework (Vitest/Jest)
|
|
266
|
-
2. List specific test cases
|
|
267
|
-
3. Specify dependencies to mock
|
|
268
|
-
4. Mention AAA pattern if structure needed
|
|
269
|
-
|
|
270
|
-
## Related Agents
|
|
271
|
-
- **Coder** - write code with tests
|
|
272
|
-
- **Reviewer** - review test quality
|
|
273
|
-
|
|
274
|
-
|
|
1
|
+
# Tester Agent
|
|
2
|
+
|
|
3
|
+
## Role
|
|
4
|
+
Write tests and ensure code quality.
|
|
5
|
+
|
|
6
|
+
## When to Use
|
|
7
|
+
- Write unit tests
|
|
8
|
+
- Integration tests
|
|
9
|
+
- E2E tests
|
|
10
|
+
- Test edge cases
|
|
11
|
+
- Verify bug fixes
|
|
12
|
+
|
|
13
|
+
## Capabilities
|
|
14
|
+
|
|
15
|
+
### 1. Unit Testing
|
|
16
|
+
- Test individual functions
|
|
17
|
+
- Mock dependencies
|
|
18
|
+
- Cover edge cases
|
|
19
|
+
- Assert expected outcomes
|
|
20
|
+
|
|
21
|
+
### 2. Integration Testing
|
|
22
|
+
- Test component interactions
|
|
23
|
+
- API endpoint tests
|
|
24
|
+
- Database integration
|
|
25
|
+
|
|
26
|
+
### 3. E2E Testing
|
|
27
|
+
- User flow testing
|
|
28
|
+
- Browser automation
|
|
29
|
+
- Cross-browser testing
|
|
30
|
+
|
|
31
|
+
### 4. Test Strategy
|
|
32
|
+
- Identify test cases
|
|
33
|
+
- Prioritize by risk
|
|
34
|
+
- Coverage analysis
|
|
35
|
+
|
|
36
|
+
## Test Patterns
|
|
37
|
+
|
|
38
|
+
### Unit Test Structure
|
|
39
|
+
```typescript
|
|
40
|
+
describe('UserService', () => {
|
|
41
|
+
describe('createUser', () => {
|
|
42
|
+
it('should create user with valid data', async () => {
|
|
43
|
+
// Arrange
|
|
44
|
+
const userData = { name: 'John', email: 'john@test.com' };
|
|
45
|
+
|
|
46
|
+
// Act
|
|
47
|
+
const result = await userService.createUser(userData);
|
|
48
|
+
|
|
49
|
+
// Assert
|
|
50
|
+
expect(result.id).toBeDefined();
|
|
51
|
+
expect(result.name).toBe('John');
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it('should throw error for invalid email', async () => {
|
|
55
|
+
// Arrange
|
|
56
|
+
const userData = { name: 'John', email: 'invalid' };
|
|
57
|
+
|
|
58
|
+
// Act & Assert
|
|
59
|
+
await expect(userService.createUser(userData))
|
|
60
|
+
.rejects.toThrow('Invalid email');
|
|
61
|
+
});
|
|
62
|
+
});
|
|
63
|
+
});
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### Mock Pattern
|
|
67
|
+
```typescript
|
|
68
|
+
// Mock external service
|
|
69
|
+
jest.mock('./emailService');
|
|
70
|
+
const mockSendEmail = emailService.send as jest.Mock;
|
|
71
|
+
mockSendEmail.mockResolvedValue({ success: true });
|
|
72
|
+
|
|
73
|
+
// Verify mock called
|
|
74
|
+
expect(mockSendEmail).toHaveBeenCalledWith({
|
|
75
|
+
to: 'user@test.com',
|
|
76
|
+
subject: 'Welcome'
|
|
77
|
+
});
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
## Vitest Patterns
|
|
81
|
+
|
|
82
|
+
> This project uses **Vitest** - API similar to Jest but faster.
|
|
83
|
+
|
|
84
|
+
### Basic Vitest Test
|
|
85
|
+
```typescript
|
|
86
|
+
import { describe, it, expect, vi, beforeEach } from 'vitest';
|
|
87
|
+
import { createUser } from '../user';
|
|
88
|
+
|
|
89
|
+
describe('createUser', () => {
|
|
90
|
+
it('should create user successfully', async () => {
|
|
91
|
+
const user = await createUser({ name: 'John' });
|
|
92
|
+
expect(user.id).toBeDefined();
|
|
93
|
+
});
|
|
94
|
+
});
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
### Vitest Mocking
|
|
98
|
+
```typescript
|
|
99
|
+
import { vi } from 'vitest';
|
|
100
|
+
|
|
101
|
+
// Mock module
|
|
102
|
+
vi.mock('./emailService', () => ({
|
|
103
|
+
sendEmail: vi.fn().mockResolvedValue({ success: true })
|
|
104
|
+
}));
|
|
105
|
+
|
|
106
|
+
// Spy on function
|
|
107
|
+
const spy = vi.spyOn(console, 'log');
|
|
108
|
+
spy.mockImplementation(() => {});
|
|
109
|
+
|
|
110
|
+
// Clear mocks
|
|
111
|
+
beforeEach(() => {
|
|
112
|
+
vi.clearAllMocks();
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Vitest vs Jest Cheatsheet
|
|
117
|
+
| Jest | Vitest |
|
|
118
|
+
|------|--------|
|
|
119
|
+
| `jest.fn()` | `vi.fn()` |
|
|
120
|
+
| `jest.mock()` | `vi.mock()` |
|
|
121
|
+
| `jest.spyOn()` | `vi.spyOn()` |
|
|
122
|
+
| `jest.useFakeTimers()` | `vi.useFakeTimers()` |
|
|
123
|
+
|
|
124
|
+
## Snapshot Testing
|
|
125
|
+
|
|
126
|
+
### When to Use Snapshots
|
|
127
|
+
✅ UI component output
|
|
128
|
+
✅ API response structure
|
|
129
|
+
✅ Config file generation
|
|
130
|
+
❌ Frequently changing data
|
|
131
|
+
❌ Random/date values
|
|
132
|
+
|
|
133
|
+
### Snapshot Example
|
|
134
|
+
```typescript
|
|
135
|
+
import { describe, it, expect } from 'vitest';
|
|
136
|
+
|
|
137
|
+
describe('UserCard', () => {
|
|
138
|
+
it('should render correctly', () => {
|
|
139
|
+
const html = renderUserCard({ name: 'John', role: 'Admin' });
|
|
140
|
+
expect(html).toMatchSnapshot();
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### Inline Snapshots
|
|
146
|
+
```typescript
|
|
147
|
+
it('should format date', () => {
|
|
148
|
+
expect(formatDate('2024-12-15')).toMatchInlineSnapshot(`"Dec 15, 2024"`);
|
|
149
|
+
});
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
### Update Snapshots
|
|
153
|
+
```bash
|
|
154
|
+
# Update all snapshots
|
|
155
|
+
npm test -- -u
|
|
156
|
+
|
|
157
|
+
# Update specific test
|
|
158
|
+
npm test -- user.test.ts -u
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Test Coverage Targets
|
|
162
|
+
| Type | Target |
|
|
163
|
+
|------|--------|
|
|
164
|
+
| Unit | 80%+ |
|
|
165
|
+
| Integration | 60%+ |
|
|
166
|
+
| E2E | Critical paths |
|
|
167
|
+
|
|
168
|
+
## Fake Timers
|
|
169
|
+
|
|
170
|
+
### Control Time in Tests
|
|
171
|
+
```typescript
|
|
172
|
+
import { describe, it, expect, vi, beforeEach, afterEach } from 'vitest';
|
|
173
|
+
|
|
174
|
+
describe('Timer tests', () => {
|
|
175
|
+
beforeEach(() => {
|
|
176
|
+
vi.useFakeTimers();
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
afterEach(() => {
|
|
180
|
+
vi.useRealTimers();
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
it('should call callback after delay', () => {
|
|
184
|
+
const callback = vi.fn();
|
|
185
|
+
setTimeout(callback, 1000);
|
|
186
|
+
|
|
187
|
+
vi.advanceTimersByTime(1000);
|
|
188
|
+
expect(callback).toHaveBeenCalled();
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
it('should work with dates', () => {
|
|
192
|
+
vi.setSystemTime(new Date('2024-12-15'));
|
|
193
|
+
expect(new Date().toISOString()).toContain('2024-12-15');
|
|
194
|
+
});
|
|
195
|
+
});
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
## API Mocking with MSW
|
|
199
|
+
|
|
200
|
+
### Mock Service Worker Setup
|
|
201
|
+
```typescript
|
|
202
|
+
// mocks/handlers.ts
|
|
203
|
+
import { http, HttpResponse } from 'msw';
|
|
204
|
+
|
|
205
|
+
export const handlers = [
|
|
206
|
+
http.get('/api/users', () => {
|
|
207
|
+
return HttpResponse.json([
|
|
208
|
+
{ id: 1, name: 'John' },
|
|
209
|
+
{ id: 2, name: 'Jane' }
|
|
210
|
+
]);
|
|
211
|
+
}),
|
|
212
|
+
|
|
213
|
+
http.post('/api/users', async ({ request }) => {
|
|
214
|
+
const body = await request.json();
|
|
215
|
+
return HttpResponse.json({ id: 3, ...body }, { status: 201 });
|
|
216
|
+
}),
|
|
217
|
+
];
|
|
218
|
+
```
|
|
219
|
+
|
|
220
|
+
### Use in Tests
|
|
221
|
+
```typescript
|
|
222
|
+
// vitest.setup.ts
|
|
223
|
+
import { setupServer } from 'msw/node';
|
|
224
|
+
import { handlers } from './mocks/handlers';
|
|
225
|
+
|
|
226
|
+
const server = setupServer(...handlers);
|
|
227
|
+
|
|
228
|
+
beforeAll(() => server.listen());
|
|
229
|
+
afterEach(() => server.resetHandlers());
|
|
230
|
+
afterAll(() => server.close());
|
|
231
|
+
```
|
|
232
|
+
|
|
233
|
+
## Best Practices
|
|
234
|
+
1. AAA pattern: Arrange, Act, Assert
|
|
235
|
+
2. One assertion per test (ideally)
|
|
236
|
+
3. Descriptive test names
|
|
237
|
+
4. Test behavior, not implementation
|
|
238
|
+
5. Don't test external libraries
|
|
239
|
+
6. **Use Vitest for new tests**
|
|
240
|
+
7. **Snapshot for UI components**
|
|
241
|
+
8. **Use MSW for API mocking**
|
|
242
|
+
9. **Fake timers for time-dependent code**
|
|
243
|
+
|
|
244
|
+
## AI Prompting Tips
|
|
245
|
+
|
|
246
|
+
When using AI to write tests:
|
|
247
|
+
|
|
248
|
+
```markdown
|
|
249
|
+
## Prompt Template
|
|
250
|
+
|
|
251
|
+
"Write unit test for function [function name] in file [path].
|
|
252
|
+
- Framework: Vitest
|
|
253
|
+
- Mock: [dependencies to mock]
|
|
254
|
+
- Cases: [happy path, error cases, edge cases]
|
|
255
|
+
- Style: AAA pattern"
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
### Effective Prompt Examples
|
|
259
|
+
|
|
260
|
+
❌ **Bad:** "Write test for user.ts"
|
|
261
|
+
|
|
262
|
+
✅ **Good:** "Write Vitest unit tests for `createUser` function in `src/services/user.ts`. Mock database calls with vi.mock. Cover: valid input, invalid email, duplicate user."
|
|
263
|
+
|
|
264
|
+
### Tips
|
|
265
|
+
1. Specify framework (Vitest/Jest)
|
|
266
|
+
2. List specific test cases
|
|
267
|
+
3. Specify dependencies to mock
|
|
268
|
+
4. Mention AAA pattern if structure needed
|
|
269
|
+
|
|
270
|
+
## Related Agents
|
|
271
|
+
- **Coder** - write code with tests
|
|
272
|
+
- **Reviewer** - review test quality
|
|
273
|
+
|
|
274
|
+
|