ai-devx 1.0.0 → 1.0.2

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 (206) hide show
  1. package/package.json +1 -1
  2. package/templates/.agent/.shared/ui-ux-pro-max/data/charts.csv +26 -0
  3. package/templates/.agent/.shared/ui-ux-pro-max/data/colors.csv +97 -0
  4. package/templates/.agent/.shared/ui-ux-pro-max/data/icons.csv +101 -0
  5. package/templates/.agent/.shared/ui-ux-pro-max/data/landing.csv +31 -0
  6. package/templates/.agent/.shared/ui-ux-pro-max/data/products.csv +97 -0
  7. package/templates/.agent/.shared/ui-ux-pro-max/data/prompts.csv +24 -0
  8. package/templates/.agent/.shared/ui-ux-pro-max/data/react-performance.csv +45 -0
  9. package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
  10. package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
  11. package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
  12. package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
  13. package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
  14. package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
  15. package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
  16. package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/react.csv +54 -0
  17. package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
  18. package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
  19. package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
  20. package/templates/.agent/.shared/ui-ux-pro-max/data/stacks/vue.csv +50 -0
  21. package/templates/.agent/.shared/ui-ux-pro-max/data/styles.csv +59 -0
  22. package/templates/.agent/.shared/ui-ux-pro-max/data/typography.csv +58 -0
  23. package/templates/.agent/.shared/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
  24. package/templates/.agent/.shared/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
  25. package/templates/.agent/.shared/ui-ux-pro-max/data/web-interface.csv +31 -0
  26. package/templates/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/core.cpython-313.pyc +0 -0
  27. package/templates/.agent/.shared/ui-ux-pro-max/scripts/__pycache__/design_system.cpython-313.pyc +0 -0
  28. package/templates/.agent/.shared/ui-ux-pro-max/scripts/core.py +258 -0
  29. package/templates/.agent/.shared/ui-ux-pro-max/scripts/design_system.py +1067 -0
  30. package/templates/.agent/.shared/ui-ux-pro-max/scripts/search.py +106 -0
  31. package/templates/.agent/ARCHITECTURE.md +288 -0
  32. package/templates/.agent/agents/backend-specialist.md +251 -135
  33. package/templates/.agent/agents/code-archaeologist.md +106 -0
  34. package/templates/.agent/agents/database-architect.md +222 -160
  35. package/templates/.agent/agents/debugger.md +205 -108
  36. package/templates/.agent/agents/devops-engineer.md +226 -169
  37. package/templates/.agent/agents/documentation-writer.md +104 -0
  38. package/templates/.agent/agents/explorer-agent.md +73 -0
  39. package/templates/.agent/agents/frontend-specialist.md +587 -116
  40. package/templates/.agent/agents/game-developer.md +162 -0
  41. package/templates/.agent/agents/mobile-developer.md +377 -0
  42. package/templates/.agent/agents/orchestrator.md +412 -133
  43. package/templates/.agent/agents/penetration-tester.md +188 -0
  44. package/templates/.agent/agents/performance-optimizer.md +187 -0
  45. package/templates/.agent/agents/product-manager.md +112 -0
  46. package/templates/.agent/agents/product-owner.md +95 -0
  47. package/templates/.agent/agents/project-planner.md +390 -111
  48. package/templates/.agent/agents/qa-automation-engineer.md +103 -0
  49. package/templates/.agent/agents/security-auditor.md +158 -110
  50. package/templates/.agent/agents/seo-specialist.md +111 -0
  51. package/templates/.agent/agents/test-engineer.md +136 -154
  52. package/templates/.agent/mcp_config.json +24 -0
  53. package/templates/.agent/rules/GEMINI.md +273 -0
  54. package/templates/.agent/scripts/auto_preview.py +148 -0
  55. package/templates/.agent/scripts/checklist.py +217 -0
  56. package/templates/.agent/scripts/session_manager.py +120 -0
  57. package/templates/.agent/scripts/verify_all.py +327 -0
  58. package/templates/.agent/skills/api-patterns/SKILL.md +77 -232
  59. package/templates/.agent/skills/api-patterns/api-style.md +42 -0
  60. package/templates/.agent/skills/api-patterns/auth.md +24 -0
  61. package/templates/.agent/skills/api-patterns/documentation.md +26 -0
  62. package/templates/.agent/skills/api-patterns/graphql.md +41 -0
  63. package/templates/.agent/skills/api-patterns/rate-limiting.md +31 -0
  64. package/templates/.agent/skills/api-patterns/response.md +37 -0
  65. package/templates/.agent/skills/api-patterns/rest.md +40 -0
  66. package/templates/.agent/skills/api-patterns/scripts/api_validator.py +211 -0
  67. package/templates/.agent/skills/api-patterns/security-testing.md +122 -0
  68. package/templates/.agent/skills/api-patterns/trpc.md +41 -0
  69. package/templates/.agent/skills/api-patterns/versioning.md +22 -0
  70. package/templates/.agent/skills/app-builder/SKILL.md +75 -0
  71. package/templates/.agent/skills/app-builder/agent-coordination.md +71 -0
  72. package/templates/.agent/skills/app-builder/feature-building.md +53 -0
  73. package/templates/.agent/skills/app-builder/project-detection.md +34 -0
  74. package/templates/.agent/skills/app-builder/scaffolding.md +118 -0
  75. package/templates/.agent/skills/app-builder/tech-stack.md +40 -0
  76. package/templates/.agent/skills/app-builder/templates/SKILL.md +39 -0
  77. package/templates/.agent/skills/app-builder/templates/astro-static/TEMPLATE.md +76 -0
  78. package/templates/.agent/skills/app-builder/templates/chrome-extension/TEMPLATE.md +92 -0
  79. package/templates/.agent/skills/app-builder/templates/cli-tool/TEMPLATE.md +88 -0
  80. package/templates/.agent/skills/app-builder/templates/electron-desktop/TEMPLATE.md +88 -0
  81. package/templates/.agent/skills/app-builder/templates/express-api/TEMPLATE.md +83 -0
  82. package/templates/.agent/skills/app-builder/templates/flutter-app/TEMPLATE.md +90 -0
  83. package/templates/.agent/skills/app-builder/templates/monorepo-turborepo/TEMPLATE.md +90 -0
  84. package/templates/.agent/skills/app-builder/templates/nextjs-fullstack/TEMPLATE.md +122 -0
  85. package/templates/.agent/skills/app-builder/templates/nextjs-saas/TEMPLATE.md +122 -0
  86. package/templates/.agent/skills/app-builder/templates/nextjs-static/TEMPLATE.md +169 -0
  87. package/templates/.agent/skills/app-builder/templates/nuxt-app/TEMPLATE.md +134 -0
  88. package/templates/.agent/skills/app-builder/templates/python-fastapi/TEMPLATE.md +83 -0
  89. package/templates/.agent/skills/app-builder/templates/react-native-app/TEMPLATE.md +119 -0
  90. package/templates/.agent/skills/architecture/SKILL.md +55 -0
  91. package/templates/.agent/skills/architecture/context-discovery.md +43 -0
  92. package/templates/.agent/skills/architecture/examples.md +94 -0
  93. package/templates/.agent/skills/architecture/pattern-selection.md +68 -0
  94. package/templates/.agent/skills/architecture/patterns-reference.md +50 -0
  95. package/templates/.agent/skills/architecture/trade-off-analysis.md +77 -0
  96. package/templates/.agent/skills/bash-linux/SKILL.md +199 -0
  97. package/templates/.agent/skills/behavioral-modes/SKILL.md +242 -0
  98. package/templates/.agent/skills/brainstorming/SKILL.md +163 -0
  99. package/templates/.agent/skills/brainstorming/dynamic-questioning.md +350 -0
  100. package/templates/.agent/skills/clean-code/SKILL.md +201 -0
  101. package/templates/.agent/skills/code-review-checklist/SKILL.md +109 -0
  102. package/templates/.agent/skills/database-design/SKILL.md +34 -285
  103. package/templates/.agent/skills/database-design/database-selection.md +43 -0
  104. package/templates/.agent/skills/database-design/indexing.md +39 -0
  105. package/templates/.agent/skills/database-design/migrations.md +48 -0
  106. package/templates/.agent/skills/database-design/optimization.md +36 -0
  107. package/templates/.agent/skills/database-design/orm-selection.md +30 -0
  108. package/templates/.agent/skills/database-design/schema-design.md +56 -0
  109. package/templates/.agent/skills/database-design/scripts/schema_validator.py +172 -0
  110. package/templates/.agent/skills/deployment-procedures/SKILL.md +241 -0
  111. package/templates/.agent/skills/doc.md +177 -0
  112. package/templates/.agent/skills/documentation-templates/SKILL.md +194 -0
  113. package/templates/.agent/skills/frontend-design/SKILL.md +418 -0
  114. package/templates/.agent/skills/frontend-design/animation-guide.md +331 -0
  115. package/templates/.agent/skills/frontend-design/color-system.md +311 -0
  116. package/templates/.agent/skills/frontend-design/decision-trees.md +418 -0
  117. package/templates/.agent/skills/frontend-design/motion-graphics.md +306 -0
  118. package/templates/.agent/skills/frontend-design/scripts/accessibility_checker.py +183 -0
  119. package/templates/.agent/skills/frontend-design/scripts/ux_audit.py +722 -0
  120. package/templates/.agent/skills/frontend-design/typography-system.md +345 -0
  121. package/templates/.agent/skills/frontend-design/ux-psychology.md +1116 -0
  122. package/templates/.agent/skills/frontend-design/visual-effects.md +383 -0
  123. package/templates/.agent/skills/game-development/2d-games/SKILL.md +119 -0
  124. package/templates/.agent/skills/game-development/3d-games/SKILL.md +135 -0
  125. package/templates/.agent/skills/game-development/SKILL.md +167 -0
  126. package/templates/.agent/skills/game-development/game-art/SKILL.md +185 -0
  127. package/templates/.agent/skills/game-development/game-audio/SKILL.md +190 -0
  128. package/templates/.agent/skills/game-development/game-design/SKILL.md +129 -0
  129. package/templates/.agent/skills/game-development/mobile-games/SKILL.md +108 -0
  130. package/templates/.agent/skills/game-development/multiplayer/SKILL.md +132 -0
  131. package/templates/.agent/skills/game-development/pc-games/SKILL.md +144 -0
  132. package/templates/.agent/skills/game-development/vr-ar/SKILL.md +123 -0
  133. package/templates/.agent/skills/game-development/web-games/SKILL.md +150 -0
  134. package/templates/.agent/skills/geo-fundamentals/SKILL.md +156 -0
  135. package/templates/.agent/skills/geo-fundamentals/scripts/geo_checker.py +289 -0
  136. package/templates/.agent/skills/i18n-localization/SKILL.md +154 -0
  137. package/templates/.agent/skills/i18n-localization/scripts/i18n_checker.py +241 -0
  138. package/templates/.agent/skills/intelligent-routing/SKILL.md +335 -0
  139. package/templates/.agent/skills/lint-and-validate/SKILL.md +45 -0
  140. package/templates/.agent/skills/lint-and-validate/scripts/lint_runner.py +184 -0
  141. package/templates/.agent/skills/lint-and-validate/scripts/type_coverage.py +173 -0
  142. package/templates/.agent/skills/mcp-builder/SKILL.md +176 -0
  143. package/templates/.agent/skills/mobile-design/SKILL.md +394 -0
  144. package/templates/.agent/skills/mobile-design/decision-trees.md +516 -0
  145. package/templates/.agent/skills/mobile-design/mobile-backend.md +491 -0
  146. package/templates/.agent/skills/mobile-design/mobile-color-system.md +420 -0
  147. package/templates/.agent/skills/mobile-design/mobile-debugging.md +122 -0
  148. package/templates/.agent/skills/mobile-design/mobile-design-thinking.md +357 -0
  149. package/templates/.agent/skills/mobile-design/mobile-navigation.md +458 -0
  150. package/templates/.agent/skills/mobile-design/mobile-performance.md +767 -0
  151. package/templates/.agent/skills/mobile-design/mobile-testing.md +356 -0
  152. package/templates/.agent/skills/mobile-design/mobile-typography.md +433 -0
  153. package/templates/.agent/skills/mobile-design/platform-android.md +666 -0
  154. package/templates/.agent/skills/mobile-design/platform-ios.md +561 -0
  155. package/templates/.agent/skills/mobile-design/scripts/mobile_audit.py +670 -0
  156. package/templates/.agent/skills/mobile-design/touch-psychology.md +537 -0
  157. package/templates/.agent/skills/nextjs-react-expert/1-async-eliminating-waterfalls.md +312 -0
  158. package/templates/.agent/skills/nextjs-react-expert/2-bundle-bundle-size-optimization.md +240 -0
  159. package/templates/.agent/skills/nextjs-react-expert/3-server-server-side-performance.md +490 -0
  160. package/templates/.agent/skills/nextjs-react-expert/4-client-client-side-data-fetching.md +264 -0
  161. package/templates/.agent/skills/nextjs-react-expert/5-rerender-re-render-optimization.md +581 -0
  162. package/templates/.agent/skills/nextjs-react-expert/6-rendering-rendering-performance.md +432 -0
  163. package/templates/.agent/skills/nextjs-react-expert/7-js-javascript-performance.md +684 -0
  164. package/templates/.agent/skills/nextjs-react-expert/8-advanced-advanced-patterns.md +150 -0
  165. package/templates/.agent/skills/nextjs-react-expert/SKILL.md +286 -0
  166. package/templates/.agent/skills/nextjs-react-expert/scripts/convert_rules.py +222 -0
  167. package/templates/.agent/skills/nextjs-react-expert/scripts/react_performance_checker.py +252 -0
  168. package/templates/.agent/skills/nodejs-best-practices/SKILL.md +333 -0
  169. package/templates/.agent/skills/parallel-agents/SKILL.md +175 -0
  170. package/templates/.agent/skills/performance-profiling/SKILL.md +143 -0
  171. package/templates/.agent/skills/performance-profiling/scripts/lighthouse_audit.py +76 -0
  172. package/templates/.agent/skills/plan-writing/SKILL.md +152 -0
  173. package/templates/.agent/skills/powershell-windows/SKILL.md +167 -0
  174. package/templates/.agent/skills/python-patterns/SKILL.md +441 -0
  175. package/templates/.agent/skills/red-team-tactics/SKILL.md +199 -0
  176. package/templates/.agent/skills/rust-pro/SKILL.md +176 -0
  177. package/templates/.agent/skills/seo-fundamentals/SKILL.md +129 -0
  178. package/templates/.agent/skills/seo-fundamentals/scripts/seo_checker.py +219 -0
  179. package/templates/.agent/skills/server-management/SKILL.md +161 -0
  180. package/templates/.agent/skills/systematic-debugging/SKILL.md +109 -0
  181. package/templates/.agent/skills/tailwind-patterns/SKILL.md +269 -0
  182. package/templates/.agent/skills/tdd-workflow/SKILL.md +149 -0
  183. package/templates/.agent/skills/testing-patterns/SKILL.md +156 -240
  184. package/templates/.agent/skills/testing-patterns/scripts/test_runner.py +219 -0
  185. package/templates/.agent/skills/vulnerability-scanner/SKILL.md +276 -0
  186. package/templates/.agent/skills/vulnerability-scanner/checklists.md +121 -0
  187. package/templates/.agent/skills/vulnerability-scanner/scripts/security_scan.py +458 -0
  188. package/templates/.agent/skills/web-design-guidelines/SKILL.md +57 -0
  189. package/templates/.agent/skills/webapp-testing/SKILL.md +187 -0
  190. package/templates/.agent/skills/webapp-testing/scripts/playwright_runner.py +173 -0
  191. package/templates/.agent/workflows/brainstorm.md +113 -0
  192. package/templates/.agent/workflows/create.md +40 -112
  193. package/templates/.agent/workflows/debug.md +82 -117
  194. package/templates/.agent/workflows/deploy.md +142 -129
  195. package/templates/.agent/workflows/enhance.md +63 -0
  196. package/templates/.agent/workflows/orchestrate.md +237 -0
  197. package/templates/.agent/workflows/plan.md +74 -138
  198. package/templates/.agent/workflows/preview.md +81 -0
  199. package/templates/.agent/workflows/status.md +86 -0
  200. package/templates/.agent/workflows/test.md +109 -130
  201. package/templates/.agent/workflows/ui-ux-pro-max.md +296 -0
  202. package/templates/.agent/scripts/checklist.js +0 -260
  203. package/templates/.agent/scripts/security_scan.js +0 -251
  204. package/templates/.agent/skills/docker-expert/SKILL.md +0 -286
  205. package/templates/.agent/skills/react-best-practices/SKILL.md +0 -246
  206. package/templates/.agent/workflows/security.md +0 -181
@@ -1,262 +1,178 @@
1
1
  ---
2
2
  name: testing-patterns
3
- description: Comprehensive testing strategies for unit, integration, and E2E tests
4
- version: "1.0.0"
5
- requires: []
6
- related:
7
- - react-best-practices
8
- - backend-specialist
3
+ description: Testing patterns and principles. Unit, integration, mocking strategies.
4
+ allowed-tools: Read, Write, Edit, Glob, Grep, Bash
9
5
  ---
10
6
 
11
- # Testing Patterns Skill
7
+ # Testing Patterns
12
8
 
13
- ## Testing Pyramid
9
+ > Principles for reliable test suites.
10
+
11
+ ---
12
+
13
+ ## 1. Testing Pyramid
14
14
 
15
15
  ```
16
- /\
17
- / \ E2E Tests
18
- /____\ (Slow, Expensive)
19
- / \
20
- /________\ Integration Tests
21
- (Medium Speed)
22
- ____________
23
- Unit Tests
24
- (Fast, Cheap)
16
+ /\ E2E (Few)
17
+ / \ Critical flows
18
+ /----\
19
+ / \ Integration (Some)
20
+ /--------\ API, DB queries
21
+ / \
22
+ /------------\ Unit (Many)
23
+ Functions, classes
25
24
  ```
26
25
 
27
- ## Unit Testing
26
+ ---
28
27
 
29
- ### AAA Pattern
30
- ```typescript
31
- // Arrange
32
- const user = { name: 'John', age: 30 };
28
+ ## 2. AAA Pattern
33
29
 
34
- // Act
35
- const result = calculateAgeGroup(user);
30
+ | Step | Purpose |
31
+ |------|---------|
32
+ | **Arrange** | Set up test data |
33
+ | **Act** | Execute code under test |
34
+ | **Assert** | Verify outcome |
36
35
 
37
- // Assert
38
- expect(result).toBe('adult');
39
- ```
36
+ ---
40
37
 
41
- ### Test Naming
42
- ```typescript
43
- describe('calculateAgeGroup', () => {
44
- it('should return "child" when age is less than 13', () => {
45
- // test
46
- });
47
-
48
- it('should return "teen" when age is between 13 and 19', () => {
49
- // test
50
- });
51
-
52
- it('should return "adult" when age is 20 or greater', () => {
53
- // test
54
- });
55
- });
56
- ```
38
+ ## 3. Test Type Selection
57
39
 
58
- ### React Component Testing
59
- ```tsx
60
- import { render, screen, fireEvent } from '@testing-library/react';
61
- import userEvent from '@testing-library/user-event';
62
-
63
- describe('Button', () => {
64
- it('should render button with text', () => {
65
- render(<Button>Click me</Button>);
66
- expect(screen.getByText('Click me')).toBeInTheDocument();
67
- });
68
-
69
- it('should call onClick when clicked', async () => {
70
- const handleClick = jest.fn();
71
- render(<Button onClick={handleClick}>Click me</Button>);
72
-
73
- await userEvent.click(screen.getByText('Click me'));
74
- expect(handleClick).toHaveBeenCalledTimes(1);
75
- });
76
-
77
- it('should be disabled when disabled prop is true', () => {
78
- render(<Button disabled>Click me</Button>);
79
- expect(screen.getByText('Click me')).toBeDisabled();
80
- });
81
- });
82
- ```
40
+ ### When to Use Each
83
41
 
84
- ### Mocking
85
- ```typescript
86
- // Mock modules
87
- jest.mock('./api', () => ({
88
- fetchUser: jest.fn()
89
- }));
90
-
91
- // Mock return value
92
- (fetchUser as jest.Mock).mockResolvedValue({ id: 1, name: 'John' });
93
-
94
- // Mock with implementation
95
- jest.mock('./logger', () => ({
96
- log: jest.fn(),
97
- error: jest.fn()
98
- }));
99
- ```
42
+ | Type | Best For | Speed |
43
+ |------|----------|-------|
44
+ | **Unit** | Pure functions, logic | Fast (<50ms) |
45
+ | **Integration** | API, DB, services | Medium |
46
+ | **E2E** | Critical user flows | Slow |
100
47
 
101
- ## Integration Testing
102
-
103
- ### API Testing
104
- ```typescript
105
- import request from 'supertest';
106
- import { app } from './app';
107
-
108
- describe('Users API', () => {
109
- it('should create a new user', async () => {
110
- const response = await request(app)
111
- .post('/users')
112
- .send({ name: 'John', email: 'john@example.com' })
113
- .expect(201);
114
-
115
- expect(response.body.data.name).toBe('John');
116
- });
117
-
118
- it('should return 400 for invalid data', async () => {
119
- await request(app)
120
- .post('/users')
121
- .send({ name: '' })
122
- .expect(400);
123
- });
124
- });
125
- ```
48
+ ---
126
49
 
127
- ### Database Testing
128
- ```typescript
129
- import { prisma } from './db';
130
-
131
- describe('User Repository', () => {
132
- beforeEach(async () => {
133
- await prisma.user.deleteMany();
134
- });
135
-
136
- it('should create user in database', async () => {
137
- const user = await prisma.user.create({
138
- data: { email: 'test@example.com', name: 'Test' }
139
- });
140
-
141
- expect(user.email).toBe('test@example.com');
142
-
143
- const found = await prisma.user.findUnique({
144
- where: { id: user.id }
145
- });
146
- expect(found).toBeTruthy();
147
- });
148
- });
149
- ```
50
+ ## 4. Unit Test Principles
150
51
 
151
- ## E2E Testing
152
-
153
- ### Playwright Example
154
- ```typescript
155
- import { test, expect } from '@playwright/test';
156
-
157
- test('user can login', async ({ page }) => {
158
- await page.goto('/login');
159
-
160
- await page.fill('[name="email"]', 'user@example.com');
161
- await page.fill('[name="password"]', 'password123');
162
- await page.click('button[type="submit"]');
163
-
164
- await expect(page).toHaveURL('/dashboard');
165
- await expect(page.locator('h1')).toContainText('Welcome');
166
- });
167
-
168
- test('user can complete purchase flow', async ({ page }) => {
169
- // Browse products
170
- await page.goto('/products');
171
- await page.click('text=Add to Cart');
172
-
173
- // Go to cart
174
- await page.click('text=Cart');
175
- await page.click('text=Checkout');
176
-
177
- // Fill checkout form
178
- await page.fill('[name="address"]', '123 Main St');
179
- await page.click('text=Place Order');
180
-
181
- // Verify success
182
- await expect(page.locator('.success-message')).toBeVisible();
183
- });
184
- ```
52
+ ### Good Unit Tests
185
53
 
186
- ## Test Coverage
187
-
188
- ### Coverage Thresholds
189
- ```json
190
- {
191
- "coverageThreshold": {
192
- "global": {
193
- "branches": 80,
194
- "functions": 80,
195
- "lines": 80,
196
- "statements": 80
197
- }
198
- }
199
- }
200
- ```
54
+ | Principle | Meaning |
55
+ |-----------|---------|
56
+ | Fast | < 100ms each |
57
+ | Isolated | No external deps |
58
+ | Repeatable | Same result always |
59
+ | Self-checking | No manual verification |
60
+ | Timely | Written with code |
61
+
62
+ ### What to Unit Test
63
+
64
+ | Test | Don't Test |
65
+ |------|------------|
66
+ | Business logic | Framework code |
67
+ | Edge cases | Third-party libs |
68
+ | Error handling | Simple getters |
69
+
70
+ ---
71
+
72
+ ## 5. Integration Test Principles
201
73
 
202
74
  ### What to Test
203
75
 
204
- **Always Test:**
205
- - Business logic
206
- - Edge cases
207
- - Error handling
208
- - User interactions
209
- - API contracts
210
-
211
- **Don't Test:**
212
- - Third-party libraries
213
- - Simple getters/setters
214
- - Implementation details
215
- - CSS/styling
216
-
217
- ## TDD Workflow
218
-
219
- 1. **Red**: Write failing test
220
- ```typescript
221
- it('should add two numbers', () => {
222
- expect(add(1, 2)).toBe(3);
223
- });
224
- ```
225
-
226
- 2. **Green**: Write minimal code
227
- ```typescript
228
- function add(a: number, b: number) {
229
- return a + b;
230
- }
231
- ```
232
-
233
- 3. **Refactor**: Improve code
234
- ```typescript
235
- // Add input validation
236
- function add(a: number, b: number) {
237
- if (typeof a !== 'number' || typeof b !== 'number') {
238
- throw new Error('Inputs must be numbers');
239
- }
240
- return a + b;
241
- }
242
- ```
243
-
244
- ## Testing Checklist
245
-
246
- ### Before Writing Tests
247
- - [ ] Understand requirements
248
- - [ ] Identify edge cases
249
- - [ ] Plan test scenarios
250
-
251
- ### While Writing Tests
252
- - [ ] Test happy path
253
- - [ ] Test error cases
254
- - [ ] Test boundary conditions
255
- - [ ] Use descriptive names
256
- - [ ] One concept per test
257
-
258
- ### After Writing Tests
259
- - [ ] All tests pass
260
- - [ ] Coverage meets thresholds
261
- - [ ] Tests are maintainable
262
- - [ ] No test interdependencies
76
+ | Area | Focus |
77
+ |------|-------|
78
+ | API endpoints | Request/response |
79
+ | Database | Queries, transactions |
80
+ | External services | Contracts |
81
+
82
+ ### Setup/Teardown
83
+
84
+ | Phase | Action |
85
+ |-------|--------|
86
+ | Before All | Connect resources |
87
+ | Before Each | Reset state |
88
+ | After Each | Clean up |
89
+ | After All | Disconnect |
90
+
91
+ ---
92
+
93
+ ## 6. Mocking Principles
94
+
95
+ ### When to Mock
96
+
97
+ | Mock | Don't Mock |
98
+ |------|------------|
99
+ | External APIs | The code under test |
100
+ | Database (unit) | Simple dependencies |
101
+ | Time/random | Pure functions |
102
+ | Network | In-memory stores |
103
+
104
+ ### Mock Types
105
+
106
+ | Type | Use |
107
+ |------|-----|
108
+ | Stub | Return fixed values |
109
+ | Spy | Track calls |
110
+ | Mock | Set expectations |
111
+ | Fake | Simplified implementation |
112
+
113
+ ---
114
+
115
+ ## 7. Test Organization
116
+
117
+ ### Naming
118
+
119
+ | Pattern | Example |
120
+ |---------|---------|
121
+ | Should behavior | "should return error when..." |
122
+ | When condition | "when user not found..." |
123
+ | Given-when-then | "given X, when Y, then Z" |
124
+
125
+ ### Grouping
126
+
127
+ | Level | Use |
128
+ |-------|-----|
129
+ | describe | Group related tests |
130
+ | it/test | Individual case |
131
+ | beforeEach | Common setup |
132
+
133
+ ---
134
+
135
+ ## 8. Test Data
136
+
137
+ ### Strategies
138
+
139
+ | Approach | Use |
140
+ |----------|-----|
141
+ | Factories | Generate test data |
142
+ | Fixtures | Predefined datasets |
143
+ | Builders | Fluent object creation |
144
+
145
+ ### Principles
146
+
147
+ - Use realistic data
148
+ - Randomize non-essential values (faker)
149
+ - Share common fixtures
150
+ - Keep data minimal
151
+
152
+ ---
153
+
154
+ ## 9. Best Practices
155
+
156
+ | Practice | Why |
157
+ |----------|-----|
158
+ | One assert per test | Clear failure reason |
159
+ | Independent tests | No order dependency |
160
+ | Fast tests | Run frequently |
161
+ | Descriptive names | Self-documenting |
162
+ | Clean up | Avoid side effects |
163
+
164
+ ---
165
+
166
+ ## 10. Anti-Patterns
167
+
168
+ | ❌ Don't | ✅ Do |
169
+ |----------|-------|
170
+ | Test implementation | Test behavior |
171
+ | Duplicate test code | Use factories |
172
+ | Complex test setup | Simplify or split |
173
+ | Ignore flaky tests | Fix root cause |
174
+ | Skip cleanup | Reset state |
175
+
176
+ ---
177
+
178
+ > **Remember:** Tests are documentation. If someone can't understand what the code does from the tests, rewrite them.
@@ -0,0 +1,219 @@
1
+ #!/usr/bin/env python3
2
+ """
3
+ Test Runner - Unified test execution and coverage reporting
4
+ Runs tests and generates coverage report based on project type.
5
+
6
+ Usage:
7
+ python test_runner.py <project_path> [--coverage]
8
+
9
+ Supports:
10
+ - Node.js: npm test, jest, vitest
11
+ - Python: pytest, unittest
12
+ """
13
+
14
+ import subprocess
15
+ import sys
16
+ import json
17
+ from pathlib import Path
18
+ from datetime import datetime
19
+
20
+ # Fix Windows console encoding
21
+ try:
22
+ sys.stdout.reconfigure(encoding='utf-8', errors='replace')
23
+ except:
24
+ pass
25
+
26
+
27
+ def detect_test_framework(project_path: Path) -> dict:
28
+ """Detect test framework and commands."""
29
+ result = {
30
+ "type": "unknown",
31
+ "framework": None,
32
+ "cmd": None,
33
+ "coverage_cmd": None
34
+ }
35
+
36
+ # Node.js project
37
+ package_json = project_path / "package.json"
38
+ if package_json.exists():
39
+ result["type"] = "node"
40
+ try:
41
+ pkg = json.loads(package_json.read_text(encoding='utf-8'))
42
+ scripts = pkg.get("scripts", {})
43
+ deps = {**pkg.get("dependencies", {}), **pkg.get("devDependencies", {})}
44
+
45
+ # Check for test script
46
+ if "test" in scripts:
47
+ result["framework"] = "npm test"
48
+ result["cmd"] = ["npm", "test"]
49
+
50
+ # Try to detect specific framework for coverage
51
+ if "vitest" in deps:
52
+ result["framework"] = "vitest"
53
+ result["coverage_cmd"] = ["npx", "vitest", "run", "--coverage"]
54
+ elif "jest" in deps:
55
+ result["framework"] = "jest"
56
+ result["coverage_cmd"] = ["npx", "jest", "--coverage"]
57
+ elif "vitest" in deps:
58
+ result["framework"] = "vitest"
59
+ result["cmd"] = ["npx", "vitest", "run"]
60
+ result["coverage_cmd"] = ["npx", "vitest", "run", "--coverage"]
61
+ elif "jest" in deps:
62
+ result["framework"] = "jest"
63
+ result["cmd"] = ["npx", "jest"]
64
+ result["coverage_cmd"] = ["npx", "jest", "--coverage"]
65
+
66
+ except:
67
+ pass
68
+
69
+ # Python project
70
+ if (project_path / "pyproject.toml").exists() or (project_path / "requirements.txt").exists():
71
+ result["type"] = "python"
72
+ result["framework"] = "pytest"
73
+ result["cmd"] = ["python", "-m", "pytest", "-v"]
74
+ result["coverage_cmd"] = ["python", "-m", "pytest", "--cov", "--cov-report=term-missing"]
75
+
76
+ return result
77
+
78
+
79
+ def run_tests(cmd: list, cwd: Path) -> dict:
80
+ """Run tests and return results."""
81
+ result = {
82
+ "passed": False,
83
+ "output": "",
84
+ "error": "",
85
+ "tests_run": 0,
86
+ "tests_passed": 0,
87
+ "tests_failed": 0
88
+ }
89
+
90
+ try:
91
+ proc = subprocess.run(
92
+ cmd,
93
+ cwd=str(cwd),
94
+ capture_output=True,
95
+ text=True,
96
+ encoding='utf-8',
97
+ errors='replace',
98
+ timeout=300 # 5 min timeout for tests
99
+ )
100
+
101
+ result["output"] = proc.stdout[:3000] if proc.stdout else ""
102
+ result["error"] = proc.stderr[:500] if proc.stderr else ""
103
+ result["passed"] = proc.returncode == 0
104
+
105
+ # Try to parse test counts from output
106
+ output = proc.stdout or ""
107
+
108
+ # Jest/Vitest pattern: "Tests: X passed, Y failed, Z total"
109
+ if "passed" in output.lower() and "failed" in output.lower():
110
+ import re
111
+ match = re.search(r'(\d+)\s+passed', output, re.IGNORECASE)
112
+ if match:
113
+ result["tests_passed"] = int(match.group(1))
114
+ match = re.search(r'(\d+)\s+failed', output, re.IGNORECASE)
115
+ if match:
116
+ result["tests_failed"] = int(match.group(1))
117
+ result["tests_run"] = result["tests_passed"] + result["tests_failed"]
118
+
119
+ # Pytest pattern: "X passed, Y failed"
120
+ if "pytest" in str(cmd):
121
+ import re
122
+ match = re.search(r'(\d+)\s+passed', output)
123
+ if match:
124
+ result["tests_passed"] = int(match.group(1))
125
+ match = re.search(r'(\d+)\s+failed', output)
126
+ if match:
127
+ result["tests_failed"] = int(match.group(1))
128
+ result["tests_run"] = result["tests_passed"] + result["tests_failed"]
129
+
130
+ except FileNotFoundError:
131
+ result["error"] = f"Command not found: {cmd[0]}"
132
+ except subprocess.TimeoutExpired:
133
+ result["error"] = "Timeout after 300s"
134
+ except Exception as e:
135
+ result["error"] = str(e)
136
+
137
+ return result
138
+
139
+
140
+ def main():
141
+ project_path = Path(sys.argv[1] if len(sys.argv) > 1 else ".").resolve()
142
+ with_coverage = "--coverage" in sys.argv
143
+
144
+ print(f"\n{'='*60}")
145
+ print(f"[TEST RUNNER] Unified Test Execution")
146
+ print(f"{'='*60}")
147
+ print(f"Project: {project_path}")
148
+ print(f"Coverage: {'enabled' if with_coverage else 'disabled'}")
149
+ print(f"Time: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
150
+
151
+ # Detect test framework
152
+ test_info = detect_test_framework(project_path)
153
+ print(f"Type: {test_info['type']}")
154
+ print(f"Framework: {test_info['framework']}")
155
+ print("-"*60)
156
+
157
+ if not test_info["cmd"]:
158
+ print("No test framework found for this project.")
159
+ output = {
160
+ "script": "test_runner",
161
+ "project": str(project_path),
162
+ "type": test_info["type"],
163
+ "framework": None,
164
+ "passed": True,
165
+ "message": "No tests configured"
166
+ }
167
+ print(json.dumps(output, indent=2))
168
+ sys.exit(0)
169
+
170
+ # Choose command
171
+ cmd = test_info["coverage_cmd"] if with_coverage and test_info["coverage_cmd"] else test_info["cmd"]
172
+
173
+ print(f"Running: {' '.join(cmd)}")
174
+ print("-"*60)
175
+
176
+ # Run tests
177
+ result = run_tests(cmd, project_path)
178
+
179
+ # Print output (truncated)
180
+ if result["output"]:
181
+ lines = result["output"].split("\n")
182
+ for line in lines[:30]:
183
+ print(line)
184
+ if len(lines) > 30:
185
+ print(f"... ({len(lines) - 30} more lines)")
186
+
187
+ # Summary
188
+ print("\n" + "="*60)
189
+ print("SUMMARY")
190
+ print("="*60)
191
+
192
+ if result["passed"]:
193
+ print("[PASS] All tests passed")
194
+ else:
195
+ print("[FAIL] Some tests failed")
196
+ if result["error"]:
197
+ print(f"Error: {result['error'][:200]}")
198
+
199
+ if result["tests_run"] > 0:
200
+ print(f"Tests: {result['tests_run']} total, {result['tests_passed']} passed, {result['tests_failed']} failed")
201
+
202
+ output = {
203
+ "script": "test_runner",
204
+ "project": str(project_path),
205
+ "type": test_info["type"],
206
+ "framework": test_info["framework"],
207
+ "tests_run": result["tests_run"],
208
+ "tests_passed": result["tests_passed"],
209
+ "tests_failed": result["tests_failed"],
210
+ "passed": result["passed"]
211
+ }
212
+
213
+ print("\n" + json.dumps(output, indent=2))
214
+
215
+ sys.exit(0 if result["passed"] else 1)
216
+
217
+
218
+ if __name__ == "__main__":
219
+ main()