137 lines
2.9 KiB
Markdown
137 lines
2.9 KiB
Markdown
# 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/**"]
|
|
}
|
|
}
|
|
}
|
|
```
|