@@ -32,3 +32,65 @@ def test_cycle_in_rc_file(tmp_path):
3232 uplt .rc .load (str (rc_file ))
3333
3434 assert uplt .rc ["cycle" ] == "colorblind"
35+
36+
37+ import io
38+ from unittest .mock import patch , MagicMock
39+ from importlib .metadata import PackageNotFoundError
40+ from ultraplot .utils import check_for_update
41+
42+
43+ @patch ("builtins.print" )
44+ @patch ("importlib.metadata.version" )
45+ def test_package_not_installed (mock_version , mock_print ):
46+ mock_version .side_effect = PackageNotFoundError
47+ check_for_update ("fakepkg" )
48+ mock_print .assert_not_called ()
49+
50+
51+ @patch ("builtins.print" )
52+ @patch ("importlib.metadata.version" , return_value = "1.0.0" )
53+ @patch ("urllib.request.urlopen" )
54+ def test_network_failure (mock_urlopen , mock_version , mock_print ):
55+ mock_urlopen .side_effect = Exception ("Network down" )
56+ check_for_update ("fakepkg" )
57+ mock_print .assert_not_called ()
58+
59+
60+ @patch ("builtins.print" )
61+ @patch ("importlib.metadata.version" , return_value = "1.0.0" )
62+ @patch ("urllib.request.urlopen" )
63+ def test_no_update_available (mock_urlopen , mock_version , mock_print ):
64+ mock_resp = MagicMock ()
65+ mock_resp .__enter__ .return_value = io .StringIO ('{"info": {"version": "1.0.0"}}' )
66+ mock_urlopen .return_value = mock_resp
67+
68+ check_for_update ("fakepkg" )
69+ mock_print .assert_not_called ()
70+
71+
72+ @patch ("builtins.print" )
73+ @patch ("importlib.metadata.version" , return_value = "1.0.0" )
74+ @patch ("urllib.request.urlopen" )
75+ def test_update_available (mock_urlopen , mock_version , mock_print ):
76+ mock_resp = MagicMock ()
77+ mock_resp .__enter__ .return_value = io .StringIO ('{"info": {"version": "1.2.0"}}' )
78+ mock_urlopen .return_value = mock_resp
79+
80+ check_for_update ("fakepkg" )
81+ mock_print .assert_called_once ()
82+ msg = mock_print .call_args [0 ][0 ]
83+ assert "A newer version of fakepkg is available" in msg
84+ assert "1.0.0 → 1.2.0" in msg
85+
86+
87+ @patch ("builtins.print" )
88+ @patch ("importlib.metadata.version" , return_value = "1.0.0dev" )
89+ @patch ("urllib.request.urlopen" )
90+ def test_dev_version_skipped (mock_urlopen , mock_version , mock_print ):
91+ mock_resp = MagicMock ()
92+ mock_resp .__enter__ .return_value = io .StringIO ('{"info": {"version": "2.0.0"}}' )
93+ mock_urlopen .return_value = mock_resp
94+
95+ check_for_update ("fakepkg" )
96+ mock_print .assert_not_called ()
0 commit comments