@tinkcarlos/skillora 0.2.0
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/.claude/skills/.temp-skill-index.md +245 -0
- package/.claude/skills/SKILL.md +264 -0
- package/.claude/skills/api-scaffolding/SKILL.md +431 -0
- package/.claude/skills/api-scaffolding/agents/backend-architect.md +282 -0
- package/.claude/skills/api-scaffolding/agents/django-pro.md +144 -0
- package/.claude/skills/api-scaffolding/agents/fastapi-pro.md +156 -0
- package/.claude/skills/api-scaffolding/agents/graphql-architect.md +146 -0
- package/.claude/skills/api-scaffolding/skills/fastapi-templates/SKILL.md +171 -0
- package/.claude/skills/api-testing-observability/SKILL.md +583 -0
- package/.claude/skills/api-testing-observability/agents/api-documenter.md +146 -0
- package/.claude/skills/api-testing-observability/commands/api-mock.md +1320 -0
- package/.claude/skills/brainstorming/SKILL.md +283 -0
- package/.claude/skills/bug-fixing/SKILL.md +382 -0
- package/.claude/skills/bug-fixing/references/backend-guide.md +132 -0
- package/.claude/skills/bug-fixing/references/bug-guide.md +354 -0
- package/.claude/skills/bug-fixing/references/bug-record-template.md +134 -0
- package/.claude/skills/bug-fixing/references/bug-records.md +88 -0
- package/.claude/skills/bug-fixing/references/code-review-gate.md +81 -0
- package/.claude/skills/bug-fixing/references/common-bugs.md +140 -0
- package/.claude/skills/bug-fixing/references/complete-workflow.md +361 -0
- package/.claude/skills/bug-fixing/references/config-driven-fixes.md +136 -0
- package/.claude/skills/bug-fixing/references/context-isolation-protocol.md +268 -0
- package/.claude/skills/bug-fixing/references/cross-surface-regression.md +120 -0
- package/.claude/skills/bug-fixing/references/database-investigation.md +129 -0
- package/.claude/skills/bug-fixing/references/dependency-and-integrity-protocol.md +369 -0
- package/.claude/skills/bug-fixing/references/fix-completeness-checklist.md +239 -0
- package/.claude/skills/bug-fixing/references/frontend-guide.md +219 -0
- package/.claude/skills/bug-fixing/references/fullstack-joint-guide.md +123 -0
- package/.claude/skills/bug-fixing/references/functional-breakage.md +117 -0
- package/.claude/skills/bug-fixing/references/ide-lint-errors-guide.md +176 -0
- package/.claude/skills/bug-fixing/references/impact-analysis.md +511 -0
- package/.claude/skills/bug-fixing/references/investigation-checklist.md +263 -0
- package/.claude/skills/bug-fixing/references/knowledge-extraction-guide.md +531 -0
- package/.claude/skills/bug-fixing/references/knowledge-workflow.md +212 -0
- package/.claude/skills/bug-fixing/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/bug-fixing/references/python-env-and-testing.md +126 -0
- package/.claude/skills/bug-fixing/references/rca-guide.md +428 -0
- package/.claude/skills/bug-fixing/references/similar-bug-patterns.md +113 -0
- package/.claude/skills/bug-fixing/references/skill-delegation-guide.md +350 -0
- package/.claude/skills/bug-fixing/references/skill-orchestration.md +155 -0
- package/.claude/skills/bug-fixing/references/testing-strategy.md +350 -0
- package/.claude/skills/bug-fixing/references/tooling-build-scripts.md +162 -0
- package/.claude/skills/bug-fixing/references/user-input-validation.md +77 -0
- package/.claude/skills/bug-fixing/references/ux-patterns.md +158 -0
- package/.claude/skills/bug-fixing/references/windows-terminal-hygiene.md +106 -0
- package/.claude/skills/bug-fixing/references/zero-regression-matrix.md +239 -0
- package/.claude/skills/bug-fixing/references/zero-risk-protocol.md +102 -0
- package/.claude/skills/bug-fixing/scripts/format_code.py +611 -0
- package/.claude/skills/bug-fixing/scripts/generate_report_template.py +74 -0
- package/.claude/skills/bug-fixing/scripts/lint_check.py +816 -0
- package/.claude/skills/bug-fixing/scripts/requirements.txt +36 -0
- package/.claude/skills/cicd-pipeline/SKILL.md +300 -0
- package/.claude/skills/code-review/SKILL.md +535 -0
- package/.claude/skills/code-review/references/anti-pattern-scan.md +102 -0
- package/.claude/skills/code-review/references/automated-analysis.md +456 -0
- package/.claude/skills/code-review/references/backend-common-issues.md +589 -0
- package/.claude/skills/code-review/references/backend-expert-guide.md +415 -0
- package/.claude/skills/code-review/references/backend-review.md +868 -0
- package/.claude/skills/code-review/references/batch-processing-strategy.md +198 -0
- package/.claude/skills/code-review/references/call-chain-analysis-protocol.md +166 -0
- package/.claude/skills/code-review/references/common-patterns.md +321 -0
- package/.claude/skills/code-review/references/configuration-review.md +425 -0
- package/.claude/skills/code-review/references/control-flow-completeness.md +114 -0
- package/.claude/skills/code-review/references/database-review.md +298 -0
- package/.claude/skills/code-review/references/dependency-and-integrity-protocol.md +313 -0
- package/.claude/skills/code-review/references/external-standards.md +51 -0
- package/.claude/skills/code-review/references/feature-review.md +329 -0
- package/.claude/skills/code-review/references/file-review-template.md +326 -0
- package/.claude/skills/code-review/references/frontend-advanced.md +654 -0
- package/.claude/skills/code-review/references/frontend-common-issues.md +482 -0
- package/.claude/skills/code-review/references/frontend-expert-guide.md +342 -0
- package/.claude/skills/code-review/references/frontend-review.md +783 -0
- package/.claude/skills/code-review/references/fullstack-consistency.md +418 -0
- package/.claude/skills/code-review/references/fullstack-review.md +477 -0
- package/.claude/skills/code-review/references/functional-completeness.md +386 -0
- package/.claude/skills/code-review/references/hidden-bugs-detection.md +473 -0
- package/.claude/skills/code-review/references/ide-lint-errors-guide.md +173 -0
- package/.claude/skills/code-review/references/infrastructure-review.md +453 -0
- package/.claude/skills/code-review/references/iteration-review.md +264 -0
- package/.claude/skills/code-review/references/job-review.md +335 -0
- package/.claude/skills/code-review/references/layered-checklist-protocol.md +157 -0
- package/.claude/skills/code-review/references/logic-completeness.md +535 -0
- package/.claude/skills/code-review/references/mandatory-checklist.md +288 -0
- package/.claude/skills/code-review/references/multi-language-guide.md +800 -0
- package/.claude/skills/code-review/references/new-project-review.md +226 -0
- package/.claude/skills/code-review/references/non-code-files-review.md +451 -0
- package/.claude/skills/code-review/references/overlooked-issues.md +657 -0
- package/.claude/skills/code-review/references/platform-specific-review.md +195 -0
- package/.claude/skills/code-review/references/precision-analysis-protocol.md +260 -0
- package/.claude/skills/code-review/references/python-patterns.md +494 -0
- package/.claude/skills/code-review/references/rca-techniques.md +362 -0
- package/.claude/skills/code-review/references/report-template.md +430 -0
- package/.claude/skills/code-review/references/resource-limits-and-degradation.md +137 -0
- package/.claude/skills/code-review/references/review-dimensions.md +311 -0
- package/.claude/skills/code-review/references/review-guide.md +202 -0
- package/.claude/skills/code-review/references/review-knowledge-workflow.md +257 -0
- package/.claude/skills/code-review/references/review-progress-tracker-protocol.md +172 -0
- package/.claude/skills/code-review/references/review-record-template.md +195 -0
- package/.claude/skills/code-review/references/skill-orchestration.md +143 -0
- package/.claude/skills/code-review/references/ui-ux-review.md +470 -0
- package/.claude/skills/containerization/SKILL.md +313 -0
- package/.claude/skills/database-migrations/agents/database-admin.md +142 -0
- package/.claude/skills/database-migrations/agents/database-optimizer.md +144 -0
- package/.claude/skills/database-migrations/commands/migration-observability.md +408 -0
- package/.claude/skills/database-migrations/commands/sql-migrations.md +492 -0
- package/.claude/skills/finishing-a-development-branch/SKILL.md +319 -0
- package/.claude/skills/frontend-design/LICENSE.txt +177 -0
- package/.claude/skills/frontend-design/SKILL.md +587 -0
- package/.claude/skills/frontend-design/references/color-consistency.md +487 -0
- package/.claude/skills/frontend-design/references/color-palettes-full.md +657 -0
- package/.claude/skills/frontend-design/references/design-system-generator.md +285 -0
- package/.claude/skills/frontend-design/references/font-pairings-full.md +705 -0
- package/.claude/skills/frontend-design/references/industry-anti-patterns.md +281 -0
- package/.claude/skills/frontend-design/references/layout-anti-patterns.md +582 -0
- package/.claude/skills/frontend-design/references/motion-patterns.md +659 -0
- package/.claude/skills/frontend-design/references/pre-delivery-checklist.md +153 -0
- package/.claude/skills/frontend-design/references/responsive-design.md +555 -0
- package/.claude/skills/frontend-design/references/style-modification-rules.md +335 -0
- package/.claude/skills/frontend-design/references/ui-styles-full.md +383 -0
- package/.claude/skills/frontend-design/references/ui-styles-rating.md +191 -0
- package/.claude/skills/frontend-design/references/ux-guidelines.md +640 -0
- package/.claude/skills/fullstack-developer/SKILL.md +512 -0
- package/.claude/skills/fullstack-developer/references/api-contract-guide.md +312 -0
- package/.claude/skills/fullstack-developer/references/api-response-patterns.md +223 -0
- package/.claude/skills/fullstack-developer/references/async-patterns.md +220 -0
- package/.claude/skills/fullstack-developer/references/bug-prevention.md +914 -0
- package/.claude/skills/fullstack-developer/references/code-quality-checklist.md +271 -0
- package/.claude/skills/fullstack-developer/references/complete-development-workflow.md +278 -0
- package/.claude/skills/fullstack-developer/references/context-isolation-protocol.md +256 -0
- package/.claude/skills/fullstack-developer/references/database-migration.md +331 -0
- package/.claude/skills/fullstack-developer/references/dependency-and-integrity-protocol.md +390 -0
- package/.claude/skills/fullstack-developer/references/development-phases.md +333 -0
- package/.claude/skills/fullstack-developer/references/expert-guide.md +214 -0
- package/.claude/skills/fullstack-developer/references/file-import-patterns.md +114 -0
- package/.claude/skills/fullstack-developer/references/graceful-degradation-patterns.md +78 -0
- package/.claude/skills/fullstack-developer/references/ide-lint-errors-guide.md +183 -0
- package/.claude/skills/fullstack-developer/references/integration-testing.md +301 -0
- package/.claude/skills/fullstack-developer/references/mock-api-patterns.md +307 -0
- package/.claude/skills/fullstack-developer/references/phase-gate-template.md +249 -0
- package/.claude/skills/fullstack-developer/references/post-edit-quality-gate.md +30 -0
- package/.claude/skills/fullstack-developer/references/python-engineering.md +79 -0
- package/.claude/skills/fullstack-developer/references/skill-orchestration.md +214 -0
- package/.claude/skills/fullstack-developer/references/skill-router-table.md +304 -0
- package/.claude/skills/fullstack-developer/references/state-sync.md +217 -0
- package/.claude/skills/fullstack-developer/references/ui-testing-checklist.md +292 -0
- package/.claude/skills/fullstack-developer/scripts/format_code.py +611 -0
- package/.claude/skills/fullstack-developer/scripts/lint_check.py +816 -0
- package/.claude/skills/fullstack-developer/scripts/requirements.txt +36 -0
- package/.claude/skills/performance-optimization/SKILL.md +250 -0
- package/.claude/skills/product-requirements/SKILL.md +357 -0
- package/.claude/skills/product-requirements/references/acceptance-criteria.md +335 -0
- package/.claude/skills/product-requirements/references/answer-first-questioning-protocol.md +299 -0
- package/.claude/skills/product-requirements/references/competitive-analysis-guide.md +183 -0
- package/.claude/skills/product-requirements/references/document-accuracy-protocol.md +253 -0
- package/.claude/skills/product-requirements/references/document-management-protocol.md +278 -0
- package/.claude/skills/product-requirements/references/external-standards.md +62 -0
- package/.claude/skills/product-requirements/references/feature-spec-template.md +359 -0
- package/.claude/skills/product-requirements/references/knowledge-acquisition-protocol.md +251 -0
- package/.claude/skills/product-requirements/references/plan-execution-protocol.md +334 -0
- package/.claude/skills/product-requirements/references/plan-generation-protocol.md +264 -0
- package/.claude/skills/product-requirements/references/prioritization-frameworks.md +80 -0
- package/.claude/skills/product-requirements/references/requirement-decomposition-protocol.md +291 -0
- package/.claude/skills/product-requirements/references/user-story-examples.md +297 -0
- package/.claude/skills/product-requirements/references/workflow-templates.md +266 -0
- package/.claude/skills/react-best-practices/SKILL.md +198 -0
- package/.claude/skills/react-best-practices/references/advanced-patterns.md +94 -0
- package/.claude/skills/react-best-practices/references/bundle-optimization.md +182 -0
- package/.claude/skills/react-best-practices/references/client-data-fetching.md +112 -0
- package/.claude/skills/react-best-practices/references/complete-guide.md +2249 -0
- package/.claude/skills/react-best-practices/references/eliminating-waterfalls.md +169 -0
- package/.claude/skills/react-best-practices/references/javascript-performance.md +256 -0
- package/.claude/skills/react-best-practices/references/rendering-performance.md +230 -0
- package/.claude/skills/react-best-practices/references/rerender-optimization.md +214 -0
- package/.claude/skills/react-best-practices/references/server-performance.md +182 -0
- package/.claude/skills/security-audit/SKILL.md +226 -0
- package/.claude/skills/shared-references/advanced-debugging-techniques.md +186 -0
- package/.claude/skills/shared-references/code-quality-checklist.md +218 -0
- package/.claude/skills/shared-references/code-review-efficiency-guide.md +125 -0
- package/.claude/skills/shared-references/mcp-dependency-compatibility-protocol.md +276 -0
- package/.claude/skills/shared-references/skill-call-graph.md +230 -0
- package/.claude/skills/shared-references/skill-orchestration-protocol.md +281 -0
- package/.claude/skills/shared-references/subagent-dispatch-templates.md +199 -0
- package/.claude/skills/skill-expert-skills/LICENSE.txt +204 -0
- package/.claude/skills/skill-expert-skills/QUICK_NAVIGATION.md +374 -0
- package/.claude/skills/skill-expert-skills/SKILL.md +247 -0
- package/.claude/skills/skill-expert-skills/docs/_index.md +91 -0
- package/.claude/skills/skill-expert-skills/references/deep-research-methodology.md +389 -0
- package/.claude/skills/skill-expert-skills/references/docs-generation-workflow.md +398 -0
- package/.claude/skills/skill-expert-skills/references/domain-expertise-protocol.md +343 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/_index.md +54 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/backend-expertise.md +517 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/bug-fixing-expertise.md +363 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/code-review-expertise.md +392 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge/frontend-expertise.md +410 -0
- package/.claude/skills/skill-expert-skills/references/domain-knowledge-template.md +503 -0
- package/.claude/skills/skill-expert-skills/references/examples.md +782 -0
- package/.claude/skills/skill-expert-skills/references/integration-examples.md +655 -0
- package/.claude/skills/skill-expert-skills/references/knowledge-validation-checklist.md +246 -0
- package/.claude/skills/skill-expert-skills/references/latest-knowledge-acquisition.md +461 -0
- package/.claude/skills/skill-expert-skills/references/mcp-tools-guide.md +439 -0
- package/.claude/skills/skill-expert-skills/references/official-best-practices.md +616 -0
- package/.claude/skills/skill-expert-skills/references/patterns.md +218 -0
- package/.claude/skills/skill-expert-skills/references/plugin-skills-guide.md +432 -0
- package/.claude/skills/skill-expert-skills/references/requirement-elicitation-protocol.md +290 -0
- package/.claude/skills/skill-expert-skills/references/skill-creator-SKILL.md +353 -0
- package/.claude/skills/skill-expert-skills/references/skill-templates.md +583 -0
- package/.claude/skills/skill-expert-skills/references/skills-knowledge-base.md +561 -0
- package/.claude/skills/skill-expert-skills/references/tools-guide.md +379 -0
- package/.claude/skills/skill-expert-skills/references/troubleshooting.md +378 -0
- package/.claude/skills/skill-expert-skills/references/universality-guide.md +205 -0
- package/.claude/skills/skill-expert-skills/references/writing-style-guide.md +466 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/quick_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/__pycache__/universal_validate.cpython-313.pyc +0 -0
- package/.claude/skills/skill-expert-skills/scripts/analyze_trigger.py +425 -0
- package/.claude/skills/skill-expert-skills/scripts/diff_with_official.py +188 -0
- package/.claude/skills/skill-expert-skills/scripts/init_skill.py +349 -0
- package/.claude/skills/skill-expert-skills/scripts/package_skill.py +156 -0
- package/.claude/skills/skill-expert-skills/scripts/quick_validate.py +493 -0
- package/.claude/skills/skill-expert-skills/scripts/requirements.txt +2 -0
- package/.claude/skills/skill-expert-skills/scripts/universal_validate.py +182 -0
- package/.claude/skills/skill-expert-skills/scripts/upgrade_skill.py +431 -0
- package/.claude/skills/subagent-driven-development/SKILL.md +268 -0
- package/.claude/skills/test-driven-development/SKILL.md +246 -0
- package/.claude/skills/test-driven-development/references/testing-anti-patterns.md +192 -0
- package/.claude/skills/using-git-worktrees/SKILL.md +266 -0
- package/.claude/skills/using-skillstack/SKILL.md +127 -0
- package/.claude/skills/vercel-deploy/SKILL.md +166 -0
- package/.claude/skills/vercel-deploy/scripts/deploy.sh +249 -0
- package/.claude/skills/verification-before-completion/SKILL.md +305 -0
- package/.claude/skills/writing-plans/SKILL.md +259 -0
- package/README.md +69 -0
- package/bin/cli.js +468 -0
- package/lib/init.js +333 -0
- package/package.json +29 -0
|
@@ -0,0 +1,350 @@
|
|
|
1
|
+
# Testing Strategy for Bug Fixes
|
|
2
|
+
|
|
3
|
+
> Comprehensive testing approach to verify bug fixes and prevent regressions.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
|
|
7
|
+
- [Testing Philosophy](#testing-philosophy)
|
|
8
|
+
- [Test Pyramid for Bug Fixes](#test-pyramid-for-bug-fixes)
|
|
9
|
+
- [Mandatory Test Types](#mandatory-test-types)
|
|
10
|
+
- [Test Writing Guidelines](#test-writing-guidelines)
|
|
11
|
+
- [Coverage Requirements](#coverage-requirements)
|
|
12
|
+
- [Test Templates](#test-templates)
|
|
13
|
+
|
|
14
|
+
---
|
|
15
|
+
|
|
16
|
+
## Testing Philosophy
|
|
17
|
+
|
|
18
|
+
1. **Prove the bug existed** - Write a test that fails before the fix
|
|
19
|
+
2. **Prove the fix works** - Same test passes after the fix
|
|
20
|
+
3. **Prove nothing broke** - All existing tests still pass
|
|
21
|
+
4. **Prevent recurrence** - Test stays in the codebase forever
|
|
22
|
+
|
|
23
|
+
---
|
|
24
|
+
|
|
25
|
+
## Test Pyramid for Bug Fixes
|
|
26
|
+
|
|
27
|
+
```
|
|
28
|
+
┌─────────────────┐
|
|
29
|
+
│ E2E │ ← Critical path only
|
|
30
|
+
│ (Playwright) │
|
|
31
|
+
└────────┬────────┘
|
|
32
|
+
│
|
|
33
|
+
┌─────────────┴─────────────┐
|
|
34
|
+
│ Integration │ ← API contracts, DB
|
|
35
|
+
│ (Testcontainers/MSW) │
|
|
36
|
+
└────────────┬──────────────┘
|
|
37
|
+
│
|
|
38
|
+
┌───────────────────┴───────────────────┐
|
|
39
|
+
│ Unit Tests │ ← Most bug fix tests
|
|
40
|
+
│ (Jest/Vitest/Pytest) │
|
|
41
|
+
└───────────────────────────────────────┘
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**For bug fixes, prioritize:**
|
|
45
|
+
1. **Unit test** that reproduces the exact bug condition
|
|
46
|
+
2. **Integration test** if bug involves multiple components
|
|
47
|
+
3. **E2E test** only if bug is user-journey critical
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
|
|
51
|
+
## Mandatory Test Types
|
|
52
|
+
|
|
53
|
+
### 1. Bug Reproduction Test
|
|
54
|
+
|
|
55
|
+
Must be written **before** the fix:
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
// ❌ This test should FAIL on main branch
|
|
59
|
+
describe('BUG-1234: User profile crashes on null avatar', () => {
|
|
60
|
+
it('should handle missing avatar gracefully', () => {
|
|
61
|
+
const user = { name: 'John', avatar: null };
|
|
62
|
+
|
|
63
|
+
// This would crash before fix
|
|
64
|
+
expect(() => renderProfile(user)).not.toThrow();
|
|
65
|
+
expect(screen.getByText('John')).toBeInTheDocument();
|
|
66
|
+
});
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### 2. Fix Verification Test
|
|
71
|
+
|
|
72
|
+
Same test **passes** after fix:
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
// ✅ This test should PASS after fix
|
|
76
|
+
it('should display default avatar when user.avatar is null', () => {
|
|
77
|
+
const user = { name: 'John', avatar: null };
|
|
78
|
+
renderProfile(user);
|
|
79
|
+
|
|
80
|
+
expect(screen.getByAltText('Default avatar')).toBeInTheDocument();
|
|
81
|
+
});
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
### 3. Edge Case Tests
|
|
85
|
+
|
|
86
|
+
Cover related edge cases discovered during RCA:
|
|
87
|
+
|
|
88
|
+
```typescript
|
|
89
|
+
describe('Avatar edge cases', () => {
|
|
90
|
+
it.each([
|
|
91
|
+
[null, 'default.png'],
|
|
92
|
+
[undefined, 'default.png'],
|
|
93
|
+
['', 'default.png'],
|
|
94
|
+
['valid-url.jpg', 'valid-url.jpg'],
|
|
95
|
+
])('avatar=%s should display %s', (avatar, expected) => {
|
|
96
|
+
const user = { name: 'John', avatar };
|
|
97
|
+
renderProfile(user);
|
|
98
|
+
|
|
99
|
+
expect(screen.getByRole('img').src).toContain(expected);
|
|
100
|
+
});
|
|
101
|
+
});
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### 4. Regression Tests
|
|
105
|
+
|
|
106
|
+
Verify existing functionality unchanged:
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
describe('Profile regression tests', () => {
|
|
110
|
+
it('should still display user name correctly', () => { /* ... */ });
|
|
111
|
+
it('should still allow avatar upload', () => { /* ... */ });
|
|
112
|
+
it('should still link to settings', () => { /* ... */ });
|
|
113
|
+
});
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
---
|
|
117
|
+
|
|
118
|
+
## Test Writing Guidelines
|
|
119
|
+
|
|
120
|
+
### Do's ✅
|
|
121
|
+
|
|
122
|
+
```typescript
|
|
123
|
+
// ✅ Descriptive test name includes bug ID
|
|
124
|
+
it('BUG-1234: should not crash when avatar is null');
|
|
125
|
+
|
|
126
|
+
// ✅ Test the exact failure condition
|
|
127
|
+
const user = { avatar: null }; // Exact trigger
|
|
128
|
+
|
|
129
|
+
// ✅ Assert specific behavior, not just "no error"
|
|
130
|
+
expect(component).toHaveAttribute('src', 'default.png');
|
|
131
|
+
|
|
132
|
+
// ✅ Use realistic data
|
|
133
|
+
const user = userFactory.build({ avatar: null });
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
### Don'ts ❌
|
|
137
|
+
|
|
138
|
+
```typescript
|
|
139
|
+
// ❌ Vague test name
|
|
140
|
+
it('should work correctly');
|
|
141
|
+
|
|
142
|
+
// ❌ Testing implementation, not behavior
|
|
143
|
+
expect(useState).toHaveBeenCalledWith(null);
|
|
144
|
+
|
|
145
|
+
// ❌ Multiple bugs in one test
|
|
146
|
+
it('should handle null avatar and empty name and missing email');
|
|
147
|
+
|
|
148
|
+
// ❌ Skipping cleanup
|
|
149
|
+
afterEach(() => cleanup()); // Don't forget!
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
---
|
|
153
|
+
|
|
154
|
+
## Coverage Requirements
|
|
155
|
+
|
|
156
|
+
| Fix Scope | Required Coverage |
|
|
157
|
+
|-----------|-------------------|
|
|
158
|
+
| Single function | 100% on changed lines |
|
|
159
|
+
| Multiple functions | 100% on changed + 80% on callers |
|
|
160
|
+
| Cross-module | 100% on changed + integration tests |
|
|
161
|
+
| Critical path | All above + E2E test |
|
|
162
|
+
|
|
163
|
+
### Coverage Commands
|
|
164
|
+
|
|
165
|
+
```bash
|
|
166
|
+
# JavaScript/TypeScript
|
|
167
|
+
npx vitest run --coverage --reporter=html
|
|
168
|
+
npx jest --coverage --collectCoverageFrom='src/**/*.{ts,tsx}'
|
|
169
|
+
|
|
170
|
+
# Python
|
|
171
|
+
pytest --cov=src --cov-report=html
|
|
172
|
+
coverage run -m pytest
|
|
173
|
+
coverage report --fail-under=80
|
|
174
|
+
|
|
175
|
+
# Go
|
|
176
|
+
go test -coverprofile=coverage.out ./...
|
|
177
|
+
go tool cover -html=coverage.out
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
---
|
|
181
|
+
|
|
182
|
+
## Test Templates
|
|
183
|
+
|
|
184
|
+
### Unit Test Template (TypeScript)
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
import { describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
188
|
+
import { render, screen, cleanup } from '@testing-library/react';
|
|
189
|
+
|
|
190
|
+
describe('BUG-XXXX: [Brief description]', () => {
|
|
191
|
+
beforeEach(() => {
|
|
192
|
+
// Setup: mock dependencies, reset state
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
afterEach(() => {
|
|
196
|
+
cleanup();
|
|
197
|
+
vi.restoreAllMocks();
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
describe('Bug reproduction', () => {
|
|
201
|
+
it('should [expected behavior] when [trigger condition]', () => {
|
|
202
|
+
// Arrange: setup the exact bug trigger
|
|
203
|
+
const input = { /* bug trigger data */ };
|
|
204
|
+
|
|
205
|
+
// Act: execute the buggy code path
|
|
206
|
+
const result = functionUnderTest(input);
|
|
207
|
+
|
|
208
|
+
// Assert: verify correct behavior
|
|
209
|
+
expect(result).toBe(expected);
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
|
|
213
|
+
describe('Edge cases', () => {
|
|
214
|
+
it.each([
|
|
215
|
+
['case 1', input1, expected1],
|
|
216
|
+
['case 2', input2, expected2],
|
|
217
|
+
])('%s', (name, input, expected) => {
|
|
218
|
+
expect(functionUnderTest(input)).toBe(expected);
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
|
|
222
|
+
describe('Regression', () => {
|
|
223
|
+
it('should still [existing behavior]', () => {
|
|
224
|
+
// Verify existing functionality unchanged
|
|
225
|
+
});
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Integration Test Template (Python)
|
|
231
|
+
|
|
232
|
+
```python
|
|
233
|
+
import pytest
|
|
234
|
+
from unittest.mock import patch, MagicMock
|
|
235
|
+
|
|
236
|
+
class TestBugXXXX:
|
|
237
|
+
"""BUG-XXXX: [Brief description]"""
|
|
238
|
+
|
|
239
|
+
@pytest.fixture(autouse=True)
|
|
240
|
+
def setup(self, db_session):
|
|
241
|
+
"""Setup test fixtures."""
|
|
242
|
+
self.session = db_session
|
|
243
|
+
# Create test data
|
|
244
|
+
|
|
245
|
+
def test_bug_reproduction(self):
|
|
246
|
+
"""Should [expected] when [trigger]."""
|
|
247
|
+
# Arrange
|
|
248
|
+
user = User(avatar=None) # Bug trigger
|
|
249
|
+
|
|
250
|
+
# Act
|
|
251
|
+
result = get_user_profile(user.id)
|
|
252
|
+
|
|
253
|
+
# Assert
|
|
254
|
+
assert result.avatar_url == "default.png"
|
|
255
|
+
|
|
256
|
+
@pytest.mark.parametrize("avatar,expected", [
|
|
257
|
+
(None, "default.png"),
|
|
258
|
+
("", "default.png"),
|
|
259
|
+
("valid.jpg", "valid.jpg"),
|
|
260
|
+
])
|
|
261
|
+
def test_edge_cases(self, avatar, expected):
|
|
262
|
+
"""Edge case: avatar={avatar}."""
|
|
263
|
+
user = User(avatar=avatar)
|
|
264
|
+
result = get_user_profile(user.id)
|
|
265
|
+
assert result.avatar_url == expected
|
|
266
|
+
|
|
267
|
+
def test_regression_existing_users(self):
|
|
268
|
+
"""Existing users should still work."""
|
|
269
|
+
user = User(avatar="existing.jpg")
|
|
270
|
+
result = get_user_profile(user.id)
|
|
271
|
+
assert result.avatar_url == "existing.jpg"
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
### E2E Test Template (Playwright)
|
|
275
|
+
|
|
276
|
+
```typescript
|
|
277
|
+
import { test, expect } from '@playwright/test';
|
|
278
|
+
|
|
279
|
+
test.describe('BUG-XXXX: [Brief description]', () => {
|
|
280
|
+
test.beforeEach(async ({ page }) => {
|
|
281
|
+
// Login, navigate to page
|
|
282
|
+
await page.goto('/profile');
|
|
283
|
+
});
|
|
284
|
+
|
|
285
|
+
test('should display default avatar for user without avatar', async ({ page }) => {
|
|
286
|
+
// Setup: Create user without avatar via API
|
|
287
|
+
await api.createUser({ name: 'Test', avatar: null });
|
|
288
|
+
|
|
289
|
+
// Navigate
|
|
290
|
+
await page.goto('/profile/test-user');
|
|
291
|
+
|
|
292
|
+
// Assert
|
|
293
|
+
await expect(page.getByAltText('User avatar')).toHaveAttribute(
|
|
294
|
+
'src',
|
|
295
|
+
/default\.png/
|
|
296
|
+
);
|
|
297
|
+
});
|
|
298
|
+
|
|
299
|
+
test('regression: should still display custom avatar', async ({ page }) => {
|
|
300
|
+
await api.createUser({ name: 'Test', avatar: 'custom.jpg' });
|
|
301
|
+
await page.goto('/profile/test-user');
|
|
302
|
+
|
|
303
|
+
await expect(page.getByAltText('User avatar')).toHaveAttribute(
|
|
304
|
+
'src',
|
|
305
|
+
/custom\.jpg/
|
|
306
|
+
);
|
|
307
|
+
});
|
|
308
|
+
});
|
|
309
|
+
```
|
|
310
|
+
|
|
311
|
+
---
|
|
312
|
+
|
|
313
|
+
## Test Execution Checklist
|
|
314
|
+
|
|
315
|
+
Before submitting the fix:
|
|
316
|
+
|
|
317
|
+
```markdown
|
|
318
|
+
### Test Verification Checklist
|
|
319
|
+
|
|
320
|
+
- [ ] Bug reproduction test written and fails on main
|
|
321
|
+
- [ ] Fix applied and reproduction test now passes
|
|
322
|
+
- [ ] Edge case tests added (null, undefined, empty, boundary)
|
|
323
|
+
- [ ] Regression tests for affected callers pass
|
|
324
|
+
- [ ] Full test suite green (`npm test` / `pytest`)
|
|
325
|
+
- [ ] Coverage on changed files = 100%
|
|
326
|
+
- [ ] No flaky tests introduced (run 3x to verify)
|
|
327
|
+
- [ ] Test naming follows convention: `BUG-XXXX: should...`
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
---
|
|
331
|
+
|
|
332
|
+
## Quick Reference: Test Commands
|
|
333
|
+
|
|
334
|
+
```bash
|
|
335
|
+
# Run specific test file
|
|
336
|
+
npx vitest run src/components/Profile.test.tsx
|
|
337
|
+
pytest tests/test_profile.py -v
|
|
338
|
+
|
|
339
|
+
# Run tests matching pattern
|
|
340
|
+
npx vitest run -t "BUG-1234"
|
|
341
|
+
pytest -k "bug_1234"
|
|
342
|
+
|
|
343
|
+
# Watch mode during development
|
|
344
|
+
npx vitest watch
|
|
345
|
+
pytest-watch
|
|
346
|
+
|
|
347
|
+
# Coverage report
|
|
348
|
+
npx vitest run --coverage
|
|
349
|
+
pytest --cov --cov-report=term-missing
|
|
350
|
+
```
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
# Tooling & Build Scripts — Bug Fixing Guide (Zero Regression)
|
|
2
|
+
|
|
3
|
+
Use this guide when the “bug” lives in:
|
|
4
|
+
- build scripts (`.bat`, `.sh`, Makefiles)
|
|
5
|
+
- packaging tools (Electron Builder, PyInstaller, installers)
|
|
6
|
+
- CI/CD pipelines (GitHub Actions, GitLab CI, Jenkins, etc.)
|
|
7
|
+
|
|
8
|
+
The failure mode here is common: the fix “seems right” but breaks a different branch (interactive vs non-interactive, admin vs non-admin, CI vs local), or the output is too quiet so it looks “stuck”.
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 1) Triage (fast classifier)
|
|
13
|
+
|
|
14
|
+
Ask 1–2 questions:
|
|
15
|
+
- **Entry point**:
|
|
16
|
+
- (A) double-click / GUI runner
|
|
17
|
+
- (B) interactive terminal
|
|
18
|
+
- (C) CI job / pipeline step
|
|
19
|
+
- **Final outcome**:
|
|
20
|
+
- (A) fails with an error
|
|
21
|
+
- (B) “hangs” / no progress output
|
|
22
|
+
- (C) succeeds but produces wrong artifact (wrong folder / missing files)
|
|
23
|
+
|
|
24
|
+
Then capture **evidence**:
|
|
25
|
+
- exact command line (or “double-click”)
|
|
26
|
+
- working directory
|
|
27
|
+
- tool versions (node/npm/python/electron-builder/pyinstaller if relevant)
|
|
28
|
+
- last ~30 lines of output + **exit code**
|
|
29
|
+
|
|
30
|
+
---
|
|
31
|
+
|
|
32
|
+
## 2) Baseline (BEFORE fixing)
|
|
33
|
+
|
|
34
|
+
### 2.1 Make the script observable (no “it looks stuck”)
|
|
35
|
+
|
|
36
|
+
If output is too quiet:
|
|
37
|
+
- remove silent flags (`-q`, `--silent`) for install/build steps
|
|
38
|
+
- enable progress (`pip --progress-bar on`, package manager progress, verbose flags)
|
|
39
|
+
- print step boundaries and timestamps
|
|
40
|
+
|
|
41
|
+
### 2.2 Make runs deterministic (reduce flakiness)
|
|
42
|
+
|
|
43
|
+
- avoid interactive prompts; provide non-interactive flags where possible
|
|
44
|
+
- pin versions for toolchains when feasible
|
|
45
|
+
- isolate caches (or document how to clear them)
|
|
46
|
+
|
|
47
|
+
### 2.3 Baseline matrix (minimum)
|
|
48
|
+
|
|
49
|
+
Record these as a table: **command → expected → actual → exit code → evidence**.
|
|
50
|
+
|
|
51
|
+
Typical minimal set:
|
|
52
|
+
- `script --help` (prints options, exits 0)
|
|
53
|
+
- `script --check-only` (validates env, exits 0/1 deterministically)
|
|
54
|
+
- “fast path” / “skip” flags (should not run heavy steps)
|
|
55
|
+
- “full path” once (the real end-to-end build)
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
|
|
59
|
+
## 3) Windows Batch (`.bat`) pitfall checklist (common root causes)
|
|
60
|
+
|
|
61
|
+
### 3.1 Control flow inside parentheses
|
|
62
|
+
|
|
63
|
+
Avoid `goto` inside parenthesized blocks, e.g.:
|
|
64
|
+
|
|
65
|
+
```bat
|
|
66
|
+
if exist "X" (
|
|
67
|
+
goto :Label REM fragile
|
|
68
|
+
)
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
Prefer a flag variable and jump once outside the block.
|
|
72
|
+
|
|
73
|
+
### 3.2 Delayed expansion and `!`
|
|
74
|
+
|
|
75
|
+
If using `setlocal enabledelayedexpansion`, any `!` in values can be expanded unexpectedly.
|
|
76
|
+
Be explicit about when delayed expansion is required, and avoid printing unescaped `!`.
|
|
77
|
+
|
|
78
|
+
### 3.3 Special characters and quoting
|
|
79
|
+
|
|
80
|
+
Windows batch is sensitive to `&`, `|`, `<`, `>`, `(`, `)`, `^`, `%`.
|
|
81
|
+
Always quote paths with spaces and escape special characters when echoing commands.
|
|
82
|
+
|
|
83
|
+
### 3.4 Encoding / non-ASCII
|
|
84
|
+
|
|
85
|
+
Non-ASCII output can break in surprising ways depending on:
|
|
86
|
+
- file encoding (UTF-8 with/without BOM)
|
|
87
|
+
- code page (`chcp`)
|
|
88
|
+
- console host
|
|
89
|
+
|
|
90
|
+
Recommendation for robustness:
|
|
91
|
+
- keep control keywords and critical command lines ASCII-only
|
|
92
|
+
- if localized output is required, test on the real target console host
|
|
93
|
+
|
|
94
|
+
### 3.5 “Double-click closes instantly”
|
|
95
|
+
|
|
96
|
+
If users double-click the script, the window closes on completion or error.
|
|
97
|
+
Options:
|
|
98
|
+
- add a final `pause` (or a `--no-pause` flag)
|
|
99
|
+
- instruct users to run from an existing terminal so output remains visible
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## 4) Packaging toolchain pitfalls (general)
|
|
104
|
+
|
|
105
|
+
### 4.1 Code signing on Windows
|
|
106
|
+
|
|
107
|
+
If you do not have a code-signing certificate, **disable signing**.
|
|
108
|
+
Otherwise tools may download signing helpers and fail due to permissions/symlink extraction, especially on locked-down machines.
|
|
109
|
+
|
|
110
|
+
### 4.2 Symlink permissions (Windows)
|
|
111
|
+
|
|
112
|
+
Creating symlinks often requires:
|
|
113
|
+
- Administrator privileges, or
|
|
114
|
+
- enabling Developer Mode
|
|
115
|
+
|
|
116
|
+
If a tool tries to extract archives containing symlinks, prefer a no-symlink path or disable the feature that requires it.
|
|
117
|
+
|
|
118
|
+
### 4.3 Caches
|
|
119
|
+
|
|
120
|
+
Build tools cache downloads aggressively. When you see repeated failures with “cannot execute”, “corrupt archive”, “permission denied”, try clearing the tool’s cache directory and retry once.
|
|
121
|
+
|
|
122
|
+
---
|
|
123
|
+
|
|
124
|
+
## 5) Verification gate (tooling-specific)
|
|
125
|
+
|
|
126
|
+
Don’t declare “fixed” until ALL pass:
|
|
127
|
+
|
|
128
|
+
### 5.1 Correctness
|
|
129
|
+
- original failing command now succeeds (or fails with the intended error message)
|
|
130
|
+
- expected artifacts are produced in the expected location
|
|
131
|
+
|
|
132
|
+
### 5.2 Regression
|
|
133
|
+
- other entry points still work (double-click vs terminal vs CI)
|
|
134
|
+
- “fast path” flags still skip heavy work
|
|
135
|
+
|
|
136
|
+
### 5.3 Observability
|
|
137
|
+
- progress is visible for long steps (no false “hang” reports)
|
|
138
|
+
- error messages are actionable (tell user what to install/enable)
|
|
139
|
+
|
|
140
|
+
### 5.4 Evidence (mandatory)
|
|
141
|
+
|
|
142
|
+
Provide:
|
|
143
|
+
- the exact commands used
|
|
144
|
+
- exit codes
|
|
145
|
+
- the relevant log tail for each command
|
|
146
|
+
|
|
147
|
+
---
|
|
148
|
+
|
|
149
|
+
## 6) Output template (copy/paste)
|
|
150
|
+
|
|
151
|
+
```markdown
|
|
152
|
+
## Tooling Verification Matrix
|
|
153
|
+
|
|
154
|
+
| Case | Command / Entry point | Expected | Actual | Exit code | Evidence |
|
|
155
|
+
|------|------------------------|----------|--------|----------:|----------|
|
|
156
|
+
| 1 | `script --help` | prints help | | | |
|
|
157
|
+
| 2 | `script --check-only` | env validated | | | |
|
|
158
|
+
| 3 | fast path | skips heavy steps | | | |
|
|
159
|
+
| 4 | full path | artifact produced | | | |
|
|
160
|
+
```
|
|
161
|
+
|
|
162
|
+
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
# User Input & External Data Validation
|
|
2
|
+
|
|
3
|
+
When bugs involve user input or external data (file imports, API responses, form data), incorrect assumptions about data format are the #1 cause of multi-fix loops.
|
|
4
|
+
|
|
5
|
+
## Common Input Format Traps
|
|
6
|
+
|
|
7
|
+
| Category | Trap | Reality | Prevention |
|
|
8
|
+
|----------|------|---------|------------|
|
|
9
|
+
| **Column/Field Names** | Names are plain identifiers | Users may use wrapper syntax, templates, or special chars | Normalize names at parse time; strip common wrappers |
|
|
10
|
+
| **Data Types** | All values are strings | May be numbers, dates, booleans, nulls | Explicit type conversion with fallbacks |
|
|
11
|
+
| **Empty Values** | Empty means empty string | Could be null, undefined, missing key, or whitespace-only | Define and handle all empty variants |
|
|
12
|
+
| **Encoding** | File is UTF-8 | Could be UTF-8 BOM, UTF-16, ISO-8859-1 | Detect encoding or specify in docs |
|
|
13
|
+
| **Line Endings** | LF only | Windows CRLF, old Mac CR | Normalize line endings at parse |
|
|
14
|
+
| **Response Body** | HTTP success = business success | 200 with `{"code": -1, "error": "..."}` | Parse response body; check business status fields |
|
|
15
|
+
|
|
16
|
+
## File Import Checklist
|
|
17
|
+
|
|
18
|
+
### Parse Phase
|
|
19
|
+
|
|
20
|
+
- [ ] **Column name normalization**: Strip wrapper syntax (e.g., `${name}` → `name`)
|
|
21
|
+
- [ ] **Type detection**: Number, date, boolean, string
|
|
22
|
+
- [ ] **Null handling**: Define what empty/missing values become
|
|
23
|
+
- [ ] **Encoding handling**: BOM, charset detection
|
|
24
|
+
|
|
25
|
+
### Validation Phase
|
|
26
|
+
|
|
27
|
+
- [ ] **Required fields**: Check presence and non-empty
|
|
28
|
+
- [ ] **Format validation**: Regex/pattern for constrained fields
|
|
29
|
+
- [ ] **Range validation**: Min/max for numbers, length for strings
|
|
30
|
+
|
|
31
|
+
### Integration Phase
|
|
32
|
+
|
|
33
|
+
- [ ] **Data stored correctly**: Compare input → storage → retrieval
|
|
34
|
+
- [ ] **Display matches input**: Compare original input → final render
|
|
35
|
+
- [ ] **Edge cases work**: Special chars, very long values, unicode
|
|
36
|
+
|
|
37
|
+
## API Response Validation
|
|
38
|
+
|
|
39
|
+
### Common Response Patterns
|
|
40
|
+
|
|
41
|
+
```
|
|
42
|
+
Pattern A: { "code": 0, "message": "ok", "data": {...} }
|
|
43
|
+
Pattern B: { "success": true, "result": {...} }
|
|
44
|
+
Pattern C: { "status": "success", "payload": {...} }
|
|
45
|
+
Pattern D: { "error": null, "data": {...} }
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Response Validation Checklist
|
|
49
|
+
|
|
50
|
+
- [ ] **Identify response structure**: What fields indicate success/failure?
|
|
51
|
+
- [ ] **Define success condition**: Not just HTTP 2xx, but also body fields
|
|
52
|
+
- [ ] **Extract error info**: message/msg/error field for user display
|
|
53
|
+
- [ ] **Handle edge cases**: Non-JSON response, empty body, timeout
|
|
54
|
+
|
|
55
|
+
## Assumption Verification Template
|
|
56
|
+
|
|
57
|
+
When fixing a bug involving external data, fill this table BEFORE coding:
|
|
58
|
+
|
|
59
|
+
| Assumption | How to Verify | Evidence | Status |
|
|
60
|
+
|------------|---------------|----------|--------|
|
|
61
|
+
| Input format is X | Check actual sample data | | ⬜ |
|
|
62
|
+
| Parser handles format Y | Read parser code | | ⬜ |
|
|
63
|
+
| Data is normalized before use | Trace data flow | | ⬜ |
|
|
64
|
+
| Edge case Z is handled | Test with edge case input | | ⬜ |
|
|
65
|
+
| Response structure is A | Check API implementation | | ⬜ |
|
|
66
|
+
|
|
67
|
+
## Red Flags (Trigger Deeper Investigation)
|
|
68
|
+
|
|
69
|
+
If any of these appear, explicitly verify input handling:
|
|
70
|
+
|
|
71
|
+
- Bug report mentions "sometimes works, sometimes doesn't"
|
|
72
|
+
- Bug involves file upload/import functionality
|
|
73
|
+
- Bug involves third-party API integration
|
|
74
|
+
- User says "I followed the format exactly"
|
|
75
|
+
- Error occurs only for certain users/inputs
|
|
76
|
+
- Data looks correct in DB but wrong on display
|
|
77
|
+
|