mirror of
				https://github.com/nvbn/thefuck.git
				synced 2025-10-30 22:54:14 +00:00 
			
		
		
		
	| @@ -5,34 +5,38 @@ from tests.utils import Command | ||||
|  | ||||
| @pytest.fixture | ||||
| def composer_not_command(): | ||||
|     return """ | ||||
|  | ||||
|                                      | ||||
|   [InvalidArgumentException]         | ||||
|   Command "udpate" is not defined.   | ||||
|   Did you mean this?                 | ||||
|       update | ||||
|  | ||||
|  | ||||
| """ | ||||
|     # that weird spacing is part of the actual command output | ||||
|     return ( | ||||
|         '\n' | ||||
|         '\n' | ||||
|         '                                    \n' | ||||
|         '  [InvalidArgumentException]        \n' | ||||
|         '  Command "udpate" is not defined.  \n' | ||||
|         '  Did you mean this?                \n' | ||||
|         '      update                        \n' | ||||
|         '                                    \n' | ||||
|         '\n' | ||||
|         '\n' | ||||
|     ) | ||||
|  | ||||
|  | ||||
| @pytest.fixture | ||||
| def composer_not_command_one_of_this(): | ||||
|     return """ | ||||
|                              | ||||
|  | ||||
|  | ||||
|   [InvalidArgumentException]        | ||||
|   Command "pdate" is not defined.   | ||||
|   Did you mean one of these?        | ||||
|       selfupdate                    | ||||
|       self-update                   | ||||
|       update                        | ||||
|  | ||||
|  | ||||
|  | ||||
| """ | ||||
|     # that weird spacing is part of the actual command output | ||||
|     return ( | ||||
|         '\n' | ||||
|         '\n' | ||||
|         '                                   \n' | ||||
|         '  [InvalidArgumentException]       \n' | ||||
|         '  Command "pdate" is not defined.  \n' | ||||
|         '  Did you mean one of these?       \n' | ||||
|         '      selfupdate                   \n' | ||||
|         '      self-update                  \n' | ||||
|         '      update                       \n' | ||||
|         '                                   \n' | ||||
|         '\n' | ||||
|         '\n' | ||||
|     ) | ||||
|  | ||||
|  | ||||
| def test_match(composer_not_command, composer_not_command_one_of_this): | ||||
|   | ||||
| @@ -40,6 +40,7 @@ parametrize_script = pytest.mark.parametrize('script, fixed', [ | ||||
|     ('tar -xvf {}', 'mkdir -p foo && tar -xvf {} -C foo'), | ||||
|     ('tar --extract -f {}', 'mkdir -p foo && tar --extract -f {} -C foo')]) | ||||
|  | ||||
|  | ||||
| @parametrize_filename | ||||
| @parametrize_script | ||||
| def test_match(tar_error, filename, script, fixed): | ||||
|   | ||||
| @@ -2,11 +2,12 @@ import pytest | ||||
| import os | ||||
| from thefuck.rules.fix_file import match, get_new_command | ||||
| from tests.utils import Command | ||||
| from thefuck.types import Settings | ||||
|  | ||||
|  | ||||
| # (script, file, line, col (or None), stderr) | ||||
| # (script, file, line, col (or None), stdout, stderr) | ||||
| tests = ( | ||||
| ('gcc a.c', 'a.c', 3, 1, | ||||
| ('gcc a.c', 'a.c', 3, 1, '', | ||||
| """ | ||||
| a.c: In function 'main': | ||||
| a.c:3:1: error: expected expression before '}' token | ||||
| @@ -14,47 +15,47 @@ a.c:3:1: error: expected expression before '}' token | ||||
|   ^ | ||||
| """), | ||||
|  | ||||
| ('clang a.c', 'a.c', 3, 1, | ||||
| ('clang a.c', 'a.c', 3, 1, '', | ||||
| """ | ||||
| a.c:3:1: error: expected expression | ||||
| } | ||||
| ^ | ||||
| """), | ||||
|  | ||||
| ('perl a.pl', 'a.pl', 3, None, | ||||
| ('perl a.pl', 'a.pl', 3, None, '', | ||||
| """ | ||||
| syntax error at a.pl line 3, at EOF | ||||
| Execution of a.pl aborted due to compilation errors. | ||||
| """), | ||||
|  | ||||
| ('perl a.pl', 'a.pl', 2, None, | ||||
| ('perl a.pl', 'a.pl', 2, None, '', | ||||
| """ | ||||
| Search pattern not terminated at a.pl line 2. | ||||
| """), | ||||
|  | ||||
| ('sh a.sh', 'a.sh', 2, None, | ||||
| ('sh a.sh', 'a.sh', 2, None, '', | ||||
| """ | ||||
| a.sh: line 2: foo: command not found | ||||
| """), | ||||
|  | ||||
| ('zsh a.sh', 'a.sh', 2, None, | ||||
| ('zsh a.sh', 'a.sh', 2, None, '', | ||||
| """ | ||||
| a.sh:2: command not found: foo | ||||
| """), | ||||
|  | ||||
| ('bash a.sh', 'a.sh', 2, None, | ||||
| ('bash a.sh', 'a.sh', 2, None, '', | ||||
| """ | ||||
| a.sh: line 2: foo: command not found | ||||
| """), | ||||
|  | ||||
| ('rustc a.rs', 'a.rs', 2, 5, | ||||
| ('rustc a.rs', 'a.rs', 2, 5, '', | ||||
| """ | ||||
| a.rs:2:5: 2:6 error: unexpected token: `+` | ||||
| a.rs:2     + | ||||
|            ^ | ||||
| """), | ||||
|  | ||||
| ('cargo build', 'src/lib.rs', 3, 5, | ||||
| ('cargo build', 'src/lib.rs', 3, 5, '', | ||||
| """ | ||||
|    Compiling test v0.1.0 (file:///tmp/fix-error/test) | ||||
|    src/lib.rs:3:5: 3:6 error: unexpected token: `+` | ||||
| @@ -65,7 +66,7 @@ Could not compile `test`. | ||||
| To learn more, run the command again with --verbose. | ||||
| """), | ||||
|  | ||||
| ('python a.py', 'a.py', 2, None, | ||||
| ('python a.py', 'a.py', 2, None, '', | ||||
| """ | ||||
|   File "a.py", line 2 | ||||
|       + | ||||
| @@ -73,7 +74,7 @@ To learn more, run the command again with --verbose. | ||||
| SyntaxError: invalid syntax | ||||
| """), | ||||
|  | ||||
| ('python a.py', 'a.py', 8, None, | ||||
| ('python a.py', 'a.py', 8, None, '', | ||||
| """ | ||||
| Traceback (most recent call last): | ||||
|   File "a.py", line 8, in <module> | ||||
| @@ -85,46 +86,45 @@ Traceback (most recent call last): | ||||
|   File "/usr/lib/python3.4/re.py", line 293, in _compile | ||||
|     raise TypeError("first argument must be string or compiled pattern") | ||||
| TypeError: first argument must be string or compiled pattern | ||||
| """ | ||||
| ), | ||||
| """), | ||||
|  | ||||
| ('ruby a.rb', 'a.rb', 3, None, | ||||
| ('ruby a.rb', 'a.rb', 3, None, '', | ||||
| """ | ||||
| a.rb:3: syntax error, unexpected keyword_end | ||||
| """), | ||||
|  | ||||
| ('lua a.lua', 'a.lua', 2, None, | ||||
| ('lua a.lua', 'a.lua', 2, None, '', | ||||
| """ | ||||
| lua: a.lua:2: unexpected symbol near '+' | ||||
| """), | ||||
|  | ||||
| ('fish a.sh', '/tmp/fix-error/a.sh', 2, None, | ||||
| ('fish a.sh', '/tmp/fix-error/a.sh', 2, None, '', | ||||
| """ | ||||
| fish: Unknown command 'foo' | ||||
| /tmp/fix-error/a.sh (line 2): foo | ||||
|                               ^ | ||||
| """), | ||||
|  | ||||
| ('./a', './a', 2, None, | ||||
| ('./a', './a', 2, None, '', | ||||
| """ | ||||
| awk: ./a:2: BEGIN { print "Hello, world!" + } | ||||
| awk: ./a:2:                                 ^ syntax error | ||||
| """), | ||||
|  | ||||
| ('llc a.ll', 'a.ll', 1, None, | ||||
| ('llc a.ll', 'a.ll', 1, 2, '', | ||||
| """ | ||||
| llc: a.ll:1:1: error: expected top-level entity | ||||
| llc: a.ll:1:2: error: expected top-level entity | ||||
| + | ||||
| ^ | ||||
| """), | ||||
|  | ||||
| ('go build a.go', 'a.go', 1, None, | ||||
| ('go build a.go', 'a.go', 1, 2, '', | ||||
| """ | ||||
| can't load package: | ||||
| a.go:1:1: expected 'package', found '+' | ||||
| a.go:1:2: expected 'package', found '+' | ||||
| """), | ||||
|  | ||||
| ('make', 'Makefile', 2, None, | ||||
| ('make', 'Makefile', 2, None, '', | ||||
| """ | ||||
| bidule | ||||
| make: bidule: Command not found | ||||
| @@ -132,12 +132,12 @@ Makefile:2: recipe for target 'target' failed | ||||
| make: *** [target] Error 127 | ||||
| """), | ||||
|  | ||||
| ('git st', '/home/martin/.config/git/config', 1, None, | ||||
| ('git st', '/home/martin/.config/git/config', 1, None, '', | ||||
| """ | ||||
| fatal: bad config file line 1 in /home/martin/.config/git/config | ||||
| """), | ||||
|  | ||||
| ('node fuck.js asdf qwer', '/Users/pablo/Workspace/barebones/fuck.js', '2', 5, | ||||
| ('node fuck.js asdf qwer', '/Users/pablo/Workspace/barebones/fuck.js', '2', 5, '', | ||||
| """ | ||||
| /Users/pablo/Workspace/barebones/fuck.js:2 | ||||
| conole.log(arg);  // this should read console.log(arg); | ||||
| @@ -154,35 +154,81 @@ ReferenceError: conole is not defined | ||||
|     at startup (node.js:129:16) | ||||
|     at node.js:814:3 | ||||
| """), | ||||
|  | ||||
| ('pep8', './tests/rules/test_systemctl.py', 17, 80, | ||||
| """ | ||||
| ./tests/rules/test_systemctl.py:17:80: E501 line too long (93 > 79 characters) | ||||
| ./tests/rules/test_systemctl.py:18:80: E501 line too long (103 > 79 characters) | ||||
| ./tests/rules/test_whois.py:20:80: E501 line too long (89 > 79 characters) | ||||
| ./tests/rules/test_whois.py:22:80: E501 line too long (83 > 79 characters) | ||||
| """, ''), | ||||
|  | ||||
| ('py.test', '/home/thefuck/tests/rules/test_fix_file.py', 218, None, | ||||
| """ | ||||
| monkeypatch = <_pytest.monkeypatch.monkeypatch object at 0x7fdb76a25b38> | ||||
| test = ('fish a.sh', '/tmp/fix-error/a.sh', 2, None, '', "\\nfish: Unknown command 'foo'\\n/tmp/fix-error/a.sh (line 2): foo\\n                              ^\\n") | ||||
|  | ||||
|     @pytest.mark.parametrize('test', tests) | ||||
|     @pytest.mark.usefixtures('no_memoize') | ||||
|     def test_get_new_command(monkeypatch, test): | ||||
| >       mocker.patch('os.path.isfile', return_value=True) | ||||
| E       NameError: name 'mocker' is not defined | ||||
|  | ||||
| /home/thefuck/tests/rules/test_fix_file.py:218: NameError | ||||
| """, ''), | ||||
| ) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('test', tests) | ||||
| @pytest.mark.usefixtures('no_memoize') | ||||
| def test_match(mocker, monkeypatch, test): | ||||
|     mocker.patch('os.path.isfile', return_value=True) | ||||
|     monkeypatch.setenv('EDITOR', 'dummy_editor') | ||||
|     assert match(Command(stderr=test[4]), None) | ||||
|     assert match(Command(stdout=test[4], stderr=test[5]), None) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('test', tests) | ||||
| @pytest.mark.usefixtures('no_memoize') | ||||
| def test_no_editor(mocker, monkeypatch, test): | ||||
|     mocker.patch('os.path.isfile', return_value=True) | ||||
|     if 'EDITOR' in os.environ: | ||||
|         monkeypatch.delenv('EDITOR') | ||||
|  | ||||
|     assert not match(Command(stderr=test[4]), None) | ||||
|     assert not match(Command(stdout=test[4], stderr=test[5]), None) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('test', tests) | ||||
| @pytest.mark.usefixtures('no_memoize') | ||||
| def test_not_file(mocker, monkeypatch, test): | ||||
|     mocker.patch('os.path.isfile', return_value=False) | ||||
|     monkeypatch.setenv('EDITOR', 'dummy_editor') | ||||
|  | ||||
|     assert not match(Command(stderr=test[4]), None) | ||||
|     assert not match(Command(stdout=test[4], stderr=test[5]), None) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('test', tests) | ||||
| def test_get_new_command(monkeypatch, test): | ||||
| @pytest.mark.usefixtures('no_memoize') | ||||
| def test_get_new_command(mocker, monkeypatch, test): | ||||
|     mocker.patch('os.path.isfile', return_value=True) | ||||
|     monkeypatch.setenv('EDITOR', 'dummy_editor') | ||||
|     assert (get_new_command(Command(script=test[0], stderr=test[4]), None) == | ||||
|         'dummy_editor {} +{} && {}'.format(test[1], test[2], test[0])) | ||||
|  | ||||
|     cmd = Command(script=test[0], stdout=test[4], stderr=test[5]) | ||||
|     #assert (get_new_command(cmd, Settings({})) == | ||||
|     #    'dummy_editor {} +{} && {}'.format(test[1], test[2], test[0])) | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('test', tests) | ||||
| @pytest.mark.usefixtures('no_memoize') | ||||
| def test_get_new_command_with_settings(mocker, monkeypatch, test): | ||||
|     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}'}) | ||||
|  | ||||
|     if test[3]: | ||||
|         assert (get_new_command(cmd, settings) == | ||||
|             'dummy_editor {} +{}:{} && {}'.format(test[1], test[2], test[3], test[0])) | ||||
|     else: | ||||
|         assert (get_new_command(cmd, settings) == | ||||
|             'dummy_editor {} +{} && {}'.format(test[1], test[2], test[0])) | ||||
|   | ||||
| @@ -2,6 +2,7 @@ from thefuck import shells | ||||
| from thefuck.rules.git_branch_list import match, get_new_command | ||||
| from tests.utils import Command | ||||
|  | ||||
|  | ||||
| def test_match(): | ||||
|     assert match(Command('git branch list'), None) | ||||
|  | ||||
|   | ||||
| @@ -10,7 +10,7 @@ usage: git stash list [<options>] | ||||
|    or: git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>] | ||||
|    or: git stash branch <branchname> [<stash>] | ||||
|    or: git stash [save [--patch] [-k|--[no-]keep-index] [-q|--quiet] | ||||
| 		       [-u|--include-untracked] [-a|--all] [<message>]] | ||||
| \t\t       [-u|--include-untracked] [-a|--all] [<message>]] | ||||
|    or: git stash clear | ||||
| ''' | ||||
|  | ||||
|   | ||||
| @@ -30,8 +30,8 @@ def git_not_command_closest(): | ||||
|     return '''git: 'tags' is not a git command. See 'git --help'. | ||||
|  | ||||
| Did you mean one of these? | ||||
| 	stage | ||||
| 	tag | ||||
| \tstage | ||||
| \ttag | ||||
| ''' | ||||
|  | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,7 @@ from tests.utils import Command | ||||
|  | ||||
|  | ||||
| @pytest.mark.parametrize('command', [ | ||||
|     Command(script='go run foo'),  | ||||
|     Command(script='go run foo'), | ||||
|     Command(script='go run bar')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|   | ||||
| @@ -9,7 +9,10 @@ from tests.utils import Command | ||||
|     Command(script='open foo.org'), | ||||
|     Command(script='open foo.net'), | ||||
|     Command(script='open foo.se'), | ||||
|     Command(script='open foo.io')]) | ||||
|     Command(script='open foo.io'), | ||||
|     Command(script='xdg-open foo.com'), | ||||
|     Command(script='gnome-open foo.com'), | ||||
|     Command(script='kde-open foo.com')]) | ||||
| def test_match(command): | ||||
|     assert match(command, None) | ||||
|  | ||||
| @@ -20,6 +23,9 @@ def test_match(command): | ||||
|     (Command('open foo.org'), 'open http://foo.org'), | ||||
|     (Command('open foo.net'), 'open http://foo.net'), | ||||
|     (Command('open foo.se'), 'open http://foo.se'), | ||||
|     (Command('open foo.io'), 'open http://foo.io')]) | ||||
|     (Command('open foo.io'), 'open http://foo.io'), | ||||
|     (Command('xdg-open foo.io'), 'xdg-open http://foo.io'), | ||||
|     (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 | ||||
|   | ||||
| @@ -3,7 +3,6 @@ from thefuck.rules.systemctl import match, get_new_command | ||||
| 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) | ||||
| @@ -13,6 +12,7 @@ def test_match(): | ||||
|     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) | ||||
|  | ||||
|  | ||||
| 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" | ||||
|   | ||||
							
								
								
									
										19
									
								
								tests/test_readme.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								tests/test_readme.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,19 @@ | ||||
| from pathlib import Path | ||||
|  | ||||
|  | ||||
| def test_readme(): | ||||
|     with open('README.md') as f: | ||||
|         readme = f.read() | ||||
|  | ||||
|         bundled = Path(__file__).parent.parent \ | ||||
|             .joinpath('thefuck') \ | ||||
|             .joinpath('rules') \ | ||||
|             .glob('*.py') | ||||
|  | ||||
|         for rule in bundled: | ||||
|             if rule.stem != '__init__' and rule.stem not in readme: | ||||
|                 raise Exception('Missing rule "{}" in README.md'.format(rule.stem)) | ||||
|  | ||||
|  | ||||
| if __name__ == '__main__': | ||||
|     test_readme() | ||||
| @@ -11,6 +11,7 @@ def test_rules_names_list(): | ||||
|  | ||||
| def test_update_settings(): | ||||
|     settings = Settings({'key': 'val'}) | ||||
|     new_settings = settings.update(key='new-val') | ||||
|     assert new_settings.key == 'new-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' | ||||
|   | ||||
| @@ -9,7 +9,8 @@ from tests.utils import Command | ||||
|  | ||||
| @pytest.mark.parametrize('override, old, new', [ | ||||
|     ({'key': 'val'}, {}, {'key': 'val'}), | ||||
|     ({'key': 'new-val'}, {'key': 'val'}, {'key': 'new-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 | ||||
|   | ||||
		Reference in New Issue
	
	Block a user