FallenBirdyForm/test
2025-06-07 20:41:32 +02:00
..
functional init project tests 2025-06-07 19:24:41 +02:00
integration init project tests 2025-06-07 19:24:41 +02:00
unit init project tests 2025-06-07 19:24:41 +02:00
__init__.py init project tests 2025-06-07 19:24:41 +02:00
conftest.py init project tests 2025-06-07 19:24:41 +02:00
fixtures.py init project tests 2025-06-07 19:24:41 +02:00
README.md init project tests 2025-06-07 19:24:41 +02:00
requirements.txt update requirements 2025-06-07 20:41:32 +02:00
run_tests.py init project tests 2025-06-07 19:24:41 +02:00
test_settings.py CKEditor Migration Successfully Completed 2025-06-07 20:10:08 +02:00

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

# Run all tests
cd /Users/maximilianfischer/git/django_fbf
python3 test/run_tests.py

Method 2: Using Django's manage.py

# 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)

# 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:

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:

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

def test_bird_creation(self):
    bird = Bird.objects.create(**valid_data)
    self.assertEqual(bird.name, "Test Bird")
    self.assertTrue(isinstance(bird, Bird))

Form Testing

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

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:

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:

# 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:

# 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:

cd /Users/maximilianfischer/git/django_fbf
python3 test/run_tests.py

This will exit with code 0 for success, 1 for failure.