Back to Repositories

Testing Zsh Shell Integration and Command Correction in TheFuck

This test suite validates the integration of TheFuck command-line tool with Zsh shell environments. It focuses on testing command correction functionality, history management, and configuration options across different Python versions and execution modes.

Test Coverage Overview

The test suite provides comprehensive coverage of Zsh shell integration with TheFuck tool.

Key areas tested include:
  • Command confirmation workflows
  • History management and persistence
  • Command selection using arrow keys
  • Support for both Python 2 and 3 environments
  • Instant mode configuration and validation

Implementation Analysis

The implementation uses pytest fixtures to create isolated test environments with different Python versions and instant mode configurations. Testing patterns leverage spawnu for process management and custom utility functions for verification.

Framework features utilized:
  • Parameterized fixtures for multiple environment testing
  • Functional test markers
  • Custom timeout handling
  • Shell interaction simulation

Technical Details

Testing tools and configuration:
  • Pytest as the primary testing framework
  • Custom shell spawning utilities
  • Zsh configuration management
  • History file handling
  • Environment variable configuration
  • Timeout management for shell interactions

Best Practices Demonstrated

The test suite exemplifies several testing best practices in shell integration testing.

Notable practices include:
  • Isolated test environments for each scenario
  • Comprehensive environment setup and teardown
  • Explicit timeout handling
  • Clear test case organization
  • Modular test utilities
  • Cross-version compatibility testing

nvbn/thefuck

tests/functional/test_zsh.py

            
import pytest
from tests.functional.plots import with_confirmation, without_confirmation, \
    refuse_with_confirmation, history_changed, history_not_changed, \
    select_command_with_arrows, how_to_configure


python_3 = (u'thefuck/python3', u'', u'sh')
python_2 = (u'thefuck/python2', u'', u'sh')


init_zshrc = u'''echo '
export SHELL=/usr/bin/zsh
export HISTFILE=~/.zsh_history
echo > $HISTFILE
export SAVEHIST=100
export HISTSIZE=100
eval $(thefuck --alias {})
setopt INC_APPEND_HISTORY
echo "instant mode ready: $THEFUCK_INSTANT_MODE"
' > ~/.zshrc'''


@pytest.fixture(params=[(python_3, False),
                        (python_3, True),
                        (python_2, False)])
def proc(request, spawnu, TIMEOUT):
    container, instant_mode = request.param
    proc = spawnu(*container)
    proc.sendline(init_zshrc.format(
        u'--enable-experimental-instant-mode' if instant_mode else ''))
    proc.sendline(u"zsh")
    if instant_mode:
        assert proc.expect([TIMEOUT, u'instant mode ready: True'])
    return proc


@pytest.mark.functional
def test_with_confirmation(proc, TIMEOUT):
    with_confirmation(proc, TIMEOUT)
    history_changed(proc, TIMEOUT, u'echo test')


@pytest.mark.functional
def test_select_command_with_arrows(proc, TIMEOUT):
    select_command_with_arrows(proc, TIMEOUT)
    history_changed(proc, TIMEOUT, u'git help', u'git hook')


@pytest.mark.functional
def test_refuse_with_confirmation(proc, TIMEOUT):
    refuse_with_confirmation(proc, TIMEOUT)
    history_not_changed(proc, TIMEOUT)


@pytest.mark.functional
def test_without_confirmation(proc, TIMEOUT):
    without_confirmation(proc, TIMEOUT)
    history_changed(proc, TIMEOUT, u'echo test')


@pytest.mark.functional
def test_how_to_configure_alias(proc, TIMEOUT):
    proc.sendline(u'unfunction fuck')
    how_to_configure(proc, TIMEOUT)