Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Empty file added tests/ops/__init__.py
Empty file.
159 changes: 159 additions & 0 deletions tests/ops/test_config.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,159 @@
"""AgentOps 配置模块测试"""

from pathlib import Path

from jojo_code.ops.config import OpsConfig


class TestOpsConfigDefaults:
"""OpsConfig 默认值测试"""

def test_default_enabled(self):
"""默认应启用 Ops"""
config = OpsConfig()
assert config.enabled is True

def test_default_persist_traces(self):
"""默认应持久化 Trace"""
config = OpsConfig()
assert config.persist_traces is True

def test_default_trace_dir(self):
"""默认 Trace 目录应为 .jojo-code/traces"""
config = OpsConfig()
assert config.trace_dir == ".jojo-code/traces"

def test_default_max_traces_in_memory(self):
"""默认内存中最大 Trace 数量应为 1000"""
config = OpsConfig()
assert config.max_traces_in_memory == 1000

def test_default_real_time_display(self):
"""默认不启用实时显示"""
config = OpsConfig()
assert config.real_time_display is False


class TestOpsConfigCustomValues:
"""OpsConfig 自定义值测试"""

def test_custom_enabled(self):
"""应支持自定义 enabled"""
config = OpsConfig(enabled=False)
assert config.enabled is False

def test_custom_persist_traces(self):
"""应支持自定义 persist_traces"""
config = OpsConfig(persist_traces=False)
assert config.persist_traces is False

def test_custom_trace_dir(self):
"""应支持自定义 trace_dir"""
config = OpsConfig(trace_dir="/tmp/custom_traces")
assert config.trace_dir == "/tmp/custom_traces"

def test_custom_max_traces_in_memory(self):
"""应支持自定义 max_traces_in_memory"""
config = OpsConfig(max_traces_in_memory=500)
assert config.max_traces_in_memory == 500

def test_custom_real_time_display(self):
"""应支持自定义 real_time_display"""
config = OpsConfig(real_time_display=True)
assert config.real_time_display is True


class TestOpsConfigFromEnv:
"""OpsConfig.from_env() 环境变量加载测试"""

def test_from_env_defaults(self, monkeypatch):
"""无环境变量时应使用默认值"""
# 清除所有相关环境变量
for key in [
"JOJO_CODE_OPS_ENABLED",
"JOJO_CODE_OPS_PERSIST",
"JOJO_CODE_OPS_TRACE_DIR",
"JOJO_CODE_OPS_MAX_TRACES",
"JOJO_CODE_OPS_REALTIME",
]:
monkeypatch.delenv(key, raising=False)

config = OpsConfig.from_env()
assert config.enabled is True
assert config.persist_traces is True
assert config.trace_dir == ".jojo-code/traces"
assert config.max_traces_in_memory == 1000
assert config.real_time_display is False

def test_from_env_enabled_false(self, monkeypatch):
"""JOJO_CODE_OPS_ENABLED=false 应禁用"""
monkeypatch.setenv("JOJO_CODE_OPS_ENABLED", "false")
config = OpsConfig.from_env()
assert config.enabled is False

def test_from_env_enabled_case_insensitive(self, monkeypatch):
"""JOJO_CODE_OPS_ENABLED 应不区分大小写"""
monkeypatch.setenv("JOJO_CODE_OPS_ENABLED", "FALSE")
config = OpsConfig.from_env()
assert config.enabled is False

def test_from_env_persist_false(self, monkeypatch):
"""JOJO_CODE_OPS_PERSIST=false 应禁用持久化"""
monkeypatch.setenv("JOJO_CODE_OPS_PERSIST", "false")
config = OpsConfig.from_env()
assert config.persist_traces is False

def test_from_env_custom_trace_dir(self, monkeypatch):
"""JOJO_CODE_OPS_TRACE_DIR 应设置自定义目录"""
monkeypatch.setenv("JOJO_CODE_OPS_TRACE_DIR", "/tmp/my_traces")
config = OpsConfig.from_env()
assert config.trace_dir == "/tmp/my_traces"

def test_from_env_custom_max_traces(self, monkeypatch):
"""JOJO_CODE_OPS_MAX_TRACES 应设置自定义数量"""
monkeypatch.setenv("JOJO_CODE_OPS_MAX_TRACES", "500")
config = OpsConfig.from_env()
assert config.max_traces_in_memory == 500

def test_from_env_realtime_true(self, monkeypatch):
"""JOJO_CODE_OPS_REALTIME=true 应启用实时显示"""
monkeypatch.setenv("JOJO_CODE_OPS_REALTIME", "true")
config = OpsConfig.from_env()
assert config.real_time_display is True

def test_from_env_all_custom(self, monkeypatch):
"""应支持同时设置所有环境变量"""
monkeypatch.setenv("JOJO_CODE_OPS_ENABLED", "false")
monkeypatch.setenv("JOJO_CODE_OPS_PERSIST", "false")
monkeypatch.setenv("JOJO_CODE_OPS_TRACE_DIR", "/custom/path")
monkeypatch.setenv("JOJO_CODE_OPS_MAX_TRACES", "200")
monkeypatch.setenv("JOJO_CODE_OPS_REALTIME", "true")

config = OpsConfig.from_env()
assert config.enabled is False
assert config.persist_traces is False
assert config.trace_dir == "/custom/path"
assert config.max_traces_in_memory == 200
assert config.real_time_display is True


class TestOpsConfigGetTracePath:
"""OpsConfig.get_trace_path() 测试"""

def test_get_trace_path_returns_path(self):
"""get_trace_path 应返回 Path 对象"""
config = OpsConfig()
path = config.get_trace_path()
assert isinstance(path, Path)

def test_get_trace_path_default(self):
"""默认路径应为 .jojo-code/traces"""
config = OpsConfig()
path = config.get_trace_path()
assert path == Path(".jojo-code/traces")

def test_get_trace_path_custom(self):
"""自定义路径应正确返回"""
config = OpsConfig(trace_dir="/tmp/custom")
path = config.get_trace_path()
assert path == Path("/tmp/custom")
Loading
Loading