Skip to content

Commit fa5eb95

Browse files
committed
Exception handling added for the uninstall_dev_env calls. The error reporting for the Platform Error cleaned up.
1 parent 4382ebe commit fa5eb95

13 files changed

+103
-34
lines changed

dem/cli/command/create_cmd.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from dem.core.dev_env import DevEnv, DevEnv
66
from dem.core.tool_images import ToolImages
77
from dem.core.platform import Platform
8+
from dem.core.exceptions import PlatformError
89
from dem.cli.console import stdout, stderr
910
from dem.cli.tui.panel.tool_type_selector import ToolTypeSelectorPanel
1011
from dem.cli.tui.panel.tool_image_selector import ToolImageSelectorPanel
@@ -171,7 +172,11 @@ def create_dev_env(platform: Platform, dev_env_name: str) -> None:
171172
if dev_env_original.is_installed:
172173
typer.confirm("The Development Environment is installed, so it can't be overwritten. " + \
173174
"Uninstall it first?", abort=True)
174-
platform.uninstall_dev_env(dev_env_original)
175+
try:
176+
platform.uninstall_dev_env(dev_env_original)
177+
except PlatformError as e:
178+
stderr.print(f"[red]{str(e)}[/]")
179+
typer.Abort()
175180

176181
tool_image_list = get_tool_image_list(platform.tool_images)
177182
new_dev_env_descriptor = get_dev_env_descriptor_from_user(dev_env_name, tool_image_list)

dem/cli/command/delete_cmd.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ def execute(platform: Platform, dev_env_name: str) -> None:
2020
try:
2121
platform.uninstall_dev_env(dev_env_to_delete)
2222
except PlatformError as e:
23-
stderr.print(f"[red]Error: The deletion failed, because the Dev Env can't be uninstalled. {str(e)}[/]")
23+
stderr.print(f"[red]{str(e)}[/]")
2424
return
2525

2626
stdout.print("Deleting the Development Environment...")

dem/cli/command/init_cmd.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def execute(platform: Platform, project_path: str) -> None:
3636
try:
3737
platform.uninstall_dev_env(local_dev_env)
3838
except PlatformError as e:
39-
stderr.print(f"[red]Error: The Dev Env can't be uninstalled. {str(e)}")
39+
stderr.print(f"[red]{str(e)}[/]")
4040
return
4141

4242
platform.local_dev_envs.remove(local_dev_env)

dem/cli/command/modify_cmd.py

+6-1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
from dem.core.dev_env import DevEnv, DevEnv
66
from dem.core.tool_images import ToolImages
77
from dem.core.platform import Platform
8+
from dem.core.exceptions import PlatformError
89
from dem.cli.console import stderr, stdout
910
from dem.cli.tui.renderable.menu import SelectMenu
1011
from dem.cli.tui.panel.tool_type_selector import ToolTypeSelectorPanel
@@ -207,7 +208,11 @@ def execute(platform: Platform, dev_env_name: str, tool_type: str, tool_image: s
207208
elif dev_env.is_installed is True:
208209
stdout.print("[yellow]The Development Environment is installed, so it can't be modified.[/]")
209210
typer.confirm("Do you want to uninstall it first?", abort=True)
210-
platform.uninstall_dev_env(dev_env)
211+
try:
212+
platform.uninstall_dev_env(dev_env)
213+
except PlatformError as e:
214+
stderr.print(f"[red]{str(e)}[/]")
215+
return
211216

212217
if (tool_type or tool_image):
213218
modify_single_tool(platform, dev_env, tool_type, tool_image)

dem/cli/command/uninstall_cmd.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,6 @@ def execute(platform: Platform, dev_env_name: str) -> None:
2323
try:
2424
platform.uninstall_dev_env(dev_env_to_uninstall)
2525
except PlatformError as e:
26-
stderr.print(f"[red]Error: {str(e)}[/]")
26+
stderr.print(f"[red]{str(e)}[/]")
2727
else:
2828
stdout.print(f"[green]Successfully uninstalled the {dev_env_name}![/]")

dem/core/container_engine.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ def remove(self, image: str) -> None:
114114
except docker.errors.ImageNotFound:
115115
self.user_output.msg(f"[yellow]The {image} doesn't exist. Unable to remove it.[/]\n")
116116
except docker.errors.APIError:
117-
raise ContainerEngineError(f"The {image} is used by a container. Unable to remove it.[/]\n")
117+
raise ContainerEngineError(f"The {image} is used by a container. Unable to remove it.\n")
118118
else:
119119
self.user_output.msg(f"[green]Successfully removed the {image}![/]\n")
120120

dem/core/platform.py

+4-4
Original file line numberDiff line numberDiff line change
@@ -166,11 +166,11 @@ def install_dev_env(self, dev_env_to_install: DevEnv) -> None:
166166
def uninstall_dev_env(self, dev_env_to_uninstall: DevEnv) -> None:
167167
""" Uninstall the Dev Env by removing the images not required anymore.
168168
169-
Exceptions:
170-
PlatformError -- if the uninstall fails
171-
172169
Args:
173170
dev_env_to_uninstall -- the Development Environment to uninstall
171+
172+
Exceptions:
173+
PlatformError -- if the uninstall fails
174174
"""
175175
all_required_tool_images = set()
176176
for dev_env in self.local_dev_envs:
@@ -188,7 +188,7 @@ def uninstall_dev_env(self, dev_env_to_uninstall: DevEnv) -> None:
188188
try:
189189
self.container_engine.remove(tool_image)
190190
except ContainerEngineError as e:
191-
raise PlatformError(f"Dev Env uninstall failed. {str(e)}")
191+
raise PlatformError(f"Dev Env uninstall failed. <-caused by- {str(e)}")
192192

193193
dev_env_to_uninstall.is_installed = False
194194
self.flush_descriptors()

tests/cli/test_create_cmd.py

+32
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,38 @@ def test_create_dev_env_overwrite(mock_confirm, mock_get_tool_image_list,
124124
mock_get_dev_env_descriptor_from_user.assert_called_once_with(expected_dev_env_name,
125125
mock_tool_images)
126126

127+
@patch("dem.cli.command.create_cmd.typer.Abort")
128+
@patch("dem.cli.command.create_cmd.stderr.print")
129+
@patch("dem.cli.command.create_cmd.typer.confirm")
130+
def test_create_dev_env_overwrite_PlatformError(mock_confirm: MagicMock, mock_stderr_print: MagicMock,
131+
mock_Abort: MagicMock) -> None:
132+
# Test setup
133+
mock_platform = MagicMock()
134+
mock_dev_env_original = MagicMock()
135+
mock_dev_env_original.is_installed = True
136+
mock_platform.get_dev_env_by_name.return_value = mock_dev_env_original
137+
test_exception_text = "test_exception_text"
138+
mock_platform.uninstall_dev_env.side_effect = create_cmd.PlatformError(test_exception_text)
139+
mock_Abort.side_effect = Exception("")
140+
141+
test_dev_env_name = "test_dev_env"
142+
143+
# Run unit under test
144+
with pytest.raises(Exception):
145+
create_cmd.create_dev_env(mock_platform, test_dev_env_name)
146+
147+
# Check expectations
148+
mock_platform.get_dev_env_by_name.assert_called_once_with(test_dev_env_name)
149+
mock_confirm.assert_has_calls([
150+
call("The input name is already used by a Development Environment. Overwrite it?",
151+
abort=True),
152+
call("The Development Environment is installed, so it can't be overwritten. " + \
153+
"Uninstall it first?", abort=True)
154+
])
155+
mock_platform.uninstall_dev_env.assert_called_once_with(mock_dev_env_original)
156+
mock_stderr_print.assert_called_once_with(f"[red]Platform error: {test_exception_text}[/]")
157+
mock_Abort.assert_called_once()
158+
127159
@patch("dem.cli.command.create_cmd.get_dev_env_descriptor_from_user")
128160
@patch("dem.cli.command.create_cmd.typer.confirm")
129161
def test_create_dev_env_abort(mock_confirm, mock_get_dev_env_descriptor_from_user):

tests/cli/test_delete_cmd.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ def test_delete_uninstall_failed(mock_stderr_print: MagicMock, mock_confirm: Mag
6666
mock_confirm.assert_called_once_with("The Development Environment is installed. Do you want to uninstall it?",
6767
abort=True)
6868
mock_platform.uninstall_dev_env.assert_called_once_with(test_dev_env)
69-
mock_stderr_print.assert_called_once_with(f"[red]Error: The deletion failed, because the Dev Env can't be uninstalled. Platform error: {test_exception_text}[/]")
69+
mock_stderr_print.assert_called_once_with(f"[red]Platform error: {test_exception_text}[/]")
7070

7171
@patch("dem.cli.command.delete_cmd.stderr.print")
7272
def test_delete_not_existing(mock_stderr_print: MagicMock) -> None:

tests/cli/test_init_cmd.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -133,4 +133,4 @@ def test_execute_reinit_installed_uninstall_fails(mock_DevEnv, mock_confirm, moc
133133
mock_confirm.assert_has_calls([call("Would you like to re-init the Dev Env? All local changes will be lost!", abort=True),
134134
call("The Development Environment is installed, so it can't be deleted. Do you want to uninstall it first?", abort=True)])
135135
mock_platform.uninstall_dev_env.assert_called_once_with(mock_local_dev_env)
136-
mock_stderr_print.assert_called_once_with(f"[red]Error: The Dev Env can't be uninstalled. Platform error: {test_exception_text}")
136+
mock_stderr_print.assert_called_once_with(f"[red]Platform error: {test_exception_text}[/]")

tests/cli/test_modify_cmd.py

+47-20
Original file line numberDiff line numberDiff line change
@@ -117,25 +117,6 @@ def test_handle_user_confirm_cancel():
117117
with pytest.raises(typer.Abort):
118118
modify_cmd.handle_user_confirm("cancel", MagicMock(), MagicMock())
119119

120-
def test_execute_invalid_name():
121-
# Test setup
122-
mock_platform = MagicMock()
123-
main.platform = mock_platform
124-
mock_platform.get_dev_env_by_name.return_value = None
125-
test_dev_env_name = "not existing env"
126-
127-
# Run unit under test
128-
runner_result = runner.invoke(main.typer_cli, ["modify", test_dev_env_name], color=True)
129-
130-
# Check expectations
131-
assert 0 == runner_result.exit_code
132-
133-
mock_platform.get_dev_env_by_name.assert_called_once_with(test_dev_env_name)
134-
135-
console = Console(file=io.StringIO())
136-
console.print("[red]The Development Environment doesn't exist.")
137-
assert console.file.getvalue() == runner_result.stderr
138-
139120
@patch("dem.cli.command.modify_cmd.handle_user_confirm")
140121
@patch("dem.cli.command.modify_cmd.get_confirm_from_user")
141122
@patch("dem.cli.command.modify_cmd.get_modifications_from_user")
@@ -276,6 +257,25 @@ def test_modify_single_tool_no_type(mock_stderr_print: MagicMock) -> None:
276257

277258
mock_stderr_print.assert_called_once_with("[red]Error: The tool type and the tool image must be set together.[/]")
278259

260+
def test_execute_invalid_name():
261+
# Test setup
262+
mock_platform = MagicMock()
263+
main.platform = mock_platform
264+
mock_platform.get_dev_env_by_name.return_value = None
265+
test_dev_env_name = "not existing env"
266+
267+
# Run unit under test
268+
runner_result = runner.invoke(main.typer_cli, ["modify", test_dev_env_name], color=True)
269+
270+
# Check expectations
271+
assert 0 == runner_result.exit_code
272+
273+
mock_platform.get_dev_env_by_name.assert_called_once_with(test_dev_env_name)
274+
275+
console = Console(file=io.StringIO())
276+
console.print("[red]The Development Environment doesn't exist.")
277+
assert console.file.getvalue() == runner_result.stderr
278+
279279
@patch("dem.cli.command.modify_cmd.modify_single_tool")
280280
@patch("dem.cli.command.modify_cmd.typer.confirm")
281281
@patch("dem.cli.command.modify_cmd.stdout.print")
@@ -319,4 +319,31 @@ def test_execute_open_modify_panel(mock_open_modify_panel: MagicMock) -> None:
319319

320320
# Check expectations
321321
mock_platform.get_dev_env_by_name.assert_called_once_with(test_dev_env_name)
322-
mock_open_modify_panel.assert_called_once_with(mock_platform, mock_dev_env)
322+
mock_open_modify_panel.assert_called_once_with(mock_platform, mock_dev_env)
323+
324+
@patch("dem.cli.command.modify_cmd.stderr.print")
325+
@patch("dem.cli.command.modify_cmd.typer.confirm")
326+
@patch("dem.cli.command.modify_cmd.stdout.print")
327+
def test_execute_PlatformError(mock_stdout_print: MagicMock, mock_confirm: MagicMock,
328+
mock_stderr_print: MagicMock) -> None:
329+
# Test setup
330+
mock_platform = MagicMock()
331+
test_dev_env_name = "test_dev_env_name"
332+
test_tool_type = "test_tool_type"
333+
test_tool_image = "test_tool_image"
334+
mock_dev_env = MagicMock()
335+
mock_dev_env.is_installed = True
336+
337+
mock_platform.get_dev_env_by_name.return_value = mock_dev_env
338+
test_exception_text = "test_exception_text"
339+
mock_platform.uninstall_dev_env.side_effect = modify_cmd.PlatformError(test_exception_text)
340+
341+
# Run unit under test
342+
modify_cmd.execute(mock_platform, test_dev_env_name, test_tool_type, test_tool_image)
343+
344+
# Check expectations
345+
mock_platform.get_dev_env_by_name.assert_called_once_with(test_dev_env_name)
346+
mock_stdout_print.assert_called_once_with("[yellow]The Development Environment is installed, so it can't be modified.[/]")
347+
mock_confirm.assert_called_once_with("Do you want to uninstall it first?", abort=True)
348+
mock_platform.uninstall_dev_env.assert_called_once_with(mock_dev_env)
349+
mock_stderr_print.assert_called_once_with(f"[red]Platform error: {test_exception_text}[/]")

tests/cli/test_uninstall_cmd.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,4 +87,4 @@ def test_uninstall_dev_env_valid_name_failed(mock_stderr_print):
8787
assert 0 == runner_result.exit_code
8888

8989
mock_platform.get_dev_env_by_name.assert_called_once_with(fake_dev_env_to_uninstall.name )
90-
mock_stderr_print.assert_called_once_with(f"[red]Error: Platform error: {test_exception_text}[/]")
90+
mock_stderr_print.assert_called_once_with(f"[red]Platform error: {test_exception_text}[/]")

tests/core/test_platform.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -580,7 +580,7 @@ def test_Platform_uninstall_dev_env_failure(mock___init__: MagicMock,
580580
# Check expectations
581581
mock___init__.assert_called_once()
582582

583-
assert str(exported_exception_info) == "Platform error: Dev Env uninstall failed."
583+
assert str(exported_exception_info) == "Platform error: Dev Env uninstall failed. <-caused by-"
584584
assert mock_dev_env_to_uninstall.is_installed == True
585585

586586
mock_container_engine.remove.asssert_called_once_with("test_image_name4:test_image_version4")

0 commit comments

Comments
 (0)