1
0
mirror of https://github.com/nvbn/thefuck.git synced 2024-10-06 10:51:11 +01:00
thefuck/tests/test_main.py

172 lines
6.9 KiB
Python
Raw Normal View History

2015-05-02 03:29:55 +01:00
import pytest
2015-04-08 17:15:49 +01:00
from subprocess import PIPE
from pathlib import PosixPath, Path
2015-05-02 03:29:55 +01:00
from mock import Mock
2015-04-22 22:04:22 +01:00
from thefuck import main, conf, types
from tests.utils import Rule, Command
2015-04-08 17:15:49 +01:00
2015-05-02 03:29:55 +01:00
def test_load_rule(monkeypatch):
2015-04-08 17:15:49 +01:00
match = object()
get_new_command = object()
2015-05-02 03:29:55 +01:00
load_source = Mock()
load_source.return_value = Mock(match=match,
get_new_command=get_new_command,
2015-05-06 12:57:09 +01:00
enabled_by_default=True,
priority=900)
2015-05-02 03:29:55 +01:00
monkeypatch.setattr('thefuck.main.load_source', load_source)
assert main.load_rule(Path('/rules/bash.py')) \
2015-05-06 12:57:09 +01:00
== Rule('bash', match, get_new_command, priority=900)
2015-05-02 03:29:55 +01:00
load_source.assert_called_once_with('bash', '/rules/bash.py')
2015-05-06 12:57:09 +01:00
class TestGetRules(object):
@pytest.fixture(autouse=True)
def glob(self, monkeypatch):
mock = Mock(return_value=[])
monkeypatch.setattr('thefuck.main.Path.glob', mock)
return mock
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')]
monkeypatch.setattr('thefuck.main.load_source',
lambda x, _: Rule(x))
assert self._compare_names(
main.get_rules(Path('~'), Mock(rules=conf_rules)), rules)
@pytest.mark.parametrize('unordered, ordered', [
([Rule('bash', priority=100), Rule('python', priority=5)],
['python', 'bash']),
([Rule('lisp', priority=9999), Rule('c', priority=conf.DEFAULT_PRIORITY)],
['c', 'lisp'])])
def test_ordered_by_priority(self, monkeypatch, unordered, ordered):
monkeypatch.setattr('thefuck.main._get_loaded_rules',
lambda *_: unordered)
assert self._compare_names(main.get_rules(Path('~'), Mock()), ordered)
2015-05-02 03:29:55 +01:00
class TestGetCommand(object):
@pytest.fixture(autouse=True)
def Popen(self, monkeypatch):
Popen = Mock()
2015-04-08 17:15:49 +01:00
Popen.return_value.stdout.read.return_value = b'stdout'
Popen.return_value.stderr.read.return_value = b'stderr'
2015-05-02 03:29:55 +01:00
monkeypatch.setattr('thefuck.main.Popen', Popen)
return Popen
@pytest.fixture(autouse=True)
def prepare(self, monkeypatch):
monkeypatch.setattr('thefuck.main.os.environ', {})
monkeypatch.setattr('thefuck.main.wait_output', lambda *_: True)
@pytest.fixture(autouse=True)
def generic_shell(self, monkeypatch):
monkeypatch.setattr('thefuck.shells.from_shell', lambda x: x)
monkeypatch.setattr('thefuck.shells.to_shell', lambda x: x)
2015-05-02 03:29:55 +01:00
def test_get_command_calls(self, Popen):
2015-05-04 03:44:16 +01:00
assert main.get_command(Mock(),
['thefuck', 'apt-get', 'search', 'vim']) \
== Command('apt-get search vim', 'stdout', 'stderr')
2015-04-08 17:15:49 +01:00
Popen.assert_called_once_with('apt-get search vim',
shell=True,
stdout=PIPE,
stderr=PIPE,
env={'LANG': 'C'})
2015-05-06 12:57:09 +01:00
2015-05-04 03:44:16 +01:00
@pytest.mark.parametrize('args, result', [
(['thefuck', 'ls', '-la'], 'ls -la'),
(['thefuck', 'ls'], 'ls')])
def test_get_command_script(self, args, result):
2015-05-02 03:29:55 +01:00
if result:
2015-05-04 03:44:16 +01:00
assert main.get_command(Mock(), args).script == result
2015-05-02 03:29:55 +01:00
else:
2015-05-04 03:44:16 +01:00
assert main.get_command(Mock(), args) is None
2015-05-02 03:29:55 +01:00
class TestGetMatchedRule(object):
def test_no_match(self):
assert main.get_matched_rule(
Command('ls'), [Rule('', lambda *_: False)],
Mock(no_colors=True)) is None
def test_match(self):
rule = Rule('', lambda x, _: x.script == 'cd ..')
assert main.get_matched_rule(
Command('cd ..'), [rule], Mock(no_colors=True)) == rule
def test_when_rule_failed(self, capsys):
main.get_matched_rule(
Command('ls'), [Rule('test', Mock(side_effect=OSError('Denied')))],
Mock(no_colors=True))
assert capsys.readouterr()[1].split('\n')[0] == '[WARN] Rule test:'
class TestRunRule(object):
@pytest.fixture(autouse=True)
def confirm(self, monkeypatch):
mock = Mock(return_value=True)
monkeypatch.setattr('thefuck.main.confirm', mock)
return mock
def test_run_rule(self, capsys):
main.run_rule(Rule(get_new_command=lambda *_: 'new-command'),
2015-05-04 03:44:16 +01:00
Command(), None)
2015-04-21 04:30:15 +01:00
assert capsys.readouterr() == ('new-command\n', '')
2015-05-02 03:29:55 +01:00
def test_run_rule_with_side_effect(self, capsys):
side_effect = Mock()
settings = Mock()
2015-05-02 03:29:55 +01:00
command = Command()
main.run_rule(Rule(get_new_command=lambda *_: 'new-command',
side_effect=side_effect),
2015-05-04 03:44:16 +01:00
command, settings)
assert capsys.readouterr() == ('new-command\n', '')
side_effect.assert_called_once_with(command, settings)
2015-05-02 03:29:55 +01:00
def test_when_not_comfirmed(self, capsys, confirm):
confirm.return_value = False
main.run_rule(Rule(get_new_command=lambda *_: 'new-command'),
2015-05-04 03:44:16 +01:00
Command(), None)
2015-04-21 04:30:15 +01:00
assert capsys.readouterr() == ('', '')
2015-05-02 03:29:55 +01:00
class TestConfirm(object):
@pytest.fixture
def stdin(self, monkeypatch):
mock = Mock(return_value='\n')
monkeypatch.setattr('sys.stdin.read', mock)
return mock
def test_when_not_required(self, capsys):
assert main.confirm('command', None, Mock(require_confirmation=False))
assert capsys.readouterr() == ('', 'command\n')
def test_with_side_effect_and_without_confirmation(self, capsys):
assert main.confirm('command', Mock(), Mock(require_confirmation=False))
assert capsys.readouterr() == ('', 'command*\n')
# `stdin` fixture should be applied after `capsys`
def test_when_confirmation_required_and_confirmed(self, capsys, stdin):
assert main.confirm('command', None, Mock(require_confirmation=True,
no_colors=True))
2015-04-22 05:03:06 +01:00
assert capsys.readouterr() == ('', 'command [enter/ctrl+c]')
2015-05-02 03:29:55 +01:00
# `stdin` fixture should be applied after `capsys`
def test_when_confirmation_required_and_confirmed_with_side_effect(self, capsys, stdin):
assert main.confirm('command', Mock(), Mock(require_confirmation=True,
no_colors=True))
assert capsys.readouterr() == ('', 'command* [enter/ctrl+c]')
2015-05-02 03:29:55 +01:00
def test_when_confirmation_required_and_aborted(self, capsys, stdin):
stdin.side_effect = KeyboardInterrupt
assert not main.confirm('command', None, Mock(require_confirmation=True,
no_colors=True))
2015-04-22 05:03:06 +01:00
assert capsys.readouterr() == ('', 'command [enter/ctrl+c]Aborted\n')