mirror of
				https://github.com/nvbn/thefuck.git
				synced 2025-10-31 15:12:20 +00:00 
			
		
		
		
	Merge branch 'master' of github.com:nvbn/thefuck into fix-unzip
This commit is contained in:
		| @@ -1,5 +1,13 @@ | ||||
| from pathlib import Path | ||||
| import pytest | ||||
| from mock import Mock | ||||
| from thefuck import conf | ||||
|  | ||||
|  | ||||
| def pytest_addoption(parser): | ||||
|     """Adds `--run-without-docker` argument.""" | ||||
|     group = parser.getgroup("thefuck") | ||||
|     group.addoption('--enable-functional', action="store_true", default=False, | ||||
|                     help="Enable functional tests") | ||||
|  | ||||
|  | ||||
| @pytest.fixture | ||||
| @@ -7,11 +15,29 @@ def no_memoize(monkeypatch): | ||||
|     monkeypatch.setattr('thefuck.utils.memoize.disabled', True) | ||||
|  | ||||
|  | ||||
| @pytest.fixture(autouse=True) | ||||
| def settings(request): | ||||
|     def _reset_settings(): | ||||
|         conf.settings.clear() | ||||
|         conf.settings.update(conf.DEFAULT_SETTINGS) | ||||
|  | ||||
|     request.addfinalizer(_reset_settings) | ||||
|     conf.settings.user_dir = Path('~/.thefuck') | ||||
|     return conf.settings | ||||
|  | ||||
|  | ||||
| @pytest.fixture | ||||
| def settings(): | ||||
|     return Mock(debug=False, no_colors=True) | ||||
| def no_colors(settings): | ||||
|     settings.no_colors = True | ||||
|  | ||||
|  | ||||
| @pytest.fixture(autouse=True) | ||||
| def no_cache(monkeypatch): | ||||
|     monkeypatch.setattr('thefuck.utils.cache.disabled', True) | ||||
|  | ||||
|  | ||||
| @pytest.fixture(autouse=True) | ||||
| def functional(request): | ||||
|     if request.node.get_marker('functional') \ | ||||
|             and not request.config.getoption('enable_functional'): | ||||
|         pytest.skip('functional tests are disabled') | ||||
|   | ||||
| @@ -1,6 +1,3 @@ | ||||
| from pexpect import TIMEOUT | ||||
|  | ||||
|  | ||||
| def _set_confirmation(proc, require): | ||||
|     proc.sendline(u'mkdir -p ~/.thefuck') | ||||
|     proc.sendline( | ||||
| @@ -8,7 +5,7 @@ def _set_confirmation(proc, require): | ||||
|             require)) | ||||
|  | ||||
|  | ||||
| def with_confirmation(proc): | ||||
| def with_confirmation(proc, TIMEOUT): | ||||
|     """Ensures that command can be fixed when confirmation enabled.""" | ||||
|     _set_confirmation(proc, True) | ||||
|  | ||||
| @@ -23,19 +20,19 @@ def with_confirmation(proc): | ||||
|     assert proc.expect([TIMEOUT, u'test']) | ||||
|  | ||||
|  | ||||
| def history_changed(proc, to): | ||||
| def history_changed(proc, TIMEOUT, to): | ||||
|     """Ensures that history changed.""" | ||||
|     proc.send('\033[A') | ||||
|     assert proc.expect([TIMEOUT, to]) | ||||
|  | ||||
|  | ||||
| def history_not_changed(proc): | ||||
| def history_not_changed(proc, TIMEOUT): | ||||
|     """Ensures that history not changed.""" | ||||
|     proc.send('\033[A') | ||||
|     assert proc.expect([TIMEOUT, u'fuck']) | ||||
|  | ||||
|  | ||||
| def select_command_with_arrows(proc): | ||||
| def select_command_with_arrows(proc, TIMEOUT): | ||||
|     """Ensures that command can be selected with arrow keys.""" | ||||
|     _set_confirmation(proc, True) | ||||
|  | ||||
| @@ -50,12 +47,14 @@ def select_command_with_arrows(proc): | ||||
|     assert proc.expect([TIMEOUT, u'git help']) | ||||
|     proc.send('\033[A') | ||||
|     assert proc.expect([TIMEOUT, u'git push']) | ||||
|     proc.send('\033[B') | ||||
|     assert proc.expect([TIMEOUT, u'git help']) | ||||
|     proc.send('\n') | ||||
|  | ||||
|     assert proc.expect([TIMEOUT, u'Not a git repository']) | ||||
|     assert proc.expect([TIMEOUT, u'usage']) | ||||
|  | ||||
|  | ||||
| def refuse_with_confirmation(proc): | ||||
| def refuse_with_confirmation(proc, TIMEOUT): | ||||
|     """Ensures that fix can be refused when confirmation enabled.""" | ||||
|     _set_confirmation(proc, True) | ||||
|  | ||||
| @@ -70,7 +69,7 @@ def refuse_with_confirmation(proc): | ||||
|     assert proc.expect([TIMEOUT, u'Aborted']) | ||||
|  | ||||
|  | ||||
| def without_confirmation(proc): | ||||
| def without_confirmation(proc, TIMEOUT): | ||||
|     """Ensures that command can be fixed when confirmation disabled.""" | ||||
|     _set_confirmation(proc, False) | ||||
|  | ||||
| @@ -79,3 +78,9 @@ def without_confirmation(proc): | ||||
|     proc.sendline(u'fuck') | ||||
|     assert proc.expect([TIMEOUT, u'echo test']) | ||||
|     assert proc.expect([TIMEOUT, u'test']) | ||||
|  | ||||
|  | ||||
| def how_to_configure(proc, TIMEOUT): | ||||
|     proc.sendline(u'unalias fuck') | ||||
|     proc.sendline(u'fuck') | ||||
|     assert proc.expect([TIMEOUT, u"alias isn't configured"]) | ||||
|   | ||||
| @@ -1,53 +1,63 @@ | ||||
| import pytest | ||||
| from tests.functional.plots import with_confirmation, without_confirmation, \ | ||||
|     refuse_with_confirmation, history_changed, history_not_changed, \ | ||||
|     select_command_with_arrows | ||||
| from tests.functional.utils import spawn, functional, images | ||||
|     select_command_with_arrows, how_to_configure | ||||
|  | ||||
| containers = images(('ubuntu-python3-bash', u''' | ||||
| FROM ubuntu:latest | ||||
| RUN apt-get update | ||||
| RUN apt-get install -yy python3 python3-pip python3-dev git | ||||
| RUN pip3 install -U setuptools | ||||
| RUN ln -s /usr/bin/pip3 /usr/bin/pip | ||||
| '''), | ||||
|                     ('ubuntu-python2-bash', u''' | ||||
| FROM ubuntu:latest | ||||
| RUN apt-get update | ||||
| RUN apt-get install -yy python python-pip python-dev git | ||||
| RUN pip2 install -U pip setuptools | ||||
| ''')) | ||||
| containers = ((u'thefuck/ubuntu-python3-bash', | ||||
|                u'''FROM ubuntu:latest | ||||
|                    RUN apt-get update | ||||
|                    RUN apt-get install -yy python3 python3-pip python3-dev git | ||||
|                    RUN pip3 install -U setuptools | ||||
|                    RUN ln -s /usr/bin/pip3 /usr/bin/pip''', | ||||
|                u'bash'), | ||||
|               (u'thefuck/ubuntu-python2-bash', | ||||
|                u'''FROM ubuntu:latest | ||||
|                    RUN apt-get update | ||||
|                    RUN apt-get install -yy python python-pip python-dev git | ||||
|                    RUN pip2 install -U pip setuptools''', | ||||
|                u'bash')) | ||||
|  | ||||
|  | ||||
| @pytest.fixture(params=containers) | ||||
| def proc(request): | ||||
|     tag, dockerfile = request.param | ||||
|     proc = spawn(request, tag, dockerfile, u'bash') | ||||
| def proc(request, spawnu, run_without_docker): | ||||
|     proc = spawnu(*request.param) | ||||
|     if not run_without_docker: | ||||
|         proc.sendline(u"pip install /src") | ||||
|     proc.sendline(u"export PS1='$ '") | ||||
|     proc.sendline(u'eval $(thefuck --alias)') | ||||
|     proc.sendline(u'echo > $HISTFILE') | ||||
|     return proc | ||||
|  | ||||
|  | ||||
| @functional | ||||
| def test_with_confirmation(proc): | ||||
|     with_confirmation(proc) | ||||
|     history_changed(proc, u'echo test') | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.once_without_docker | ||||
| def test_with_confirmation(proc, TIMEOUT): | ||||
|     with_confirmation(proc, TIMEOUT) | ||||
|     history_changed(proc, TIMEOUT, u'echo test') | ||||
|  | ||||
|  | ||||
| @functional | ||||
| def test_select_command_with_arrows(proc): | ||||
|     select_command_with_arrows(proc) | ||||
|     history_changed(proc, u'git push') | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.once_without_docker | ||||
| def test_select_command_with_arrows(proc, TIMEOUT): | ||||
|     select_command_with_arrows(proc, TIMEOUT) | ||||
|     history_changed(proc, TIMEOUT, u'git help') | ||||
|  | ||||
|  | ||||
| @functional | ||||
| def test_refuse_with_confirmation(proc): | ||||
|     refuse_with_confirmation(proc) | ||||
|     history_not_changed(proc) | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.once_without_docker | ||||
| def test_refuse_with_confirmation(proc, TIMEOUT): | ||||
|     refuse_with_confirmation(proc, TIMEOUT) | ||||
|     history_not_changed(proc, TIMEOUT) | ||||
|  | ||||
|  | ||||
| @functional | ||||
| def test_without_confirmation(proc): | ||||
|     without_confirmation(proc) | ||||
|     history_changed(proc, u'echo test') | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.once_without_docker | ||||
| def test_without_confirmation(proc, TIMEOUT): | ||||
|     without_confirmation(proc, TIMEOUT) | ||||
|     history_changed(proc, TIMEOUT, u'echo test') | ||||
|  | ||||
|  | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.once_without_docker | ||||
| def test_how_to_configure_alias(proc, TIMEOUT): | ||||
|     how_to_configure(proc, TIMEOUT) | ||||
|   | ||||
| @@ -1,59 +1,54 @@ | ||||
| import pytest | ||||
| from tests.functional.plots import with_confirmation, without_confirmation, \ | ||||
|     refuse_with_confirmation, select_command_with_arrows | ||||
| from tests.functional.utils import spawn, functional, images, bare | ||||
|  | ||||
| containers = images(('ubuntu-python3-fish', u''' | ||||
| FROM ubuntu:latest | ||||
| RUN apt-get update | ||||
| RUN apt-get install -yy python3 python3-pip python3-dev fish git | ||||
| RUN pip3 install -U setuptools | ||||
| RUN ln -s /usr/bin/pip3 /usr/bin/pip | ||||
| RUN apt-get install -yy fish | ||||
| '''), | ||||
|                     ('ubuntu-python2-fish', u''' | ||||
| FROM ubuntu:latest | ||||
| RUN apt-get update | ||||
| RUN apt-get install -yy python python-pip python-dev git | ||||
| RUN pip2 install -U pip setuptools | ||||
| RUN apt-get install -yy fish | ||||
| ''')) | ||||
| containers = (('thefuck/ubuntu-python3-fish', | ||||
|                u'''FROM ubuntu:latest | ||||
|                    RUN apt-get update | ||||
|                    RUN apt-get install -yy python3 python3-pip python3-dev fish git | ||||
|                    RUN pip3 install -U setuptools | ||||
|                    RUN ln -s /usr/bin/pip3 /usr/bin/pip | ||||
|                    RUN apt-get install -yy fish''', | ||||
|                u'fish'), | ||||
|               ('thefuck/ubuntu-python2-fish', | ||||
|                u'''FROM ubuntu:latest | ||||
|                    RUN apt-get update | ||||
|                    RUN apt-get install -yy python python-pip python-dev git | ||||
|                    RUN pip2 install -U pip setuptools | ||||
|                    RUN apt-get install -yy fish''', | ||||
|                u'fish')) | ||||
|  | ||||
|  | ||||
| @pytest.fixture(params=containers) | ||||
| def proc(request): | ||||
|     tag, dockerfile = request.param | ||||
|     proc = spawn(request, tag, dockerfile, u'fish') | ||||
| def proc(request, spawnu): | ||||
|     proc = spawnu(*request.param) | ||||
|     proc.sendline(u"pip install /src") | ||||
|     proc.sendline(u'thefuck --alias > ~/.config/fish/config.fish') | ||||
|     proc.sendline(u'fish') | ||||
|     return proc | ||||
|  | ||||
|  | ||||
| @functional | ||||
| @pytest.mark.skipif( | ||||
|     bool(bare), reason='https://github.com/travis-ci/apt-source-whitelist/issues/71') | ||||
| def test_with_confirmation(proc): | ||||
|     with_confirmation(proc) | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.skip_without_docker | ||||
| def test_with_confirmation(proc, TIMEOUT): | ||||
|     with_confirmation(proc, TIMEOUT) | ||||
|  | ||||
|  | ||||
| @functional | ||||
| @pytest.mark.skipif( | ||||
|     bool(bare), reason='https://github.com/travis-ci/apt-source-whitelist/issues/71') | ||||
| def test_select_command_with_arrows(proc): | ||||
|     select_command_with_arrows(proc) | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.skip_without_docker | ||||
| def test_select_command_with_arrows(proc, TIMEOUT): | ||||
|     select_command_with_arrows(proc, TIMEOUT) | ||||
|  | ||||
|  | ||||
| @functional | ||||
| @pytest.mark.skipif( | ||||
|     bool(bare), reason='https://github.com/travis-ci/apt-source-whitelist/issues/71') | ||||
| def test_refuse_with_confirmation(proc): | ||||
|     refuse_with_confirmation(proc) | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.skip_without_docker | ||||
| def test_refuse_with_confirmation(proc, TIMEOUT): | ||||
|     refuse_with_confirmation(proc, TIMEOUT) | ||||
|  | ||||
|  | ||||
| @functional | ||||
| @pytest.mark.skipif( | ||||
|     bool(bare), reason='https://github.com/travis-ci/apt-source-whitelist/issues/71') | ||||
| def test_without_confirmation(proc): | ||||
|     without_confirmation(proc) | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.skip_without_docker | ||||
| def test_without_confirmation(proc, TIMEOUT): | ||||
|     without_confirmation(proc, TIMEOUT) | ||||
|  | ||||
| # TODO: ensure that history changes. | ||||
|   | ||||
| @@ -1,25 +1,24 @@ | ||||
| import pytest | ||||
| from pexpect import TIMEOUT | ||||
| from tests.functional.utils import spawn, functional, bare | ||||
| from thefuck.main import _get_current_version | ||||
|  | ||||
| envs = ((u'bash', 'ubuntu-bash', u''' | ||||
| envs = ((u'bash', 'thefuck/ubuntu-bash', u''' | ||||
| FROM ubuntu:latest | ||||
| RUN apt-get update | ||||
| RUN apt-get install -yy bash | ||||
| '''), (u'bash', 'generic-bash', u''' | ||||
| '''), (u'bash', 'thefuck/generic-bash', u''' | ||||
| FROM fedora:latest | ||||
| RUN dnf install -yy python-devel sudo wget gcc | ||||
| ''')) | ||||
|  | ||||
|  | ||||
| @functional | ||||
| @pytest.mark.skipif( | ||||
|     bool(bare), reason="Can't be tested in bare run") | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.skip_without_docker | ||||
| @pytest.mark.parametrize('shell, tag, dockerfile', envs) | ||||
| def test_installation(request, shell, tag, dockerfile): | ||||
|     proc = spawn(request, tag, dockerfile, shell, install=False) | ||||
| def test_installation(spawnu, shell, TIMEOUT, tag, dockerfile): | ||||
|     proc = spawnu(tag, dockerfile, shell) | ||||
|     proc.sendline(u'cat /src/install.sh | sh - && $0') | ||||
|     proc.sendline(u'thefuck --version') | ||||
|     assert proc.expect([TIMEOUT, u'The Fuck'], timeout=600) | ||||
|     assert proc.expect([TIMEOUT, u'thefuck {}'.format(_get_current_version())], | ||||
|                        timeout=600) | ||||
|     proc.sendline(u'fuck') | ||||
|     assert proc.expect([TIMEOUT, u'No fucks given']) | ||||
|   | ||||
| @@ -1,7 +1,5 @@ | ||||
| from pexpect import TIMEOUT | ||||
| import pytest | ||||
| import time | ||||
| from tests.functional.utils import spawn, functional, bare | ||||
|  | ||||
| dockerfile = u''' | ||||
| FROM ubuntu:latest | ||||
| @@ -11,24 +9,17 @@ RUN pip3 install -U setuptools | ||||
| RUN ln -s /usr/bin/pip3 /usr/bin/pip | ||||
| RUN adduser --disabled-password --gecos '' test | ||||
| ENV SEED "{seed}" | ||||
| COPY thefuck /src | ||||
| WORKDIR /src | ||||
| RUN pip install . | ||||
| USER test | ||||
| RUN echo 'eval $(thefuck --alias)' > /home/test/.bashrc | ||||
| RUN echo > /home/test/.bash_history | ||||
| RUN git config --global user.email "you@example.com" | ||||
| RUN git config --global user.name "Your Name" | ||||
| USER root | ||||
| '''.format(seed=time.time()) | ||||
|  | ||||
|  | ||||
| @pytest.fixture | ||||
| def proc(request): | ||||
|     return spawn(request, 'ubuntu-python3-bash-performance', | ||||
|                  dockerfile, u'bash', install=False, copy_src=True) | ||||
|  | ||||
|  | ||||
| def plot(proc): | ||||
| def plot(proc, TIMEOUT): | ||||
|     proc.sendline(u'cd /home/test/') | ||||
|     proc.sendline(u'fuck') | ||||
|     assert proc.expect([TIMEOUT, u'No fucks given']) | ||||
| @@ -48,9 +39,12 @@ def plot(proc): | ||||
|     assert proc.expect([TIMEOUT, u'test']) | ||||
|  | ||||
|  | ||||
| @functional | ||||
| @pytest.mark.skipif( | ||||
|     bool(bare), reason='Would lie on a bare run') | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.skip_without_docker | ||||
| @pytest.mark.benchmark(min_rounds=10) | ||||
| def test_performance(proc, benchmark): | ||||
|     assert benchmark(plot, proc) is None | ||||
| def test_performance(spawnu, TIMEOUT, benchmark): | ||||
|     proc = spawnu(u'thefuck/ubuntu-python3-bash-performance', | ||||
|                   dockerfile, u'bash') | ||||
|     proc.sendline(u'pip install /src') | ||||
|     proc.sendline(u'su test') | ||||
|     assert benchmark(plot, proc, TIMEOUT) is None | ||||
|   | ||||
| @@ -1,51 +1,55 @@ | ||||
| import pytest | ||||
| from tests.functional.utils import spawn, functional, images | ||||
| from tests.functional.plots import with_confirmation, without_confirmation, \ | ||||
|     refuse_with_confirmation, select_command_with_arrows | ||||
|  | ||||
| containers = images(('ubuntu-python3-tcsh', u''' | ||||
| FROM ubuntu:latest | ||||
| RUN apt-get update | ||||
| RUN apt-get install -yy python3 python3-pip python3-dev git | ||||
| RUN pip3 install -U setuptools | ||||
| RUN ln -s /usr/bin/pip3 /usr/bin/pip | ||||
| RUN apt-get install -yy tcsh | ||||
| '''), | ||||
|                     ('ubuntu-python2-tcsh', u''' | ||||
| FROM ubuntu:latest | ||||
| RUN apt-get update | ||||
| RUN apt-get install -yy python python-pip python-dev git | ||||
| RUN pip2 install -U pip setuptools | ||||
| RUN apt-get install -yy tcsh | ||||
| ''')) | ||||
| containers = (('thefuck/ubuntu-python3-tcsh', | ||||
|                u'''FROM ubuntu:latest | ||||
|                    RUN apt-get update | ||||
|                    RUN apt-get install -yy python3 python3-pip python3-dev git | ||||
|                    RUN pip3 install -U setuptools | ||||
|                    RUN ln -s /usr/bin/pip3 /usr/bin/pip | ||||
|                    RUN apt-get install -yy tcsh''', | ||||
|                u'tcsh'), | ||||
|               ('thefuck/ubuntu-python2-tcsh', | ||||
|                u'''FROM ubuntu:latest | ||||
|                    RUN apt-get update | ||||
|                    RUN apt-get install -yy python python-pip python-dev git | ||||
|                    RUN pip2 install -U pip setuptools | ||||
|                    RUN apt-get install -yy tcsh''', | ||||
|                u'tcsh')) | ||||
|  | ||||
|  | ||||
| @pytest.fixture(params=containers) | ||||
| def proc(request): | ||||
|     tag, dockerfile = request.param | ||||
|     proc = spawn(request, tag, dockerfile, u'tcsh') | ||||
| def proc(request, spawnu, run_without_docker): | ||||
|     proc = spawnu(*request.param) | ||||
|     if not run_without_docker: | ||||
|         proc.sendline(u'pip install /src') | ||||
|     proc.sendline(u'tcsh') | ||||
|     proc.sendline(u'eval `thefuck --alias`') | ||||
|     return proc | ||||
|  | ||||
|  | ||||
| @functional | ||||
| def test_with_confirmation(proc): | ||||
|     with_confirmation(proc) | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.once_without_docker | ||||
| def test_with_confirmation(proc, TIMEOUT): | ||||
|     with_confirmation(proc, TIMEOUT) | ||||
|  | ||||
|  | ||||
| @functional | ||||
| def test_select_command_with_arrows(proc): | ||||
|     select_command_with_arrows(proc) | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.once_without_docker | ||||
| def test_select_command_with_arrows(proc, TIMEOUT): | ||||
|     select_command_with_arrows(proc, TIMEOUT) | ||||
|  | ||||
|  | ||||
| @functional | ||||
| def test_refuse_with_confirmation(proc): | ||||
|     refuse_with_confirmation(proc) | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.once_without_docker | ||||
| def test_refuse_with_confirmation(proc, TIMEOUT): | ||||
|     refuse_with_confirmation(proc, TIMEOUT) | ||||
|  | ||||
|  | ||||
| @functional | ||||
| def test_without_confirmation(proc): | ||||
|     without_confirmation(proc) | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.once_without_docker | ||||
| def test_without_confirmation(proc, TIMEOUT): | ||||
|     without_confirmation(proc, TIMEOUT) | ||||
|  | ||||
| # TODO: ensure that history changes. | ||||
|   | ||||
| @@ -1,29 +1,30 @@ | ||||
| import pytest | ||||
| from tests.functional.utils import spawn, functional, images | ||||
| from tests.functional.plots import with_confirmation, without_confirmation, \ | ||||
|     refuse_with_confirmation, history_changed, history_not_changed, select_command_with_arrows | ||||
|     refuse_with_confirmation, history_changed, history_not_changed, \ | ||||
|     select_command_with_arrows, how_to_configure | ||||
|  | ||||
| containers = images(('ubuntu-python3-zsh', u''' | ||||
| FROM ubuntu:latest | ||||
| RUN apt-get update | ||||
| RUN apt-get install -yy python3 python3-pip python3-dev git | ||||
| RUN pip3 install -U setuptools | ||||
| RUN ln -s /usr/bin/pip3 /usr/bin/pip | ||||
| RUN apt-get install -yy zsh | ||||
| '''), | ||||
|                     ('ubuntu-python2-zsh', u''' | ||||
| FROM ubuntu:latest | ||||
| RUN apt-get update | ||||
| RUN apt-get install -yy python python-pip python-dev git | ||||
| RUN pip2 install -U pip setuptools | ||||
| RUN apt-get install -yy zsh | ||||
| ''')) | ||||
| containers = (('thefuck/ubuntu-python3-zsh', | ||||
|                u'''FROM ubuntu:latest | ||||
|                    RUN apt-get update | ||||
|                    RUN apt-get install -yy python3 python3-pip python3-dev git | ||||
|                    RUN pip3 install -U setuptools | ||||
|                    RUN ln -s /usr/bin/pip3 /usr/bin/pip | ||||
|                    RUN apt-get install -yy zsh''', | ||||
|                u'zsh'), | ||||
|               ('thefuck/ubuntu-python2-zsh', | ||||
|                u'''FROM ubuntu:latest | ||||
|                    RUN apt-get update | ||||
|                    RUN apt-get install -yy python python-pip python-dev git | ||||
|                    RUN pip2 install -U pip setuptools | ||||
|                    RUN apt-get install -yy zsh''', | ||||
|                u'zsh')) | ||||
|  | ||||
|  | ||||
| @pytest.fixture(params=containers) | ||||
| def proc(request): | ||||
|     tag, dockerfile = request.param | ||||
|     proc = spawn(request, tag, dockerfile, u'zsh') | ||||
| def proc(request, spawnu, run_without_docker): | ||||
|     proc = spawnu(*request.param) | ||||
|     if not run_without_docker: | ||||
|         proc.sendline(u'pip install /src') | ||||
|     proc.sendline(u'eval $(thefuck --alias)') | ||||
|     proc.sendline(u'export HISTFILE=~/.zsh_history') | ||||
|     proc.sendline(u'echo > $HISTFILE') | ||||
| @@ -33,25 +34,35 @@ def proc(request): | ||||
|     return proc | ||||
|  | ||||
|  | ||||
| @functional | ||||
| def test_with_confirmation(proc): | ||||
|     with_confirmation(proc) | ||||
|     history_changed(proc, u'echo test') | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.once_without_docker | ||||
| def test_with_confirmation(proc, TIMEOUT): | ||||
|     with_confirmation(proc, TIMEOUT) | ||||
|     history_changed(proc, TIMEOUT, u'echo test') | ||||
|  | ||||
|  | ||||
| @functional | ||||
| def test_select_command_with_arrows(proc): | ||||
|     select_command_with_arrows(proc) | ||||
|     history_changed(proc, u'git push') | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.once_without_docker | ||||
| def test_select_command_with_arrows(proc, TIMEOUT): | ||||
|     select_command_with_arrows(proc, TIMEOUT) | ||||
|     history_changed(proc, TIMEOUT, u'git help') | ||||
|  | ||||
|  | ||||
| @functional | ||||
| def test_refuse_with_confirmation(proc): | ||||
|     refuse_with_confirmation(proc) | ||||
|     history_not_changed(proc) | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.once_without_docker | ||||
| def test_refuse_with_confirmation(proc, TIMEOUT): | ||||
|     refuse_with_confirmation(proc, TIMEOUT) | ||||
|     history_not_changed(proc, TIMEOUT) | ||||
|  | ||||
|  | ||||
| @functional | ||||
| def test_without_confirmation(proc): | ||||
|     without_confirmation(proc) | ||||
|     history_changed(proc, u'echo test') | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.once_without_docker | ||||
| def test_without_confirmation(proc, TIMEOUT): | ||||
|     without_confirmation(proc, TIMEOUT) | ||||
|     history_changed(proc, TIMEOUT, u'echo test') | ||||
|  | ||||
|  | ||||
| @pytest.mark.functional | ||||
| @pytest.mark.once_without_docker | ||||
| def test_how_to_configure_alias(proc, TIMEOUT): | ||||
|     how_to_configure(proc, TIMEOUT) | ||||
|   | ||||
| @@ -1,65 +0,0 @@ | ||||
| import pytest | ||||
| import os | ||||
| import subprocess | ||||
| import shutil | ||||
| from tempfile import mkdtemp | ||||
| from pathlib import Path | ||||
| import sys | ||||
| import pexpect | ||||
| from tests.utils import root | ||||
|  | ||||
|  | ||||
| bare = os.environ.get('BARE') | ||||
| enabled = os.environ.get('FUNCTIONAL') | ||||
|  | ||||
|  | ||||
| def build_container(tag, dockerfile, copy_src=False): | ||||
|     tmpdir = mkdtemp() | ||||
|     try: | ||||
|         if copy_src: | ||||
|             subprocess.call(['cp', '-a', str(root), tmpdir]) | ||||
|         dockerfile_path = Path(tmpdir).joinpath('Dockerfile') | ||||
|         with dockerfile_path.open('w') as file: | ||||
|             file.write(dockerfile) | ||||
|         if subprocess.call(['docker', 'build', '--tag={}'.format(tag), tmpdir]) != 0: | ||||
|             raise Exception("Can't build a container") | ||||
|     finally: | ||||
|         shutil.rmtree(tmpdir) | ||||
|  | ||||
|  | ||||
| def spawn(request, tag, dockerfile, cmd, install=True, copy_src=False): | ||||
|     if bare: | ||||
|         proc = pexpect.spawnu(cmd) | ||||
|     else: | ||||
|         tag = 'thefuck/{}'.format(tag) | ||||
|         build_container(tag, dockerfile, copy_src) | ||||
|         proc = pexpect.spawnu('docker run --rm=true --volume {}:/src --tty=true ' | ||||
|                               '--interactive=true {} {}'.format(root, tag, cmd)) | ||||
|         if install: | ||||
|             proc.sendline('pip install /src') | ||||
|  | ||||
|     proc.sendline('cd /') | ||||
|  | ||||
|     proc.logfile = sys.stdout | ||||
|  | ||||
|     def _finalizer(): | ||||
|         proc.terminate() | ||||
|         if not bare: | ||||
|             container_id = subprocess.check_output(['docker', 'ps']) \ | ||||
|                                      .decode('utf-8').split('\n')[-2].split()[0] | ||||
|             subprocess.check_call(['docker', 'kill', container_id]) | ||||
|  | ||||
|     request.addfinalizer(_finalizer) | ||||
|     return proc | ||||
|  | ||||
|  | ||||
| def images(*items): | ||||
|     if bare: | ||||
|         return [items[0]] | ||||
|     else: | ||||
|         return items | ||||
|  | ||||
|  | ||||
| functional = pytest.mark.skipif( | ||||
|     not enabled, | ||||
|     reason='Functional tests are disabled by default.') | ||||
| @@ -11,7 +11,7 @@ from tests.utils import Command | ||||
| @pytest.mark.parametrize('command', [ | ||||
|     Command(script='vim', stderr='vim: command not found')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, return_value', [ | ||||
| @@ -24,7 +24,7 @@ def test_match(command): | ||||
| def test_match_mocked(cmdnf_mock, command, return_value): | ||||
|     get_packages = Mock(return_value=return_value) | ||||
|     cmdnf_mock.CommandNotFound.return_value = Mock(getPackages=get_packages) | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|     assert cmdnf_mock.CommandNotFound.called | ||||
|     assert get_packages.called | ||||
|  | ||||
| @@ -32,7 +32,7 @@ def test_match_mocked(cmdnf_mock, command, return_value): | ||||
| @pytest.mark.parametrize('command', [ | ||||
|     Command(script='vim', stderr=''), Command()]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| # python-commandnotfound is available in ubuntu 14.04+ | ||||
| @@ -44,7 +44,7 @@ def test_not_match(command): | ||||
|     (Command('sudo vim'), 'sudo apt-get install vim && sudo vim'), | ||||
|     (Command('sudo convert'), 'sudo apt-get install imagemagick && sudo convert')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command, return_value', [ | ||||
| @@ -63,4 +63,4 @@ def test_get_new_command(command, new_command): | ||||
| def test_get_new_command_mocked(cmdnf_mock, command, new_command, return_value): | ||||
|     get_packages = Mock(return_value=return_value) | ||||
|     cmdnf_mock.CommandNotFound.return_value = Mock(getPackages=get_packages) | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -4,7 +4,7 @@ from tests.utils import Command | ||||
|  | ||||
|  | ||||
| def test_match(): | ||||
|     assert match(Command('apt-get search foo'), None) | ||||
|     assert match(Command('apt-get search foo')) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -18,8 +18,8 @@ def test_match(): | ||||
|     Command('apt-get update') | ||||
| ]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     assert get_new_command(Command('apt-get search foo'), None) == 'apt-cache search foo' | ||||
|     assert get_new_command(Command('apt-get search foo')) == 'apt-cache search foo' | ||||
|   | ||||
| @@ -28,9 +28,9 @@ def _is_not_okay_to_test(): | ||||
| def test_match(brew_no_available_formula, brew_already_installed, | ||||
|                brew_install_no_argument): | ||||
|     assert match(Command('brew install elsticsearch', | ||||
|                          stderr=brew_no_available_formula), None) | ||||
|                          stderr=brew_no_available_formula)) | ||||
|     assert not match(Command('brew install git', | ||||
|                              stderr=brew_already_installed), None) | ||||
|                              stderr=brew_already_installed)) | ||||
|     assert not match(Command('brew install', stderr=brew_install_no_argument), | ||||
|                      None) | ||||
|  | ||||
| @@ -39,7 +39,7 @@ def test_match(brew_no_available_formula, brew_already_installed, | ||||
|                     reason='No need to run if there\'s no formula') | ||||
| def test_get_new_command(brew_no_available_formula): | ||||
|     assert get_new_command(Command('brew install elsticsearch', | ||||
|                                    stderr=brew_no_available_formula), None)\ | ||||
|                                    stderr=brew_no_available_formula))\ | ||||
|         == 'brew install elasticsearch' | ||||
|  | ||||
|     assert get_new_command(Command('brew install aa', | ||||
|   | ||||
| @@ -15,15 +15,15 @@ def brew_unknown_cmd2(): | ||||
|  | ||||
|  | ||||
| def test_match(brew_unknown_cmd): | ||||
|     assert match(Command('brew inst', stderr=brew_unknown_cmd), None) | ||||
|     assert match(Command('brew inst', stderr=brew_unknown_cmd)) | ||||
|     for command in _brew_commands(): | ||||
|         assert not match(Command('brew ' + command), None) | ||||
|         assert not match(Command('brew ' + command)) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(brew_unknown_cmd, brew_unknown_cmd2): | ||||
|     assert get_new_command(Command('brew inst', stderr=brew_unknown_cmd), | ||||
|                            None) == ['brew list', 'brew install', 'brew uninstall'] | ||||
|     assert get_new_command(Command('brew inst', stderr=brew_unknown_cmd)) \ | ||||
|            == ['brew list', 'brew install', 'brew uninstall'] | ||||
|  | ||||
|     cmds = get_new_command(Command('brew instaa', stderr=brew_unknown_cmd2), None) | ||||
|     cmds = get_new_command(Command('brew instaa', stderr=brew_unknown_cmd2)) | ||||
|     assert 'brew install' in cmds | ||||
|     assert 'brew uninstall' in cmds | ||||
|   | ||||
| @@ -6,10 +6,10 @@ from tests.utils import Command | ||||
| @pytest.mark.parametrize('command', [ | ||||
|     Command(script='brew upgrade')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
|     (Command('brew upgrade'), 'brew upgrade --all')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -12,10 +12,10 @@ no_such_subcommand = """No such subcommand | ||||
| @pytest.mark.parametrize('command', [ | ||||
|     Command(script='cargo buid', stderr=no_such_subcommand)]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
|     (Command('cargo buid', stderr=no_such_subcommand), 'cargo build')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -9,17 +9,17 @@ from tests.utils import Command | ||||
|             stderr='cd: foo: No such file or directory'), | ||||
|     Command(script='cd foo/bar/baz', stderr='cd: can\'t cd to foo/bar/baz')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
|     Command(script='cd foo', stderr=''), Command()]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
|     (Command('cd foo'), 'mkdir -p foo && cd foo'), | ||||
|     (Command('cd foo/bar/baz'), 'mkdir -p foo/bar/baz && cd foo/bar/baz')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -3,10 +3,10 @@ from tests.utils import Command | ||||
|  | ||||
|  | ||||
| def test_match(): | ||||
|     assert match(Command('cd..', stderr='cd..: command not found'), None) | ||||
|     assert not match(Command(), None) | ||||
|     assert match(Command('cd..', stderr='cd..: command not found')) | ||||
|     assert not match(Command()) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     assert get_new_command( | ||||
|         Command('cd..'), None) == 'cd ..' | ||||
|         Command('cd..')) == 'cd ..' | ||||
|   | ||||
| @@ -41,17 +41,16 @@ def composer_not_command_one_of_this(): | ||||
|  | ||||
| def test_match(composer_not_command, composer_not_command_one_of_this): | ||||
|     assert match(Command('composer udpate', | ||||
|                          stderr=composer_not_command), None) | ||||
|                          stderr=composer_not_command)) | ||||
|     assert match(Command('composer pdate', | ||||
|                          stderr=composer_not_command_one_of_this), None) | ||||
|     assert not match(Command('ls update', stderr=composer_not_command), | ||||
|                      None) | ||||
|                          stderr=composer_not_command_one_of_this)) | ||||
|     assert not match(Command('ls update', stderr=composer_not_command)) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(composer_not_command, composer_not_command_one_of_this): | ||||
|     assert get_new_command(Command('composer udpate', | ||||
|                                    stderr=composer_not_command), None) \ | ||||
|                                    stderr=composer_not_command)) \ | ||||
|            == 'composer update' | ||||
|     assert get_new_command( | ||||
|         Command('composer pdate', stderr=composer_not_command_one_of_this), | ||||
|         None) == 'composer selfupdate' | ||||
|         Command('composer pdate', stderr=composer_not_command_one_of_this)) \ | ||||
|            == 'composer selfupdate' | ||||
|   | ||||
| @@ -7,7 +7,7 @@ from tests.utils import Command | ||||
|     ('cp dir', 'cp: dor: is a directory'), | ||||
|     ('cp dir', "cp: omitting directory 'dir'")]) | ||||
| def test_match(script, stderr): | ||||
|     assert match(Command(script, stderr=stderr), None) | ||||
|     assert match(Command(script, stderr=stderr)) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('script, stderr', [ | ||||
| @@ -15,8 +15,8 @@ def test_match(script, stderr): | ||||
|     ('some dir', "cp: omitting directory 'dir'"), | ||||
|     ('cp dir', '')]) | ||||
| def test_not_match(script, stderr): | ||||
|     assert not match(Command(script, stderr=stderr), None) | ||||
|     assert not match(Command(script, stderr=stderr)) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     assert get_new_command(Command(script='cp dir'), None) == 'cp -a dir' | ||||
|     assert get_new_command(Command(script='cp dir')) == 'cp -a dir' | ||||
|   | ||||
| @@ -47,14 +47,14 @@ parametrize_script = pytest.mark.parametrize('script, fixed', [ | ||||
| @parametrize_script | ||||
| def test_match(tar_error, filename, script, fixed): | ||||
|     tar_error(filename) | ||||
|     assert match(Command(script=script.format(filename)), None) | ||||
|     assert match(Command(script=script.format(filename))) | ||||
|  | ||||
|  | ||||
| @parametrize_filename | ||||
| @parametrize_script | ||||
| def test_side_effect(tar_error, filename, script, fixed): | ||||
|     tar_error(filename) | ||||
|     side_effect(Command(script=script.format(filename)), None, None) | ||||
|     side_effect(Command(script=script.format(filename)), None) | ||||
|     assert set(os.listdir('.')) == {filename, 'd'} | ||||
|  | ||||
|  | ||||
| @@ -62,4 +62,4 @@ def test_side_effect(tar_error, filename, script, fixed): | ||||
| @parametrize_script | ||||
| def test_get_new_command(tar_error, filename, script, fixed): | ||||
|     tar_error(filename) | ||||
|     assert get_new_command(Command(script=script.format(filename)), None) == fixed.format(filename) | ||||
|     assert get_new_command(Command(script=script.format(filename))) == fixed.format(filename) | ||||
|   | ||||
| @@ -30,14 +30,14 @@ def zip_error(tmpdir): | ||||
|     'unzip foo', | ||||
|     'unzip foo.zip']) | ||||
| def test_match(zip_error, script): | ||||
|     assert match(Command(script=script), None) | ||||
|     assert match(Command(script=script)) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('script', [ | ||||
|     'unzip foo', | ||||
|     'unzip foo.zip']) | ||||
| def test_side_effect(zip_error, script): | ||||
|     side_effect(Command(script=script), None, None) | ||||
|     side_effect(Command(script=script), None) | ||||
|     assert set(os.listdir('.')) == {'foo.zip', 'd'} | ||||
|  | ||||
|  | ||||
| @@ -45,4 +45,4 @@ def test_side_effect(zip_error, script): | ||||
|     ('unzip foo', 'unzip foo -d foo'), | ||||
|     ('unzip foo.zip', 'unzip foo.zip -d foo')]) | ||||
| def test_get_new_command(zip_error, script, fixed): | ||||
|     assert get_new_command(Command(script=script), None) == fixed | ||||
|     assert get_new_command(Command(script=script)) == fixed | ||||
|   | ||||
| @@ -41,13 +41,13 @@ south.exceptions.GhostMigrations: | ||||
|  | ||||
|  | ||||
| def test_match(stderr): | ||||
|     assert match(Command('./manage.py migrate', stderr=stderr), None) | ||||
|     assert match(Command('python manage.py migrate', stderr=stderr), None) | ||||
|     assert not match(Command('./manage.py migrate'), None) | ||||
|     assert not match(Command('app migrate', stderr=stderr), None) | ||||
|     assert not match(Command('./manage.py test', stderr=stderr), None) | ||||
|     assert match(Command('./manage.py migrate', stderr=stderr)) | ||||
|     assert match(Command('python manage.py migrate', stderr=stderr)) | ||||
|     assert not match(Command('./manage.py migrate')) | ||||
|     assert not match(Command('app migrate', stderr=stderr)) | ||||
|     assert not match(Command('./manage.py test', stderr=stderr)) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     assert get_new_command(Command('./manage.py migrate auth'), None)\ | ||||
|     assert get_new_command(Command('./manage.py migrate auth'))\ | ||||
|         == './manage.py migrate auth --delete-ghost-migrations' | ||||
|   | ||||
| @@ -31,13 +31,13 @@ The following options are available: | ||||
|  | ||||
|  | ||||
| def test_match(stderr): | ||||
|     assert match(Command('./manage.py migrate', stderr=stderr), None) | ||||
|     assert match(Command('python manage.py migrate', stderr=stderr), None) | ||||
|     assert not match(Command('./manage.py migrate'), None) | ||||
|     assert not match(Command('app migrate', stderr=stderr), None) | ||||
|     assert not match(Command('./manage.py test', stderr=stderr), None) | ||||
|     assert match(Command('./manage.py migrate', stderr=stderr)) | ||||
|     assert match(Command('python manage.py migrate', stderr=stderr)) | ||||
|     assert not match(Command('./manage.py migrate')) | ||||
|     assert not match(Command('app migrate', stderr=stderr)) | ||||
|     assert not match(Command('./manage.py test', stderr=stderr)) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     assert get_new_command(Command('./manage.py migrate auth'), None) \ | ||||
|     assert get_new_command(Command('./manage.py migrate auth')) \ | ||||
|            == './manage.py migrate auth --merge' | ||||
|   | ||||
| @@ -110,14 +110,14 @@ def stderr(cmd): | ||||
|  | ||||
|  | ||||
| def test_match(): | ||||
|     assert match(Command('docker pes', stderr=stderr('pes')), None) | ||||
|     assert match(Command('docker pes', stderr=stderr('pes'))) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('script, stderr', [ | ||||
|     ('docker ps', ''), | ||||
|     ('cat pes', stderr('pes'))]) | ||||
| def test_not_match(script, stderr): | ||||
|     assert not match(Command(script, stderr=stderr), None) | ||||
|     assert not match(Command(script, stderr=stderr)) | ||||
|  | ||||
|  | ||||
| @pytest.mark.usefixtures('docker_help') | ||||
| @@ -126,4 +126,4 @@ def test_not_match(script, stderr): | ||||
|     ('tags', ['tag', 'stats', 'images'])]) | ||||
| def test_get_new_command(wrong, fixed): | ||||
|     command = Command('docker {}'.format(wrong), stderr=stderr(wrong)) | ||||
|     assert get_new_command(command, None) == ['docker {}'.format(x) for x in fixed] | ||||
|     assert get_new_command(command) == ['docker {}'.format(x) for x in fixed] | ||||
|   | ||||
| @@ -7,11 +7,11 @@ from tests.utils import Command | ||||
|     Command(script='cd cd foo'), | ||||
|     Command(script='git git push origin/master')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
|     (Command('cd cd foo'), 'cd foo'), | ||||
|     (Command('git git push origin/master'), 'git push origin/master')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -11,12 +11,12 @@ def test_match(): | ||||
|  | ||||
|     """ | ||||
|     assert match(Command(u'ps -ef | grep foo', | ||||
|                          stderr=u'-bash:  grep: command not found'), None) | ||||
|     assert not match(Command('ps -ef | grep foo'), None) | ||||
|     assert not match(Command(), None) | ||||
|                          stderr=u'-bash:  grep: command not found')) | ||||
|     assert not match(Command('ps -ef | grep foo')) | ||||
|     assert not match(Command()) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     """ Replace the Alt+Space character by a simple space """ | ||||
|     assert get_new_command(Command(u'ps -ef | grep foo'), None)\ | ||||
|     assert get_new_command(Command(u'ps -ef | grep foo'))\ | ||||
|            == 'ps -ef | grep foo' | ||||
|   | ||||
| @@ -184,7 +184,7 @@ E       NameError: name 'mocker' is not defined | ||||
| def test_match(mocker, monkeypatch, test): | ||||
|     mocker.patch('os.path.isfile', return_value=True) | ||||
|     monkeypatch.setenv('EDITOR', 'dummy_editor') | ||||
|     assert match(Command(stdout=test[4], stderr=test[5]), None) | ||||
|     assert match(Command(stdout=test[4], stderr=test[5])) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('test', tests) | ||||
| @@ -194,7 +194,7 @@ def test_no_editor(mocker, monkeypatch, test): | ||||
|     if 'EDITOR' in os.environ: | ||||
|         monkeypatch.delenv('EDITOR') | ||||
|  | ||||
|     assert not match(Command(stdout=test[4], stderr=test[5]), None) | ||||
|     assert not match(Command(stdout=test[4], stderr=test[5])) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('test', tests) | ||||
| @@ -203,7 +203,7 @@ def test_not_file(mocker, monkeypatch, test): | ||||
|     mocker.patch('os.path.isfile', return_value=False) | ||||
|     monkeypatch.setenv('EDITOR', 'dummy_editor') | ||||
|  | ||||
|     assert not match(Command(stdout=test[4], stderr=test[5]), None) | ||||
|     assert not match(Command(stdout=test[4], stderr=test[5])) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('test', tests) | ||||
| @@ -219,16 +219,16 @@ def test_get_new_command(mocker, monkeypatch, test): | ||||
|  | ||||
| @pytest.mark.parametrize('test', tests) | ||||
| @pytest.mark.usefixtures('no_memoize') | ||||
| def test_get_new_command_with_settings(mocker, monkeypatch, test): | ||||
| def test_get_new_command_with_settings(mocker, monkeypatch, test, settings): | ||||
|     mocker.patch('os.path.isfile', return_value=True) | ||||
|     monkeypatch.setenv('EDITOR', 'dummy_editor') | ||||
|  | ||||
|     cmd = Command(script=test[0], stdout=test[4], stderr=test[5]) | ||||
|     settings = Settings({'fixcolcmd': '{editor} {file} +{line}:{col}'}) | ||||
|     settings.fixcolcmd = '{editor} {file} +{line}:{col}' | ||||
|  | ||||
|     if test[3]: | ||||
|         assert (get_new_command(cmd, settings) == | ||||
|         assert (get_new_command(cmd) == | ||||
|             'dummy_editor {} +{}:{} && {}'.format(test[1], test[2], test[3], test[0])) | ||||
|     else: | ||||
|         assert (get_new_command(cmd, settings) == | ||||
|         assert (get_new_command(cmd) == | ||||
|             'dummy_editor {} +{} && {}'.format(test[1], test[2], test[0])) | ||||
|   | ||||
| @@ -18,7 +18,7 @@ def did_not_match(target, did_you_forget=True): | ||||
|     Command(script='git commit unknown', | ||||
|             stderr=did_not_match('unknown'))])  # Older versions of Git | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -27,7 +27,7 @@ def test_match(command): | ||||
|     Command(script='git commit unknown',  # Newer versions of Git | ||||
|             stderr=did_not_match('unknown', False))]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
| @@ -36,4 +36,4 @@ def test_not_match(command): | ||||
|     (Command('git commit unknown', stderr=did_not_match('unknown')),  # Old Git | ||||
|      'git add -- unknown && git commit unknown')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -12,11 +12,11 @@ If you are sure you want to delete it, run 'git branch -D branch'. | ||||
|  | ||||
|  | ||||
| def test_match(stderr): | ||||
|     assert match(Command('git branch -d branch', stderr=stderr), None) | ||||
|     assert not match(Command('git branch -d branch'), None) | ||||
|     assert not match(Command('ls', stderr=stderr), None) | ||||
|     assert match(Command('git branch -d branch', stderr=stderr)) | ||||
|     assert not match(Command('git branch -d branch')) | ||||
|     assert not match(Command('ls', stderr=stderr)) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(stderr): | ||||
|     assert get_new_command(Command('git branch -d branch', stderr=stderr), None)\ | ||||
|     assert get_new_command(Command('git branch -d branch', stderr=stderr))\ | ||||
|         == "git branch -D branch" | ||||
|   | ||||
| @@ -4,16 +4,16 @@ from tests.utils import Command | ||||
|  | ||||
|  | ||||
| def test_match(): | ||||
|     assert match(Command('git branch list'), None) | ||||
|     assert match(Command('git branch list')) | ||||
|  | ||||
|  | ||||
| def test_not_match(): | ||||
|     assert not match(Command(), None) | ||||
|     assert not match(Command('git commit'), None) | ||||
|     assert not match(Command('git branch'), None) | ||||
|     assert not match(Command('git stash list'), None) | ||||
|     assert not match(Command()) | ||||
|     assert not match(Command('git commit')) | ||||
|     assert not match(Command('git branch')) | ||||
|     assert not match(Command('git stash list')) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     assert (get_new_command(Command('git branch list'), None) == | ||||
|     assert (get_new_command(Command('git branch list')) == | ||||
|             shells.and_('git branch --delete list', 'git branch')) | ||||
|   | ||||
| @@ -21,7 +21,7 @@ def get_branches(mocker): | ||||
|     Command(script='git checkout unknown', stderr=did_not_match('unknown')), | ||||
|     Command(script='git commit unknown', stderr=did_not_match('unknown'))]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -30,7 +30,7 @@ def test_match(command): | ||||
|     Command(script='git checkout known', stderr=('')), | ||||
|     Command(script='git commit known', stderr=(''))]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('branches, command, new_command', [ | ||||
| @@ -50,4 +50,4 @@ def test_not_match(command): | ||||
|      'git commit test-random-branch-123')]) | ||||
| def test_get_new_command(branches, command, new_command, get_branches): | ||||
|     get_branches.return_value = branches | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -7,7 +7,7 @@ from tests.utils import Command | ||||
|     Command(script='git diff foo'), | ||||
|     Command(script='git diff')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -16,11 +16,11 @@ def test_match(command): | ||||
|     Command(script='git branch'), | ||||
|     Command(script='git log')]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
|     (Command('git diff'), 'git diff --staged'), | ||||
|     (Command('git diff foo'), 'git diff --staged foo')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -20,7 +20,7 @@ usage: git stash list [<options>] | ||||
|     'git stash Some message', | ||||
|     'git stash saev Some message']) | ||||
| def test_match(wrong): | ||||
|     assert match(Command(wrong, stderr=git_stash_err), None) | ||||
|     assert match(Command(wrong, stderr=git_stash_err)) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('wrong,fixed', [ | ||||
| @@ -28,4 +28,4 @@ def test_match(wrong): | ||||
|     ('git stash Some message', 'git stash save Some message'), | ||||
|     ('git stash saev Some message', 'git stash save Some message')]) | ||||
| def test_get_new_command(wrong, fixed): | ||||
|     assert get_new_command(Command(wrong, stderr=git_stash_err), None) == fixed | ||||
|     assert get_new_command(Command(wrong, stderr=git_stash_err)) == fixed | ||||
|   | ||||
| @@ -41,17 +41,17 @@ def git_command(): | ||||
|  | ||||
|  | ||||
| def test_match(git_not_command, git_command, git_not_command_one_of_this): | ||||
|     assert match(Command('git brnch', stderr=git_not_command), None) | ||||
|     assert match(Command('git st', stderr=git_not_command_one_of_this), None) | ||||
|     assert not match(Command('ls brnch', stderr=git_not_command), None) | ||||
|     assert not match(Command('git branch', stderr=git_command), None) | ||||
|     assert match(Command('git brnch', stderr=git_not_command)) | ||||
|     assert match(Command('git st', stderr=git_not_command_one_of_this)) | ||||
|     assert not match(Command('ls brnch', stderr=git_not_command)) | ||||
|     assert not match(Command('git branch', stderr=git_command)) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(git_not_command, git_not_command_one_of_this, | ||||
|                          git_not_command_closest): | ||||
|     assert get_new_command(Command('git brnch', stderr=git_not_command), None) \ | ||||
|     assert get_new_command(Command('git brnch', stderr=git_not_command)) \ | ||||
|            == ['git branch'] | ||||
|     assert get_new_command(Command('git st', stderr=git_not_command_one_of_this), | ||||
|                            None) == ['git stats', 'git stash', 'git stage'] | ||||
|     assert get_new_command(Command('git tags', stderr=git_not_command_closest), | ||||
|                            None) == ['git tag', 'git stage'] | ||||
|     assert get_new_command(Command('git st', stderr=git_not_command_one_of_this)) \ | ||||
|            == ['git stats', 'git stash', 'git stage'] | ||||
|     assert get_new_command(Command('git tags', stderr=git_not_command_closest)) \ | ||||
|            == ['git tag', 'git stage'] | ||||
|   | ||||
| @@ -19,11 +19,11 @@ If you wish to set tracking information for this branch you can do so with: | ||||
|  | ||||
|  | ||||
| def test_match(stderr): | ||||
|     assert match(Command('git pull', stderr=stderr), None) | ||||
|     assert not match(Command('git pull'), None) | ||||
|     assert not match(Command('ls', stderr=stderr), None) | ||||
|     assert match(Command('git pull', stderr=stderr)) | ||||
|     assert not match(Command('git pull')) | ||||
|     assert not match(Command('ls', stderr=stderr)) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(stderr): | ||||
|     assert get_new_command(Command('git pull', stderr=stderr), None) \ | ||||
|     assert get_new_command(Command('git pull', stderr=stderr)) \ | ||||
|            == "git branch --set-upstream-to=origin/master master && git pull" | ||||
|   | ||||
| @@ -12,10 +12,10 @@ Stopping at filesystem boundary (GIT_DISCOVERY_ACROSS_FILESYSTEM not set). | ||||
| @pytest.mark.parametrize('command', [ | ||||
|     Command(script='git pull git@github.com:mcarton/thefuck.git', stderr=git_err)]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, output', [ | ||||
|     (Command(script='git pull git@github.com:mcarton/thefuck.git', stderr=git_err), 'git clone git@github.com:mcarton/thefuck.git')]) | ||||
| def test_get_new_command(command, output): | ||||
|     assert get_new_command(command, None) == output | ||||
|     assert get_new_command(command) == output | ||||
|   | ||||
| @@ -14,11 +14,11 @@ To push the current branch and set the remote as upstream, use | ||||
|  | ||||
|  | ||||
| def test_match(stderr): | ||||
|     assert match(Command('git push master', stderr=stderr), None) | ||||
|     assert not match(Command('git push master'), None) | ||||
|     assert not match(Command('ls', stderr=stderr), None) | ||||
|     assert match(Command('git push master', stderr=stderr)) | ||||
|     assert not match(Command('git push master')) | ||||
|     assert not match(Command('ls', stderr=stderr)) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(stderr): | ||||
|     assert get_new_command(Command('git push', stderr=stderr), None)\ | ||||
|     assert get_new_command(Command('git push', stderr=stderr))\ | ||||
|         == "git push --set-upstream origin master" | ||||
|   | ||||
| @@ -30,7 +30,7 @@ To /tmp/bar | ||||
|     Command(script='git push nvbn', stderr=git_err), | ||||
|     Command(script='git push nvbn master', stderr=git_err)]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -41,7 +41,7 @@ def test_match(command): | ||||
|     Command(script='git push nvbn', stderr=git_ok), | ||||
|     Command(script='git push nvbn master', stderr=git_uptodate)]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, output', [ | ||||
| @@ -49,4 +49,4 @@ def test_not_match(command): | ||||
|     (Command(script='git push nvbn', stderr=git_err), 'git push --force nvbn'), | ||||
|     (Command(script='git push nvbn master', stderr=git_err), 'git push --force nvbn master')]) | ||||
| def test_get_new_command(command, output): | ||||
|     assert get_new_command(command, None) == output | ||||
|     assert get_new_command(command) == output | ||||
|   | ||||
| @@ -30,7 +30,7 @@ To /tmp/bar | ||||
|     Command(script='git push nvbn', stderr=git_err), | ||||
|     Command(script='git push nvbn master', stderr=git_err)]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -41,7 +41,7 @@ def test_match(command): | ||||
|     Command(script='git push nvbn', stderr=git_ok), | ||||
|     Command(script='git push nvbn master', stderr=git_uptodate)]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, output', [ | ||||
| @@ -51,4 +51,4 @@ def test_not_match(command): | ||||
|     (Command(script='git push nvbn master', stderr=git_err), | ||||
|      'git pull nvbn master && git push nvbn master')]) | ||||
| def test_get_new_command(command, output): | ||||
|     assert get_new_command(command, None) == output | ||||
|     assert get_new_command(command) == output | ||||
|   | ||||
| @@ -18,14 +18,14 @@ rebase_error = ( | ||||
|     Command(script='git cherry-pick a1b2c3d', stderr=cherry_pick_error), | ||||
|     Command(script='git rebase -i HEAD~7', stderr=rebase_error)]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
|     Command(script='git cherry-pick a1b2c3d', stderr=('')), | ||||
|     Command(script='git rebase -i HEAD~7', stderr=(''))]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
| @@ -34,4 +34,4 @@ def test_not_match(command): | ||||
|     (Command('git rebase -i HEAD~7', stderr=rebase_error), | ||||
|      'git stash && git rebase -i HEAD~7')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -7,11 +7,11 @@ from tests.utils import Command | ||||
|     Command(script='go run foo'), | ||||
|     Command(script='go run bar')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
|     (Command('go run foo'), 'go run foo.go'), | ||||
|     (Command('go run bar'), 'go run bar.go')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -3,10 +3,10 @@ from tests.utils import Command | ||||
|  | ||||
|  | ||||
| def test_match(): | ||||
|     assert match(Command('grep blah .', stderr='grep: .: Is a directory'), None) | ||||
|     assert not match(Command(), None) | ||||
|     assert match(Command('grep blah .', stderr='grep: .: Is a directory')) | ||||
|     assert not match(Command()) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     assert get_new_command( | ||||
|         Command('grep blah .'), None) == 'grep -r blah .' | ||||
|         Command('grep blah .')) == 'grep -r blah .' | ||||
|   | ||||
| @@ -11,18 +11,18 @@ def stdout(task): | ||||
|  | ||||
|  | ||||
| def test_match(): | ||||
|     assert match(Command('gulp srve', stdout('srve')), None) | ||||
|     assert match(Command('gulp srve', stdout('srve'))) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('script, stdout', [ | ||||
|     ('gulp serve', ''), | ||||
|     ('cat srve', stdout('srve'))]) | ||||
| def test_not_march(script, stdout): | ||||
|     assert not match(Command(script, stdout), None) | ||||
|     assert not match(Command(script, stdout)) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(mocker): | ||||
|     mocker.patch('thefuck.rules.gulp_not_task.get_gulp_tasks', return_value=[ | ||||
|         'serve', 'build', 'default']) | ||||
|     command = Command('gulp srve', stdout('srve')) | ||||
|     assert get_new_command(command, None) == ['gulp serve', 'gulp default'] | ||||
|     assert get_new_command(command) == ['gulp serve', 'gulp default'] | ||||
|   | ||||
| @@ -4,17 +4,14 @@ from thefuck.rules.has_exists_script import match, get_new_command | ||||
|  | ||||
| def test_match(): | ||||
|     with patch('os.path.exists', return_value=True): | ||||
|         assert match(Mock(script='main', stderr='main: command not found'), | ||||
|                      None) | ||||
|         assert match(Mock(script='main', stderr='main: command not found')) | ||||
|         assert match(Mock(script='main --help', | ||||
|                           stderr='main: command not found'), | ||||
|                      None) | ||||
|         assert not match(Mock(script='main', stderr=''), None) | ||||
|                           stderr='main: command not found')) | ||||
|         assert not match(Mock(script='main', stderr='')) | ||||
|  | ||||
|     with patch('os.path.exists', return_value=False): | ||||
|         assert not match(Mock(script='main', stderr='main: command not found'), | ||||
|                          None) | ||||
|         assert not match(Mock(script='main', stderr='main: command not found')) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     assert get_new_command(Mock(script='main --help'), None) == './main --help' | ||||
|     assert get_new_command(Mock(script='main --help')) == './main --help' | ||||
|   | ||||
| @@ -16,14 +16,14 @@ no_suggest_stderr = ''' !    `aaaaa` is not a heroku command. | ||||
| @pytest.mark.parametrize('cmd', ['log', 'pge']) | ||||
| def test_match(cmd): | ||||
|     assert match( | ||||
|         Command('heroku {}'.format(cmd), stderr=suggest_stderr(cmd)), None) | ||||
|         Command('heroku {}'.format(cmd), stderr=suggest_stderr(cmd))) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('script, stderr', [ | ||||
|     ('cat log', suggest_stderr('log')), | ||||
|     ('heroku aaa', no_suggest_stderr)]) | ||||
| def test_not_match(script, stderr): | ||||
|     assert not match(Command(script, stderr=stderr), None) | ||||
|     assert not match(Command(script, stderr=stderr)) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('cmd, result', [ | ||||
| @@ -31,4 +31,4 @@ def test_not_match(script, stderr): | ||||
|     ('pge', ['heroku pg', 'heroku logs'])]) | ||||
| def test_get_new_command(cmd, result): | ||||
|     command = Command('heroku {}'.format(cmd), stderr=suggest_stderr(cmd)) | ||||
|     assert get_new_command(command, None) == result | ||||
|     assert get_new_command(command) == result | ||||
|   | ||||
| @@ -25,13 +25,13 @@ def callables(mocker): | ||||
| @pytest.mark.usefixtures('history', 'callables', 'no_memoize', 'alias') | ||||
| @pytest.mark.parametrize('script', ['ls cet', 'daff x']) | ||||
| def test_match(script): | ||||
|     assert match(Command(script=script), None) | ||||
|     assert match(Command(script=script)) | ||||
|  | ||||
|  | ||||
| @pytest.mark.usefixtures('history', 'callables', 'no_memoize', 'alias') | ||||
| @pytest.mark.parametrize('script', ['apt-get', 'nocommand y']) | ||||
| def test_not_match(script): | ||||
|     assert not match(Command(script=script), None) | ||||
|     assert not match(Command(script=script)) | ||||
|  | ||||
|  | ||||
| @pytest.mark.usefixtures('history', 'callables', 'no_memoize', 'alias') | ||||
| @@ -39,4 +39,4 @@ def test_not_match(script): | ||||
|     ('ls cet', 'ls cat'), | ||||
|     ('daff x', 'diff x')]) | ||||
| def test_get_new_command(script, result): | ||||
|     assert get_new_command(Command(script), None) == result | ||||
|     assert get_new_command(Command(script)) == result | ||||
|   | ||||
| @@ -7,11 +7,11 @@ from tests.utils import Command | ||||
|     Command(script='java foo.java'), | ||||
|     Command(script='java bar.java')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
|     (Command('java foo.java'), 'java foo'), | ||||
|     (Command('java bar.java'), 'java bar')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -7,11 +7,11 @@ from tests.utils import Command | ||||
|     Command(script='javac foo'), | ||||
|     Command(script='javac bar')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
|     (Command('javac foo'), 'javac foo.java'), | ||||
|     (Command('javac bar'), 'javac bar.java')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -14,10 +14,10 @@ Did you mean this? | ||||
|  | ||||
|  | ||||
| def test_match(is_not_task): | ||||
|     assert match(Command(script='lein rpl', stderr=is_not_task), None) | ||||
|     assert not match(Command(script='ls', stderr=is_not_task), None) | ||||
|     assert match(Command(script='lein rpl', stderr=is_not_task)) | ||||
|     assert not match(Command(script='ls', stderr=is_not_task)) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(is_not_task): | ||||
|     assert get_new_command(Command(script='lein rpl --help', stderr=is_not_task), | ||||
|                            None) == ['lein repl --help', 'lein jar --help'] | ||||
|     assert get_new_command(Command(script='lein rpl --help', stderr=is_not_task)) \ | ||||
|            == ['lein repl --help', 'lein jar --help'] | ||||
|   | ||||
| @@ -3,14 +3,14 @@ from tests.utils import Command | ||||
|  | ||||
|  | ||||
| def test_match(): | ||||
|     assert match(Command(script='ls'), None) | ||||
|     assert match(Command(script='ls file.py'), None) | ||||
|     assert match(Command(script='ls /opt'), None) | ||||
|     assert not match(Command(script='ls -lah /opt'), None) | ||||
|     assert not match(Command(script='pacman -S binutils'), None) | ||||
|     assert not match(Command(script='lsof'), None) | ||||
|     assert match(Command(script='ls')) | ||||
|     assert match(Command(script='ls file.py')) | ||||
|     assert match(Command(script='ls /opt')) | ||||
|     assert not match(Command(script='ls -lah /opt')) | ||||
|     assert not match(Command(script='pacman -S binutils')) | ||||
|     assert not match(Command(script='lsof')) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     assert get_new_command(Command(script='ls file.py'), None) == 'ls -lah file.py' | ||||
|     assert get_new_command(Command(script='ls'), None) == 'ls -lah' | ||||
|     assert get_new_command(Command(script='ls file.py')) == 'ls -lah file.py' | ||||
|     assert get_new_command(Command(script='ls')) == 'ls -lah' | ||||
|   | ||||
| @@ -12,14 +12,14 @@ from tests.utils import Command | ||||
|     Command('man -s 2 read'), | ||||
|     Command('man -s 3 read')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
|     Command('man'), | ||||
|     Command('man ')]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
| @@ -31,4 +31,4 @@ def test_not_match(command): | ||||
|     (Command('man -s 2 read'), 'man -s 3 read'), | ||||
|     (Command('man -s 3 read'), 'man -s 2 read')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -3,10 +3,10 @@ from tests.utils import Command | ||||
|  | ||||
|  | ||||
| def test_match(): | ||||
|     assert match(Command('mandiff', stderr='mandiff: command not found'), None) | ||||
|     assert not match(Command(), None) | ||||
|     assert match(Command('mandiff', stderr='mandiff: command not found')) | ||||
|     assert not match(Command()) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     assert get_new_command( | ||||
|         Command('mandiff'), None) == 'man diff' | ||||
|         Command('mandiff')) == 'man diff' | ||||
|   | ||||
| @@ -37,7 +37,7 @@ from thefuck.rules.mercurial import ( | ||||
|     )), | ||||
| ]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -63,7 +63,7 @@ def test_match(command): | ||||
|     )), | ||||
| ]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, possibilities', [ | ||||
| @@ -131,4 +131,4 @@ def test_extract_possibilities(command, possibilities): | ||||
|     )), 'hg rebase re'), | ||||
| ]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -9,7 +9,7 @@ from tests.utils import Command | ||||
|     Command('hdfs dfs -mkdir foo/bar/baz', stderr='mkdir: `foo/bar/baz\': No such file or directory') | ||||
|     ]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -19,7 +19,7 @@ def test_match(command): | ||||
|     Command('./bin/hdfs dfs -mkdir foo/bar/baz'), | ||||
|     Command()]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
| @@ -27,5 +27,5 @@ def test_not_match(command): | ||||
|     (Command('hdfs dfs -mkdir foo/bar/baz'), 'hdfs dfs -mkdir -p foo/bar/baz'), | ||||
|     (Command('./bin/hdfs dfs -mkdir foo/bar/baz'), './bin/hdfs dfs -mkdir -p foo/bar/baz')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ from tests.utils import Command | ||||
| @pytest.mark.parametrize('command', [ | ||||
|     Command(script='mvn', stdout='[ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -30,11 +30,11 @@ def test_match(command): | ||||
|     Command(script='mvn -v') | ||||
| ]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
|     (Command(script='mvn', stdout='[ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]'), ['mvn clean package', 'mvn clean install']), | ||||
|     (Command(script='mvn -N', stdout='[ERROR] No goals have been specified for this build. You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]'), ['mvn -N clean package', 'mvn -N clean install'])]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|  | ||||
|   | ||||
| @@ -6,7 +6,7 @@ from tests.utils import Command | ||||
| @pytest.mark.parametrize('command', [ | ||||
|     Command(script='mvn cle', stdout='[ERROR] Unknown lifecycle phase "cle". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -30,11 +30,11 @@ def test_match(command): | ||||
|     Command(script='mvn -v') | ||||
| ]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
|     (Command(script='mvn cle', stdout='[ERROR] Unknown lifecycle phase "cle". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]'), ['mvn clean', 'mvn compile']), | ||||
|     (Command(script='mvn claen package', stdout='[ERROR] Unknown lifecycle phase "claen". You must specify a valid lifecycle phase or a goal in the format <plugin-prefix>:<goal> or <plugin-group-id>:<plugin-artifact-id>[:<plugin-version>]:<goal>. Available lifecycle phases are: validate, initialize, generate-sources, process-sources, generate-resources, process-resources, compile, process-classes, generate-test-sources, process-test-sources, generate-test-resources, process-test-resources, test-compile, process-test-classes, test, prepare-package, package, pre-integration-test, integration-test, post-integration-test, verify, install, deploy, pre-clean, clean, post-clean, pre-site, site, post-site, site-deploy. -> [Help 1]'), ['mvn clean package'])]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|  | ||||
|   | ||||
| @@ -11,19 +11,17 @@ def get_all_executables(mocker): | ||||
|  | ||||
| @pytest.mark.usefixtures('no_memoize') | ||||
| def test_match(): | ||||
|     assert match(Command(stderr='vom: not found', script='vom file.py'), None) | ||||
|     assert match(Command(stderr='fucck: not found', script='fucck'), None) | ||||
|     assert not match(Command(stderr='qweqwe: not found', script='qweqwe'), None) | ||||
|     assert not match(Command(stderr='some text', script='vom file.py'), None) | ||||
|     assert match(Command(stderr='vom: not found', script='vom file.py')) | ||||
|     assert match(Command(stderr='fucck: not found', script='fucck')) | ||||
|     assert not match(Command(stderr='qweqwe: not found', script='qweqwe')) | ||||
|     assert not match(Command(stderr='some text', script='vom file.py')) | ||||
|  | ||||
|  | ||||
| @pytest.mark.usefixtures('no_memoize') | ||||
| def test_get_new_command(): | ||||
|     assert get_new_command( | ||||
|         Command(stderr='vom: not found', | ||||
|                 script='vom file.py'), | ||||
|         None) == ['vim file.py'] | ||||
|                 script='vom file.py')) == ['vim file.py'] | ||||
|     assert get_new_command( | ||||
|         Command(stderr='fucck: not found', | ||||
|                 script='fucck'), | ||||
|         Command) == ['fsck'] | ||||
|                 script='fucck')) == ['fsck'] | ||||
|   | ||||
| @@ -8,7 +8,7 @@ from tests.utils import Command | ||||
|     Command(script='mv foo bar/', stderr="mv: cannot move 'foo' to 'bar/': No such file or directory"), | ||||
|     ]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -16,7 +16,7 @@ def test_match(command): | ||||
|     Command(script='mv foo bar/foo', stderr="mv: permission denied"), | ||||
|     ]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
| @@ -24,4 +24,4 @@ def test_not_match(command): | ||||
|     (Command(script='mv foo bar/', stderr="mv: cannot move 'foo' to 'bar/': No such file or directory"), 'mkdir -p bar && mv foo bar/'), | ||||
|     ]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -14,7 +14,7 @@ from tests.utils import Command | ||||
|     Command(script='gnome-open foo.com'), | ||||
|     Command(script='kde-open foo.com')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
| @@ -28,4 +28,4 @@ def test_match(command): | ||||
|     (Command('gnome-open foo.io'), 'gnome-open http://foo.io'), | ||||
|     (Command('kde-open foo.io'), 'kde-open http://foo.io')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -23,7 +23,7 @@ extra/vim-python3 7.4.712-1 \t/usr/bin/vim''' | ||||
|     Command(script='vim', stderr='vim: command not found'), | ||||
|     Command(script='sudo vim', stderr='sudo: vim: command not found')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, return_value', [ | ||||
| @@ -33,14 +33,14 @@ def test_match(command): | ||||
| @patch.multiple(pacman, create=True, pacman=pacman_cmd) | ||||
| def test_match_mocked(subp_mock, command, return_value): | ||||
|     subp_mock.check_output.return_value = return_value | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
|     Command(script='vim', stderr=''), Command(), | ||||
|     Command(script='sudo vim', stderr=''), Command()]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| sudo_vim_possibilities = ['{} -S extra/gvim && sudo vim', | ||||
| @@ -66,7 +66,7 @@ vim_possibilities = [s.format(pacman_cmd) for s in vim_possibilities] | ||||
|     (Command('convert'), ['{} -S extra/imagemagick && convert'.format(pacman_cmd)]), | ||||
|     (Command('sudo convert'), ['{} -S extra/imagemagick && sudo convert'.format(pacman_cmd)])]) | ||||
| def test_get_new_command(command, new_command, mocker): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command, return_value', [ | ||||
| @@ -79,4 +79,4 @@ def test_get_new_command(command, new_command, mocker): | ||||
| @patch.multiple(pacman, create=True, pacman=pacman_cmd) | ||||
| def test_get_new_command_mocked(subp_mock, command, new_command, return_value): | ||||
|     subp_mock.check_output.return_value = return_value | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -15,7 +15,7 @@ extra/llvm35 3.5.2-13/usr/bin/llc''' | ||||
|     Command(script='pacman llc', stderr='error: target not found: llc'), | ||||
|     Command(script='sudo pacman llc', stderr='error: target not found: llc')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -25,7 +25,7 @@ def test_match(command): | ||||
| @patch('thefuck.specific.archlinux.subprocess') | ||||
| def test_match_mocked(subp_mock, command): | ||||
|     subp_mock.check_output.return_value = PKGFILE_OUTPUT_LLC | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.skipif(not getattr(pacman_not_found, 'enabled_by_default', True), | ||||
| @@ -35,7 +35,7 @@ def test_match_mocked(subp_mock, command): | ||||
|     (Command(script='pacman -S llc', stderr='error: target not found: llc'), ['pacman -S extra/llvm', 'pacman -S extra/llvm35']), | ||||
|     (Command(script='sudo pacman -S llc', stderr='error: target not found: llc'), ['sudo pacman -S extra/llvm', 'sudo pacman -S extra/llvm35'])]) | ||||
| def test_get_new_command(command, fixed): | ||||
|     assert get_new_command(command, None) == fixed | ||||
|     assert get_new_command(command) == fixed | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, fixed', [ | ||||
| @@ -45,4 +45,4 @@ def test_get_new_command(command, fixed): | ||||
| @patch('thefuck.specific.archlinux.subprocess') | ||||
| def test_get_new_command_mocked(subp_mock, command, fixed): | ||||
|     subp_mock.check_output.return_value = PKGFILE_OUTPUT_LLC | ||||
|     assert get_new_command(command, None) == fixed | ||||
|     assert get_new_command(command) == fixed | ||||
|   | ||||
| @@ -14,12 +14,11 @@ def pip_unknown_cmd_without_recommend(): | ||||
|  | ||||
|  | ||||
| def test_match(pip_unknown_cmd, pip_unknown_cmd_without_recommend): | ||||
|     assert match(Command('pip instatl', stderr=pip_unknown_cmd), None) | ||||
|     assert match(Command('pip instatl', stderr=pip_unknown_cmd)) | ||||
|     assert not match(Command('pip i', | ||||
|                              stderr=pip_unknown_cmd_without_recommend), | ||||
|                      None) | ||||
|                              stderr=pip_unknown_cmd_without_recommend)) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(pip_unknown_cmd): | ||||
|     assert get_new_command(Command('pip instatl', stderr=pip_unknown_cmd), | ||||
|                            None) == 'pip install' | ||||
|     assert get_new_command(Command('pip instatl', | ||||
|                                    stderr=pip_unknown_cmd)) == 'pip install' | ||||
|   | ||||
| @@ -3,10 +3,10 @@ from tests.utils import Command | ||||
|  | ||||
|  | ||||
| def test_match(): | ||||
|     assert match(Command('temp.py', stderr='Permission denied'), None) | ||||
|     assert not match(Command(), None) | ||||
|     assert match(Command('temp.py', stderr='Permission denied')) | ||||
|     assert not match(Command()) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     assert get_new_command(Command('./test_sudo.py'), None)\ | ||||
|     assert get_new_command(Command('./test_sudo.py'))\ | ||||
|            == 'python ./test_sudo.py' | ||||
|   | ||||
| @@ -7,11 +7,11 @@ from tests.utils import Command | ||||
|     Command(script='python foo'), | ||||
|     Command(script='python bar')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     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, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -8,7 +8,7 @@ from tests.utils import Command | ||||
|     Command(script="git commit -am \"Mismatched Quotation Marks\'"), | ||||
|     Command(script="echo \"hello\'")]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
| @@ -16,4 +16,4 @@ def test_match(command): | ||||
|     (Command("git commit -am \"Mismatched Quotation Marks\'"), "git commit -am \"Mismatched Quotation Marks\""), | ||||
|     (Command("echo \"hello\'"), "echo \"hello\"")]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -10,7 +10,7 @@ from tests.utils import Command | ||||
|     Command('./bin/hdfs dfs -rm foo', stderr='rm: `foo`: Is a directory') | ||||
|     ]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -19,13 +19,13 @@ def test_match(command): | ||||
|     Command('./bin/hdfs dfs -rm foo'),   | ||||
|     Command()]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
|     (Command('rm foo'), 'rm -rf foo'), | ||||
|     (Command('hdfs dfs -rm foo'), 'hdfs dfs -rm -r foo')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -5,7 +5,7 @@ from tests.utils import Command | ||||
|  | ||||
| def test_match(): | ||||
|     assert match(Command(script='rm -rf /', | ||||
|                          stderr='add --no-preserve-root'), None) | ||||
|                          stderr='add --no-preserve-root')) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -13,9 +13,9 @@ def test_match(): | ||||
|     Command(script='rm --no-preserve-root /', stderr='add --no-preserve-root'), | ||||
|     Command(script='rm -rf /', stderr='')]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     assert get_new_command(Command(script='rm -rf /'), None) \ | ||||
|     assert get_new_command(Command(script='rm -rf /')) \ | ||||
|            == 'rm -rf / --no-preserve-root' | ||||
|   | ||||
| @@ -9,20 +9,20 @@ def sed_unterminated_s(): | ||||
|  | ||||
|  | ||||
| def test_match(sed_unterminated_s): | ||||
|     assert match(Command('sed -e s/foo/bar', stderr=sed_unterminated_s), None) | ||||
|     assert match(Command('sed -es/foo/bar', stderr=sed_unterminated_s), None) | ||||
|     assert match(Command('sed -e s/foo/bar -e s/baz/quz', stderr=sed_unterminated_s), None) | ||||
|     assert not match(Command('sed -e s/foo/bar'), None) | ||||
|     assert not match(Command('sed -es/foo/bar'), None) | ||||
|     assert not match(Command('sed -e s/foo/bar -e s/baz/quz'), None) | ||||
|     assert match(Command('sed -e s/foo/bar', stderr=sed_unterminated_s)) | ||||
|     assert match(Command('sed -es/foo/bar', stderr=sed_unterminated_s)) | ||||
|     assert match(Command('sed -e s/foo/bar -e s/baz/quz', stderr=sed_unterminated_s)) | ||||
|     assert not match(Command('sed -e s/foo/bar')) | ||||
|     assert not match(Command('sed -es/foo/bar')) | ||||
|     assert not match(Command('sed -e s/foo/bar -e s/baz/quz')) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(sed_unterminated_s): | ||||
|     assert get_new_command(Command('sed -e s/foo/bar', stderr=sed_unterminated_s), None) \ | ||||
|     assert get_new_command(Command('sed -e s/foo/bar', stderr=sed_unterminated_s)) \ | ||||
|             == 'sed -e s/foo/bar/' | ||||
|     assert get_new_command(Command('sed -es/foo/bar', stderr=sed_unterminated_s), None) \ | ||||
|     assert get_new_command(Command('sed -es/foo/bar', stderr=sed_unterminated_s)) \ | ||||
|             == 'sed -es/foo/bar/' | ||||
|     assert get_new_command(Command(r"sed -e 's/\/foo/bar'", stderr=sed_unterminated_s), None) \ | ||||
|     assert get_new_command(Command(r"sed -e 's/\/foo/bar'", stderr=sed_unterminated_s)) \ | ||||
|             == r"sed -e 's/\/foo/bar/'" | ||||
|     assert get_new_command(Command(r"sed -e s/foo/bar -es/baz/quz", stderr=sed_unterminated_s), None) \ | ||||
|     assert get_new_command(Command(r"sed -e s/foo/bar -es/baz/quz", stderr=sed_unterminated_s)) \ | ||||
|             == r"sed -e s/foo/bar/ -es/baz/quz/" | ||||
|   | ||||
| @@ -4,9 +4,9 @@ from tests.utils import Command | ||||
|  | ||||
|  | ||||
| def test_match(): | ||||
|     assert match(Command('sl'), None) | ||||
|     assert not match(Command('ls'), None) | ||||
|     assert match(Command('sl')) | ||||
|     assert not match(Command('ls')) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     assert get_new_command(Command('sl'), None) == 'ls' | ||||
|     assert get_new_command(Command('sl')) == 'ls' | ||||
|   | ||||
| @@ -44,23 +44,23 @@ Host key verification failed.""".format(path, '98.765.432.321') | ||||
|  | ||||
| def test_match(ssh_error): | ||||
|     errormsg, _, _, _ = ssh_error | ||||
|     assert match(Command('ssh', stderr=errormsg), None) | ||||
|     assert match(Command('ssh', stderr=errormsg), None) | ||||
|     assert match(Command('scp something something', stderr=errormsg), None) | ||||
|     assert match(Command('scp something something', stderr=errormsg), None) | ||||
|     assert not match(Command(stderr=errormsg), None) | ||||
|     assert not match(Command('notssh', stderr=errormsg), None) | ||||
|     assert not match(Command('ssh'), None) | ||||
|     assert match(Command('ssh', stderr=errormsg)) | ||||
|     assert match(Command('ssh', stderr=errormsg)) | ||||
|     assert match(Command('scp something something', stderr=errormsg)) | ||||
|     assert match(Command('scp something something', stderr=errormsg)) | ||||
|     assert not match(Command(stderr=errormsg)) | ||||
|     assert not match(Command('notssh', stderr=errormsg)) | ||||
|     assert not match(Command('ssh')) | ||||
|  | ||||
|  | ||||
| def test_side_effect(ssh_error): | ||||
|     errormsg, path, reset, known_hosts = ssh_error | ||||
|     command = Command('ssh user@host', stderr=errormsg) | ||||
|     side_effect(command, None, None) | ||||
|     side_effect(command, None) | ||||
|     expected = ['123.234.567.890 asdjkasjdakjsd\n', '111.222.333.444 qwepoiwqepoiss\n'] | ||||
|     assert known_hosts(path) == expected | ||||
|  | ||||
|  | ||||
| def test_get_new_command(ssh_error, monkeypatch): | ||||
|     errormsg, _, _, _ = ssh_error | ||||
|     assert get_new_command(Command('ssh user@host', stderr=errormsg), None) == 'ssh user@host' | ||||
|     assert get_new_command(Command('ssh user@host', stderr=errormsg)) == 'ssh user@host' | ||||
|   | ||||
| @@ -14,11 +14,11 @@ from tests.utils import Command | ||||
|     ('You don\'t have access to the history DB.', ''), | ||||
|     ('', "error: [Errno 13] Permission denied: '/usr/local/lib/python2.7/dist-packages/ipaddr.py'")]) | ||||
| def test_match(stderr, stdout): | ||||
|     assert match(Command(stderr=stderr, stdout=stdout), None) | ||||
|     assert match(Command(stderr=stderr, stdout=stdout)) | ||||
|  | ||||
|  | ||||
| def test_not_match(): | ||||
|     assert not match(Command(), None) | ||||
|     assert not match(Command()) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('before, after', [ | ||||
| @@ -26,4 +26,4 @@ def test_not_match(): | ||||
|     ('echo a > b', 'sudo sh -c "echo a > b"'), | ||||
|     ('echo "a" >> b', 'sudo sh -c "echo \\"a\\" >> b"')]) | ||||
| def test_get_new_command(before, after): | ||||
|     assert get_new_command(Command(before), None) == after | ||||
|     assert get_new_command(Command(before)) == after | ||||
|   | ||||
| @@ -9,7 +9,7 @@ from tests.utils import Command | ||||
|     Command(stderr='command not found: фзе-пуе', script=u'фзе-пуе'), | ||||
|     Command(stderr='command not found: λσ', script=u'λσ')]) | ||||
| def test_match(command): | ||||
|     assert switch_lang.match(command, None) | ||||
|     assert switch_lang.match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -18,11 +18,11 @@ def test_match(command): | ||||
|     Command(stderr='command not found: агсл', script=u'агсл'), | ||||
|     Command(stderr='some info', script=u'фзе-пуе')]) | ||||
| def test_not_match(command): | ||||
|     assert not switch_lang.match(command, None) | ||||
|     assert not switch_lang.match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
|     (Command(u'фзе-пуе штыефдд мшь'), 'apt-get install vim'), | ||||
|     (Command(u'λσ -λα'), 'ls -la')]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert switch_lang.get_new_command(command, None) == new_command | ||||
|     assert switch_lang.get_new_command(command) == new_command | ||||
|   | ||||
| @@ -4,15 +4,15 @@ from tests.utils import Command | ||||
|  | ||||
|  | ||||
| def test_match(): | ||||
|     assert match(Command('systemctl nginx start', stderr='Unknown operation \'nginx\'.'), None) | ||||
|     assert match(Command('sudo systemctl nginx start', stderr='Unknown operation \'nginx\'.'), None) | ||||
|     assert not match(Command('systemctl start nginx'), None) | ||||
|     assert not match(Command('systemctl start nginx'), None) | ||||
|     assert not match(Command('sudo systemctl nginx', stderr='Unknown operation \'nginx\'.'), None) | ||||
|     assert not match(Command('systemctl nginx', stderr='Unknown operation \'nginx\'.'), None) | ||||
|     assert not match(Command('systemctl start wtf', stderr='Failed to start wtf.service: Unit wtf.service failed to load: No such file or directory.'), None) | ||||
|     assert match(Command('systemctl nginx start', stderr='Unknown operation \'nginx\'.')) | ||||
|     assert match(Command('sudo systemctl nginx start', stderr='Unknown operation \'nginx\'.')) | ||||
|     assert not match(Command('systemctl start nginx')) | ||||
|     assert not match(Command('systemctl start nginx')) | ||||
|     assert not match(Command('sudo systemctl nginx', stderr='Unknown operation \'nginx\'.')) | ||||
|     assert not match(Command('systemctl nginx', stderr='Unknown operation \'nginx\'.')) | ||||
|     assert not match(Command('systemctl start wtf', stderr='Failed to start wtf.service: Unit wtf.service failed to load: No such file or directory.')) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(): | ||||
|     assert get_new_command(Command('systemctl nginx start'), None) == "systemctl start nginx" | ||||
|     assert get_new_command(Command('sudo systemctl nginx start'), None) == "sudo systemctl start nginx" | ||||
|     assert get_new_command(Command('systemctl nginx start')) == "systemctl start nginx" | ||||
|     assert get_new_command(Command('sudo systemctl nginx start')) == "sudo systemctl start nginx" | ||||
|   | ||||
| @@ -11,9 +11,9 @@ def tmux_ambiguous(): | ||||
|  | ||||
|  | ||||
| def test_match(tmux_ambiguous): | ||||
|     assert match(Command('tmux list', stderr=tmux_ambiguous), None) | ||||
|     assert match(Command('tmux list', stderr=tmux_ambiguous)) | ||||
|  | ||||
|  | ||||
| def test_get_new_command(tmux_ambiguous): | ||||
|     assert get_new_command(Command('tmux list', stderr=tmux_ambiguous), None)\ | ||||
|     assert get_new_command(Command('tmux list', stderr=tmux_ambiguous))\ | ||||
|         == ['tmux list-keys', 'tmux list-panes', 'tmux list-windows'] | ||||
|   | ||||
| @@ -15,7 +15,7 @@ error_msg = ( | ||||
|     Command(script='tsuru app-log -f', stderr=error_msg[1]), | ||||
| ]) | ||||
| def test_match(command): | ||||
|     assert match(command, {}) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -24,7 +24,7 @@ def test_match(command): | ||||
|     Command(script='tsuru app-log -f', stderr=('Error: unparseable data')), | ||||
| ]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, {}) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
| @@ -34,4 +34,4 @@ def test_not_match(command): | ||||
|      'tsuru login && tsuru app-log -f'), | ||||
| ]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, {}) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -30,7 +30,7 @@ from thefuck.rules.tsuru_not_command import match, get_new_command | ||||
|     )), | ||||
| ]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -58,7 +58,7 @@ def test_match(command): | ||||
|     Command('tsuru env-get', stderr='Error: App thefuck not found.'), | ||||
| ]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_commands', [ | ||||
| @@ -87,4 +87,4 @@ def test_not_match(command): | ||||
|     )), ['tsuru target-list']), | ||||
| ]) | ||||
| def test_get_new_command(command, new_commands): | ||||
|     assert get_new_command(command, None) == new_commands | ||||
|     assert get_new_command(command) == new_commands | ||||
|   | ||||
| @@ -9,7 +9,7 @@ from tests.utils import Command | ||||
|             stderr='ls: Unknown command\nDid you mean -ls?  This command begins with a dash.'), | ||||
|     Command(script='hdfs dfs ls /foo/bar', stderr='ls: Unknown command\nDid you mean -ls?  This command begins with a dash.')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -18,7 +18,7 @@ def test_match(command): | ||||
|     Command(script='hdfs dfs -ls -R /foo/bar', stderr=''),   | ||||
|     Command()]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
| @@ -31,5 +31,5 @@ def test_not_match(command): | ||||
|     (Command('./bin/hdfs dfs -Dtest=fred ls -R /foo/bar', | ||||
|         stderr='ls: Unknown command\nDid you mean -ls?  This command begins with a dash.'), ['./bin/hdfs dfs -Dtest=fred -ls -R /foo/bar'])]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|  | ||||
|   | ||||
| @@ -11,7 +11,7 @@ from tests.utils import Command | ||||
|     Command(script='vagrant rdp devbox', | ||||
|             stderr='VM must be created before running this command. Run `vagrant up` first.')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
| @@ -20,7 +20,7 @@ def test_match(command): | ||||
|     Command(script='vagrant ssh', stderr='A Vagrant environment or target machine is required to run this command. Run `vagrant init` to create a new Vagrant environment. Or, get an ID of a target machine from `vagrant global-status` to run this command on. A final option is to change to a directory with a Vagrantfile and to try again.'),   | ||||
|     Command()]) | ||||
| def test_not_match(command): | ||||
|     assert not match(command, None) | ||||
|     assert not match(command) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, new_command', [ | ||||
| @@ -31,5 +31,5 @@ def test_not_match(command): | ||||
|     (Command(script='vagrant rdp devbox', | ||||
|             stderr='VM must be created before running this command. Run `vagrant up` first.'), ['vagrant up devbox && vagrant rdp devbox', 'vagrant up && vagrant rdp devbox'])]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|  | ||||
|   | ||||
| @@ -8,11 +8,11 @@ from tests.utils import Command | ||||
|     Command(script='whois https://en.wikipedia.org/'), | ||||
|     Command(script='whois meta.unix.stackexchange.com')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|     assert match(command) | ||||
|  | ||||
|  | ||||
| def test_not_match(): | ||||
|     assert not match(Command(script='whois'), None) | ||||
|     assert not match(Command(script='whois')) | ||||
|  | ||||
|  | ||||
| # `whois com` actually makes sense | ||||
| @@ -23,4 +23,4 @@ def test_not_match(): | ||||
|                                                     'whois stackexchange.com', | ||||
|                                                     'whois com'])]) | ||||
| def test_get_new_command(command, new_command): | ||||
|     assert get_new_command(command, None) == new_command | ||||
|     assert get_new_command(command) == new_command | ||||
|   | ||||
| @@ -9,9 +9,10 @@ from tests.utils import Command | ||||
|      "19:23:25.470911 git.c:282   trace: alias expansion: com => 'commit' '--verbose'")]) | ||||
| def test_git_support(called, command, stderr): | ||||
|     @git_support | ||||
|     def fn(command, settings): return command.script | ||||
|     def fn(command): | ||||
|         return command.script | ||||
|  | ||||
|     assert fn(Command(script=called, stderr=stderr), None) == command | ||||
|     assert fn(Command(script=called, stderr=stderr)) == command | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command, is_git', [ | ||||
| @@ -24,6 +25,7 @@ def test_git_support(called, command, stderr): | ||||
|     ('cat hub', False)]) | ||||
| def test_git_support_match(command, is_git): | ||||
|     @git_support | ||||
|     def fn(command, settings): return True | ||||
|     def fn(command): | ||||
|         return True | ||||
|  | ||||
|     assert fn(Command(script=command), None) == is_git | ||||
|     assert fn(Command(script=command)) == is_git | ||||
|   | ||||
| @@ -13,8 +13,8 @@ from tests.utils import Command | ||||
|     (False, 'sudo ls', 'ls', False), | ||||
|     (False, 'ls', 'ls', False)]) | ||||
| def test_sudo_support(return_value, command, called, result): | ||||
|     def fn(command, settings): | ||||
|     def fn(command): | ||||
|         assert command == Command(called) | ||||
|         return return_value | ||||
|  | ||||
|     assert sudo_support(fn)(Command(command), None) == result | ||||
|     assert sudo_support(fn)(Command(command)) == result | ||||
|   | ||||
| @@ -26,54 +26,60 @@ def environ(monkeypatch): | ||||
|  | ||||
|  | ||||
| @pytest.mark.usefixture('environ') | ||||
| def test_settings_defaults(load_source): | ||||
| def test_settings_defaults(load_source, settings): | ||||
|     load_source.return_value = object() | ||||
|     conf.init_settings(Mock()) | ||||
|     for key, val in conf.DEFAULT_SETTINGS.items(): | ||||
|         assert getattr(conf.get_settings(Mock()), key) == val | ||||
|         assert getattr(settings, key) == val | ||||
|  | ||||
|  | ||||
| @pytest.mark.usefixture('environ') | ||||
| class TestSettingsFromFile(object): | ||||
|     def test_from_file(self, load_source): | ||||
|     def test_from_file(self, load_source, settings): | ||||
|         load_source.return_value = Mock(rules=['test'], | ||||
|                                         wait_command=10, | ||||
|                                         require_confirmation=True, | ||||
|                                         no_colors=True, | ||||
|                                         priority={'vim': 100}) | ||||
|         settings = conf.get_settings(Mock()) | ||||
|                                         priority={'vim': 100}, | ||||
|                                         exclude_rules=['git']) | ||||
|         conf.init_settings(Mock()) | ||||
|         assert settings.rules == ['test'] | ||||
|         assert settings.wait_command == 10 | ||||
|         assert settings.require_confirmation is True | ||||
|         assert settings.no_colors is True | ||||
|         assert settings.priority == {'vim': 100} | ||||
|         assert settings.exclude_rules == ['git'] | ||||
|  | ||||
|     def test_from_file_with_DEFAULT(self, load_source): | ||||
|     def test_from_file_with_DEFAULT(self, load_source, settings): | ||||
|         load_source.return_value = Mock(rules=conf.DEFAULT_RULES + ['test'], | ||||
|                                         wait_command=10, | ||||
|                                         exclude_rules=[], | ||||
|                                         require_confirmation=True, | ||||
|                                         no_colors=True) | ||||
|         settings = conf.get_settings(Mock()) | ||||
|         conf.init_settings(Mock()) | ||||
|         assert settings.rules == conf.DEFAULT_RULES + ['test'] | ||||
|  | ||||
|  | ||||
| @pytest.mark.usefixture('load_source') | ||||
| class TestSettingsFromEnv(object): | ||||
|     def test_from_env(self, environ): | ||||
|     def test_from_env(self, environ, settings): | ||||
|         environ.update({'THEFUCK_RULES': 'bash:lisp', | ||||
|                         'THEFUCK_EXCLUDE_RULES': 'git:vim', | ||||
|                         'THEFUCK_WAIT_COMMAND': '55', | ||||
|                         'THEFUCK_REQUIRE_CONFIRMATION': 'true', | ||||
|                         'THEFUCK_NO_COLORS': 'false', | ||||
|                         'THEFUCK_PRIORITY': 'bash=10:lisp=wrong:vim=15'}) | ||||
|         settings = conf.get_settings(Mock()) | ||||
|         conf.init_settings(Mock()) | ||||
|         assert settings.rules == ['bash', 'lisp'] | ||||
|         assert settings.exclude_rules == ['git', 'vim'] | ||||
|         assert settings.wait_command == 55 | ||||
|         assert settings.require_confirmation is True | ||||
|         assert settings.no_colors is False | ||||
|         assert settings.priority == {'bash': 10, 'vim': 15} | ||||
|  | ||||
|     def test_from_env_with_DEFAULT(self, environ): | ||||
|     def test_from_env_with_DEFAULT(self, environ, settings): | ||||
|         environ.update({'THEFUCK_RULES': 'DEFAULT_RULES:bash:lisp'}) | ||||
|         settings = conf.get_settings(Mock()) | ||||
|         conf.init_settings(Mock()) | ||||
|         assert settings.rules == conf.DEFAULT_RULES + ['bash', 'lisp'] | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -16,70 +16,87 @@ def test_load_rule(mocker): | ||||
|                           enabled_by_default=True, | ||||
|                           priority=900, | ||||
|                           requires_output=True)) | ||||
|     assert corrector.load_rule(Path('/rules/bash.py'), settings=Mock(priority={})) \ | ||||
|     assert corrector.load_rule(Path('/rules/bash.py')) \ | ||||
|            == Rule('bash', match, get_new_command, priority=900) | ||||
|     load_source.assert_called_once_with('bash', '/rules/bash.py') | ||||
|  | ||||
|  | ||||
| class TestGetRules(object): | ||||
|     @pytest.fixture(autouse=True) | ||||
|     @pytest.fixture | ||||
|     def glob(self, mocker): | ||||
|         return mocker.patch('thefuck.corrector.Path.glob', return_value=[]) | ||||
|         results = {} | ||||
|         mocker.patch('pathlib.Path.glob', | ||||
|                      new_callable=lambda: lambda *_: results.pop('value', [])) | ||||
|         return lambda value: results.update({'value': value}) | ||||
|  | ||||
|     def _compare_names(self, rules, names): | ||||
|         return [r.name for r in rules] == names | ||||
|  | ||||
|     @pytest.mark.parametrize('conf_rules, rules', [ | ||||
|         (conf.DEFAULT_RULES, ['bash', 'lisp', 'bash', 'lisp']), | ||||
|         (types.RulesNamesList(['bash']), ['bash', 'bash'])]) | ||||
|     def test_get(self, monkeypatch, glob, conf_rules, rules): | ||||
|         glob.return_value = [PosixPath('bash.py'), PosixPath('lisp.py')] | ||||
|     @pytest.fixture(autouse=True) | ||||
|     def load_source(self, monkeypatch): | ||||
|         monkeypatch.setattr('thefuck.corrector.load_source', | ||||
|                             lambda x, _: Rule(x)) | ||||
|         assert self._compare_names( | ||||
|             corrector.get_rules(Path('~'), Mock(rules=conf_rules, priority={})), | ||||
|             rules) | ||||
|  | ||||
|     def _compare_names(self, rules, names): | ||||
|         assert {r.name for r in rules} == set(names) | ||||
|  | ||||
|     def _prepare_rules(self, rules): | ||||
|         if rules == conf.DEFAULT_RULES: | ||||
|             return rules | ||||
|         else: | ||||
|             return types.RulesNamesList(rules) | ||||
|  | ||||
|     @pytest.mark.parametrize('paths, conf_rules, exclude_rules, loaded_rules', [ | ||||
|         (['git.py', 'bash.py'], conf.DEFAULT_RULES, [], ['git', 'bash']), | ||||
|         (['git.py', 'bash.py'], ['git'], [], ['git']), | ||||
|         (['git.py', 'bash.py'], conf.DEFAULT_RULES, ['git'], ['bash']), | ||||
|         (['git.py', 'bash.py'], ['git'], ['git'], [])]) | ||||
|     def test_get_rules(self, glob, settings, paths, conf_rules, exclude_rules, | ||||
|                        loaded_rules): | ||||
|         glob([PosixPath(path) for path in paths]) | ||||
|         settings.update(rules=self._prepare_rules(conf_rules), | ||||
|                         priority={}, | ||||
|                         exclude_rules=self._prepare_rules(exclude_rules)) | ||||
|         rules = corrector.get_rules() | ||||
|         self._compare_names(rules, loaded_rules) | ||||
|  | ||||
|  | ||||
| class TestIsRuleMatch(object): | ||||
|     def test_no_match(self, settings): | ||||
|     def test_no_match(self): | ||||
|         assert not corrector.is_rule_match( | ||||
|             Command('ls'), Rule('', lambda *_: False), settings) | ||||
|             Command('ls'), Rule('', lambda _: False)) | ||||
|  | ||||
|     def test_match(self, settings): | ||||
|         rule = Rule('', lambda x, _: x.script == 'cd ..') | ||||
|         assert corrector.is_rule_match(Command('cd ..'), rule, settings) | ||||
|     def test_match(self): | ||||
|         rule = Rule('', lambda x: x.script == 'cd ..') | ||||
|         assert corrector.is_rule_match(Command('cd ..'), rule) | ||||
|  | ||||
|     def test_when_rule_failed(self, capsys, settings): | ||||
|     @pytest.mark.usefixtures('no_colors') | ||||
|     def test_when_rule_failed(self, capsys): | ||||
|         rule = Rule('test', Mock(side_effect=OSError('Denied')), | ||||
|                     requires_output=False) | ||||
|         assert not corrector.is_rule_match( | ||||
|             Command('ls'), rule, settings) | ||||
|         assert not corrector.is_rule_match(Command('ls'), rule) | ||||
|         assert capsys.readouterr()[1].split('\n')[0] == '[WARN] Rule test:' | ||||
|  | ||||
|  | ||||
| class TestMakeCorrectedCommands(object): | ||||
|     def test_with_rule_returns_list(self): | ||||
|         rule = Rule(get_new_command=lambda x, _: [x.script + '!', x.script + '@'], | ||||
|         rule = Rule(get_new_command=lambda x: [x.script + '!', x.script + '@'], | ||||
|                     priority=100) | ||||
|         assert list(make_corrected_commands(Command(script='test'), rule, None)) \ | ||||
|         assert list(make_corrected_commands(Command(script='test'), rule)) \ | ||||
|                == [CorrectedCommand(script='test!', priority=100), | ||||
|                    CorrectedCommand(script='test@', priority=200)] | ||||
|  | ||||
|     def test_with_rule_returns_command(self): | ||||
|         rule = Rule(get_new_command=lambda x, _: x.script + '!', | ||||
|         rule = Rule(get_new_command=lambda x: x.script + '!', | ||||
|                     priority=100) | ||||
|         assert list(make_corrected_commands(Command(script='test'), rule, None)) \ | ||||
|         assert list(make_corrected_commands(Command(script='test'), rule)) \ | ||||
|                == [CorrectedCommand(script='test!', priority=100)] | ||||
|  | ||||
| def test_get_corrected_commands(mocker): | ||||
|     command = Command('test', 'test', 'test') | ||||
|     rules = [Rule(match=lambda *_: False), | ||||
|              Rule(match=lambda *_: True, | ||||
|                   get_new_command=lambda x, _: x.script + '!', priority=100), | ||||
|              Rule(match=lambda *_: True, | ||||
|                   get_new_command=lambda x, _: [x.script + '@', x.script + ';'], | ||||
|     rules = [Rule(match=lambda _: False), | ||||
|              Rule(match=lambda _: True, | ||||
|                   get_new_command=lambda x: x.script + '!', priority=100), | ||||
|              Rule(match=lambda _: True, | ||||
|                   get_new_command=lambda x: [x.script + '@', x.script + ';'], | ||||
|                   priority=60)] | ||||
|     mocker.patch('thefuck.corrector.get_rules', return_value=rules) | ||||
|     assert [cmd.script for cmd in get_corrected_commands(command, None, Mock(debug=False))] \ | ||||
|     assert [cmd.script for cmd in get_corrected_commands(command)] \ | ||||
|            == ['test!', 'test@', 'test;'] | ||||
|   | ||||
| @@ -1,14 +1,20 @@ | ||||
| import pytest | ||||
| from mock import Mock | ||||
| from thefuck import logs | ||||
|  | ||||
|  | ||||
| def test_color(): | ||||
|     assert logs.color('red', Mock(no_colors=False)) == 'red' | ||||
|     assert logs.color('red', Mock(no_colors=True)) == '' | ||||
| def test_color(settings): | ||||
|     settings.no_colors = False | ||||
|     assert logs.color('red') == 'red' | ||||
|     settings.no_colors = True | ||||
|     assert logs.color('red') == '' | ||||
|  | ||||
|  | ||||
| def test_debug(capsys): | ||||
|     logs.debug('test', Mock(no_colors=True, debug=True)) | ||||
|     assert capsys.readouterr() == ('', 'DEBUG: test\n') | ||||
|     logs.debug('test', Mock(no_colors=True, debug=False)) | ||||
|     assert capsys.readouterr() == ('', '') | ||||
| @pytest.mark.usefixtures('no_colors') | ||||
| @pytest.mark.parametrize('debug, stderr', [ | ||||
|     (True, 'DEBUG: test\n'), | ||||
|     (False, '')]) | ||||
| def test_debug(capsys, settings, debug, stderr): | ||||
|     settings.debug = debug | ||||
|     logs.debug('test') | ||||
|     assert capsys.readouterr() == ('', stderr) | ||||
|   | ||||
| @@ -24,9 +24,9 @@ class TestGetCommand(object): | ||||
|         monkeypatch.setattr('thefuck.shells.from_shell', lambda x: x) | ||||
|         monkeypatch.setattr('thefuck.shells.to_shell', lambda x: x) | ||||
|  | ||||
|     def test_get_command_calls(self, Popen): | ||||
|         assert main.get_command(Mock(env={}), | ||||
|                                 ['thefuck', 'apt-get', 'search', 'vim']) \ | ||||
|     def test_get_command_calls(self, Popen, settings): | ||||
|         settings.env = {} | ||||
|         assert main.get_command(['thefuck', 'apt-get', 'search', 'vim']) \ | ||||
|                == Command('apt-get search vim', 'stdout', 'stderr') | ||||
|         Popen.assert_called_once_with('apt-get search vim', | ||||
|                                       shell=True, | ||||
| @@ -41,6 +41,6 @@ class TestGetCommand(object): | ||||
|         (['thefuck', 'ls'], 'ls')]) | ||||
|     def test_get_command_script(self, args, result): | ||||
|         if result: | ||||
|             assert main.get_command(Mock(env={}), args).script == result | ||||
|             assert main.get_command(args).script == result | ||||
|         else: | ||||
|             assert main.get_command(Mock(env={}), args) is None | ||||
|             assert main.get_command(args) is None | ||||
|   | ||||
| @@ -10,14 +10,6 @@ def test_rules_names_list(): | ||||
|     assert Rule('bash') not in RulesNamesList(['lisp']) | ||||
|  | ||||
|  | ||||
| def test_update_settings(): | ||||
|     settings = Settings({'key': 'val'}) | ||||
|     new_settings = settings.update(key='new-val', unset='unset-value') | ||||
|     assert new_settings.key == 'val' | ||||
|     assert new_settings.unset == 'unset-value' | ||||
|     assert settings.key == 'val' | ||||
|  | ||||
|  | ||||
| class TestSortedCorrectedCommandsSequence(object): | ||||
|     def test_realises_generator_only_on_demand(self, settings): | ||||
|         should_realise = False | ||||
| @@ -28,24 +20,23 @@ class TestSortedCorrectedCommandsSequence(object): | ||||
|             assert should_realise | ||||
|             yield CorrectedCommand('git checkout', priority=100) | ||||
|  | ||||
|         commands = SortedCorrectedCommandsSequence(gen(), settings) | ||||
|         commands = SortedCorrectedCommandsSequence(gen()) | ||||
|         assert commands[0] == CorrectedCommand('git commit') | ||||
|         should_realise = True | ||||
|         assert commands[1] == CorrectedCommand('git checkout', priority=100) | ||||
|         assert commands[2] == CorrectedCommand('git branch', priority=200) | ||||
|  | ||||
|     def test_remove_duplicates(self, settings): | ||||
|     def test_remove_duplicates(self): | ||||
|         side_effect = lambda *_: None | ||||
|         seq = SortedCorrectedCommandsSequence( | ||||
|             iter([CorrectedCommand('ls', priority=100), | ||||
|                   CorrectedCommand('ls', priority=200), | ||||
|                   CorrectedCommand('ls', side_effect, 300)]), | ||||
|             settings) | ||||
|                   CorrectedCommand('ls', side_effect, 300)])) | ||||
|         assert set(seq) == {CorrectedCommand('ls', priority=100), | ||||
|                             CorrectedCommand('ls', side_effect, 300)} | ||||
|  | ||||
|     def test_with_blank(self, settings): | ||||
|         seq = SortedCorrectedCommandsSequence(iter([]), settings) | ||||
|     def test_with_blank(self): | ||||
|         seq = SortedCorrectedCommandsSequence(iter([])) | ||||
|         assert list(seq) == [] | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -56,66 +56,55 @@ def test_command_selector(): | ||||
|     assert changes == [1, 2, 3, 1, 3] | ||||
|  | ||||
|  | ||||
| @pytest.mark.usefixtures('no_colors') | ||||
| class TestSelectCommand(object): | ||||
|     @pytest.fixture | ||||
|     def commands_with_side_effect(self, settings): | ||||
|     def commands_with_side_effect(self): | ||||
|         return SortedCorrectedCommandsSequence( | ||||
|             iter([CorrectedCommand('ls', lambda *_: None, 100), | ||||
|                   CorrectedCommand('cd', lambda *_: None, 100)]), | ||||
|             settings) | ||||
|                   CorrectedCommand('cd', lambda *_: None, 100)])) | ||||
|  | ||||
|     @pytest.fixture | ||||
|     def commands(self, settings): | ||||
|     def commands(self): | ||||
|         return SortedCorrectedCommandsSequence( | ||||
|             iter([CorrectedCommand('ls', None, 100), | ||||
|                   CorrectedCommand('cd', None, 100)]), | ||||
|             settings) | ||||
|                   CorrectedCommand('cd', None, 100)])) | ||||
|  | ||||
|     def test_without_commands(self, capsys): | ||||
|         assert ui.select_command([], Mock(debug=False, no_color=True)) is None | ||||
|         assert ui.select_command([]) is None | ||||
|         assert capsys.readouterr() == ('', 'No fucks given\n') | ||||
|  | ||||
|     def test_without_confirmation(self, capsys, commands): | ||||
|         assert ui.select_command(commands, | ||||
|                                  Mock(debug=False, no_color=True, | ||||
|                                       require_confirmation=False)) == commands[0] | ||||
|     def test_without_confirmation(self, capsys, commands, settings): | ||||
|         settings.require_confirmation = False | ||||
|         assert ui.select_command(commands) == commands[0] | ||||
|         assert capsys.readouterr() == ('', 'ls\n') | ||||
|  | ||||
|     def test_without_confirmation_with_side_effects(self, capsys, | ||||
|                                                     commands_with_side_effect): | ||||
|         assert ui.select_command(commands_with_side_effect, | ||||
|                                  Mock(debug=False, no_color=True, | ||||
|                                       require_confirmation=False)) \ | ||||
|     def test_without_confirmation_with_side_effects( | ||||
|             self, capsys, commands_with_side_effect, settings): | ||||
|         settings.require_confirmation = False | ||||
|         assert ui.select_command(commands_with_side_effect) \ | ||||
|                == commands_with_side_effect[0] | ||||
|         assert capsys.readouterr() == ('', 'ls (+side effect)\n') | ||||
|  | ||||
|     def test_with_confirmation(self, capsys, patch_getch, commands): | ||||
|         patch_getch(['\n']) | ||||
|         assert ui.select_command(commands, | ||||
|                                  Mock(debug=False, no_color=True, | ||||
|                                       require_confirmation=True)) == commands[0] | ||||
|         assert ui.select_command(commands) == commands[0] | ||||
|         assert capsys.readouterr() == ('', u'\x1b[1K\rls [enter/↑/↓/ctrl+c]\n') | ||||
|  | ||||
|     def test_with_confirmation_abort(self, capsys, patch_getch, commands): | ||||
|         patch_getch([KeyboardInterrupt]) | ||||
|         assert ui.select_command(commands, | ||||
|                                  Mock(debug=False, no_color=True, | ||||
|                                       require_confirmation=True)) is None | ||||
|         assert ui.select_command(commands) is None | ||||
|         assert capsys.readouterr() == ('', u'\x1b[1K\rls [enter/↑/↓/ctrl+c]\nAborted\n') | ||||
|  | ||||
|     def test_with_confirmation_with_side_effct(self, capsys, patch_getch, | ||||
|                                                commands_with_side_effect): | ||||
|         patch_getch(['\n']) | ||||
|         assert ui.select_command(commands_with_side_effect, | ||||
|                                  Mock(debug=False, no_color=True, | ||||
|                                       require_confirmation=True))\ | ||||
|         assert ui.select_command(commands_with_side_effect)\ | ||||
|                == commands_with_side_effect[0] | ||||
|         assert capsys.readouterr() == ('', u'\x1b[1K\rls (+side effect) [enter/↑/↓/ctrl+c]\n') | ||||
|  | ||||
|     def test_with_confirmation_select_second(self, capsys, patch_getch, commands): | ||||
|         patch_getch(['\x1b', '[', 'B', '\n']) | ||||
|         assert ui.select_command(commands, | ||||
|                                  Mock(debug=False, no_color=True, | ||||
|                                       require_confirmation=True)) == commands[1] | ||||
|         assert ui.select_command(commands) == commands[1] | ||||
|         assert capsys.readouterr() == ( | ||||
|             '', u'\x1b[1K\rls [enter/↑/↓/ctrl+c]\x1b[1K\rcd [enter/↑/↓/ctrl+c]\n') | ||||
|   | ||||
| @@ -1,10 +1,9 @@ | ||||
| import pytest | ||||
| from mock import Mock | ||||
| import six | ||||
| from thefuck.utils import wrap_settings, \ | ||||
| from thefuck.utils import default_settings, \ | ||||
|     memoize, get_closest, get_all_executables, replace_argument, \ | ||||
|     get_all_matched_commands, is_app, for_app, cache | ||||
| from thefuck.types import Settings | ||||
|     get_all_matched_commands, is_app, for_app, cache, compatibility_call | ||||
| from tests.utils import Command | ||||
|  | ||||
|  | ||||
| @@ -12,9 +11,12 @@ from tests.utils import Command | ||||
|     ({'key': 'val'}, {}, {'key': 'val'}), | ||||
|     ({'key': 'new-val'}, {'key': 'val'}, {'key': 'val'}), | ||||
|     ({'key': 'new-val', 'unset': 'unset'}, {'key': 'val'}, {'key': 'val', 'unset': 'unset'})]) | ||||
| def test_wrap_settings(override, old, new): | ||||
|     fn = lambda _, settings: settings | ||||
|     assert wrap_settings(override)(fn)(None, Settings(old)) == new | ||||
| def test_default_settings(settings, override, old, new): | ||||
|     settings.clear() | ||||
|     settings.update(old) | ||||
|     fn = lambda _: _ | ||||
|     default_settings(override)(fn)(None) | ||||
|     assert settings == new | ||||
|  | ||||
|  | ||||
| def test_memoize(): | ||||
| @@ -53,7 +55,7 @@ def get_aliases(mocker): | ||||
|  | ||||
|  | ||||
| @pytest.mark.usefixtures('no_memoize', 'get_aliases') | ||||
| def test_get_all_callables(): | ||||
| def test_get_all_executables(): | ||||
|     all_callables = get_all_executables() | ||||
|     assert 'vim' in all_callables | ||||
|     assert 'fsck' in all_callables | ||||
| @@ -112,10 +114,10 @@ def test_is_app(script, names, result): | ||||
|     ('hg diff', ['git', 'hub'], False)]) | ||||
| def test_for_app(script, names, result): | ||||
|     @for_app(*names) | ||||
|     def match(command, settings): | ||||
|     def match(command): | ||||
|         return True | ||||
|  | ||||
|     assert match(Command(script), None) == result | ||||
|     assert match(Command(script)) == result | ||||
|  | ||||
|  | ||||
| class TestCache(object): | ||||
| @@ -180,3 +182,50 @@ class TestCache(object): | ||||
|         shelve.update({key: {'etag': '-1', 'value': 'old-value'}}) | ||||
|         assert fn() == 'test' | ||||
|         assert shelve == {key: {'etag': '0', 'value': 'test'}} | ||||
|  | ||||
|  | ||||
| class TestCompatibilityCall(object): | ||||
|     def test_match(self): | ||||
|         def match(command): | ||||
|             assert command == Command() | ||||
|             return True | ||||
|  | ||||
|         assert compatibility_call(match, Command()) | ||||
|  | ||||
|     def test_old_match(self, settings): | ||||
|         def match(command, _settings): | ||||
|             assert command == Command() | ||||
|             assert settings == _settings | ||||
|             return True | ||||
|  | ||||
|         assert compatibility_call(match, Command()) | ||||
|  | ||||
|     def test_get_new_command(self): | ||||
|         def get_new_command(command): | ||||
|             assert command == Command() | ||||
|             return True | ||||
|  | ||||
|         assert compatibility_call(get_new_command, Command()) | ||||
|  | ||||
|     def test_old_get_new_command(self, settings): | ||||
|         def get_new_command(command, _settings): | ||||
|             assert command == Command() | ||||
|             assert settings == _settings | ||||
|             return True | ||||
|  | ||||
|         assert compatibility_call(get_new_command, Command()) | ||||
|  | ||||
|     def test_side_effect(self): | ||||
|         def side_effect(command, new_command): | ||||
|             assert command == Command() == new_command | ||||
|             return True | ||||
|  | ||||
|         assert compatibility_call(side_effect, Command(), Command()) | ||||
|  | ||||
|     def test_old_side_effect(self, settings): | ||||
|         def side_effect(command, new_command, _settings): | ||||
|             assert command == Command() == new_command | ||||
|             assert settings == _settings | ||||
|             return True | ||||
|  | ||||
|         assert compatibility_call(side_effect, Command(), Command()) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user