Initial commit
This commit is contained in:
136
hooks/suggest-tests.md
Normal file
136
hooks/suggest-tests.md
Normal file
@@ -0,0 +1,136 @@
|
||||
# Suggest Tests Hook
|
||||
|
||||
This hook triggers after writing a new Ruby file and suggests relevant tests.
|
||||
|
||||
## Trigger
|
||||
|
||||
- Event: post-write
|
||||
- Pattern: **/*.rb (excluding *_spec.rb files)
|
||||
|
||||
## Action
|
||||
|
||||
When a new Ruby file is created or significantly modified, analyze the file and suggest appropriate tests.
|
||||
|
||||
## Analysis Process
|
||||
|
||||
1. **Read the File**
|
||||
- Determine the class/module name
|
||||
- Identify public methods
|
||||
- Note any dependencies or collaborators
|
||||
- Identify edge cases from code structure
|
||||
|
||||
2. **Check for Existing Tests**
|
||||
- Look for corresponding spec file (e.g., `lib/user.rb` → `spec/user_spec.rb`)
|
||||
- If exists, check coverage of new methods
|
||||
- If missing, offer to create spec file
|
||||
|
||||
3. **Generate Test Suggestions**
|
||||
|
||||
Based on the code structure, suggest tests for:
|
||||
|
||||
### Public Methods
|
||||
- Happy path (normal operation)
|
||||
- Edge cases (boundary conditions)
|
||||
- Error cases (invalid inputs)
|
||||
- Null cases (nil/empty values)
|
||||
|
||||
### Class Responsibilities
|
||||
- Single Responsibility compliance
|
||||
- Interface clarity
|
||||
- Dependency injection points
|
||||
|
||||
### Common Patterns
|
||||
- Data object serialization (to_h, to_json)
|
||||
- Factory methods (build, from_json, from_h)
|
||||
- Validation logic
|
||||
- Error handling
|
||||
- State management
|
||||
|
||||
## Response Format
|
||||
|
||||
**New File Detected: [file_path]**
|
||||
|
||||
I noticed you created/modified a Ruby file with:
|
||||
- Class: [ClassName]
|
||||
- Public methods: [method1, method2, method3]
|
||||
- Dependencies: [list]
|
||||
|
||||
**Test File Status:**
|
||||
- [ ] Spec file exists at: [spec_path]
|
||||
- [ ] No spec file found
|
||||
|
||||
**Suggested Tests:**
|
||||
|
||||
```ruby
|
||||
# spec/path/to/class_spec.rb
|
||||
require 'spec_helper'
|
||||
|
||||
RSpec.describe ClassName do
|
||||
describe '.build' do
|
||||
it 'creates instance from hash attributes' do
|
||||
# Test factory method
|
||||
end
|
||||
|
||||
context 'with missing attributes' do
|
||||
it 'handles gracefully' do
|
||||
# Test edge case
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#public_method' do
|
||||
let(:instance) { described_class.new(dependencies) }
|
||||
|
||||
it 'performs expected behavior' do
|
||||
# Happy path test
|
||||
end
|
||||
|
||||
context 'when error condition occurs' do
|
||||
it 'raises appropriate exception' do
|
||||
# Error handling test
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
describe '#to_h' do
|
||||
it 'serializes to hash with expected keys' do
|
||||
# Serialization test
|
||||
end
|
||||
end
|
||||
end
|
||||
```
|
||||
|
||||
**Additional Considerations:**
|
||||
- [ ] Test dependency injection
|
||||
- [ ] Test error handling for [specific method]
|
||||
- [ ] Test edge case: [description]
|
||||
- [ ] Add integration test for [interaction]
|
||||
|
||||
Would you like me to:
|
||||
1. Create the spec file with these tests?
|
||||
2. Add tests for specific methods?
|
||||
3. Skip test suggestions for this file?
|
||||
|
||||
## Configuration
|
||||
|
||||
Users can disable this hook in `.claude/settings.json`:
|
||||
```json
|
||||
{
|
||||
"hooks": {
|
||||
"ruby-post-write": {
|
||||
"enabled": false
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Or configure per-project patterns to exclude:
|
||||
```json
|
||||
{
|
||||
"hooks": {
|
||||
"ruby-post-write": {
|
||||
"excludePattern": ["lib/generated/**", "lib/legacy/**"]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
Reference in New Issue
Block a user