FallenBirdyForm/test/README.md
2025-06-07 19:24:41 +02:00

282 lines
8.2 KiB
Markdown

# Django FBF Test Suite
Comprehensive test suite for the Django FBF (Falken-, Bussard- und Fischadler) project.
## Test Structure
```
test/
├── __init__.py # Test package initialization
├── conftest.py # Pytest configuration
├── test_settings.py # Django test settings
├── run_tests.py # Custom test runner script
├── fixtures.py # Test fixtures and utilities
├── requirements.txt # Test-specific dependencies
├── README.md # This file
├── unit/ # Unit tests
│ ├── __init__.py
│ ├── test_bird_models.py # Bird model tests
│ ├── test_bird_forms.py # Bird form tests
│ ├── test_bird_views.py # Bird view tests
│ ├── test_aviary_models.py # Aviary model tests
│ ├── test_aviary_forms.py # Aviary form tests
│ ├── test_contact_models.py # Contact model tests
│ └── test_costs_models.py # Costs model tests
├── functional/ # Functional tests
│ ├── __init__.py
│ └── test_workflows.py # User workflow tests
└── integration/ # Integration tests
├── __init__.py
└── test_system_integration.py # System integration tests
```
## Test Categories
### Unit Tests
Tests individual components in isolation:
- **Model Tests**: Test Django models, validation, relationships
- **Form Tests**: Test Django forms, validation, field behavior
- **View Tests**: Test Django views, permissions, responses
### Functional Tests
Tests complete user workflows and feature interactions:
- **Bird Management Workflows**: Creating, editing, transferring birds
- **Aviary Management**: Capacity management, bird assignments
- **Search and Filtering**: Testing search functionality
- **User Permissions**: Access control and authentication flows
### Integration Tests
Tests system-wide functionality and external integrations:
- **Database Integration**: Transaction handling, constraints, performance
- **Email Integration**: Email sending and notification systems
- **File Handling**: Static files, media uploads
- **API Integration**: External API calls (if any)
- **Cache Integration**: Caching functionality (if implemented)
## Running Tests
### Method 1: Using the Custom Test Runner
```bash
# Run all tests
cd /Users/maximilianfischer/git/django_fbf
python3 test/run_tests.py
```
### Method 2: Using Django's manage.py
```bash
# Run all tests
cd /Users/maximilianfischer/git/django_fbf/app
python3 manage.py test test --settings=test.test_settings
# Run specific test categories
python3 manage.py test test.unit --settings=test.test_settings
python3 manage.py test test.functional --settings=test.test_settings
python3 manage.py test test.integration --settings=test.test_settings
# Run specific test files
python3 manage.py test test.unit.test_bird_models --settings=test.test_settings
```
### Method 3: Using pytest (if installed)
```bash
# Install test requirements first
pip install -r test/requirements.txt
# Run all tests
cd /Users/maximilianfischer/git/django_fbf/test
pytest -v
# Run with coverage
pytest --cov=../app --cov-report=html
# Run specific test categories
pytest unit/ -v
pytest functional/ -v
pytest integration/ -v
# Run specific test files
pytest unit/test_bird_models.py -v
```
### Method 4: Using the Rebuild Script
The rebuild script automatically runs all tests as part of the rebuild process:
```bash
cd /Users/maximilianfischer/git/django_fbf
./rebuild_project.sh
```
## Test Configuration
### Test Settings (`test_settings.py`)
- Uses SQLite in-memory database for speed
- Disables migrations for faster test setup
- Uses simple password hasher for performance
- Configures email backend for testing
- Sets up test-specific logging
### Test Fixtures (`fixtures.py`)
- `TestDataMixin`: Provides common test data creation methods
- Pytest fixtures for common objects
- Sample data generators
- Test utilities for assertions and validations
### Environment Setup
- Tests use separate settings from development/production
- Isolated test database (in-memory SQLite)
- Mock external dependencies
- Clean state for each test
## Test Data
### Sample Data Available
- **Birds**: Robin, Sparrow, Falcon with different attributes
- **Aviaries**: Forest Sanctuary, Lake Resort, Mountain Refuge
- **Statuses**: Gesund (Healthy), Krank (Sick), Verletzt (Injured)
- **Circumstances**: Gefunden (Found), Gebracht (Brought), Übertragen (Transferred)
- **Users**: Admin and regular users with different permissions
### Creating Test Data
Use the `TestDataMixin` class or pytest fixtures:
```python
from test.fixtures import TestDataMixin
class MyTest(TestCase, TestDataMixin):
def setUp(self):
self.user = self.create_test_user()
self.aviary = self.create_test_aviary(self.user)
self.bird = self.create_test_bird(self.user, self.aviary, ...)
```
## Coverage Goals
### Current Test Coverage
- **Models**: All model fields, methods, and relationships
- **Forms**: Form validation, field types, error handling
- **Views**: Authentication, permissions, CRUD operations
- **Workflows**: Complete user journeys
- **Integration**: Database, email, file handling
### Coverage Targets
- Unit Tests: >90% code coverage
- Functional Tests: All major user workflows
- Integration Tests: All external dependencies
## Common Test Patterns
### Model Testing
```python
def test_bird_creation(self):
bird = Bird.objects.create(**valid_data)
self.assertEqual(bird.name, "Test Bird")
self.assertTrue(isinstance(bird, Bird))
```
### Form Testing
```python
def test_form_valid_data(self):
form = BirdAddForm(data=valid_form_data)
self.assertTrue(form.is_valid())
def test_form_invalid_data(self):
form = BirdAddForm(data=invalid_form_data)
self.assertFalse(form.is_valid())
self.assertIn('field_name', form.errors)
```
### View Testing
```python
def test_view_requires_login(self):
response = self.client.get(url)
self.assertEqual(response.status_code, 302)
def test_view_authenticated(self):
self.client.login(username='user', password='pass')
response = self.client.get(url)
self.assertEqual(response.status_code, 200)
```
## Troubleshooting
### Common Issues
1. **Import Errors**
- Ensure Django settings are configured: `DJANGO_SETTINGS_MODULE=test.test_settings`
- Check Python path includes the app directory
2. **Database Errors**
- Tests use in-memory SQLite, migrations are disabled
- Each test gets a fresh database state
3. **Missing Dependencies**
- Install test requirements: `pip install -r test/requirements.txt`
- Ensure Django and all app dependencies are installed
4. **URL Reversing Errors**
- Some tests use try/except blocks for URL reversing
- Update URL names in tests to match your actual URLs
### Debug Mode
Run tests with verbose output:
```bash
python3 manage.py test test --verbosity=2
pytest -v -s # -s shows print statements
```
### Test Database
The test database is automatically created and destroyed. To inspect:
```bash
# Run with keepdb to preserve test database
python3 manage.py test test --keepdb
```
## Contributing Tests
### Adding New Tests
1. **Unit Tests**: Add to appropriate file in `unit/`
2. **Functional Tests**: Add to `functional/test_workflows.py`
3. **Integration Tests**: Add to `integration/test_system_integration.py`
### Test Guidelines
- Use descriptive test method names: `test_bird_creation_with_valid_data`
- Include both positive and negative test cases
- Test edge cases and error conditions
- Use fixtures and test utilities for common setup
- Keep tests independent and isolated
- Add docstrings for complex tests
### Running Before Commits
Always run tests before committing:
```bash
# Quick unit tests
python3 manage.py test test.unit
# Full test suite
./rebuild_project.sh
```
## Continuous Integration
The test suite is designed to work with CI/CD pipelines:
- Fast execution with in-memory database
- Clear pass/fail status
- Comprehensive coverage reporting
- Integration with the rebuild script
For CI/CD integration, use:
```bash
cd /Users/maximilianfischer/git/django_fbf
python3 test/run_tests.py
```
This will exit with code 0 for success, 1 for failure.