OpenWriterControle/plugins/claude-code/skills/test-generation/SKILL.md
Darren Hinde f84f32b7b3
fix: overhaul Claude Code plugin for correctness and spec compliance (#225)
- Fix critical bugs: coder-agent name (CoderAgent→coder-agent), manifest
  path in session-start.sh, /oac:setup ghost command replaced with /install-context
- Fix hooks.json: add timeout/async, add description, restore matcher
- Fix session-start.sh: dual-format output (Claude Code + Cursor/OpenCode),
  remove invalid JSON escapes for $ and backtick
- Fix agent spec compliance: disallowedTools on read-only agents, WebFetch
  on external-scout, haiku model on context-scout, example blocks on 3 agents
- Fix skill descriptions: triggering conditions only (no workflow summaries)
  per superpowers empirical testing — prevents Claude shortcutting skill content
- Add Red Flags + Rationalization tables to 4 discipline skills
- Add install-context skill + command replacing oac-setup/oac-plan/oac-add-context
- Add cleanup-tmp.sh (was missing, broke /oac:cleanup)
- Add TypeScript installer (install-context.ts/js) with profile-based download
- Update plugin.json: keywords, homepage for marketplace discoverability
- Update README: correct skill count, fix structure diagram, remove stale refs
- Remove obsolete files: FIRST-TIME-SETUP.md, INSTALL.md, QUICK-START.md,
  download-context.sh, verify-context.sh, load-config.sh, context-manager skill,
  oac-setup/oac-plan/oac-add-context commands
2026-02-19 20:16:17 +00:00

182 lines
4.6 KiB
Markdown

---
name: test-generation
description: Use when the user asks for tests, mentions TDD, or when new code has been written and needs test coverage.
context: fork
agent: test-engineer
---
# Test Generation
## Overview
Generate comprehensive tests following TDD principles and project testing standards. Runs in isolated test-engineer context with pre-loaded testing conventions.
**Announce at start:** "I'm using the test-generation skill to create tests for [feature/component]."
## The Process
### Step 1: Specify Test Requirements
Provide clear requirements to test-engineer:
```markdown
/test-generation
Feature: JWT token validation middleware
Behaviors:
1. Valid token → allow request
2. Expired token → reject with 401
3. Invalid signature → reject with 401
4. Missing token → reject with 401
Coverage: All critical paths
Testing Standards (pre-loaded):
- Framework: vitest
- Mocks: vi.mock()
- Structure: AAA pattern
```
### Step 2: Review Test Plan
Test-engineer proposes a test plan:
```markdown
## Test Plan
Behaviors:
1. Valid token
- ✅ Positive: Allow request with valid JWT
- ❌ Negative: Reject malformed JWT
2. Expired token
- ✅ Positive: Normal token works
- ❌ Negative: Expired token rejected with 401
Mocking Strategy:
- JWT verification: Mock with vi.mock()
- Request/Response: Use test doubles
Coverage Target: 95% line coverage, all critical paths
```
**IMPORTANT**: Review and approve before implementation proceeds.
### Step 3: Implement Tests
Test-engineer implements following AAA pattern (Arrange-Act-Assert):
```typescript
describe('JWT Middleware', () => {
it('allows request with valid token', () => {
// Arrange
const req = mockRequest({ headers: { authorization: 'Bearer valid.jwt.token' } });
// Act
const result = jwtMiddleware(req);
// Assert
expect(result.authorized).toBe(true);
});
});
```
### Step 4: Run Self-Review
Test-engineer verifies:
- ✅ Positive AND negative tests for each behavior
- ✅ AAA pattern followed
- ✅ All external dependencies mocked
- ✅ Tests are deterministic (no flakiness)
- ✅ Standards compliance
### Step 5: Run Tests
Execute test suite and verify all pass:
```bash
npm test -- jwt.middleware.test.ts
```
### Step 6: Return Results
```yaml
status: success
tests_written: 8
coverage:
lines: 96%
branches: 93%
functions: 100%
behaviors_tested:
- name: "Valid token handling"
positive_tests: 2
negative_tests: 2
test_results:
passed: 8
failed: 0
deliverables:
- "src/auth/jwt.middleware.test.ts"
```
## TDD Workflow
For test-driven development, invoke BEFORE implementation:
```markdown
/test-generation
Write tests for user registration endpoint (not yet implemented):
Expected Behavior:
- POST /api/register with valid data → 201 + user object
- POST /api/register with duplicate email → 409 error
- POST /api/register with invalid email → 400 error
Note: Implementation does not exist. Write tests that define expected behavior.
```
Tests will fail initially—use them as spec to guide implementation.
## Error Handling
**Tests don't match project conventions:**
- Main agent must pre-load `.opencode/context/core/standards/tests.md`
**Missing edge cases:**
- Specify explicitly in requirements
**Flaky tests:**
- Ensure all external dependencies mocked
## Red Flags
If you think any of these, STOP and re-read this skill:
- "The implementation is simple enough that tests aren't needed"
- "I'll just write the happy path tests for now"
- "Mocking is too complex for this dependency"
- "I'll add tests after the feature is stable"
## Common Rationalizations
| Excuse | Reality |
|--------|---------|
| "It's too simple to break" | Simple code breaks in simple ways. Tests document the contract, not just catch bugs. |
| "Negative tests are obvious failures, not worth writing" | Negative tests are where bugs hide. "Obviously fails" is not the same as "correctly fails". |
| "Mocking this dependency is too hard" | Hard-to-mock dependencies are a design smell. Mock them anyway and note the smell. |
| "Tests slow down delivery" | Tests without negative cases give false confidence. False confidence slows delivery more. |
## Remember
- Pre-load testing standards BEFORE invoking skill
- Specify clear behaviors and acceptance criteria
- Review test plan before implementation
- Both positive AND negative tests required
- All external dependencies MUST be mocked (no real network/DB calls)
- AAA pattern (Arrange-Act-Assert) mandatory
- Tests must be deterministic (no randomness or time dependencies)
## Related
- code-execution
- code-review
- context-discovery