返回 last30days-skill
test_save_raw_per_entity.py
根目录 / tests / test_save_raw_per_entity.py
1 """Tests for per-entity save files when running vs-mode or --competitors.
2
3 Each entity's sub-run produces its own {entity-slug}-raw.md. Single-entity
4 runs unchanged.
5 """
6
7 from __future__ import annotations
8
9 import os
10 import subprocess
11 import sys
12 import tempfile
13 import unittest
14 from pathlib import Path
15
16 REPO_ROOT = Path(__file__).resolve().parents[1]
17
18
19 def _engine_path() -> Path:
20 return REPO_ROOT / "skills" / "last30days" / "scripts" / "last30days.py"
21
22
23 class PerEntitySaveFilesTests(unittest.TestCase):
24 def _run(self, *argv: str, topic: str) -> tuple[subprocess.CompletedProcess, Path]:
25 save_dir = Path(tempfile.mkdtemp(prefix="last30days-test-"))
26 cmd = [
27 sys.executable,
28 str(_engine_path()),
29 topic,
30 "--mock",
31 "--emit=md",
32 "--save-dir", str(save_dir),
33 *argv,
34 ]
35 env = {**os.environ, "LAST30DAYS_SKIP_PREFLIGHT": "1"}
36 result = subprocess.run(cmd, capture_output=True, text=True, encoding="utf-8", env=env)
37 return result, save_dir
38
39 def test_vs_mode_produces_per_entity_files(self):
40 result, save_dir = self._run(topic="Kanye West vs Drake vs Kendrick Lamar")
41 self.assertEqual(result.returncode, 0, msg=result.stderr)
42 files = sorted(save_dir.glob("*-raw.md"))
43 names = [f.name for f in files]
44 # Each entity slug should produce a file
45 self.assertIn("kanye-west-raw.md", names)
46 self.assertIn("drake-raw.md", names)
47 self.assertIn("kendrick-lamar-raw.md", names)
48
49 def test_vs_mode_logs_authoritative_artifact_set(self):
50 result, save_dir = self._run(topic="Kanye West vs Drake")
51 self.assertEqual(result.returncode, 0, msg=result.stderr)
52 expected_main = (save_dir / "kanye-west-raw.md").resolve()
53 expected_peer = (save_dir / "drake-raw.md").resolve()
54 self.assertIn(
55 f"[last30days] Comparison artifact set: main={expected_main}; "
56 f"peers={expected_peer}",
57 result.stderr,
58 )
59
60 def test_competitors_list_produces_per_entity_files(self):
61 result, save_dir = self._run(
62 "--competitors-list", "Anthropic,xAI",
63 topic="OpenAI",
64 )
65 self.assertEqual(result.returncode, 0, msg=result.stderr)
66 files = sorted(save_dir.glob("*-raw.md"))
67 names = [f.name for f in files]
68 self.assertIn("openai-raw.md", names)
69 self.assertIn("anthropic-raw.md", names)
70 self.assertIn("xai-raw.md", names)
71
72 def test_single_entity_run_produces_one_file(self):
73 result, save_dir = self._run(topic="OpenAI")
74 self.assertEqual(result.returncode, 0, msg=result.stderr)
75 files = sorted(save_dir.glob("*-raw.md"))
76 self.assertEqual(len(files), 1)
77 self.assertEqual(files[0].name, "openai-raw.md")
78
79 def test_per_entity_file_has_resolved_block(self):
80 result, save_dir = self._run(
81 "--competitors-list", "Anthropic",
82 topic="OpenAI",
83 )
84 self.assertEqual(result.returncode, 0, msg=result.stderr)
85 anthropic_file = save_dir / "anthropic-raw.md"
86 self.assertTrue(anthropic_file.exists())
87 content = anthropic_file.read_text()
88 self.assertIn("## Resolved Entities", content)
89 self.assertIn("**Anthropic**", content)
90
91 if __name__ == "__main__":
92 unittest.main()
93
93 lines PYTHON