diff --git a/tests/rules/test_su.py b/tests/rules/test_su.py new file mode 100644 index 00000000..998d9307 --- /dev/null +++ b/tests/rules/test_su.py @@ -0,0 +1,25 @@ +import pytest +from thefuck.rules.su import match, get_new_command +from thefuck.types import Command + + +@pytest.mark.parametrize('output', [ + 'command not found: sudo']) +def test_match(output): + assert match(Command('', output)) + + +def test_not_match(): + assert not match(Command('', '')) + assert not match(Command('sudo ls', 'Permission denied')) + assert not match(Command('su -c ls', 'Permission denied')) + assert not match(Command('ls', 'command not found: ls')) + + +@pytest.mark.parametrize('before, after', [ + ('sudo ls', 'su -c "ls"'), + ('sudo echo a > b', 'su -c "echo a > b"'), + ('sudo echo "a" >> b', 'su -c "echo \\"a\\" >> b"'), + ('sudo mkdir && touch a', 'su -c "mkdir && touch a"')]) +def test_get_new_command(before, after): + assert get_new_command(Command(before, '')) == after diff --git a/thefuck/rules/su.py b/thefuck/rules/su.py index 4233e4ed..14dbdac1 100644 --- a/thefuck/rules/su.py +++ b/thefuck/rules/su.py @@ -6,10 +6,7 @@ def match(command): def get_new_command(command): - if '&&' in command.script: - return u'su -c "sh -c "{}""'.format(" ".join([part for part in command.script_parts if part != "sudo"])) - elif '>' in command.script: - return u'su -c "sh -c "{}""'.format(command.script.replace('"', '\\"')) - else: - return u'su -c {}'.format(command.script) + return u'su -c "{}"'.format(command.script.replace('"', '\\"').replace('sudo ', '')) + + priority = 1200