File size: 1,812 Bytes
8a652b8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
from __future__ import annotations

import asyncio
import stat
from pathlib import Path
from types import SimpleNamespace
from unittest.mock import MagicMock

import pytest

from peachy.console import LocalStream
from peachy.state import resolve_state_root


def _mode(path: Path) -> int:
    return stat.S_IMODE(path.stat().st_mode)


def test_state_root_precedence_and_permissions(tmp_path: Path) -> None:
    explicit = tmp_path / "explicit"
    xdg = tmp_path / "xdg"
    home = tmp_path / "home"
    result = resolve_state_root(
        environ={"PEACHY_STATE_DIR": str(explicit), "XDG_STATE_HOME": str(xdg)},
        home=home,
    )
    assert result == explicit
    assert _mode(result) == 0o700


def test_state_root_uses_xdg_then_home(tmp_path: Path) -> None:
    xdg = tmp_path / "xdg"
    home = tmp_path / "home"
    assert resolve_state_root(environ={"XDG_STATE_HOME": str(xdg)}, home=home) == xdg / "peachy"
    assert resolve_state_root(environ={}, home=home) == home / ".local" / "state" / "peachy"


@pytest.mark.parametrize(
    "environ",
    [
        {"PEACHY_STATE_DIR": "relative/path"},
        {"XDG_STATE_HOME": "relative/path"},
    ],
)
def test_state_root_rejects_relative_overrides(environ: dict[str, str], tmp_path: Path) -> None:
    with pytest.raises(ValueError, match="absolute"):
        resolve_state_root(environ=environ, home=tmp_path)


def test_persisted_env_is_owner_only(tmp_path: Path) -> None:
    handler = MagicMock()
    handler.output_queue = asyncio.Queue()
    handler.last_activity_time = 0.0
    robot = SimpleNamespace(media=SimpleNamespace(audio=None, backend=None))
    stream = LocalStream(handler, robot, instance_path=str(tmp_path))

    stream._persist_env_values({"OPENAI_API_KEY": "sk-test-file-mode"})

    assert _mode(tmp_path / ".env") == 0o600