Back to Repositories

Testing Python Command Execution Rules in TheFuck

This test suite validates the Python execute rule functionality in TheFuck, focusing on command correction for Python file execution. It verifies the automatic addition of .py extension when users forget to include it in Python commands.

Test Coverage Overview

The test suite provides comprehensive coverage of Python command execution scenarios.

Key areas tested include:
  • Command matching validation for Python file execution
  • Command transformation logic for adding .py extension
  • Multiple test cases with different filenames
Edge cases are handled through parametrized tests covering various filename patterns.

Implementation Analysis

The testing approach utilizes pytest’s parametrize decorator for efficient test case management. The implementation follows a clear pattern of separating matching logic from command transformation, using pytest fixtures to test both components independently.

Framework features leveraged include:
  • Pytest parametrization for multiple test cases
  • Command object usage for input handling
  • Assertion-based verification

Technical Details

Testing tools and configuration:
  • Pytest as the primary testing framework
  • Custom Command type for input structuring
  • Parametrized test decorators for case management
  • Direct assertion checking for validation

Best Practices Demonstrated

The test suite demonstrates several testing best practices in Python unit testing. Notable practices include clear separation of concerns between matching and command generation, consistent use of parametrized tests for multiple scenarios, and proper type handling through custom Command objects.

Key quality aspects:
  • DRY principle through parametrization
  • Clear test case organization
  • Strong type safety with Command objects

nvbn/thefuck

tests/rules/test_python_execute.py

            
import pytest
from thefuck.rules.python_execute import match, get_new_command
from thefuck.types import Command


@pytest.mark.parametrize('command', [
    Command('python foo', ''),
    Command('python bar', '')])
def test_match(command):
    assert match(command)


@pytest.mark.parametrize('command, new_command', [
    (Command('python foo', ''), 'python foo.py'),
    (Command('python bar', ''), 'python bar.py')])
def test_get_new_command(command, new_command):
    assert get_new_command(command) == new_command