|
| 1 | +# pylint: disable=protected-access |
1 | 2 | from contextlib import contextmanager |
2 | 3 | import os |
3 | 4 | import pickle |
4 | | -from tempfile import mkstemp |
| 5 | +from tempfile import mkstemp, NamedTemporaryFile |
| 6 | + |
5 | 7 | import unittest |
6 | 8 | from unittest.mock import patch, Mock |
7 | 9 | import warnings |
| 10 | + |
| 11 | +from Orange.tests import named_file |
8 | 12 | from Orange.widgets.settings import SettingsHandler, Setting, SettingProvider,\ |
9 | 13 | VERSION_KEY, rename_setting, Context, migrate_str_to_variable |
10 | 14 |
|
@@ -64,6 +68,33 @@ def test_write_defaults(self): |
64 | 68 |
|
65 | 69 | os.remove(settings_file) |
66 | 70 |
|
| 71 | + def test_write_defaults_handles_permission_error(self): |
| 72 | + handler = SettingsHandler() |
| 73 | + |
| 74 | + with named_file("") as f: |
| 75 | + handler._get_settings_filename = lambda: f |
| 76 | + |
| 77 | + with patch('Orange.widgets.settings.open', create=True) as mocked_open: |
| 78 | + mocked_open.side_effect = PermissionError() |
| 79 | + |
| 80 | + handler.write_defaults() |
| 81 | + |
| 82 | + def test_write_defaults_handles_writing_errors(self): |
| 83 | + handler = SettingsHandler() |
| 84 | + |
| 85 | + for error in (EOFError, IOError, pickle.PicklingError): |
| 86 | + f = NamedTemporaryFile("wt", delete=False) |
| 87 | + f.close() # so it can be opened on windows |
| 88 | + handler._get_settings_filename = lambda x=f: x.name |
| 89 | + |
| 90 | + with patch.object(handler, "write_defaults_file") as mocked_write: |
| 91 | + mocked_write.side_effect = error() |
| 92 | + |
| 93 | + handler.write_defaults() |
| 94 | + |
| 95 | + # Corrupt setting files should be removed |
| 96 | + self.assertFalse(os.path.exists(f.name)) |
| 97 | + |
67 | 98 | def test_initialize_widget(self): |
68 | 99 | handler = SettingsHandler() |
69 | 100 | handler.defaults = {'default': 42, 'setting': 1} |
@@ -286,9 +317,9 @@ def override_default_settings(self, widget, defaults=None): |
286 | 317 |
|
287 | 318 | h = SettingsHandler() |
288 | 319 | h.widget_class = widget |
| 320 | + h.defaults = defaults |
289 | 321 | filename = h._get_settings_filename() |
290 | | - with open(filename, "wb") as f: |
291 | | - pickle.dump(defaults, f) |
| 322 | + h.write_defaults() |
292 | 323 |
|
293 | 324 | yield |
294 | 325 |
|
|
0 commit comments