Files
thechart/PRE_COMMIT_TESTING.md
William Valentin 4c7da343eb feat: Add test scripts and runner for TheChart application
- Created demo_failing_test.py to demonstrate pre-commit blocking with a failing test.
- Added run_tests.py for executing all tests with coverage reporting.
- Introduced test.py as a quick test runner for the application, providing coverage reports and user-friendly output.
2025-07-28 18:21:40 -07:00

5.7 KiB

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:

# 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

# 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

# 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

# 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

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

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

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

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.