import os from gateway.config import Platform from gateway.run import GatewayRunner from gateway.session import SessionContext, SessionSource from gateway.session_context import ( get_session_env, set_session_vars, clear_session_vars, ) def test_set_session_env_sets_contextvars(monkeypatch): """_set_session_env should populate contextvars, not os.environ.""" runner = object.__new__(GatewayRunner) source = SessionSource( platform=Platform.TELEGRAM, chat_id="-1001", chat_name="Group", chat_type="group", thread_id="17585", ) context = SessionContext(source=source, connected_platforms=[], home_channels={}) monkeypatch.delenv("HERMES_SESSION_PLATFORM", raising=False) monkeypatch.delenv("HERMES_SESSION_CHAT_ID", raising=False) monkeypatch.delenv("HERMES_SESSION_CHAT_NAME", raising=False) monkeypatch.delenv("HERMES_SESSION_THREAD_ID", raising=False) tokens = runner._set_session_env(context) # Values should be readable via get_session_env (contextvar path) assert get_session_env("HERMES_SESSION_PLATFORM") == "telegram" assert get_session_env("HERMES_SESSION_CHAT_ID") == "-1001" assert get_session_env("HERMES_SESSION_CHAT_NAME") == "Group" assert get_session_env("HERMES_SESSION_THREAD_ID") == "17585" # os.environ should NOT be touched assert os.getenv("HERMES_SESSION_PLATFORM") is None assert os.getenv("HERMES_SESSION_THREAD_ID") is None # Clean up runner._clear_session_env(tokens) def test_clear_session_env_restores_previous_state(monkeypatch): """_clear_session_env should restore contextvars to their pre-handler values.""" runner = object.__new__(GatewayRunner) monkeypatch.delenv("HERMES_SESSION_PLATFORM", raising=False) monkeypatch.delenv("HERMES_SESSION_CHAT_ID", raising=False) monkeypatch.delenv("HERMES_SESSION_CHAT_NAME", raising=False) monkeypatch.delenv("HERMES_SESSION_THREAD_ID", raising=False) source = SessionSource( platform=Platform.TELEGRAM, chat_id="-1001", chat_name="Group", chat_type="group", thread_id="17585", ) context = SessionContext(source=source, connected_platforms=[], home_channels={}) tokens = runner._set_session_env(context) assert get_session_env("HERMES_SESSION_PLATFORM") == "telegram" runner._clear_session_env(tokens) # After clear, contextvars should return to defaults (empty) assert get_session_env("HERMES_SESSION_PLATFORM") == "" assert get_session_env("HERMES_SESSION_CHAT_ID") == "" assert get_session_env("HERMES_SESSION_CHAT_NAME") == "" assert get_session_env("HERMES_SESSION_THREAD_ID") == "" def test_get_session_env_falls_back_to_os_environ(monkeypatch): """get_session_env should fall back to os.environ when contextvar is unset.""" monkeypatch.setenv("HERMES_SESSION_PLATFORM", "discord") # No contextvar set — should read from os.environ assert get_session_env("HERMES_SESSION_PLATFORM") == "discord" # Now set a contextvar — should prefer it tokens = set_session_vars(platform="telegram") assert get_session_env("HERMES_SESSION_PLATFORM") == "telegram" # Restore — should fall back to os.environ again clear_session_vars(tokens) assert get_session_env("HERMES_SESSION_PLATFORM") == "discord" def test_get_session_env_default_when_nothing_set(monkeypatch): """get_session_env returns default when neither contextvar nor env is set.""" monkeypatch.delenv("HERMES_SESSION_PLATFORM", raising=False) assert get_session_env("HERMES_SESSION_PLATFORM") == "" assert get_session_env("HERMES_SESSION_PLATFORM", "fallback") == "fallback" def test_set_session_env_handles_missing_optional_fields(): """_set_session_env should handle None chat_name and thread_id gracefully.""" runner = object.__new__(GatewayRunner) source = SessionSource( platform=Platform.TELEGRAM, chat_id="-1001", chat_name=None, chat_type="private", thread_id=None, ) context = SessionContext(source=source, connected_platforms=[], home_channels={}) tokens = runner._set_session_env(context) assert get_session_env("HERMES_SESSION_PLATFORM") == "telegram" assert get_session_env("HERMES_SESSION_CHAT_ID") == "-1001" assert get_session_env("HERMES_SESSION_CHAT_NAME") == "" assert get_session_env("HERMES_SESSION_THREAD_ID") == "" runner._clear_session_env(tokens)