@@ -86,35 +86,33 @@ def test_it_transforms_kwargs_into_git_command_arguments(self):
86
86
(True ,True ,True ),
87
87
)
88
88
89
+ def _do_shell_combo (self ,value_in_call ,value_from_class ):
90
+ with mock .patch .object (Git ,"USE_SHELL" ,value_from_class ):
91
+ # git.cmd gets Popen via a "from" import, so patch it there.
92
+ with mock .patch .object (cmd ,"Popen" ,wraps = cmd .Popen )as mock_popen :
93
+ # Use a command with no arguments (besides the program name), so it runs
94
+ # with or without a shell, on all OSes, with the same effect. Since git
95
+ # errors out when run with no arguments, we swallow that error.
96
+ with contextlib .suppress (GitCommandError ):
97
+ self .git .execute (["git" ],shell = value_in_call )
98
+
99
+ return mock_popen
100
+
89
101
@ddt .idata (_shell_cases )
90
- @mock .patch .object (cmd ,"Popen" ,wraps = cmd .Popen )# Since it is gotten via a "from" import.
91
- def test_it_uses_shell_or_not_as_specified (self ,case ,mock_popen ):
102
+ def test_it_uses_shell_or_not_as_specified (self ,case ):
92
103
"""A bool passed as ``shell=`` takes precedence over `Git.USE_SHELL`."""
93
104
value_in_call ,value_from_class ,expected_popen_arg = case
94
-
95
- with mock .patch .object (Git ,"USE_SHELL" ,value_from_class ):
96
- with contextlib .suppress (GitCommandError ):
97
- self .git .execute (
98
- ["git" ],# No args, so it runs with or without a shell, on all OSes.
99
- shell = value_in_call ,
100
- )
101
-
105
+ mock_popen = self ._do_shell_combo (value_in_call ,value_from_class )
102
106
mock_popen .assert_called_once ()
103
107
self .assertIs (mock_popen .call_args .kwargs ["shell" ],expected_popen_arg )
104
108
105
109
@ddt .idata (full_case [:2 ]for full_case in _shell_cases )
106
- @mock .patch .object (cmd ,"Popen" ,wraps = cmd .Popen )# Since it is gotten via a "from" import.
107
- def test_it_logs_if_it_uses_a_shell (self ,case ,mock_popen ):
110
+ def test_it_logs_if_it_uses_a_shell (self ,case ):
108
111
"""``shell=`` in the log message agrees with what is passed to `Popen`."""
109
112
value_in_call ,value_from_class = case
110
113
111
114
with self .assertLogs (cmd .log ,level = logging .DEBUG )as log_watcher :
112
- with mock .patch .object (Git ,"USE_SHELL" ,value_from_class ):
113
- with contextlib .suppress (GitCommandError ):
114
- self .git .execute (
115
- ["git" ],# No args, so it runs with or without a shell, on all OSes.
116
- shell = value_in_call ,
117
- )
115
+ mock_popen = self ._do_shell_combo (value_in_call ,value_from_class )
118
116
119
117
popen_shell_arg = mock_popen .call_args .kwargs ["shell" ]
120
118
expected_message = re .compile (rf"DEBUG:git.cmd:Popen\(.*\bshell={ popen_shell_arg } \b.*\)" )