mirror of
				https://github.com/nvbn/thefuck.git
				synced 2025-10-31 07:04:12 +00:00 
			
		
		
		
	Some improvements (#846)
* #833: do not require sudo on TravisCI * #N/A: Add Python dev releases to TravisCI pipeline Inspired by Brett Cannon's advise [1]. 1: https://snarky.ca/how-to-use-your-project-travis-to-help-test-python-itself/ * #837: try and kill proc and its children * #N/A: show shell information on `thefuck --version` * #N/A: omit default arguments to get_close_matches * #842: add settings var to control number of close matches * #N/A: remove `n` from the list of `get_closest`'s args
This commit is contained in:
		
				
					committed by
					
						 Vladimir Iakovlev
						Vladimir Iakovlev
					
				
			
			
				
	
			
			
			
						parent
						
							5fd4f74701
						
					
				
				
					commit
					25142f81f8
				
			
							
								
								
									
										58
									
								
								tests/output_readers/test_rerun.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										58
									
								
								tests/output_readers/test_rerun.py
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,58 @@ | ||||
| # -*- encoding: utf-8 -*- | ||||
|  | ||||
| from mock import Mock, patch | ||||
| from psutil import AccessDenied, TimeoutExpired | ||||
|  | ||||
| from thefuck.output_readers import rerun | ||||
|  | ||||
|  | ||||
| class TestRerun(object): | ||||
|     def setup_method(self, test_method): | ||||
|         self.patcher = patch('thefuck.output_readers.rerun.Process') | ||||
|         process_mock = self.patcher.start() | ||||
|         self.proc_mock = process_mock.return_value = Mock() | ||||
|  | ||||
|     def teardown_method(self, test_method): | ||||
|         self.patcher.stop() | ||||
|  | ||||
|     @patch('thefuck.output_readers.rerun._wait_output', return_value=False) | ||||
|     @patch('thefuck.output_readers.rerun.Popen') | ||||
|     def test_get_output(self, popen_mock, wait_output_mock): | ||||
|         popen_mock.return_value.stdout.read.return_value = b'output' | ||||
|         assert rerun.get_output('', '') is None | ||||
|         wait_output_mock.assert_called_once() | ||||
|  | ||||
|     def test_wait_output_is_slow(self, settings): | ||||
|         assert rerun._wait_output(Mock(), True) | ||||
|         self.proc_mock.wait.assert_called_once_with(settings.wait_slow_command) | ||||
|  | ||||
|     def test_wait_output_is_not_slow(self, settings): | ||||
|         assert rerun._wait_output(Mock(), False) | ||||
|         self.proc_mock.wait.assert_called_once_with(settings.wait_command) | ||||
|  | ||||
|     @patch('thefuck.output_readers.rerun._kill_process') | ||||
|     def test_wait_output_timeout(self, kill_process_mock): | ||||
|         self.proc_mock.wait.side_effect = TimeoutExpired(3) | ||||
|         self.proc_mock.children.return_value = [] | ||||
|         assert not rerun._wait_output(Mock(), False) | ||||
|         kill_process_mock.assert_called_once_with(self.proc_mock) | ||||
|  | ||||
|     @patch('thefuck.output_readers.rerun._kill_process') | ||||
|     def test_wait_output_timeout_children(self, kill_process_mock): | ||||
|         self.proc_mock.wait.side_effect = TimeoutExpired(3) | ||||
|         self.proc_mock.children.return_value = [Mock()] * 2 | ||||
|         assert not rerun._wait_output(Mock(), False) | ||||
|         assert kill_process_mock.call_count == 3 | ||||
|  | ||||
|     def test_kill_process(self): | ||||
|         proc = Mock() | ||||
|         rerun._kill_process(proc) | ||||
|         proc.kill.assert_called_once_with() | ||||
|  | ||||
|     @patch('thefuck.output_readers.rerun.logs') | ||||
|     def test_kill_process_access_denied(self, logs_mock): | ||||
|         proc = Mock() | ||||
|         proc.kill.side_effect = AccessDenied() | ||||
|         rerun._kill_process(proc) | ||||
|         proc.kill.assert_called_once_with() | ||||
|         logs_mock.debug.assert_called_once() | ||||
| @@ -73,3 +73,8 @@ class TestBash(object): | ||||
|                                                     config_exists): | ||||
|         config_exists.return_value = False | ||||
|         assert not shell.how_to_configure().can_configure_automatically | ||||
|  | ||||
|     def test_info(self, shell, mocker): | ||||
|         patch = mocker.patch('thefuck.shells.bash.Popen') | ||||
|         patch.return_value.stdout.read.side_effect = [b'3.5.9'] | ||||
|         assert shell.info() == 'Bash 3.5.9' | ||||
|   | ||||
| @@ -112,3 +112,7 @@ class TestFish(object): | ||||
|                                                     config_exists): | ||||
|         config_exists.return_value = False | ||||
|         assert not shell.how_to_configure().can_configure_automatically | ||||
|  | ||||
|     def test_info(self, shell, Popen): | ||||
|         Popen.return_value.stdout.read.side_effect = [b'3.5.9'] | ||||
|         assert shell.info() == 'Fish Shell 3.5.9' | ||||
|   | ||||
| @@ -68,3 +68,8 @@ class TestZsh(object): | ||||
|                                                     config_exists): | ||||
|         config_exists.return_value = False | ||||
|         assert not shell.how_to_configure().can_configure_automatically | ||||
|  | ||||
|     def test_info(self, shell, mocker): | ||||
|         patch = mocker.patch('thefuck.shells.zsh.Popen') | ||||
|         patch.return_value.stdout.read.side_effect = [b'3.5.9'] | ||||
|         assert shell.info() == 'ZSH 3.5.9' | ||||
|   | ||||
| @@ -53,7 +53,8 @@ class TestSettingsFromEnv(object): | ||||
|                            'THEFUCK_NO_COLORS': 'false', | ||||
|                            'THEFUCK_PRIORITY': 'bash=10:lisp=wrong:vim=15', | ||||
|                            'THEFUCK_WAIT_SLOW_COMMAND': '999', | ||||
|                            'THEFUCK_SLOW_COMMANDS': 'lein:react-native:./gradlew'}) | ||||
|                            'THEFUCK_SLOW_COMMANDS': 'lein:react-native:./gradlew', | ||||
|                            'THEFUCK_NUM_CLOSE_MATCHES': '359'}) | ||||
|         settings.init() | ||||
|         assert settings.rules == ['bash', 'lisp'] | ||||
|         assert settings.exclude_rules == ['git', 'vim'] | ||||
| @@ -63,6 +64,7 @@ class TestSettingsFromEnv(object): | ||||
|         assert settings.priority == {'bash': 10, 'vim': 15} | ||||
|         assert settings.wait_slow_command == 999 | ||||
|         assert settings.slow_commands == ['lein', 'react-native', './gradlew'] | ||||
|         assert settings.num_close_matches == 359 | ||||
|  | ||||
|     def test_from_env_with_DEFAULT(self, os_environ, settings): | ||||
|         os_environ.update({'THEFUCK_RULES': 'DEFAULT_RULES:bash:lisp'}) | ||||
|   | ||||
| @@ -2,11 +2,11 @@ | ||||
|  | ||||
| import pytest | ||||
| import warnings | ||||
| from mock import Mock | ||||
| from mock import Mock, patch | ||||
| from thefuck.utils import default_settings, \ | ||||
|     memoize, get_closest, get_all_executables, replace_argument, \ | ||||
|     get_all_matched_commands, is_app, for_app, cache, \ | ||||
|     get_valid_history_without_current, _cache | ||||
|     get_valid_history_without_current, _cache, get_close_matches | ||||
| from thefuck.types import Command | ||||
|  | ||||
|  | ||||
| @@ -50,6 +50,18 @@ class TestGetClosest(object): | ||||
|                            fallback_to_first=False) is None | ||||
|  | ||||
|  | ||||
| class TestGetCloseMatches(object): | ||||
|     @patch('thefuck.utils.difflib_get_close_matches') | ||||
|     def test_call_with_n(self, difflib_mock): | ||||
|         get_close_matches('', [], 1) | ||||
|         assert difflib_mock.call_args[0][2] == 1 | ||||
|  | ||||
|     @patch('thefuck.utils.difflib_get_close_matches') | ||||
|     def test_call_without_n(self, difflib_mock, settings): | ||||
|         get_close_matches('', []) | ||||
|         assert difflib_mock.call_args[0][2] == settings.get('num_close_matches') | ||||
|  | ||||
|  | ||||
| @pytest.fixture | ||||
| def get_aliases(mocker): | ||||
|     mocker.patch('thefuck.shells.shell.get_aliases', | ||||
|   | ||||
		Reference in New Issue
	
	Block a user