Mock the settings rather than monkeypatching external modules

This commit is contained in:
Alexis Métaireau 2025-03-24 16:20:04 +01:00
parent 5a56a7f055
commit b551a4dec4
No known key found for this signature in database
GPG key ID: C65C7A89A8FFC56E
3 changed files with 21 additions and 31 deletions

View file

@ -21,34 +21,25 @@ def get_qt_app() -> Application:
def generate_isolated_updater(
tmp_path: Path,
monkeypatch: MonkeyPatch,
app_mocker: Optional[MockerFixture] = None,
mocker: MockerFixture,
mock_app: bool = False,
) -> UpdaterThread:
"""Generate an Updater class with its own settings."""
if app_mocker:
app = app_mocker.MagicMock()
else:
app = get_qt_app()
app = mocker.MagicMock() if mock_app else get_qt_app()
dummy = Dummy()
# XXX: We can monkey-patch global state without wrapping it in a context manager, or
# worrying that it will leak between tests, for two reasons:
#
# 1. Parallel tests in PyTest take place in different processes.
# 2. The monkeypatch fixture tears down the monkey-patch after each test ends.
monkeypatch.setattr(util, "get_config_dir", lambda: tmp_path)
mocker.patch("dangerzone.settings.get_config_dir", return_value=tmp_path)
dangerzone = DangerzoneGui(app, isolation_provider=dummy)
updater = UpdaterThread(dangerzone)
return updater
@pytest.fixture
def updater(
tmp_path: Path, monkeypatch: MonkeyPatch, mocker: MockerFixture
) -> UpdaterThread:
return generate_isolated_updater(tmp_path, monkeypatch, mocker)
def updater(tmp_path: Path, mocker: MockerFixture) -> UpdaterThread:
return generate_isolated_updater(tmp_path, mocker, mock_app=True)
@pytest.fixture
def qt_updater(tmp_path: Path, monkeypatch: MonkeyPatch) -> UpdaterThread:
return generate_isolated_updater(tmp_path, monkeypatch)
def qt_updater(tmp_path: Path, mocker: MockerFixture) -> UpdaterThread:
return generate_isolated_updater(tmp_path, mocker, mock_app=False)

View file

@ -48,9 +48,7 @@ def test_default_updater_settings(updater: UpdaterThread) -> None:
)
def test_pre_0_4_2_settings(
tmp_path: Path, monkeypatch: MonkeyPatch, mocker: MockerFixture
) -> None:
def test_pre_0_4_2_settings(tmp_path: Path, mocker: MockerFixture) -> None:
"""Check settings of installations prior to 0.4.2.
Check that installations that have been upgraded from a version < 0.4.2 to >= 0.4.2
@ -58,7 +56,7 @@ def test_pre_0_4_2_settings(
in their settings.json file.
"""
save_settings(tmp_path, default_settings_0_4_1())
updater = generate_isolated_updater(tmp_path, monkeypatch, mocker)
updater = generate_isolated_updater(tmp_path, mocker, mock_app=True)
assert (
updater.dangerzone.settings.get_updater_settings() == default_updater_settings()
)
@ -83,12 +81,10 @@ def test_post_0_4_2_settings(
# version is 0.4.3.
expected_settings = default_updater_settings()
expected_settings["updater_latest_version"] = "0.4.3"
monkeypatch.setattr(
settings, "get_version", lambda: expected_settings["updater_latest_version"]
)
monkeypatch.setattr(settings, "get_version", lambda: "0.4.3")
# Ensure that the Settings class will correct the latest version field to 0.4.3.
updater = generate_isolated_updater(tmp_path, monkeypatch, mocker)
updater = generate_isolated_updater(tmp_path, mocker, mock_app=True)
assert updater.dangerzone.settings.get_updater_settings() == expected_settings
# Simulate an updater check that found a newer Dangerzone version (e.g., 0.4.4).
@ -118,9 +114,7 @@ def test_linux_no_check(updater: UpdaterThread, monkeypatch: MonkeyPatch) -> Non
assert updater.dangerzone.settings.get_updater_settings() == expected_settings
def test_user_prompts(
updater: UpdaterThread, monkeypatch: MonkeyPatch, mocker: MockerFixture
) -> None:
def test_user_prompts(updater: UpdaterThread, mocker: MockerFixture) -> None:
"""Test prompting users to ask them if they want to enable update checks."""
# First run
#
@ -370,8 +364,6 @@ def test_update_errors(
def test_update_check_prompt(
qtbot: QtBot,
qt_updater: UpdaterThread,
monkeypatch: MonkeyPatch,
mocker: MockerFixture,
) -> None:
"""Test that the prompt to enable update checks works properly."""
# Force Dangerzone to check immediately for updates

View file

@ -21,6 +21,13 @@ def default_settings_0_4_1() -> dict:
}
def save_settings(tmp_path: Path, settings: dict) -> None:
"""Mimic the way Settings save a dictionary to a settings.json file."""
settings_filename = tmp_path / "settings.json"
with open(settings_filename, "w") as settings_file:
json.dump(settings, settings_file, indent=4)
def test_no_settings_file_creates_new_one(
tmp_path: Path,
mocker: MockerFixture,