- 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
182 lines
4.6 KiB
Markdown
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
|