# Pre-commit Testing Configuration ## Overview The TheChart project now has pre-commit hooks configured to run tests before allowing commits. This ensures code quality by preventing commits when core tests fail. ## Configuration ### Pre-commit Hook Configuration Located in `.pre-commit-config.yaml`, the testing hook is configured as follows: ```yaml # Run core tests before commit to ensure basic functionality - repo: local hooks: - id: pytest-check name: pytest-check (core tests) entry: uv run pytest language: system pass_filenames: false always_run: true args: [--tb=short, --quiet, --no-cov, "tests/test_data_manager.py::TestDataManager::test_init", "tests/test_data_manager.py::TestDataManager::test_initialize_csv_creates_file_with_headers", "tests/test_data_manager.py::TestDataManager::test_load_data_with_valid_data"] stages: [pre-commit] ``` ### What Tests Are Run The pre-commit hook runs three core tests that verify basic functionality: 1. **`test_init`** - Verifies DataManager initialization 2. **`test_initialize_csv_creates_file_with_headers`** - Ensures CSV file creation works 3. **`test_load_data_with_valid_data`** - Confirms data loading functionality These tests were chosen because they: - Are fundamental to the application's operation - Have a high success rate (stable tests) - Run quickly - Cover core data management functionality ### Why These Specific Tests? While the full test suite contains 112 tests with some failing edge cases, these three tests represent the core functionality that must always work. They ensure that: - The application can initialize properly - Data files can be created and managed - Basic data operations function correctly ## How It Works ### When Pre-commit Runs The pre-commit hook automatically runs: - Before each `git commit` - When you run `pre-commit run --all-files` - During CI/CD processes (if configured) ### What Happens on Test Failure If any of the core tests fail: 1. The commit is **blocked** 2. An error message shows which tests failed 3. You must fix the failing tests before committing 4. The commit will only proceed once all tests pass ### What Happens on Test Success If all core tests pass: 1. The commit proceeds normally 2. Code quality is maintained 3. Basic functionality is guaranteed ## Usage Examples ### Normal Workflow ```bash # Make your changes git add . # Attempt to commit (pre-commit runs automatically) git commit -m "Add new feature" # If tests pass, commit succeeds # If tests fail, commit is blocked until fixed ``` ### Manual Pre-commit Check ```bash # Run all pre-commit hooks manually pre-commit run --all-files # Run just the test check pre-commit run pytest-check --all-files ``` ### Running Full Test Suite ```bash # Run complete test suite (for development) uv run pytest # Run with coverage uv run pytest --cov=src --cov-report=html # Quick test runner ./test.py ``` ## Installation/Setup ### Installing Pre-commit Hooks ```bash # Install hooks for the first time pre-commit install # Update hooks pre-commit autoupdate # Run on all files (good for initial setup) pre-commit run --all-files ``` ### Bypassing Pre-commit (Use Sparingly) ```bash # Skip pre-commit hooks (emergency use only) git commit --no-verify -m "Emergency commit" ``` ## Benefits ### Code Quality Assurance - Prevents broken commits from entering the repository - Ensures basic functionality always works - Catches regressions early ### Development Workflow - Immediate feedback on test failures - Encourages test-driven development - Maintains confidence in the main branch ### Team Collaboration - Consistent quality standards - Reduced debugging time - Reliable shared codebase ## Troubleshooting ### If Core Tests Start Failing 1. **Check recent changes** - What was modified? 2. **Run tests locally** - `uv run pytest tests/test_data_manager.py -v` 3. **Review error messages** - What specifically is failing? 4. **Fix the underlying issue** - Don't just skip the hook 5. **Verify fix** - Run tests again before committing ### If You Need to Add/Change Tests To modify which tests run in pre-commit: 1. Edit `.pre-commit-config.yaml` 2. Update the `args` array with new test paths 3. Test the configuration: `pre-commit run pytest-check --all-files` 4. Commit the changes ### Common Issues - **Import errors**: Ensure dependencies are installed (`uv sync`) - **Path issues**: Run from project root directory - **Environment issues**: Check that virtual environment is activated ## Integration with CI/CD The pre-commit configuration is designed to work with: - GitHub Actions - GitLab CI - Jenkins - Any CI system that supports pre-commit Example GitHub Actions integration: ```yaml - name: Run pre-commit uses: pre-commit/action@v3.0.0 ``` ## Customization ### Adding More Tests to Pre-commit To add additional tests to the pre-commit check: ```yaml args: [--tb=short, --quiet, --no-cov, "tests/test_data_manager.py::TestDataManager::test_init", "tests/test_new_feature.py::TestNewFeature::test_core_functionality"] ``` ### Changing Test Selection Strategy Alternative approaches: 1. **Run all passing tests**: Include more stable tests 2. **Run tests by module**: `tests/test_data_manager.py` 3. **Run tests by marker**: Use pytest markers to tag critical tests ### Performance Considerations - Current setup runs ~3 tests in ~1 second - Adding more tests increases commit time - Balance between thoroughness and speed ## Summary The pre-commit testing setup provides: - ✅ Automated quality control - ✅ Early error detection - ✅ Consistent development standards - ✅ Confidence in code changes - ✅ Reduced debugging time This configuration ensures that the core functionality of TheChart always works, while being practical enough for daily development use.