Skip to content

Commit 77a3da9

Browse files
fix: narrow file picker data fallback errors (#146)
* fix: narrow file picker data fallback errors * test: cover file picker fallback and resolver failures --------- Co-authored-by: Peter Corke <peter.i.corke@gmail.com>
1 parent 715af60 commit 77a3da9

2 files changed

Lines changed: 49 additions & 1 deletion

File tree

‎src/machinevisiontoolbox/base/imageio.py‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ def _pick_imagefile() -> Path:
5454
"""
5555
try:
5656
initialdir = mvtb_path_to_datafile("images")
57-
except Exception:
57+
except (ModuleNotFoundError, ValueError):
5858
initialdir = Path.home()
5959

6060
try:

‎tests/base/test_file_picker.py‎

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
"""The file picker only falls back for unavailable toolbox data."""
2+
3+
from pathlib import Path
4+
from types import SimpleNamespace
5+
from unittest.mock import Mock
6+
7+
import pytest
8+
9+
from machinevisiontoolbox.base import imageio
10+
11+
12+
@pytest.fixture
13+
def picker(monkeypatch):
14+
dialog = Mock(return_value="selected.png")
15+
root = Mock()
16+
tk = SimpleNamespace(
17+
Tk=Mock(return_value=root), filedialog=SimpleNamespace(askopenfilename=dialog)
18+
)
19+
monkeypatch.setitem(__import__("sys").modules, "tkinter", tk)
20+
return dialog, root
21+
22+
23+
@pytest.mark.parametrize(
24+
"error", [ModuleNotFoundError("mvtbdata"), ValueError("missing images")]
25+
)
26+
def test_missing_data_uses_home(monkeypatch, picker, error):
27+
monkeypatch.setattr(imageio, "mvtb_path_to_datafile", Mock(side_effect=error))
28+
dialog, root = picker
29+
assert imageio._pick_imagefile() == Path("selected.png")
30+
assert dialog.call_args.kwargs["initialdir"] == str(Path.home())
31+
root.destroy.assert_called_once()
32+
33+
34+
def test_data_directory_is_used(monkeypatch, picker, tmp_path):
35+
monkeypatch.setattr(imageio, "mvtb_path_to_datafile", Mock(return_value=tmp_path))
36+
dialog, _ = picker
37+
assert imageio._pick_imagefile() == Path("selected.png")
38+
assert dialog.call_args.kwargs["initialdir"] == str(tmp_path)
39+
40+
41+
@pytest.mark.parametrize(
42+
"error", [RuntimeError("broken resolver"), KeyboardInterrupt()]
43+
)
44+
def test_unexpected_resolver_errors_propagate(monkeypatch, picker, error):
45+
monkeypatch.setattr(imageio, "mvtb_path_to_datafile", Mock(side_effect=error))
46+
with pytest.raises(type(error)):
47+
imageio._pick_imagefile()
48+
picker[0].assert_not_called()

0 commit comments

Comments
 (0)