133 lines
5.1 KiB
Python
133 lines
5.1 KiB
Python
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",
|
|
user_id="123456",
|
|
user_name="alice",
|
|
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_USER_ID", raising=False)
|
|
monkeypatch.delenv("HERMES_SESSION_USER_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_USER_ID") == "123456"
|
|
assert get_session_env("HERMES_SESSION_USER_NAME") == "alice"
|
|
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_USER_ID", raising=False)
|
|
monkeypatch.delenv("HERMES_SESSION_USER_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",
|
|
user_id="123456",
|
|
user_name="alice",
|
|
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"
|
|
assert get_session_env("HERMES_SESSION_USER_ID") == "123456"
|
|
|
|
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_USER_ID") == ""
|
|
assert get_session_env("HERMES_SESSION_USER_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)
|