8a9f734d14
Add end-to-end smoke tests and expand coverage for score and render modules: - test_smoke.py (new): subprocess tests for --diagnose, --help, --mock, and missing topic. Validates exit codes, JSON structure, and source detection (HN/Polymarket always available). - test_score.py: add TestCommentQualityWeight (top_comment_score boost), TestInstagramEngagement (basic scoring, views vs likes weighting) - test_render.py: add TestEnsureOutputDir, TestXrefTag, TestRenderEmptyReport Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
165 lines
4.7 KiB
Python
165 lines
4.7 KiB
Python
"""Tests for render module."""
|
|
|
|
import sys
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
# Add lib to path
|
|
sys.path.insert(0, str(Path(__file__).parent.parent / "scripts"))
|
|
|
|
from lib import render, schema
|
|
|
|
|
|
class TestRenderCompact(unittest.TestCase):
|
|
def test_renders_basic_report(self):
|
|
report = schema.Report(
|
|
topic="test topic",
|
|
range_from="2026-01-01",
|
|
range_to="2026-01-31",
|
|
generated_at="2026-01-31T12:00:00Z",
|
|
mode="both",
|
|
openai_model_used="gpt-5.2",
|
|
xai_model_used="grok-4-latest",
|
|
)
|
|
|
|
result = render.render_compact(report)
|
|
|
|
self.assertIn("test topic", result)
|
|
self.assertIn("2026-01-01", result)
|
|
self.assertIn("both", result)
|
|
self.assertIn("gpt-5.2", result)
|
|
|
|
def test_renders_reddit_items(self):
|
|
report = schema.Report(
|
|
topic="test",
|
|
range_from="2026-01-01",
|
|
range_to="2026-01-31",
|
|
generated_at="2026-01-31T12:00:00Z",
|
|
mode="reddit-only",
|
|
reddit=[
|
|
schema.RedditItem(
|
|
id="R1",
|
|
title="Test Thread",
|
|
url="https://reddit.com/r/test/1",
|
|
subreddit="test",
|
|
date="2026-01-15",
|
|
date_confidence="high",
|
|
score=85,
|
|
why_relevant="Very relevant",
|
|
)
|
|
],
|
|
)
|
|
|
|
result = render.render_compact(report)
|
|
|
|
self.assertIn("R1", result)
|
|
self.assertIn("Test Thread", result)
|
|
self.assertIn("r/test", result)
|
|
|
|
def test_shows_coverage_tip_for_reddit_only(self):
|
|
report = schema.Report(
|
|
topic="test",
|
|
range_from="2026-01-01",
|
|
range_to="2026-01-31",
|
|
generated_at="2026-01-31T12:00:00Z",
|
|
mode="reddit-only",
|
|
)
|
|
|
|
result = render.render_compact(report)
|
|
|
|
self.assertIn("xAI key", result)
|
|
|
|
|
|
class TestRenderContextSnippet(unittest.TestCase):
|
|
def test_renders_snippet(self):
|
|
report = schema.Report(
|
|
topic="Claude Code Skills",
|
|
range_from="2026-01-01",
|
|
range_to="2026-01-31",
|
|
generated_at="2026-01-31T12:00:00Z",
|
|
mode="both",
|
|
)
|
|
|
|
result = render.render_context_snippet(report)
|
|
|
|
self.assertIn("Claude Code Skills", result)
|
|
self.assertIn("Last 30 Days", result)
|
|
|
|
|
|
class TestRenderFullReport(unittest.TestCase):
|
|
def test_renders_full_report(self):
|
|
report = schema.Report(
|
|
topic="test topic",
|
|
range_from="2026-01-01",
|
|
range_to="2026-01-31",
|
|
generated_at="2026-01-31T12:00:00Z",
|
|
mode="both",
|
|
openai_model_used="gpt-5.2",
|
|
xai_model_used="grok-4-latest",
|
|
)
|
|
|
|
result = render.render_full_report(report)
|
|
|
|
self.assertIn("# test topic", result)
|
|
self.assertIn("## Models Used", result)
|
|
self.assertIn("gpt-5.2", result)
|
|
|
|
|
|
class TestGetContextPath(unittest.TestCase):
|
|
def test_returns_path_string(self):
|
|
result = render.get_context_path()
|
|
self.assertIsInstance(result, str)
|
|
self.assertIn("last30days.context.md", result)
|
|
|
|
|
|
class TestEnsureOutputDir(unittest.TestCase):
|
|
"""Tests for ensure_output_dir()."""
|
|
|
|
def test_creates_directory(self):
|
|
import os
|
|
import tempfile
|
|
test_dir = os.path.join(tempfile.mkdtemp(), "output", "nested")
|
|
os.environ["LAST30DAYS_OUTPUT_DIR"] = test_dir
|
|
try:
|
|
render.ensure_output_dir()
|
|
self.assertTrue(os.path.exists(test_dir))
|
|
finally:
|
|
os.environ.pop("LAST30DAYS_OUTPUT_DIR", None)
|
|
|
|
|
|
class TestXrefTag(unittest.TestCase):
|
|
"""Tests for _xref_tag()."""
|
|
|
|
def test_no_refs(self):
|
|
item = schema.RedditItem(id="R1", title="T", url="u", subreddit="s")
|
|
self.assertEqual(render._xref_tag(item), "")
|
|
|
|
def test_with_refs(self):
|
|
item = schema.RedditItem(
|
|
id="R1", title="T", url="u", subreddit="s",
|
|
cross_refs=["X1", "HN2"],
|
|
)
|
|
tag = render._xref_tag(item)
|
|
self.assertIn("X", tag)
|
|
self.assertIn("HN", tag)
|
|
|
|
|
|
class TestRenderEmptyReport(unittest.TestCase):
|
|
"""Test render_compact handles empty reports gracefully."""
|
|
|
|
def test_empty_items_graceful(self):
|
|
report = schema.Report(
|
|
topic="test",
|
|
range_from="2026-02-04",
|
|
range_to="2026-03-06",
|
|
generated_at="2026-03-06T00:00:00+00:00",
|
|
mode="both",
|
|
)
|
|
output = render.render_compact(report)
|
|
self.assertIn("test", output)
|
|
self.assertIsInstance(output, str)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|