"""
Regression tests for GitHub issue #570 follow-up:
PermissionError from SETTINGS_FILE.exists() in Docker UID-mismatch scenarios.

When ~/.hermes is owned by a different UID than the container user (common in
Docker setups), Path.exists() raises PermissionError instead of returning False.
load_settings() must treat that as "file not accessible = use defaults" rather
than propagating the exception up to crash the request handler.
"""
import stat
import pytest
import api.config as config


def test_load_settings_returns_defaults_when_settings_file_unreadable(monkeypatch, tmp_path):
    """PermissionError from SETTINGS_FILE.exists() must not propagate — return defaults instead.

    Regression for issue #570 comment: Docker UID mismatch caused every request
    to 500 because load_settings() called SETTINGS_FILE.exists() without catching OSError.
    """
    state_dir = tmp_path / "state"
    state_dir.mkdir()
    settings_file = state_dir / "settings.json"
    # Create the file then make the parent unreadable so .exists() raises PermissionError
    settings_file.write_text('{"send_key": "ctrl+enter"}', encoding="utf-8")
    state_dir.chmod(stat.S_IWUSR)  # write-only: stat() on children will fail

    monkeypatch.setattr(config, "SETTINGS_FILE", settings_file)

    try:
        result = config.load_settings()
        # Must not raise; must return a dict with default values
        assert isinstance(result, dict)
        assert "send_key" in result
        # The corrupted/inaccessible value should NOT appear — defaults win
        assert result["send_key"] == config._SETTINGS_DEFAULTS["send_key"]
    finally:
        state_dir.chmod(stat.S_IRWXU)  # restore for cleanup


def test_load_settings_returns_defaults_when_exists_raises_permission_error(monkeypatch, tmp_path):
    """Direct simulation: monkeypatch SETTINGS_FILE.exists to raise PermissionError."""
    from unittest import mock

    state_dir = tmp_path / "state"
    state_dir.mkdir()
    settings_file = state_dir / "settings.json"

    monkeypatch.setattr(config, "SETTINGS_FILE", settings_file)

    with mock.patch.object(type(settings_file), "exists",
                           side_effect=PermissionError("Permission denied")):
        result = config.load_settings()

    assert isinstance(result, dict)
    assert result["send_key"] == config._SETTINGS_DEFAULTS["send_key"]
