|
| 1 | +import json |
1 | 2 | import pytest |
2 | 3 | from base import BaseTest |
3 | 4 | from seedsigner.models.settings import InvalidSettingsQRData, Settings |
@@ -35,6 +36,68 @@ def test_settings_defaults(self): |
35 | 36 | assert settings.get_value(settings_entry.attr_name) == settings_entry.default_value |
36 | 37 |
|
37 | 38 |
|
| 39 | + def test_load_persistent_settings(self): |
| 40 | + """ Settings should load previously saved persistent settings from disk, if any |
| 41 | + exist. """ |
| 42 | + # Initial Settings will start with defaults |
| 43 | + settings = Settings.get_instance() |
| 44 | + |
| 45 | + # Enable persistent settings and make another change |
| 46 | + settings.set_value(SettingsConstants.SETTING__PERSISTENT_SETTINGS, SettingsConstants.OPTION__ENABLED) |
| 47 | + |
| 48 | + assert settings.get_value(SettingsConstants.SETTING__QR_DENSITY) != SettingsConstants.DENSITY__HIGH |
| 49 | + settings.set_value(SettingsConstants.SETTING__QR_DENSITY, SettingsConstants.DENSITY__HIGH) |
| 50 | + |
| 51 | + # Hold on to the settings.json content |
| 52 | + settings_json = None |
| 53 | + with open(Settings.SETTINGS_FILENAME) as settings_file: |
| 54 | + settings_json = json.loads(settings_file.read()) |
| 55 | + |
| 56 | + # Now wipe out the Settings singleton |
| 57 | + BaseTest.reset_settings() |
| 58 | + |
| 59 | + # This also deletes settings.json, so recreate it |
| 60 | + with open(Settings.SETTINGS_FILENAME, "w") as settings_file: |
| 61 | + settings_file.write(json.dumps(settings_json)) |
| 62 | + |
| 63 | + # Now instantiate the Settings singleton again; it should load from disk |
| 64 | + settings = Settings.get_instance() |
| 65 | + |
| 66 | + # Persistent setting change should have survived |
| 67 | + assert settings.get_value(SettingsConstants.SETTING__QR_DENSITY) == SettingsConstants.DENSITY__HIGH |
| 68 | + |
| 69 | + |
| 70 | + def test_load_empty_multiselect_settings(self): |
| 71 | + """ Empty multiselect settings should load defaults. """ |
| 72 | + # Initial Settings will start with defaults |
| 73 | + settings = Settings.get_instance() |
| 74 | + |
| 75 | + # Enable persistent settings to write settings.json to disk |
| 76 | + settings.set_value(SettingsConstants.SETTING__PERSISTENT_SETTINGS, SettingsConstants.OPTION__ENABLED) |
| 77 | + |
| 78 | + # Hold on to the settings.json content |
| 79 | + settings_dict = None |
| 80 | + with open(Settings.SETTINGS_FILENAME) as settings_file: |
| 81 | + settings_dict = json.loads(settings_file.read()) |
| 82 | + |
| 83 | + def _verify_defaults_loaded(attr_name: str): |
| 84 | + # Verify that the multiselect setting has loaded its defaults |
| 85 | + settings = Settings.get_instance() |
| 86 | + cur_setting_value = settings.get_value(attr_name) |
| 87 | + assert cur_setting_value == SettingsDefinition.get_settings_entry(attr_name).default_value |
| 88 | + |
| 89 | + # Alter the settings to test against various empty values |
| 90 | + for empty_value in ["", ",", [], None]: |
| 91 | + settings_dict[SettingsConstants.SETTING__SIG_TYPES] = empty_value |
| 92 | + settings.update(settings_dict) |
| 93 | + _verify_defaults_loaded(SettingsConstants.SETTING__SIG_TYPES) |
| 94 | + |
| 95 | + # One last test: remove the multiselect setting entirely |
| 96 | + del settings_dict[SettingsConstants.SETTING__SIG_TYPES] |
| 97 | + settings.update(settings_dict) |
| 98 | + _verify_defaults_loaded(SettingsConstants.SETTING__SIG_TYPES) |
| 99 | + |
| 100 | + |
38 | 101 | def test_parse_settingsqr_data(self): |
39 | 102 | """ |
40 | 103 | SettingsQR parser should successfully parse a valid settingsqr input string and |
@@ -108,6 +171,14 @@ def test_settingsqr_fails_unrecognized_option(self): |
108 | 171 | assert "passphrase" in str(e.value) |
109 | 172 |
|
110 | 173 |
|
| 174 | + def test_settingsqr_fails_empty_values(self): |
| 175 | + """ SettingsQR parser should fail if a setting is empty """ |
| 176 | + settingsqr_data = "settings::v1 persistent=D sigs= camera=180" |
| 177 | + with pytest.raises(InvalidSettingsQRData) as e: |
| 178 | + Settings.parse_settingsqr(settingsqr_data) |
| 179 | + assert "sigs" in str(e.value) |
| 180 | + |
| 181 | + |
111 | 182 | def test_settingsqr_parses_line_break_separators(self): |
112 | 183 | """ SettingsQR parser should read line breaks as acceptable separators """ |
113 | 184 | settingsqr_data = "settings::v1\nname=Foo\nsigs=ss,ms\nscripts=nat,nes,tr\npassphrase=E\n" |
|
0 commit comments