"""Unit tests for opensquilla.contrib.codetask.config.""" import sys from opensquilla.contrib.codetask import config class TestSlugify: def test_basic(self): assert config.slugify("Fix CSV export bug") == "fix-csv-export-bug" def test_strips_punctuation_and_unicode(self): assert config.slugify("修复 CSV 导出 bug!!!") == "csv-bug" def test_truncates(self): s = config.slugify("a" * 100, max_len=10) assert len(s) <= 10 def test_empty_fallback(self): assert config.slugify("!!!") == "task" class TestPaths: def test_runs_root_override(self, monkeypatch, tmp_path): monkeypatch.setenv("OPENSQUILLA_CODETASK_RUNS_DIR", str(tmp_path)) assert config.runs_root() == tmp_path assert config.run_dir("r1") == tmp_path / "r1" assert config.repo_dir("r1") == tmp_path / "r1" / "repo" assert config.artifact_path("r1", "result.json") == tmp_path / "r1" / "result.json" def test_scratch_is_sandbox_writable_not_under_runs_root(self, monkeypatch, tmp_path): # The scratch dir MUST NOT live under the runs root (which defaults to # ~/.opensquilla, i.e. /root/... — hard-blocked by the agent sandbox). # It must default under the system temp dir. import tempfile monkeypatch.setenv("OPENSQUILLA_CODETASK_RUNS_DIR", str(tmp_path)) monkeypatch.delenv("OPENSQUILLA_CODETASK_SCRATCH_DIR", raising=False) scratch = config.scratch_dir("r1") assert tempfile.gettempdir() in str(scratch) assert str(tmp_path) not in str(scratch) assert scratch.name == "scratch" def test_scratch_override(self, monkeypatch, tmp_path): monkeypatch.setenv("OPENSQUILLA_CODETASK_SCRATCH_DIR", str(tmp_path / "s")) assert config.scratch_dir("r1") == tmp_path / "s" / "r1" / "scratch" def test_agent_python_default(self, monkeypatch): monkeypatch.delenv("OPENSQUILLA_CODETASK_AGENT_PYTHON", raising=False) assert config.agent_python() == sys.executable def test_agent_python_override(self, monkeypatch): monkeypatch.setenv("OPENSQUILLA_CODETASK_AGENT_PYTHON", "/opt/py/bin/python") assert config.agent_python() == "/opt/py/bin/python" def test_prompt_template_shipped(self, monkeypatch): monkeypatch.delenv("OPENSQUILLA_CODETASK_PROMPT_TEMPLATE", raising=False) path = config.prompt_template_path() assert path.exists() body = path.read_text(encoding="utf-8") for slot in ("{task}", "{env_hints}", "{scratch_dir}", "{manifest_name}"): assert slot in body class TestAgentConfigPath: def test_default_exists(self): p = config.agent_config_path() assert p.name == "config.toml" assert p.exists() def test_env_override(self, monkeypatch, tmp_path): custom = tmp_path / "custom.toml" custom.write_text("") monkeypatch.setenv("OPENSQUILLA_CODETASK_AGENT_CONFIG", str(custom)) assert config.agent_config_path() == custom