def test_load_from_disk_with_data( mock_read_persisted_options: MagicMock, mock_get_persisted_options_from_data: MagicMock, mock_set_field: MagicMock, fields_to_test: List[str], option: Options): # Setup persisted_options = { field_name: MagicMock() for field_name in fields_to_test } new_serializers = { field_name: MagicMock() for field_name in fields_to_test } mock_get_persisted_options_from_data.return_value = persisted_options # Run with patch.dict(randovania.interface_common.options._SERIALIZER_FOR_FIELD, new_serializers): option.load_from_disk() # Assert mock_read_persisted_options.assert_called_once_with(option) mock_get_persisted_options_from_data.assert_called_once_with( mock_read_persisted_options.return_value) for field_name, serializer in new_serializers.items(): serializer.decode.assert_called_once_with( persisted_options[field_name]) mock_set_field.assert_has_calls( call(option, field_name, new_serializers[field_name].decode.return_value) for field_name in fields_to_test)
def test_load_from_disk_no_data( mock_read_persisted_options: MagicMock, mock_get_persisted_options_from_data: MagicMock, option: Options): # Run option.load_from_disk() # Assert mock_read_persisted_options.assert_called_once_with(option) mock_get_persisted_options_from_data.assert_not_called()
def test_load_from_disk_missing_json(ignore_decode_errors: bool, tmpdir): # Setup option = Options(Path(tmpdir)) tmpdir.join("config.json").write_text("", "utf-8") if ignore_decode_errors: result = option.load_from_disk(ignore_decode_errors) assert result != ignore_decode_errors else: with pytest.raises(DecodeFailedException): option.load_from_disk(ignore_decode_errors)
def test_load_from_disk_no_data(tmp_path, mocker): # Setup mock_get_persisted_options_from_data: MagicMock = mocker.patch( "randovania.interface_common.persisted_options.get_persisted_options_from_data", autospec=True) option = Options(tmp_path) # Run option.load_from_disk() # Assert mock_get_persisted_options_from_data.assert_not_called()
def test_mark_alert_as_displayed(tmp_path): opt = Options(tmp_path) all_alerts = (InfoAlert.FAQ, InfoAlert.MULTIWORLD_FAQ) for alert in all_alerts: assert not opt.is_alert_displayed(alert) opt.mark_alert_as_displayed(alert) assert opt.is_alert_displayed(alert) assert opt.displayed_alerts == set(all_alerts) new_opt = Options(tmp_path) new_opt.load_from_disk() assert new_opt.displayed_alerts == set(all_alerts)
def test_load_from_disk_first_failure(tmp_path, mocker): persisted_result = MagicMock() mocker.patch( "randovania.interface_common.persisted_options.find_config_files", autospec=True, return_value=[ "[1]", "[2]", ]) mock_get_persisted_options_from_data = mocker.patch( "randovania.interface_common.persisted_options.get_persisted_options_from_data", autospec=True, side_effect=[ migration_lib.UnsupportedVersion(), persisted_result, ]) option = Options(tmp_path) option.load_from_persisted = MagicMock() # Run result = option.load_from_disk(True) # Assert assert result option.load_from_persisted.assert_called_once_with(persisted_result, True) mock_get_persisted_options_from_data.assert_has_calls([ call([1]), call([2]), ])
def test_load_from_disk_invalid_json(ignore_decode_errors: bool, tmpdir): # Setup option = Options(Path(tmpdir)) tmpdir.join("config.json").write_text( json.dumps( randovania.interface_common.persisted_options. serialized_data_for_options( {"cosmetic_patches": { "pickup_model_style": "invalid-value" }})), "utf-8") if ignore_decode_errors: result = option.load_from_disk(ignore_decode_errors) assert result != ignore_decode_errors else: with pytest.raises(DecodeFailedException): option.load_from_disk(ignore_decode_errors)
def load_options_from_disk(options: Options) -> bool: try: options.load_from_disk() return True except DecodeFailedException as decode_failed: user_response = QMessageBox.critical( None, "Error loading previous settings", ("The following error occurred while restoring your settings:\n" "{}\n\n" "Do you want to reset this part of your settings?" ).format(decode_failed), QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if user_response == QMessageBox.Yes: options.load_from_disk(True) return True else: return False
def test_edit_during_options_changed(tmpdir): # Setup option = Options(Path(tmpdir)) option._output_directory = Path("start") def on_changed(): with option: option.output_directory = Path("final") option.on_options_changed = on_changed # Run with option: option.output_directory = Path("middle") second_option = Options(Path(tmpdir)) second_option.load_from_disk() # Assert assert option.output_directory == Path("final") assert option.output_directory == second_option.output_directory
def test_edit_during_options_changed(tmpdir): # Setup option = Options(Path(tmpdir)) option._selected_tracker = "start" def on_changed(): with option: option.selected_tracker = "final" option.on_options_changed = on_changed # Run with option: option.selected_tracker = "middle" second_option = Options(Path(tmpdir)) second_option.load_from_disk() # Assert assert option.selected_tracker == "final" assert option.selected_tracker == second_option.selected_tracker
def test_load_from_disk_with_data(fields_to_test: list[str], tmp_path, mocker): # Setup mock_get_persisted_options_from_data: MagicMock = mocker.patch( "randovania.interface_common.persisted_options.get_persisted_options_from_data", autospec=True) mock_set_field: MagicMock = mocker.patch( "randovania.interface_common.options.Options._set_field", autospec=True) tmp_path.joinpath("config.json").write_text("[1, 2, 54, 69]") option = Options(tmp_path) persisted_options = { field_name: MagicMock() for field_name in fields_to_test } new_serializers = { field_name: MagicMock() for field_name in fields_to_test } mock_get_persisted_options_from_data.return_value = persisted_options # Run with patch.dict(randovania.interface_common.options._SERIALIZER_FOR_FIELD, new_serializers): option.load_from_disk() # Assert mock_get_persisted_options_from_data.assert_called_once_with( [1, 2, 54, 69]) for field_name, serializer in new_serializers.items(): serializer.decode.assert_called_once_with( persisted_options[field_name]) mock_set_field.assert_has_calls([ call(option, field_name, new_serializers[field_name].decode.return_value) for field_name in fields_to_test ])
async def load_options_from_disk(options: Options) -> bool: parent: QtWidgets.QWidget = None try: options.load_from_disk() return True except DecodeFailedException as decode_failed: user_response = await async_dialog.message_box( parent, QtWidgets.QMessageBox.Critical, "Error loading previous settings", ("The following error occurred while restoring your settings:\n" "{}\n\n" "Do you want to reset this part of your settings?" ).format(decode_failed), QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No, QtWidgets.QMessageBox.No, ) if user_response == QtWidgets.QMessageBox.Yes: options.load_from_disk(True) return True else: logging.exception("") return False
def test_load_from_disk_first_successful(tmp_path, mocker): mocker.patch( "randovania.interface_common.persisted_options.find_config_files", autospec=True, return_value=[ "[1]", "[2]", ]) mock_get_persisted_options_from_data = mocker.patch( "randovania.interface_common.persisted_options.get_persisted_options_from_data", autospec=True, ) option = Options(tmp_path) option.load_from_persisted = MagicMock() # Run result = option.load_from_disk(False) # Assert assert result option.load_from_persisted.assert_called_once_with( mock_get_persisted_options_from_data.return_value, False) mock_get_persisted_options_from_data.assert_called_once_with([1])